diff --git a/src/models/pathResolver.js b/src/models/pathResolver.js index 310be5bf4..7ce629489 100644 --- a/src/models/pathResolver.js +++ b/src/models/pathResolver.js @@ -113,7 +113,7 @@ function getContext(router, options = {}) { const match = pathname.match(MAP_URL_PATTERN); const matchV2 = pathname.match(MAP_URL_PATTERNV2); - if (match) { + if (match && match[2]) { const context = { name: match[2], id: match[3], @@ -121,7 +121,7 @@ function getContext(router, options = {}) { return context; } - if (matchV2) { + if (matchV2 && matchV2[2]) { const context = { name: matchV2[2], id: matchV2[3], @@ -129,12 +129,14 @@ function getContext(router, options = {}) { return context; } - const match2 = pathname.match(/^\/wallets\/([a-z0-9-]+)\/tokens\?.*$/); - const context = { - name: 'wallets', - id: match2[1], - }; - return context; + const match2 = pathname.match(/^\/wallets\/([a-z0-9-]+)\/tokens(\?.*)?$/); + if (match2) { + const context = { + name: 'wallets', + id: match2[1], + }; + return context; + } return null; } diff --git a/src/pages/organizations/[organizationid].js b/src/pages/organizations/[organizationid].js index 9075ba696..3e2cee680 100644 --- a/src/pages/organizations/[organizationid].js +++ b/src/pages/organizations/[organizationid].js @@ -434,7 +434,9 @@ export default function Organization(props) { @@ -455,7 +457,9 @@ export default function Organization(props) { letterSpacing: '0.04em', }} dangerouslySetInnerHTML={{ - __html: marked.parse(organization.mission || 'NO DATA YET'), + __html: marked.parse(organization.mission || 'NO DATA YET', { + breaks: true, + }), }} /> diff --git a/src/pages/planters/[planterid].js b/src/pages/planters/[planterid].js index 0106d52d4..6fa70f440 100644 --- a/src/pages/planters/[planterid].js +++ b/src/pages/planters/[planterid].js @@ -489,7 +489,9 @@ export default function Planter(props) { > diff --git a/src/pages/tokens/[tokenid].js b/src/pages/tokens/[tokenid].js index 651639233..0043761f5 100644 --- a/src/pages/tokens/[tokenid].js +++ b/src/pages/tokens/[tokenid].js @@ -67,7 +67,8 @@ export default function Token(props) { const mapContext = useMapContext(); const isMobile = useMobile(); const router = useRouter(); - const userCameFromWalletPage = router.asPath.includes('wallets'); + const userCameFromWalletPage = + router.asPath.includes('wallets') || !!router.query.walletId; const context = pathResolver.getContext(router, { base: process.env.NEXT_PUBLIC_BASE, }); @@ -75,6 +76,7 @@ export default function Token(props) { log.warn('map:', mapContext); useEffect(() => { + let cancelled = false; async function reload() { // manipulate the map // const { map } = mapContext; @@ -115,26 +117,29 @@ export default function Token(props) { // manipulate the map log.warn('map ,tree, context in tree page:', map, tree, context); if (map && tree?.lat && tree?.lon) { - if (context && context.name) { - if (context.name === 'wallets') { - log.warn('set wallet filter', context.id); - await map.setFilters({ - wallet: wallet.name, - }); - await focusTree(map, tree); - const treeDataForMap = { - ...tree, - lat: parseFloat(tree.lat.toString()), - lon: parseFloat(tree.lon.toString()), - }; - map.selectTree(treeDataForMap); - } else { - throw new Error(`unknown context name: ${context.name}`); - } + const isWalletContext = + (context && context.name === 'wallets') || !!router.query.walletId; + if (isWalletContext && wallet) { + log.warn( + 'set wallet filter', + context?.id || router.query.walletId, + ); + await map.setFilters({ + wallet: wallet.name, + }); + await focusTree(map, tree); + if (cancelled) return; + const treeDataForMap = { + ...tree, + lat: parseFloat(tree.lat.toString()), + lon: parseFloat(tree.lon.toString()), + }; + map.selectTree(treeDataForMap); } else { log.warn('set treeid filter', tree.id); await map.setFilters({}); await focusTree(map, tree); + if (cancelled) return; const treeDataForMap = { ...tree, lat: parseFloat(tree.lat.toString()), @@ -145,6 +150,7 @@ export default function Token(props) { } } reload(); + return () => { cancelled = true; }; }, [mapContext, token]); log.warn('token:', token); diff --git a/src/pages/top.js b/src/pages/top.js index 7367f3c51..14c0958bd 100644 --- a/src/pages/top.js +++ b/src/pages/top.js @@ -48,6 +48,7 @@ function Top(props) { React.useEffect(() => { async function reload() { if (mapContext.map) { + await mapContext.map.clearSelection(); await mapContext.map.setFilters({}); const bounds = pathResolver.getBounds(router); if (bounds) { diff --git a/src/pages/trees/[treeid].js b/src/pages/trees/[treeid].js index df562a00a..34bdb0fbc 100644 --- a/src/pages/trees/[treeid].js +++ b/src/pages/trees/[treeid].js @@ -106,6 +106,7 @@ export default function Tree({ // draw(); // }, [mapContext.map, tree.lat, tree.lon]); useEffect(() => { + let cancelled = false; async function reload() { async function focusTree(map2, tree2) { const currentView = map2.getCurrentView(); @@ -131,6 +132,7 @@ export default function Tree({ userid: context.id, }); await focusTree(map, tree); + if (cancelled) return; const treeDataForMap = { ...tree, lat: parseFloat(tree.lat.toString()), @@ -143,6 +145,7 @@ export default function Tree({ map_name: organization.map_name, }); await focusTree(map, tree); + if (cancelled) return; const treeDataForMap = { ...tree, lat: parseFloat(tree.lat.toString()), @@ -156,6 +159,7 @@ export default function Tree({ log.warn('set treeid filter', tree.id); await map.setFilters({}); await focusTree(map, tree); + if (cancelled) return; const treeDataForMap = { ...tree, lat: parseFloat(tree.lat.toString()), @@ -163,18 +167,10 @@ export default function Tree({ }; map.selectTree(treeDataForMap); } - - // // select the tree - // const treeDataForMap = { - // ...tree, - // lat: parseFloat(tree.lat.toString()), - // lon: parseFloat(tree.lon.toString()), - // }; - // mapContext.map.selectTree(treeDataForMap); - // // log.warn('filter of map:', mapContext.map.getFilters()); } } reload(); + return () => { cancelled = true; }; }, [map, tree.lat, tree.lon]); log.warn(planter, 'planter'); diff --git a/src/pages/v2/captures/[captureid].js b/src/pages/v2/captures/[captureid].js index 0c56101ad..2d60eb480 100644 --- a/src/pages/v2/captures/[captureid].js +++ b/src/pages/v2/captures/[captureid].js @@ -114,6 +114,7 @@ export default function Capture({ // draw(); // }, [mapContext.map, tree.lat, tree.lon]); useEffect(() => { + let cancelled = false; async function reload() { async function focusTree(map2, tree2) { const currentView = map2.getCurrentView(); @@ -139,6 +140,7 @@ export default function Capture({ userid: context.id, }); await focusTree(map, tree); + if (cancelled) return; const treeDataForMap = { ...tree, lat: parseFloat(tree.lat.toString()), @@ -151,6 +153,7 @@ export default function Capture({ map_name: organization.map_name, }); await focusTree(map, tree); + if (cancelled) return; const treeDataForMap = { ...tree, lat: parseFloat(tree.lat.toString()), @@ -164,6 +167,7 @@ export default function Capture({ log.warn('set treeid filter', tree.id); await map.setFilters({}); await focusTree(map, tree); + if (cancelled) return; const treeDataForMap = { ...tree, lat: parseFloat(tree.lat.toString()), @@ -171,18 +175,10 @@ export default function Capture({ }; map.selectTree(treeDataForMap); } - - // // select the tree - // const treeDataForMap = { - // ...tree, - // lat: parseFloat(tree.lat.toString()), - // lon: parseFloat(tree.lon.toString()), - // }; - // mapContext.map.selectTree(treeDataForMap); - // // log.warn('filter of map:', mapContext.map.getFilters()); } } reload(); + return () => { cancelled = true; }; }, [map, tree.lat, tree.lon]); log.warn(grower, 'grower'); diff --git a/src/pages/wallets/[walletid].js b/src/pages/wallets/[walletid].js index f06bfe6d0..daff2e8e8 100644 --- a/src/pages/wallets/[walletid].js +++ b/src/pages/wallets/[walletid].js @@ -374,7 +374,9 @@ export default function Wallet(props) { sx={{ mt: [2.5, 5] }} variant="body2" dangerouslySetInnerHTML={{ - __html: marked.parse(wallet.about || 'NO DATA YET'), + __html: marked.parse(wallet.about || 'NO DATA YET', { + breaks: true, + }), }} />