From 1686299e9d26163a750452082d003c91ca6ded8d Mon Sep 17 00:00:00 2001 From: acholyn Date: Thu, 21 Nov 2024 14:02:47 +0000 Subject: [PATCH 01/48] updating chips --- src/SearchForm.jsx | 22 +++++++++++++++++++--- src/styles/search.css | 1 + 2 files changed, 20 insertions(+), 3 deletions(-) diff --git a/src/SearchForm.jsx b/src/SearchForm.jsx index 00f443a..166ef87 100644 --- a/src/SearchForm.jsx +++ b/src/SearchForm.jsx @@ -46,11 +46,11 @@ export default function SearchForm({ showSearchResults, taskListOpen }) { const chipSuggestions = [ { - label: "Show me all the sanity tasks", + label: "Show me all the sanitation tasks", icon: <>, action: (setFieldValue) => { - setFieldValue("query", "sanity"); - handleSubmit("sanity"); + setFieldValue("query", "sanitation"); + handleSubmit("sanitation"); }, }, { @@ -61,6 +61,22 @@ export default function SearchForm({ showSearchResults, taskListOpen }) { handleSubmit("points"); }, }, + { + label: "Information about postboxes", + icon: <>, + action: (setFieldValue) => { + setFieldValue("query", "postbox"); + handleSubmit("postbox"); + }, + }, + { + label: "Bakery recommendations", + icon: <>, + action: (setFieldValue) => { + setFieldValue("query", "bakeries"); + handleSubmit("bakeries"); + }, + }, { label: "Where are the elves?", icon: <>, diff --git a/src/styles/search.css b/src/styles/search.css index 9326d2a..65a76a1 100644 --- a/src/styles/search.css +++ b/src/styles/search.css @@ -42,6 +42,7 @@ gap: 0.4rem; display: flex; justify-content: center; + flex-wrap: wrap; } .search__input__wrapper { From 9c83082ca957f6a2fa99fdf902dc78a085c61447 Mon Sep 17 00:00:00 2001 From: acholyn Date: Thu, 28 Nov 2024 12:38:29 +0000 Subject: [PATCH 02/48] stop caching polygons in map source --- src/Mapbox.jsx | 44 +++++++++++--------------------------------- 1 file changed, 11 insertions(+), 33 deletions(-) diff --git a/src/Mapbox.jsx b/src/Mapbox.jsx index c6c1e9d..d9ba64e 100644 --- a/src/Mapbox.jsx +++ b/src/Mapbox.jsx @@ -114,6 +114,7 @@ export function Map({ }, }); } else { + // is search results, should be treated as collection const newData = { type: "FeatureCollection", features: polygonStore.map((polygon) => ({ @@ -136,60 +137,37 @@ export function Map({ }); } } else { + // source already exists, update the data + // removing data points since new task if (map.current.getLayer("datapoints-layer")) { map.current.removeLayer("datapoints-layer"); } + // removing popup since new task if (map.current && popupRef.current) { popupRef.current.remove(); popupRef.current = null; } - // source already exists, used when viewing task list and clicking between tasks let source = map.current.getSource("polygon-source"); - let existingData = source._data; - - if (!existingData || existingData.type !== "FeatureCollection") { - existingData = { - type: "FeatureCollection", - features: [], - }; - } - // Ensure polygonStore is an array so we can use .map() even if it's one item (the initial one) - const polygons = Array.isArray(polygonStore) - ? polygonStore - : [polygonStore]; // Set structure like this, particular attention to the [] around coordinates, otherwise polygon will not show - const newFeatures = polygons.map((polygon) => ({ + const newFeature = { type: "Feature", geometry: { type: "Polygon", - coordinates: [polygon.geo_bounds.coordinates], + coordinates: [polygonStore.geo_bounds.coordinates], }, properties: { - id: polygon.task_id, - title: polygon.task_title, - description: polygon.task_description, + id: polygonStore.task_id, + title: polygonStore.task_title, + description: polygonStore.task_description, }, - })); - - // if the polygon is already on the map, don't add it again - const filteredNewFeatures = newFeatures.filter((newFeature) => { - return !existingData.features.some( - (existingFeature) => - existingFeature.properties.id === newFeature.properties.id - ); - }); - - const updatedFeatures = [ - ...existingData.features, - ...filteredNewFeatures, - ]; + }; const newData = { type: "FeatureCollection", - features: updatedFeatures, + features: [newFeature], }; source.setData(newData); From 72efa9fa0acb4f0edf10a4fb9d82a3351f349023 Mon Sep 17 00:00:00 2001 From: acholyn Date: Thu, 28 Nov 2024 13:33:20 +0000 Subject: [PATCH 03/48] streamlining + refactoring map functions + disabling getBounds in favour of get centroid and fly --- src/Mapbox.jsx | 206 ++++++++++++++++++++++++------------------------- 1 file changed, 100 insertions(+), 106 deletions(-) diff --git a/src/Mapbox.jsx b/src/Mapbox.jsx index d9ba64e..0071781 100644 --- a/src/Mapbox.jsx +++ b/src/Mapbox.jsx @@ -1,7 +1,7 @@ import mapboxgl from "mapbox-gl"; import { useEffect, useRef } from "react"; import { MAPBOX_TOKEN } from "./globals"; -import { centroid } from "@turf/turf"; +import { centroid, polygon } from "@turf/turf"; import "./styles/mapbox.css"; @@ -16,6 +16,8 @@ export function Map({ const popupRef = useRef(null); const longtAdjustment = 0.015; // used when splitscreen since transform mucks up the interaction + console.log("polygonStore in map", polygonStore); + const addMapClickListener = () => { // listen for click on a polygon map.current.on("click", "polygon-fill", (e) => { @@ -55,6 +57,24 @@ export function Map({ }); }; + const getCentroidAndFlyTo = (focusTask) => { + const turfPoly = polygon([focusTask.geo_bounds.coordinates]); + + const centroidPoint = centroid(turfPoly); + + let [longitude, latitude] = centroidPoint.geometry.coordinates; + if (taskListOpen) { + longitude += longtAdjustment; + } + + map.current.flyTo({ + center: [longitude, latitude], + essential: true, // not user-interruptible + padding: 200, + zoom: 10, + }); + }; + // base map useEffect(() => { if (map.current) return; @@ -94,64 +114,28 @@ export function Map({ useEffect(() => { if (!map.current || !map.current.isStyleLoaded() || !polygonStore) return; - // source does not exist - if (!map.current.getSource("polygon-source")) { - // not an array of polygons (not search results) - if (!Array.isArray(polygonStore)) { - map.current.addSource("polygon-source", { - type: "geojson", - data: { - type: "Feature", - geometry: { - type: "Polygon", - coordinates: [polygonStore.geo_bounds.coordinates], - }, - properties: { - id: polygonStore.task_id, - title: polygonStore.task_title, - description: polygonStore.task_description, - }, + var newData; + + // is search results + if (Array.isArray(polygonStore)) { + console.log("is array"); + newData = { + type: "FeatureCollection", + features: polygonStore.map((polygon) => ({ + type: "Feature", + geometry: { + type: "Polygon", + coordinates: [polygon.geo_bounds.coordinates], }, - }); - } else { - // is search results, should be treated as collection - const newData = { - type: "FeatureCollection", - features: polygonStore.map((polygon) => ({ - type: "Feature", - geometry: { - type: "Polygon", - coordinates: [polygon.geo_bounds.coordinates], - }, - properties: { - id: polygon.task_id, - title: polygon.task_title, - description: polygon.task_description, - }, - })), - }; - - map.current.addSource("polygon-source", { - type: "geojson", - data: newData, - }); - } + properties: { + id: polygon.task_id, + title: polygon.task_title, + description: polygon.task_description, + }, + })), + }; } else { - // source already exists, update the data - - // removing data points since new task - if (map.current.getLayer("datapoints-layer")) { - map.current.removeLayer("datapoints-layer"); - } - // removing popup since new task - if (map.current && popupRef.current) { - popupRef.current.remove(); - popupRef.current = null; - } - - let source = map.current.getSource("polygon-source"); - - // Set structure like this, particular attention to the [] around coordinates, otherwise polygon will not show + // single polygon const newFeature = { type: "Feature", geometry: { @@ -165,12 +149,42 @@ export function Map({ }, }; - const newData = { + newData = { type: "FeatureCollection", features: [newFeature], }; + } + + // source does not exist + if (!map.current.getSource("polygon-source")) { + map.current.addSource("polygon-source", { + type: "geojson", + data: newData, + }); + } else { + console.log("source exists"); + // source already exists, update the data + + // removing data points since new task + if (map.current.getLayer("datapoints-layer")) { + map.current.removeLayer("datapoints-layer"); + } + // removing popup since new task + if (map.current && popupRef.current) { + popupRef.current.remove(); + popupRef.current = null; + } + let source = map.current.getSource("polygon-source"); + + // if (!Array.isArray(polygonStore)) { + // // Set structure like this, particular attention to the [] around coordinates, otherwise polygon will not show + + // source.setData(newData); + // } else { + // source exists and is search results source.setData(newData); + // } } // draw the polygons and their outlines @@ -213,29 +227,30 @@ export function Map({ } map.current.off("click"); } - - const adjustedBounds = (bounds) => { - const sw = bounds.getSouthWest(); - const ne = bounds.getNorthEast(); - - // Shift bounds by adjusting the longitude - const newSw = new mapboxgl.LngLat(sw.lng + longtAdjustment, sw.lat); - const newNe = new mapboxgl.LngLat(ne.lng + longtAdjustment, ne.lat); - - const adjustedBounds = new mapboxgl.LngLatBounds(newSw, newNe); - - return adjustedBounds; - }; - // fit to polygon and center it - const bounds = taskListOpen - ? adjustedBounds(getBounds(polygonStore)) - : getBounds(polygonStore); - - if (bounds) { - map.current.fitBounds(bounds, { - padding: 200, - }); - } + getCentroidAndFlyTo(polygonStore); + + // const adjustedBounds = (bounds) => { + // const sw = bounds.getSouthWest(); + // const ne = bounds.getNorthEast(); + + // // Shift bounds by adjusting the longitude + // const newSw = new mapboxgl.LngLat(sw.lng + longtAdjustment, sw.lat); + // const newNe = new mapboxgl.LngLat(ne.lng + longtAdjustment, ne.lat); + + // const adjustedBounds = new mapboxgl.LngLatBounds(newSw, newNe); + + // return adjustedBounds; + // }; + // // fit to polygon and center it + // const bounds = taskListOpen + // ? adjustedBounds(getBounds(polygonStore)) + // : getBounds(polygonStore); + + // if (bounds) { + // map.current.fitBounds(bounds, { + // padding: 200, + // }); + // } }, [polygonStore, boundsVisible, taskListOpen]); // fly to focused task and show data points @@ -243,18 +258,10 @@ export function Map({ // flying to task when multiple loaded if (!map.current || !map.current.isStyleLoaded() || !focusTask) return; - if (focusTask && focusTask.geo_bounds) { - const centroidPoint = centroid(focusTask.geo_bounds); - let [longitude, latitude] = centroidPoint.geometry.coordinates; - if (taskListOpen) { - longitude += longtAdjustment; - } + console.log("flyign to task", focusTask); - map.current.flyTo({ - center: [longitude, latitude], - essential: true, // not user-interruptible - padding: 200, - }); + if (focusTask && focusTask.geo_bounds) { + getCentroidAndFlyTo(focusTask); } // if focusTask is a feature collection (used for showing data points) else if (focusTask && focusTask.type === "FeatureCollection") { @@ -281,20 +288,7 @@ export function Map({ }); } - // fly to it (in case they moved away) - const middleIndex = Math.floor(focusTask.features.length / 2); - const middleCoordinates = - focusTask.features[middleIndex].geometry.coordinates; - - if (taskListOpen) { - middleCoordinates[0] += longtAdjustment; - } - - map.current.flyTo({ - center: middleCoordinates, - essential: true, - padding: 200, - }); + getCentroidAndFlyTo(focusTask); } }, [focusTask]); From 49e661dc5dad0197cbb509aab968b191affde503 Mon Sep 17 00:00:00 2001 From: acholyn Date: Thu, 28 Nov 2024 14:26:26 +0000 Subject: [PATCH 04/48] simplifying get bounds, using this instead of flyto --- src/Mapbox.jsx | 78 +++++--------------------------------------------- 1 file changed, 7 insertions(+), 71 deletions(-) diff --git a/src/Mapbox.jsx b/src/Mapbox.jsx index 0071781..c1ceb5a 100644 --- a/src/Mapbox.jsx +++ b/src/Mapbox.jsx @@ -1,7 +1,7 @@ import mapboxgl from "mapbox-gl"; import { useEffect, useRef } from "react"; import { MAPBOX_TOKEN } from "./globals"; -import { centroid, polygon } from "@turf/turf"; +import { centroid, polygon, bbox } from "@turf/turf"; import "./styles/mapbox.css"; @@ -14,7 +14,6 @@ export function Map({ }) { const map = useRef(null); const popupRef = useRef(null); - const longtAdjustment = 0.015; // used when splitscreen since transform mucks up the interaction console.log("polygonStore in map", polygonStore); @@ -57,21 +56,12 @@ export function Map({ }); }; - const getCentroidAndFlyTo = (focusTask) => { + const getAndFitBounds = (focusTask) => { const turfPoly = polygon([focusTask.geo_bounds.coordinates]); - const centroidPoint = centroid(turfPoly); - - let [longitude, latitude] = centroidPoint.geometry.coordinates; - if (taskListOpen) { - longitude += longtAdjustment; - } - - map.current.flyTo({ - center: [longitude, latitude], - essential: true, // not user-interruptible + const bounds = bbox(turfPoly); + map.current.fitBounds(bounds, { padding: 200, - zoom: 10, }); }; @@ -227,30 +217,7 @@ export function Map({ } map.current.off("click"); } - getCentroidAndFlyTo(polygonStore); - - // const adjustedBounds = (bounds) => { - // const sw = bounds.getSouthWest(); - // const ne = bounds.getNorthEast(); - - // // Shift bounds by adjusting the longitude - // const newSw = new mapboxgl.LngLat(sw.lng + longtAdjustment, sw.lat); - // const newNe = new mapboxgl.LngLat(ne.lng + longtAdjustment, ne.lat); - - // const adjustedBounds = new mapboxgl.LngLatBounds(newSw, newNe); - - // return adjustedBounds; - // }; - // // fit to polygon and center it - // const bounds = taskListOpen - // ? adjustedBounds(getBounds(polygonStore)) - // : getBounds(polygonStore); - - // if (bounds) { - // map.current.fitBounds(bounds, { - // padding: 200, - // }); - // } + getAndFitBounds(polygonStore); }, [polygonStore, boundsVisible, taskListOpen]); // fly to focused task and show data points @@ -261,7 +228,7 @@ export function Map({ console.log("flyign to task", focusTask); if (focusTask && focusTask.geo_bounds) { - getCentroidAndFlyTo(focusTask); + getAndFitBounds(focusTask); } // if focusTask is a feature collection (used for showing data points) else if (focusTask && focusTask.type === "FeatureCollection") { @@ -288,40 +255,9 @@ export function Map({ }); } - getCentroidAndFlyTo(focusTask); + getAndFitBounds(focusTask); } }, [focusTask]); - const getBounds = (polygonStore) => { - // expects either a single task object or an array of task objects with geo_bounds as the relevant part - var bounds = new mapboxgl.LngLatBounds(); - if (Array.isArray(polygonStore)) { - // only an array if multiple, unclear why there are slightly different structures - - polygonStore.forEach((object) => { - const geoBounds = object.geo_bounds; - if (geoBounds.type === "Polygon") { - geoBounds.coordinates.forEach((coord) => { - bounds.extend(coord); - }); - } else { - geoBounds.forEach((item) => { - if (item.type === "Polygon") { - item.coordinates.forEach((coord) => { - bounds.extend(coord); - }); - } - }); - } - }); - } else { - const coordinates = polygonStore.geo_bounds.coordinates; - coordinates.forEach((coord) => { - bounds.extend(coord); - }); - } - return bounds; - }; - return
; } From baeb8a2f0ddf535d0aa3b5610cedd2efce01df24 Mon Sep 17 00:00:00 2001 From: acholyn Date: Thu, 28 Nov 2024 15:07:34 +0000 Subject: [PATCH 05/48] cleaning up how we handle results and display them --- src/Mapbox.jsx | 24 ++++++++++++++++-------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/src/Mapbox.jsx b/src/Mapbox.jsx index c1ceb5a..4ea3bac 100644 --- a/src/Mapbox.jsx +++ b/src/Mapbox.jsx @@ -165,16 +165,10 @@ export function Map({ popupRef.current = null; } + // getting and setting source let source = map.current.getSource("polygon-source"); - // if (!Array.isArray(polygonStore)) { - // // Set structure like this, particular attention to the [] around coordinates, otherwise polygon will not show - - // source.setData(newData); - // } else { - // source exists and is search results source.setData(newData); - // } } // draw the polygons and their outlines @@ -217,7 +211,21 @@ export function Map({ } map.current.off("click"); } - getAndFitBounds(polygonStore); + if (!Array.isArray(polygonStore)) { + getAndFitBounds(polygonStore); + } else { + // fly to first task of results but not zoom in + const taskWithGeoBounds = polygonStore.find((task) => task.geo_bounds); + + const turfPoly = polygon([taskWithGeoBounds.geo_bounds.coordinates]); + const centroidPoint = centroid(turfPoly); + + map.current.flyTo({ + center: centroidPoint.geometry.coordinates, + essential: true, + zoom: 3, + }); + } }, [polygonStore, boundsVisible, taskListOpen]); // fly to focused task and show data points From ba85058200b65e5b374d602b70737946a46748f9 Mon Sep 17 00:00:00 2001 From: acholyn Date: Fri, 29 Nov 2024 09:52:09 +0000 Subject: [PATCH 06/48] disabling logo button --- src/TaskForm.jsx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/TaskForm.jsx b/src/TaskForm.jsx index 9be5fcb..128683e 100644 --- a/src/TaskForm.jsx +++ b/src/TaskForm.jsx @@ -127,8 +127,8 @@ export default function TaskForm({ /> {/* Logo */} - - + */} {/* Private to Org */} From 748a37843659f73965240722ec960f1f25d45e01 Mon Sep 17 00:00:00 2001 From: acholyn Date: Fri, 29 Nov 2024 10:03:16 +0000 Subject: [PATCH 07/48] fixing id and code not being generated for each task --- src/TaskForm.jsx | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/TaskForm.jsx b/src/TaskForm.jsx index 128683e..c78b275 100644 --- a/src/TaskForm.jsx +++ b/src/TaskForm.jsx @@ -7,10 +7,6 @@ import { CloseButton } from "./utils/Buttons"; import { createTask, updateTask } from "./utils/apiQueries"; // import * as Yup from "yup"; -// these will be dynamically taken from their login and generated -const taskID = generateTaskId(); -const campaignCode = generateCampaignCode(); - // const validationSchema = Yup.object({ // organisation: Yup.string().required("Organisation is required"), // in future maybe we turn this into a dropdown with "add new?" and generate a uuid // logo: Yup.mixed(), @@ -32,7 +28,7 @@ export default function TaskForm({ organisation: user.organisation || "", logo: null, private: false, - visible: true, + visible: false, title: "", description: "", }; @@ -63,7 +59,11 @@ export default function TaskForm({ // const imageBuffer = fs.readFileSync(imagePath); // const base64Image = imageBuffer.toString('base64'); + const taskID = generateTaskId(); + const campaignCode = generateCampaignCode(); + values = { ...values, taskID: taskID, campaignCode: campaignCode }; + try { const response = await createTask({ user, values }); if (response) { @@ -158,8 +158,8 @@ export default function TaskForm({ {/* Visible on Kapta Web */}
{/* Title */} From e7b4d5f91b5899b62034bdd6822e5c07463f464f Mon Sep 17 00:00:00 2001 From: acholyn Date: Fri, 29 Nov 2024 10:19:50 +0000 Subject: [PATCH 08/48] changing success message contents + styling tweaks for task form and success --- src/SuccessModal.jsx | 8 ++------ src/TaskForm.jsx | 13 +++++++------ src/styles/dialogs.css | 6 ++---- src/styles/forms.css | 2 +- 4 files changed, 12 insertions(+), 17 deletions(-) diff --git a/src/SuccessModal.jsx b/src/SuccessModal.jsx index 608ac42..7f97ef3 100644 --- a/src/SuccessModal.jsx +++ b/src/SuccessModal.jsx @@ -5,7 +5,6 @@ import { copyToClipboard } from "./utils/copyToClipboard"; import { useAutoClose } from "./utils/autoCloseHook"; export default function SuccessModal({ - taskID = "", taskTitle = "", taskDescription = "", campaignCode = "", @@ -37,16 +36,13 @@ export default function SuccessModal({ {" "}

- {taskTitle} {taskID} + {taskTitle}

{taskDescription}

-

- Below is the campaign code for people to access your study on{" "} - Kapta Mobile and contribute to it. -

+

Use this code to upload and search WhatsApp Maps.

handleCopy(campaignCode)} diff --git a/src/TaskForm.jsx b/src/TaskForm.jsx index c78b275..3b7601a 100644 --- a/src/TaskForm.jsx +++ b/src/TaskForm.jsx @@ -68,9 +68,7 @@ export default function TaskForm({ const response = await createTask({ user, values }); if (response) { let msg = { - title: values.title, - description: values.description, - taskID: values.taskID, + title: "Your task has been created", campaignCode: values.campaignCode, }; showSuccess(msg); @@ -87,7 +85,6 @@ export default function TaskForm({ let msg = { title: values.title, description: values.description, - taskID: values.taskID, campaignCode: values.campaignCode, }; showSuccess(msg); @@ -107,7 +104,9 @@ export default function TaskForm({ {({ isSubmitting, setFieldValue }) => (
-

Tell us about your task

+

+ {taskValues ? "Edit task details" : "Tell us about your task"} +

{/* Hidden field for Created By */} @@ -179,6 +178,8 @@ export default function TaskForm({ label="Description" fullWidth required + multiline + rows={2} /> - {taskValues ? "Edit Task" : "Submit Request"} + {taskValues ? "Update" : "Submit Request"}
diff --git a/src/styles/dialogs.css b/src/styles/dialogs.css index 73cfcd6..149ccb6 100644 --- a/src/styles/dialogs.css +++ b/src/styles/dialogs.css @@ -11,7 +11,8 @@ #success-dialog { background-color: #2d5b39eb; top: 20%; - width: 60vw; + width: 50vw; + max-width: 50rem; color: white; h3 { @@ -20,9 +21,6 @@ font-size: 1.5rem; color: #c9ff79; } - .task-info__container { - border: 1px solid var(--rose); - } .task-info { font-size: 1.2rem; small { diff --git a/src/styles/forms.css b/src/styles/forms.css index 41371c5..1a3bd9a 100644 --- a/src/styles/forms.css +++ b/src/styles/forms.css @@ -1,5 +1,5 @@ .task-request-form { - width: 75%; + width: 55%; text-align: center; display: flex; flex-direction: column; From ed5563dd8abd97ba5588fbd6852c17efeeb2f81c Mon Sep 17 00:00:00 2001 From: acholyn Date: Fri, 29 Nov 2024 10:58:08 +0000 Subject: [PATCH 09/48] making BM always visible --- src/App.jsx | 255 +++++++++++++++++++------------------ src/styles/burger-menu.css | 1 + 2 files changed, 131 insertions(+), 125 deletions(-) diff --git a/src/App.jsx b/src/App.jsx index cb49f2d..18f94d4 100644 --- a/src/App.jsx +++ b/src/App.jsx @@ -37,9 +37,9 @@ export default function App() { const [BMopen, setBMopen] = useState(false); const [boundsVisible, setBoundsVisible] = useState(false); - const [polygonStore, setPolygonStore] = useState(null); - const [focusTask, setFocusTask] = useState(null); - const [chosenTask, setChosenTask] = useState(null); + const [polygonStore, setPolygonStore] = useState(null); // for showing polygons + const [focusTask, setFocusTask] = useState(null); // for showing data points + const [chosenTask, setChosenTask] = useState(null); // for showing task in list from popup const [taskListName, setTaskListName] = useState("mine"); @@ -91,10 +91,13 @@ export default function App() { polygons.push(task); } }); + console.log("polygons", polygons); return polygons; }; const showSearchResults = (results) => { + console.log("show search results", results); + setBoundsVisible(false); if (results !== searchResults) { setPolygonStore(null); // reset polygon store for each new search setSearchResults(results); @@ -131,134 +134,136 @@ export default function App() { }; return ( -
- {errorMsg && } - {!isLoginFormVisible && !user.loggedIn && !signUpFormVisible && ( -
- - -
- )} - - - {confirmModalVisible && ( - +
+ {errorMsg && } + {!isLoginFormVisible && !user.loggedIn && !signUpFormVisible && ( +
+ + +
+ )} + - )} - {successModalVisible && !successIsTask && ( - - )} - {successModalVisible && successIsTask && ( - - )} - {user.loggedIn && ( - <> - -
-
- {/* this is where the bot responses will go */} + {confirmModalVisible && ( + + )} + {successModalVisible && !successIsTask && ( + + )} + {successModalVisible && successIsTask && ( + + )} + + {user.loggedIn && ( + <> +
+
+ {/* this is where the bot responses will go */} +
+ +
+
+ + - -
-
- - +
+ - - -
- - setTaskListVisible(true)} - className="btn--view-tasks" - > - TASKS - - - )} -
+ setTaskListVisible(true)} + className="btn--view-tasks" + > + TASKS + + + )} +
+ ); } diff --git a/src/styles/burger-menu.css b/src/styles/burger-menu.css index 33b36a4..f8e7d99 100644 --- a/src/styles/burger-menu.css +++ b/src/styles/burger-menu.css @@ -1,4 +1,5 @@ .btn--burger-menu { + position: fixed !important; height: fit-content; margin-left: 1rem !important; margin-top: 1rem !important; From 7f22468cb3b4abe47c3c8d3b28f5146031c0a046 Mon Sep 17 00:00:00 2001 From: acholyn Date: Fri, 29 Nov 2024 11:51:02 +0000 Subject: [PATCH 10/48] updating background + search bar width + task btn --- src/App.jsx | 82 ++++++++++++++++++++------------------ src/Mapbox.jsx | 14 +++++-- src/SearchForm.jsx | 13 ++++-- src/styles/App.css | 12 ++++++ src/styles/burger-menu.css | 2 +- src/styles/forms.css | 5 +++ src/styles/search.css | 4 +- 7 files changed, 84 insertions(+), 48 deletions(-) diff --git a/src/App.jsx b/src/App.jsx index 18f94d4..b941b1c 100644 --- a/src/App.jsx +++ b/src/App.jsx @@ -202,26 +202,31 @@ export default function App() { /> )} - {user.loggedIn && ( - <> -
-
- {/* this is where the bot responses will go */} -
- -
-
- + {!user.loggedIn &&
} + +
+
+ {/* this is where the bot responses will go */} +
+ + +
+
+ + {user.loggedIn && ( + <> -
- - setTaskListVisible(true)} - className="btn--view-tasks" - > - TASKS - - - )} + + setTaskListVisible(true)} + className="btn--view-tasks" + > + Task WhatsApp Mappers + + + )} +
+ ); diff --git a/src/Mapbox.jsx b/src/Mapbox.jsx index 4ea3bac..4ff4c27 100644 --- a/src/Mapbox.jsx +++ b/src/Mapbox.jsx @@ -11,12 +11,11 @@ export function Map({ taskListOpen, focusTask, showTaskInList, + isBackground, }) { const map = useRef(null); const popupRef = useRef(null); - console.log("polygonStore in map", polygonStore); - const addMapClickListener = () => { // listen for click on a polygon map.current.on("click", "polygon-fill", (e) => { @@ -73,7 +72,7 @@ export function Map({ map.current = new mapboxgl.Map({ container: "map", style: "mapbox://styles/mapbox/dark-v11", - zoom: 1.2, + zoom: 1.3, center: [30, 50], projection: "globe", }); @@ -267,5 +266,12 @@ export function Map({ } }, [focusTask]); - return
; + return ( +
+ ); } diff --git a/src/SearchForm.jsx b/src/SearchForm.jsx index 9c12713..c563cec 100644 --- a/src/SearchForm.jsx +++ b/src/SearchForm.jsx @@ -8,7 +8,11 @@ import ArrowUpwardRoundedIcon from "@mui/icons-material/ArrowUpwardRounded"; import "./styles/search.css"; -export default function SearchForm({ showSearchResults, taskListOpen }) { +export default function SearchForm({ + showSearchResults, + taskListOpen, + isBackground, +}) { const user = useUserStore(); const [snackbarOpen, setSnackbarOpen] = useState(false); const [tasks, setTasks] = useState([]); @@ -46,6 +50,7 @@ export default function SearchForm({ showSearchResults, taskListOpen }) { } else showSearchResults(results); }; const handleRefresh = async () => { + // todo: get this to work try { const fetchTasks = async () => { var fetchedTasks = await fetchAllTasks({ user }); @@ -95,7 +100,9 @@ export default function SearchForm({ showSearchResults, taskListOpen }) { {({ isSubmitting, setFieldValue }) => (
diff --git a/src/styles/App.css b/src/styles/App.css index d366f20..1f4d74b 100644 --- a/src/styles/App.css +++ b/src/styles/App.css @@ -5,6 +5,7 @@ --intrinsic-grey: #16161d; --intrinsic-grey--translucent: #16161dd5; + --intrinsic-grey--translucent-2: #16161d69; --off-white: #eae1e1; --rose: var(--mui-palette-info-200); --dark-grey--translucent: #2a282888; @@ -28,6 +29,7 @@ main { height: 100vh; .login-signup__wrapper { + z-index: 3; justify-self: center; display: flex; flex-direction: column; @@ -37,6 +39,16 @@ main { justify-content: center; } } +.background { + pointer-events: none !important; +} +.shield { + position: absolute; + width: 100%; + height: 100%; + background-color: var(--intrinsic-grey--translucent-2); + z-index: 2; +} .task-map-wrapper { display: grid; diff --git a/src/styles/burger-menu.css b/src/styles/burger-menu.css index f8e7d99..980b495 100644 --- a/src/styles/burger-menu.css +++ b/src/styles/burger-menu.css @@ -3,7 +3,7 @@ height: fit-content; margin-left: 1rem !important; margin-top: 1rem !important; - z-index: 1; + z-index: 3; justify-self: flex-start; align-self: flex-start; } diff --git a/src/styles/forms.css b/src/styles/forms.css index 1a3bd9a..7d625ea 100644 --- a/src/styles/forms.css +++ b/src/styles/forms.css @@ -24,6 +24,7 @@ .login__form--container, .signup__form--container { + z-index: 3; display: flex; flex-direction: column; gap: 1rem; @@ -37,6 +38,10 @@ display: flex; flex-direction: column; gap: 0.8rem; + + div { + background-color: var(--intrinsic-grey--translucent); + } } .form__row { diff --git a/src/styles/search.css b/src/styles/search.css index c7ca2ee..255032a 100644 --- a/src/styles/search.css +++ b/src/styles/search.css @@ -6,7 +6,7 @@ } .search__form { - width: 75%; + width: 40%; display: flex; align-self: end; justify-self: center; @@ -19,7 +19,7 @@ &.splitscreen { grid-column: 1; - width: 90%; + width: 80%; transition: width ease 1.5s; justify-items: center; justify-self: center; From 81aa6e2bde3b84299a358e6accb2e9fb3b75e990 Mon Sep 17 00:00:00 2001 From: acholyn Date: Fri, 29 Nov 2024 12:54:14 +0000 Subject: [PATCH 11/48] disabling login success --- src/App.jsx | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/App.jsx b/src/App.jsx index b941b1c..b9a1105 100644 --- a/src/App.jsx +++ b/src/App.jsx @@ -62,10 +62,10 @@ export default function App() { setConfirmModalVisible(true); }; const showLoginSuccessModal = (message) => { - setSuccessModalVisible(true); - setSuccessMsg(message); - setSuccessIsTask(false); - setEmail(""); + // setSuccessModalVisible(true); + // setSuccessMsg(message); + // setSuccessIsTask(false); + // setEmail(""); }; const showFilledLoginForm = (email) => { From e3861c3b03b3897982fbdad8b8ff6922e1c15e46 Mon Sep 17 00:00:00 2001 From: acholyn Date: Fri, 29 Nov 2024 13:02:30 +0000 Subject: [PATCH 12/48] moving checkbox and making submit cintengent on its being checked --- src/TaskForm.jsx | 18 +++++++++--------- src/styles/forms.css | 1 - 2 files changed, 9 insertions(+), 10 deletions(-) diff --git a/src/TaskForm.jsx b/src/TaskForm.jsx index 3b7601a..2bde781 100644 --- a/src/TaskForm.jsx +++ b/src/TaskForm.jsx @@ -101,7 +101,7 @@ export default function TaskForm({ // validation schema currently not valid onSubmit={taskValues ? handleEdit : handleSubmit} > - {({ isSubmitting, setFieldValue }) => ( + {({ isSubmitting, setFieldValue, values }) => (

@@ -154,13 +154,6 @@ export default function TaskForm({

*/} - {/* Visible on Kapta Web */} -
- -
{/* Title */} Your campaign code: {initialValues.campaignCode}

)} + {/* Visible on Kapta Web */} +
+ +
{/* Submit Button */}
Date: Fri, 29 Nov 2024 13:16:10 +0000 Subject: [PATCH 14/48] task btn not uppercase --- src/styles/App.css | 1 + 1 file changed, 1 insertion(+) diff --git a/src/styles/App.css b/src/styles/App.css index 1f4d74b..fd3660d 100644 --- a/src/styles/App.css +++ b/src/styles/App.css @@ -78,4 +78,5 @@ main { right: 4%; bottom: 9%; z-index: 2 !important; + text-transform: none !important; } From 320896438a9d0f67321ba751bc26d06d05f2bc7c Mon Sep 17 00:00:00 2001 From: acholyn Date: Fri, 29 Nov 2024 13:21:06 +0000 Subject: [PATCH 15/48] removing improve map from attribution --- src/Mapbox.jsx | 1 + src/styles/mapbox.css | 3 +++ 2 files changed, 4 insertions(+) diff --git a/src/Mapbox.jsx b/src/Mapbox.jsx index 4ff4c27..21daf96 100644 --- a/src/Mapbox.jsx +++ b/src/Mapbox.jsx @@ -75,6 +75,7 @@ export function Map({ zoom: 1.3, center: [30, 50], projection: "globe", + attributionControl: true, }); map.current.on("load", () => { map.current.setFog({ diff --git a/src/styles/mapbox.css b/src/styles/mapbox.css index 01e9829..cc55d9d 100644 --- a/src/styles/mapbox.css +++ b/src/styles/mapbox.css @@ -27,6 +27,9 @@ cursor: pointer; } } + .mapbox-improve-map { + display: none; + } } .mapboxgl-ctrl-attrib { From 55adf80392b0f38cab0b1876eb86f23ecb9d83be Mon Sep 17 00:00:00 2001 From: acholyn Date: Fri, 29 Nov 2024 13:44:21 +0000 Subject: [PATCH 16/48] osm contributors --- src/Mapbox.jsx | 8 ++++++++ src/styles/mapbox.css | 4 ++-- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/src/Mapbox.jsx b/src/Mapbox.jsx index 21daf96..f93711b 100644 --- a/src/Mapbox.jsx +++ b/src/Mapbox.jsx @@ -87,6 +87,14 @@ export function Map({ }); }); + const attributionControl = map.current._controls.find( + (control) => control instanceof mapboxgl.AttributionControl + ); + + if (attributionControl) { + attributionControl._container.innerHTML = + '© Mapbox, OpenStreetMap Contributors'; + } // make this function available from when the map initialises window.handlePopupDetailsClick = (id) => { showTaskInList(id); diff --git a/src/styles/mapbox.css b/src/styles/mapbox.css index cc55d9d..4e6a8d8 100644 --- a/src/styles/mapbox.css +++ b/src/styles/mapbox.css @@ -35,8 +35,8 @@ .mapboxgl-ctrl-attrib { background-color: transparent !important; font-size: 0.6rem; - - .mapboxgl-ctrl-attrib-inner > a { + a, + & { color: grey; } } From 6795d49971addfbb58776f0bad3e065950cde3bc Mon Sep 17 00:00:00 2001 From: acholyn Date: Fri, 29 Nov 2024 13:58:38 +0000 Subject: [PATCH 17/48] adding a temp mobile version --- src/TempMobileApp.jsx | 15 +++++++++++++++ src/main.jsx | 6 +++++- src/styles/App.css | 10 ++++++++++ src/utils/generalUtils.js | 13 +++++++++++++ 4 files changed, 43 insertions(+), 1 deletion(-) create mode 100644 src/TempMobileApp.jsx create mode 100644 src/utils/generalUtils.js diff --git a/src/TempMobileApp.jsx b/src/TempMobileApp.jsx new file mode 100644 index 0000000..22670bf --- /dev/null +++ b/src/TempMobileApp.jsx @@ -0,0 +1,15 @@ +import { Button } from "@mui/material"; +import { WA_CHAT_URL } from "./globals"; + +export default function TempMobileApp() { + return ( +
+

The mobile version of this site is currently under development.

+

Please visit on a computer to explore with KAPTA

+ + +
+ ); +} diff --git a/src/main.jsx b/src/main.jsx index 80b57e1..6b505fe 100644 --- a/src/main.jsx +++ b/src/main.jsx @@ -12,6 +12,8 @@ import { deepOrange, grey, } from "@mui/material/colors"; +import { isMobileDevice } from "./utils/generalUtils.js"; +import TempMobileApp from "./TempMobileApp.jsx"; const theme = createTheme({ palette: { @@ -41,13 +43,15 @@ const theme = createTheme({ }, cssVariables: true, }); +const isMobile = isMobileDevice(); +console.log("isMobile", isMobile); createRoot(document.getElementById("root")).render( {" "} - {" "} + {isMobile ? : }{" "} diff --git a/src/styles/App.css b/src/styles/App.css index fd3660d..0584e0a 100644 --- a/src/styles/App.css +++ b/src/styles/App.css @@ -80,3 +80,13 @@ main { z-index: 2 !important; text-transform: none !important; } + +.temp-mobile-app { + height: 100vh; + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + margin-inline: 4%; + text-align: center; +} diff --git a/src/utils/generalUtils.js b/src/utils/generalUtils.js new file mode 100644 index 0000000..47ab67a --- /dev/null +++ b/src/utils/generalUtils.js @@ -0,0 +1,13 @@ +export function isMobileDevice() { + const userAgent = navigator.userAgent || navigator.vendor || window.opera; + + // Check for iPad separately since it might not be detected as mobile + if (/iPad/.test(userAgent) && !window.MSStream) { + return false; // Treat iPads as non-mobile devices + } + + // Check for other mobile devices + return /android|iPhone|iPod|avantgo|blackberry|bada|bb|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile|netfront|nokia|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|symbian|treo|up(\.browser|link)|vodafone|wap|windows (ce|phone)|xda|xiino/i.test( + userAgent.toLowerCase() + ); +} From 509118f18d1f2629cba18ddb62c422f83055a03a Mon Sep 17 00:00:00 2001 From: acholyn Date: Fri, 29 Nov 2024 14:31:58 +0000 Subject: [PATCH 18/48] tidying + style tweaks --- src/App.jsx | 1 - src/Mapbox.jsx | 9 ++++++--- src/main.jsx | 1 - src/styles/App.css | 2 +- src/styles/mapbox.css | 1 + src/styles/task-list.css | 2 +- 6 files changed, 9 insertions(+), 7 deletions(-) diff --git a/src/App.jsx b/src/App.jsx index 01fd5f5..f4d4f37 100644 --- a/src/App.jsx +++ b/src/App.jsx @@ -96,7 +96,6 @@ export default function App() { }; const showSearchResults = (results) => { - console.log("show search results", results); setBoundsVisible(false); if (results !== searchResults) { setPolygonStore(null); // reset polygon store for each new search diff --git a/src/Mapbox.jsx b/src/Mapbox.jsx index f93711b..498c3b8 100644 --- a/src/Mapbox.jsx +++ b/src/Mapbox.jsx @@ -103,9 +103,12 @@ export function Map({ // resize the map when splitscreen useEffect(() => { - if (map.current) { - map.current.resize(); - } + const timeoutId = setTimeout(() => { + if (map.current) { + map.current.resize(); + } + }, 100); + return () => clearTimeout(timeoutId); }, [taskListOpen]); // handle polygons diff --git a/src/main.jsx b/src/main.jsx index 6b505fe..c389182 100644 --- a/src/main.jsx +++ b/src/main.jsx @@ -44,7 +44,6 @@ const theme = createTheme({ cssVariables: true, }); const isMobile = isMobileDevice(); -console.log("isMobile", isMobile); createRoot(document.getElementById("root")).render( diff --git a/src/styles/App.css b/src/styles/App.css index 0584e0a..501887b 100644 --- a/src/styles/App.css +++ b/src/styles/App.css @@ -77,7 +77,7 @@ main { width: fit-content !important; right: 4%; bottom: 9%; - z-index: 2 !important; + z-index: 1 !important; text-transform: none !important; } diff --git a/src/styles/mapbox.css b/src/styles/mapbox.css index 4e6a8d8..592402b 100644 --- a/src/styles/mapbox.css +++ b/src/styles/mapbox.css @@ -8,6 +8,7 @@ #map { height: 100%; grid-column: span 2; + &.splitscreen { grid-column: span 1; width: 62vw !important; diff --git a/src/styles/task-list.css b/src/styles/task-list.css index 43c662e..94e7804 100644 --- a/src/styles/task-list.css +++ b/src/styles/task-list.css @@ -1,5 +1,5 @@ .task-list__drawer { - z-index: 3; + z-index: 2; .MuiPaper-root { width: 100%; From 7ad8510984ca91f0107832e55e41546dabe73f54 Mon Sep 17 00:00:00 2001 From: acholyn Date: Fri, 29 Nov 2024 14:46:36 +0000 Subject: [PATCH 19/48] tidying + making points and download conditional --- src/Mapbox.jsx | 6 +----- src/utils/TaskCard.jsx | 9 ++++++--- 2 files changed, 7 insertions(+), 8 deletions(-) diff --git a/src/Mapbox.jsx b/src/Mapbox.jsx index 498c3b8..5356d02 100644 --- a/src/Mapbox.jsx +++ b/src/Mapbox.jsx @@ -119,7 +119,6 @@ export function Map({ // is search results if (Array.isArray(polygonStore)) { - console.log("is array"); newData = { type: "FeatureCollection", features: polygonStore.map((polygon) => ({ @@ -163,7 +162,6 @@ export function Map({ data: newData, }); } else { - console.log("source exists"); // source already exists, update the data // removing data points since new task @@ -234,7 +232,7 @@ export function Map({ map.current.flyTo({ center: centroidPoint.geometry.coordinates, essential: true, - zoom: 3, + zoom: 4, }); } }, [polygonStore, boundsVisible, taskListOpen]); @@ -244,8 +242,6 @@ export function Map({ // flying to task when multiple loaded if (!map.current || !map.current.isStyleLoaded() || !focusTask) return; - console.log("flyign to task", focusTask); - if (focusTask && focusTask.geo_bounds) { getAndFitBounds(focusTask); } diff --git a/src/utils/TaskCard.jsx b/src/utils/TaskCard.jsx index ab9ec84..9ad3fe8 100644 --- a/src/utils/TaskCard.jsx +++ b/src/utils/TaskCard.jsx @@ -104,10 +104,12 @@ export default function TaskCard({ const cardActionBtns = [ { text: - taskId === displayedTask?.task_id ? "Show data points" : "Show on Map", + taskId === displayedTask?.task_id && userID === task.created_by + ? "Show data points" + : "Show on Map", icon: , action: - taskId === displayedTask?.task_id + taskId === displayedTask?.task_id && userID === task.created_by ? (task) => showDataPoints(task) : (task) => { handleShowOnMap(task); @@ -120,13 +122,14 @@ export default function TaskCard({ }, { - text: "Download Data", + text: userID === task.created_by ? "Download Data" : "Request Data", icon: , action: (task) => handleDownload(task), variant: "outlined", color: "orange", loading: true, typeName: "download", + disabled: userID !== task.created_by, }, ]; From b58302706587a462e4a1530615211b3d6e803bea Mon Sep 17 00:00:00 2001 From: acholyn Date: Fri, 29 Nov 2024 14:52:50 +0000 Subject: [PATCH 20/48] putting whatsapp on the contact button --- src/BurgerMenu.jsx | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/BurgerMenu.jsx b/src/BurgerMenu.jsx index b7ba199..b9eed50 100644 --- a/src/BurgerMenu.jsx +++ b/src/BurgerMenu.jsx @@ -161,7 +161,9 @@ export default function BurgerMenu({ isOpen, setIsOpen }) {
Have feedback or want to get in touch? - +
- + {user.loggedIn && ( + + )} From 31b0dbc94040f4324adbe1814561589ab86f40cb Mon Sep 17 00:00:00 2001 From: acholyn Date: Mon, 2 Dec 2024 15:59:40 +0000 Subject: [PATCH 29/48] removing disclaimer, adding legal notice --- src/BurgerMenu.jsx | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/BurgerMenu.jsx b/src/BurgerMenu.jsx index 2063561..a36b179 100644 --- a/src/BurgerMenu.jsx +++ b/src/BurgerMenu.jsx @@ -81,7 +81,14 @@ export default function BurgerMenu({ isOpen, setIsOpen }) { title: "About", icon: , subtitle: "Kapta Mobile is a Progressive Web App to create WhatsApp Maps", - content: "", + content: `

Legal Notice

+

+This website is operated by Wisdom of the Crowd Labs Ltd, a not-for-profit UCL spinout company registered in England and Wales.
+Registered Office: ExCiteS C/O WCL, Geography Department, University College London, Gower St, London, United Kingdom, WC1E 6BT
+Company Registration Number: 15934186
+Contact: info@kapta.earth
+All content on this website is protected by copyright and other applicable laws. Wisdom of the Crowd Labs Ltd accepts no liability for external links or third-party content.
+Governing Law: This website and its use are governed by the laws of England and Wales

`, }, { title: "People", @@ -104,13 +111,6 @@ export default function BurgerMenu({ isOpen, setIsOpen }) { "Kapta:A (de)centralised crowdsourcing system to connect users and producers of ground information.", content: "", }, - { - title: "Disclaimer", - icon: , - subtitle: - "The Kapta team has made every effort to develop an app that parse WhatsApp chats to create WhatsApp Maps with the highest possible accuracy. However, we cannot accept responsibility for any errors, omissions, or inconsistencies that may occur.", - content: ` Please always make your own judgement about the accuracy of the maps and validate the information using other sources. If you encounter any issues or have feedback, please reach out to us at geog.excites@ucl.ac.uk or via WhatsApp at +34 678380944.`, - }, ]; const handleAccordionChange = (panel) => (event, isExpanded) => { setExpandedPanel(isExpanded ? panel : false); From c1f9a9611991fbb01d2b8ac2102b0abcadc5240d Mon Sep 17 00:00:00 2001 From: acholyn Date: Mon, 2 Dec 2024 16:35:36 +0000 Subject: [PATCH 30/48] updating colours --- src/App.jsx | 2 +- src/LoginForm.jsx | 2 +- src/SearchForm.jsx | 4 ++-- src/SignUpForm.jsx | 2 +- src/TaskList.jsx | 2 +- src/main.jsx | 31 +++++++------------------------ src/styles/App.css | 1 - src/styles/burger-menu.css | 4 ++-- src/styles/forms.css | 2 +- src/styles/task-list.css | 6 +++--- src/utils/TaskCard.jsx | 4 ++-- 11 files changed, 21 insertions(+), 39 deletions(-) diff --git a/src/App.jsx b/src/App.jsx index a84b64f..e344b86 100644 --- a/src/App.jsx +++ b/src/App.jsx @@ -254,7 +254,7 @@ export default function App() { setTaskListVisible(true)} className="btn--view-tasks" > diff --git a/src/LoginForm.jsx b/src/LoginForm.jsx index 05cb30c..c99f6fe 100644 --- a/src/LoginForm.jsx +++ b/src/LoginForm.jsx @@ -51,7 +51,7 @@ export default function LoginForm({ {({ isSubmitting }) => ( - + Log in - + diff --git a/src/SignUpForm.jsx b/src/SignUpForm.jsx index e598866..2a2dad7 100644 --- a/src/SignUpForm.jsx +++ b/src/SignUpForm.jsx @@ -100,7 +100,7 @@ export default function SignUpForm({ > {({ isSubmitting, setFieldValue }) => (
- + Create Account
diff --git a/src/TaskList.jsx b/src/TaskList.jsx index 4fb40db..d58712b 100644 --- a/src/TaskList.jsx +++ b/src/TaskList.jsx @@ -162,7 +162,7 @@ export default function TaskList({ , action: (task) => handleDownload(task), - variant: "outlined", - color: "orange", + variant: "contained", + color: "info2", loading: true, typeName: "download", disabled: userID !== task.created_by, From f6eb5436ccc54cc67e826d228efbc97108a2eae0 Mon Sep 17 00:00:00 2001 From: acholyn Date: Tue, 3 Dec 2024 09:49:31 +0000 Subject: [PATCH 31/48] colours + favicon --- index.html | 2 +- public/Logo_green_white.svg | 1 + public/favicon.ico | Bin 212794 -> 0 bytes public/favicon.svg | 1 + public/logo_green_transparent.svg | 1 + src/App.jsx | 21 +++++++++-------- src/BurgerMenu.jsx | 36 +++++++++++++++++++++++++++--- src/LoginForm.jsx | 4 ++-- src/SearchForm.jsx | 2 +- src/SignUpForm.jsx | 4 ++-- src/TaskList.jsx | 2 +- src/main.jsx | 7 +++++- src/styles/burger-menu.css | 9 ++++++-- src/styles/task-list.css | 8 +++---- src/utils/TaskCard.jsx | 6 ++--- 15 files changed, 73 insertions(+), 31 deletions(-) create mode 100644 public/Logo_green_white.svg delete mode 100644 public/favicon.ico create mode 100644 public/favicon.svg create mode 100644 public/logo_green_transparent.svg diff --git a/index.html b/index.html index 69f47cd..6463442 100644 --- a/index.html +++ b/index.html @@ -2,7 +2,7 @@ - + \ No newline at end of file diff --git a/public/favicon.ico b/public/favicon.ico deleted file mode 100644 index cfc03f70050bc02e3fbba660c72469de5b973c5d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 212794 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�|iMRx8Cu)n(-fU}v{V;Hog&Cfo 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 diff --git a/public/favicon.svg b/public/favicon.svg new file mode 100644 index 0000000..ecbb4d4 --- /dev/null +++ b/public/favicon.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/logo_green_transparent.svg b/public/logo_green_transparent.svg new file mode 100644 index 0000000..006a658 --- /dev/null +++ b/public/logo_green_transparent.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/App.jsx b/src/App.jsx index e344b86..1e2c60f 100644 --- a/src/App.jsx +++ b/src/App.jsx @@ -250,17 +250,16 @@ export default function App() { chosenTaskId={chosenTaskId} scrollFlashTask={scrollFlashTask} /> - {user.loggedIn && ( - setTaskListVisible(true)} - className="btn--view-tasks" - > - Task WhatsApp Mappers - - )} + setTaskListVisible(true)} + className="btn--view-tasks" + disabled={!user.loggedIn} + > + Task WhatsApp Mappers +
Have feedback or want to get in touch? - + + Contact us on{" "} + {" "} + or email us at{" "} + +
{user.loggedIn && (
`, }, { - title: "What's Next?", - icon: , - subtitle: - "Kapta:A (de)centralised crowdsourcing system to connect users and producers of ground information.", - content: "", + title: "Discover", + icon: , + subtitle: "", + hasSubTabs: true, + subTabs: [ + { + title: "Case Study", + content: `

Is this the first-ever WhatsApp Map?

Is this the first-ever WhatsApp Map? +

The traditional method of assessing water infrastructure relies on field surveyors, a process that is often slow and costly. This can pose challenges for timely decision-making, especially in regions facing drought and hunger. In May 2024, pastoralists from various villages were engaged in the data collection process. Organised into WhatsApp groups and using Kapta, they facilitated faster and more efficient assessments by creating WhatsApp Maps on water infrastructure. Within just a few days, these WhatsApp mappers determined that 75% of the water infrastructure was non-functional, providing local authorities with accurate, ground-level information to take quicker and more informed action.

More case studies coming soon.

`, + }, + { + title: "Extreme Citizen Science", + content: `

Kapta is inspired by Extreme Citizen Science (ExCiteS), a community-led approach to creating decision-useful maps via WhatsApp that values and integrates local needs, traditions, and cultures. This co-design-based approach is committed to empowering individuals anywhere to share their knowledge through the development of innovative tools and methods. +

`, + }, + ], + }, + { + title: "About", + icon: , + subtitle: "", + hasSubTabs: true, + subTabs: [ + { + title: "Ethics", + content: `

+TWe prioritise enhancing the capabilities of individuals and communities impacted by our work, ensuring that every action serves a meaningful purpose and aligns with the public interest. Ethics is at the core of our decisions, helping us build trust and foster collective intelligence. By focusing on fairness, transparency, and inclusivity, we develop solutions that empower people to make better decisions in an increasingly complex world shaped by global environmental changes. Our work is guided by a commitment to contribute to a more equitable, sustainable, and socially responsible future for all. +

We embrace open-source principles to promote collective progress and serve the public interest. By sharing our tools and methods openly, we enable others to adapt them to diverse challenges and encourage broader participation in knowledge sharing. This approach fosters collaboration across geographies and cultures, driving solutions that benefit society as a whole.

`, + }, + { + title: "Team", + content: `

Founders:

+Team: +Advisors:
    +
  • Muki Haklay, UCL Geography
  • +
  • Claire Ellul, UCL Civil Environmental and Geomatic Engineering
  • +
  • Jerome Lewis, UCL Anthropology
  • +
  • Jonathan Cooper, UCL Advanced Research Computing
  • + +

    `, + }, + ], }, ]; const handleAccordionChange = (panel) => (event, isExpanded) => { setExpandedPanel(isExpanded ? panel : false); }; + const handleSubAccordionChange = (subPanel) => (event, isExpanded) => { + setExpandedSubPanel(isExpanded ? subPanel : false); + }; return ( <> {section.subtitle} - {parse(section.content)} + + {section.hasSubTabs + ? section.subTabs.map((subTab, subIndex) => ( + + } + aria-controls={`subPanel${index}${subIndex}a-content`} + id={`subPanel${index}${subIndex}a-header`} + > + + {subTab.title} + + + + + {parse(subTab.content)} + + + + )) + : parse(section.content)} + ))} @@ -186,24 +258,14 @@ All content on this website is protected by copyright and other applicable laws. Logout )} - - Legal Notice -

    - This website is operated by{" "} - Wisdom of the Crowd Labs Ltd, a not-for-profit - UCL spinout company registered in England and Wales.

    - Registered Office: ExCiteS C/O WCL, Geography - Department, University College London, Gower St, London, United - Kingdom, WC1E 6BT

    - Company Registration Number: 15934186

    - Contact: info@kapta.earth

    - All content on this website is protected by copyright and other - applicable laws. Wisdom of the Crowd Labs Ltd accepts no liability - for external links or third-party content.

    - Governing Law: This website and its use are - governed by the laws of England and Wales -

    + + © 2024 Wisdom of the Crowd Labs, All rights reserved -{" "} + + diff --git a/src/styles/burger-menu.css b/src/styles/burger-menu.css index 3a0688d..8bc26b1 100644 --- a/src/styles/burger-menu.css +++ b/src/styles/burger-menu.css @@ -48,4 +48,10 @@ font-size: inherit; } } + + #legal-notice { + margin-inline: 2%; + color: var(--mui-palette-secondary-main); + font-size: 50%; + } } diff --git a/src/utils/LegalNoticeModal.jsx b/src/utils/LegalNoticeModal.jsx new file mode 100644 index 0000000..57eed91 --- /dev/null +++ b/src/utils/LegalNoticeModal.jsx @@ -0,0 +1,33 @@ +import { CloseButton } from "./Buttons"; + +export default function LegalNotice({ isVisible, setIsVisible, message }) { + if (!message) { + setIsVisible(false); + return null; + } + return ( + <> + {isVisible && ( + + +

    Legal Notice

    +

    + This website is operated by{" "} + Wisdom of the Crowd Labs Ltd, a not-for-profit UCL + spinout company registered in England and Wales.

    + Registered Office: ExCiteS C/O WCL, Geography + Department, University College London, Gower St, London, United + Kingdom, WC1E 6BT

    + Company Registration Number: 15934186

    + Contact: info@kapta.earth

    + All content on this website is protected by copyright and other + applicable laws. Wisdom of the Crowd Labs Ltd accepts no liability + for external links or third-party content.

    + Governing Law: This website and its use are + governed by the laws of England and Wales +

    +
    + )} + + ); +} diff --git a/src/utils/icons.jsx b/src/utils/icons.jsx new file mode 100644 index 0000000..fceb0cb --- /dev/null +++ b/src/utils/icons.jsx @@ -0,0 +1,21 @@ +import { SvgIcon } from "@mui/material"; + +export const KaptaSVGIcon = (props) => ( + + + +); From 112b74d28ce8b2afd7160e7af501b2103dc2c9ee Mon Sep 17 00:00:00 2001 From: acholyn Date: Tue, 3 Dec 2024 12:05:01 +0000 Subject: [PATCH 33/48] fixing fitting bounds of points --- src/Mapbox.jsx | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/src/Mapbox.jsx b/src/Mapbox.jsx index bfc7d33..d1eae6e 100644 --- a/src/Mapbox.jsx +++ b/src/Mapbox.jsx @@ -47,9 +47,13 @@ export function Map({ }; const getAndFitBounds = (focusTask) => { - const turfPoly = polygon([focusTask.geo_bounds.coordinates]); - - const bounds = bbox(turfPoly); + let bounds; + if (focusTask.type === "FeatureCollection") { + bounds = bbox(focusTask); + } else { + const turfPoly = polygon([focusTask.geo_bounds.coordinates]); + bounds = bbox(turfPoly); + } map.current.fitBounds(bounds, { padding: 200, }); @@ -99,8 +103,8 @@ export function Map({ const center = map.current.getCenter(); const zoom = map.current.getZoom(); map.current.resize(); - map.current.setCenter(center); - map.current.setZoom(zoom); + // map.current.setCenter(center); + // map.current.setZoom(zoom); } }, 100); return () => clearTimeout(timeoutId); From 284180d55296557aa4549dad1754b0f44ce371f6 Mon Sep 17 00:00:00 2001 From: acholyn Date: Tue, 3 Dec 2024 12:11:06 +0000 Subject: [PATCH 34/48] tinkering with the focusing whilst maintaining zoom and center --- src/Mapbox.jsx | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/Mapbox.jsx b/src/Mapbox.jsx index d1eae6e..448eecd 100644 --- a/src/Mapbox.jsx +++ b/src/Mapbox.jsx @@ -98,13 +98,19 @@ export function Map({ // resize the map when splitscreen useEffect(() => { + // todo: this needs some polishing const timeoutId = setTimeout(() => { if (map.current) { const center = map.current.getCenter(); const zoom = map.current.getZoom(); map.current.resize(); - // map.current.setCenter(center); - // map.current.setZoom(zoom); + // setTimeout(() => { + map.current.flyTo({ + center: center, + zoom: zoom, + speed: 0.8, + }); + // }, 100); } }, 100); return () => clearTimeout(timeoutId); From 8ec1b482175a7c7147614004bd40e5c1ecba9d1c Mon Sep 17 00:00:00 2001 From: acholyn Date: Wed, 4 Dec 2024 11:46:05 +0000 Subject: [PATCH 35/48] polygon and point colours --- src/Mapbox.jsx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Mapbox.jsx b/src/Mapbox.jsx index 448eecd..35a40a3 100644 --- a/src/Mapbox.jsx +++ b/src/Mapbox.jsx @@ -194,7 +194,7 @@ export function Map({ source: "polygon-source", layout: {}, paint: { - "fill-color": "#ff6347", + "fill-color": "#087669", "fill-opacity": 0.6, }, }); @@ -205,7 +205,7 @@ export function Map({ type: "line", source: "polygon-source", paint: { - "line-color": "#e63621", + "line-color": "#075E54", "line-width": 4, }, }); @@ -270,7 +270,7 @@ export function Map({ source: "datapoints-source", paint: { "circle-radius": 5, - "circle-color": "#c8ff00", + "circle-color": "#25D366", }, }); } From 238c4dbcbd523113f342e07ce6ff53792936f683 Mon Sep 17 00:00:00 2001 From: acholyn Date: Wed, 4 Dec 2024 12:05:31 +0000 Subject: [PATCH 36/48] bm content, legal notice, white logo --- public/logo_white_transparent.svg | 1 + src/App.jsx | 13 ++++++++++++- src/BurgerMenu.jsx | 32 ++++++++++++++----------------- src/styles/burger-menu.css | 2 +- src/styles/dialogs.css | 10 +++++++--- src/utils/LegalNoticeModal.jsx | 14 +++++++------- src/utils/icons.jsx | 22 ++++++++++++++++++++- 7 files changed, 63 insertions(+), 31 deletions(-) create mode 100644 public/logo_white_transparent.svg diff --git a/public/logo_white_transparent.svg b/public/logo_white_transparent.svg new file mode 100644 index 0000000..2412023 --- /dev/null +++ b/public/logo_white_transparent.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/App.jsx b/src/App.jsx index 1e2c60f..032d948 100644 --- a/src/App.jsx +++ b/src/App.jsx @@ -14,6 +14,7 @@ import ConfirmModal from "./utils/ConfirmationModal"; import SuccessModal from "./SuccessModal"; import BurgerMenu from "./BurgerMenu"; import SearchResults from "./SearchResultsList"; +import LegalNotice from "./utils/LegalNoticeModal"; export default function App() { const [isTaskFormVisible, setTaskFormVisible] = useState(false); @@ -43,6 +44,8 @@ export default function App() { const [taskListName, setTaskListName] = useState("mine"); + const [noticeVisible, setNoticeVisible] = useState(false); + const user = useUserStore(); const showTaskForm = (task) => { @@ -203,7 +206,15 @@ export default function App() { isTask={true} /> )} - + + {!user.loggedIn &&
    } diff --git a/src/BurgerMenu.jsx b/src/BurgerMenu.jsx index e6cac55..c445fc1 100644 --- a/src/BurgerMenu.jsx +++ b/src/BurgerMenu.jsx @@ -20,15 +20,12 @@ import parse from "html-react-parser"; import { CloseButton } from "./utils/Buttons"; import "./styles/burger-menu.css"; import { useUserStore, WA_CHAT_URL } from "./globals"; -import LegalNotice from "./utils/LegalNoticeModal"; -import { KaptaSVGIcon } from "./utils/icons"; +import { KaptaSVGIconWhite } from "./utils/icons"; -export default function BurgerMenu({ isOpen, setIsOpen }) { +export default function BurgerMenu({ isOpen, setIsOpen, setNoticeVisible }) { const [expandedPanel, setExpandedPanel] = useState(false); const [expandedSubPanel, setExpandedSubPanel] = useState(false); - const [noticeVisible, setNoticeVisible] = useState(false); - const toggleDrawer = (open) => (event) => { if ( event.type === "keydown" && @@ -81,24 +78,20 @@ export default function BurgerMenu({ isOpen, setIsOpen }) { const menuSections = [ { title: "Kapta", - icon: , + icon: , subtitle: "Kapta is a WhatsApp-based crowdsourcing platform to help solve local, national and global challenges through searching WhatsApp Maps and tasking WhatsApp Mappers", - content: `Currently the core Kapta team consists of:
    `, + content: "", }, { title: "Work with us", icon: , subtitle: "We are open to building partnerships. Let's explore how Kapta can support your work.", - content: `Contact us at `, + `, }, { title: "Discover", @@ -260,12 +253,15 @@ Advisors:
      )} © 2024 Wisdom of the Crowd Labs, All rights reserved -{" "} - + { + toggleDrawer(false)(e); + setNoticeVisible(true); + }} + > + Legal Notice + - diff --git a/src/styles/burger-menu.css b/src/styles/burger-menu.css index 8bc26b1..64e4683 100644 --- a/src/styles/burger-menu.css +++ b/src/styles/burger-menu.css @@ -50,8 +50,8 @@ } #legal-notice { + text-align: center; margin-inline: 2%; color: var(--mui-palette-secondary-main); - font-size: 50%; } } diff --git a/src/styles/dialogs.css b/src/styles/dialogs.css index 149ccb6..bf95cc7 100644 --- a/src/styles/dialogs.css +++ b/src/styles/dialogs.css @@ -6,12 +6,12 @@ text-align: center; border-radius: 8px; padding-bottom: 3rem; + width: 50vw; } #success-dialog { background-color: #2d5b39eb; top: 20%; - width: 50vw; max-width: 50rem; color: white; @@ -42,14 +42,12 @@ #error-dialog { background-color: #531919d1; top: 24%; - width: 50vw; color: #f9e6e6; } #confirm-dialog { background-color: var(--dark-grey--translucent); top: 20%; - width: 50vw; color: #f9e6e6; padding-inline: 3%; @@ -57,3 +55,9 @@ margin-top: 1.5rem; } } + +#legal-dialog { + background-color: var(--dark-grey--translucent); + border: 1px solid var(--mui-palette-primary-main); + line-height: 1.3rem; +} diff --git a/src/utils/LegalNoticeModal.jsx b/src/utils/LegalNoticeModal.jsx index 57eed91..db8892a 100644 --- a/src/utils/LegalNoticeModal.jsx +++ b/src/utils/LegalNoticeModal.jsx @@ -1,10 +1,6 @@ import { CloseButton } from "./Buttons"; -export default function LegalNotice({ isVisible, setIsVisible, message }) { - if (!message) { - setIsVisible(false); - return null; - } +export default function LegalNotice({ isVisible, setIsVisible }) { return ( <> {isVisible && ( @@ -14,12 +10,16 @@ export default function LegalNotice({ isVisible, setIsVisible, message }) {

      This website is operated by{" "} Wisdom of the Crowd Labs Ltd, a not-for-profit UCL - spinout company registered in England and Wales.

      + spinout company registered in England and Wales. +

      +

      Registered Office: ExCiteS C/O WCL, Geography Department, University College London, Gower St, London, United Kingdom, WC1E 6BT

      Company Registration Number: 15934186

      - Contact: info@kapta.earth

      + Contact: info@kapta.earth +

      +

      All content on this website is protected by copyright and other applicable laws. Wisdom of the Crowd Labs Ltd accepts no liability for external links or third-party content.

      diff --git a/src/utils/icons.jsx b/src/utils/icons.jsx index fceb0cb..a1f5250 100644 --- a/src/utils/icons.jsx +++ b/src/utils/icons.jsx @@ -1,6 +1,6 @@ import { SvgIcon } from "@mui/material"; -export const KaptaSVGIcon = (props) => ( +export const KaptaSVGIconGreen = (props) => ( ( /> ); + +export const KaptaSVGIconWhite = (props) => ( + + + +); From 755be85d6dc9a0b70481d7db1ecddc1d04866424 Mon Sep 17 00:00:00 2001 From: tcouch Date: Wed, 4 Dec 2024 12:24:28 +0000 Subject: [PATCH 37/48] Use method chaining rather than settimeout --- src/Mapbox.jsx | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/src/Mapbox.jsx b/src/Mapbox.jsx index 448eecd..2c7e4fe 100644 --- a/src/Mapbox.jsx +++ b/src/Mapbox.jsx @@ -99,21 +99,15 @@ export function Map({ // resize the map when splitscreen useEffect(() => { // todo: this needs some polishing - const timeoutId = setTimeout(() => { if (map.current) { const center = map.current.getCenter(); const zoom = map.current.getZoom(); - map.current.resize(); - // setTimeout(() => { - map.current.flyTo({ + map.current.resize().flyTo({ center: center, zoom: zoom, speed: 0.8, }); - // }, 100); } - }, 100); - return () => clearTimeout(timeoutId); }, [taskListOpen]); // handle polygons From f999dc478aeffd38daf5af57f0150427ef95c0b5 Mon Sep 17 00:00:00 2001 From: acholyn Date: Wed, 4 Dec 2024 13:01:07 +0000 Subject: [PATCH 38/48] poster-ish --- src/App.jsx | 12 +++++++++ src/BurgerMenu.jsx | 51 +++++++++++++++++++++++++++++++------- src/styles/App.css | 15 +++++++++++ src/styles/burger-menu.css | 3 +++ src/utils/PosterModal.jsx | 17 +++++++++++++ 5 files changed, 89 insertions(+), 9 deletions(-) create mode 100644 src/utils/PosterModal.jsx diff --git a/src/App.jsx b/src/App.jsx index 032d948..17a0b2f 100644 --- a/src/App.jsx +++ b/src/App.jsx @@ -15,6 +15,8 @@ import SuccessModal from "./SuccessModal"; import BurgerMenu from "./BurgerMenu"; import SearchResults from "./SearchResultsList"; import LegalNotice from "./utils/LegalNoticeModal"; +import PosterModal from "./utils/PosterModal"; +import { KaptaSVGIconWhite } from "./utils/icons"; export default function App() { const [isTaskFormVisible, setTaskFormVisible] = useState(false); @@ -45,6 +47,7 @@ export default function App() { const [taskListName, setTaskListName] = useState("mine"); const [noticeVisible, setNoticeVisible] = useState(false); + const [posterVisible, setPosterVisible] = useState(false); const user = useUserStore(); @@ -141,6 +144,10 @@ export default function App() { return ( <>

      +
      + + Kapta +
      {errorMsg && } {!isLoginFormVisible && !user.loggedIn && !signUpFormVisible && (
      @@ -210,10 +217,15 @@ export default function App() { isVisible={noticeVisible} setIsVisible={setNoticeVisible} /> + {!user.loggedIn &&
      } diff --git a/src/BurgerMenu.jsx b/src/BurgerMenu.jsx index c445fc1..ad0f6c8 100644 --- a/src/BurgerMenu.jsx +++ b/src/BurgerMenu.jsx @@ -1,4 +1,4 @@ -import React, { useState } from "react"; +import React, { useEffect, useState } from "react"; import MenuIcon from "@mui/icons-material/Menu"; import ExpandMoreIcon from "@mui/icons-material/ExpandMore"; import TravelExploreIcon from "@mui/icons-material/TravelExplore"; @@ -22,9 +22,42 @@ import "./styles/burger-menu.css"; import { useUserStore, WA_CHAT_URL } from "./globals"; import { KaptaSVGIconWhite } from "./utils/icons"; -export default function BurgerMenu({ isOpen, setIsOpen, setNoticeVisible }) { +export default function BurgerMenu({ + isOpen, + setIsOpen, + setNoticeVisible, + setPosterVisible, +}) { const [expandedPanel, setExpandedPanel] = useState(false); const [expandedSubPanel, setExpandedSubPanel] = useState(false); + const user = useUserStore(); + const handlePosterClick = () => { + setPosterVisible(true); + setIsOpen(false); + console.log("handlePosterClick"); + }; + useEffect(() => { + const observer = new MutationObserver((mutationsList, observer) => { + for (let mutation of mutationsList) { + if (mutation.type === "childList") { + const imgElement = document.querySelector( + 'img[alt="Is this the first-ever WhatsApp Map?"]' + ); + if (imgElement) { + imgElement.addEventListener("click", handlePosterClick); + observer.disconnect(); // Stop observing once the element is found and event listener is attached + } + } + } + }); + + // Start observing the target node for configured mutations + observer.observe(document.body, { childList: true, subtree: true }); + + return () => { + observer.disconnect(); // Cleanup observer on component unmount + }; + }, []); const toggleDrawer = (open) => (event) => { if ( @@ -35,7 +68,7 @@ export default function BurgerMenu({ isOpen, setIsOpen, setNoticeVisible }) { } setIsOpen(open); }; - const user = useUserStore(); + const handleLogout = () => { user.logout(); toggleDrawer(false); @@ -46,6 +79,7 @@ export default function BurgerMenu({ isOpen, setIsOpen, setNoticeVisible }) { const viewSettings = () => { console.log("todo: view settings"); }; + const navItems = [ { text: "Logout", icon: , function: handleLogout }, // { text: "Profile", icon: , function: viewProfile }, @@ -101,13 +135,12 @@ export default function BurgerMenu({ isOpen, setIsOpen, setNoticeVisible }) { subTabs: [ { title: "Case Study", - content: `

      Is this the first-ever WhatsApp Map?

      Is this the first-ever WhatsApp Map? -

      The traditional method of assessing water infrastructure relies on field surveyors, a process that is often slow and costly. This can pose challenges for timely decision-making, especially in regions facing drought and hunger. In May 2024, pastoralists from various villages were engaged in the data collection process. Organised into WhatsApp groups and using Kapta, they facilitated faster and more efficient assessments by creating WhatsApp Maps on water infrastructure. Within just a few days, these WhatsApp mappers determined that 75% of the water infrastructure was non-functional, providing local authorities with accurate, ground-level information to take quicker and more informed action.

      More case studies coming soon.

      `, + content: `

      Is this the first-ever WhatsApp Map?

      Is this the first-ever WhatsApp Map? +

      The traditional method of assessing water infrastructure relies on field surveyors, a process that is often slow and costly. This can pose challenges for timely decision-making, especially in regions facing drought and hunger. In May 2024, pastoralists from various villages were engaged in the data collection process. Organised into WhatsApp groups and using Kapta, they facilitated faster and more efficient assessments by creating WhatsApp Maps on water infrastructure. Within just a few days, these WhatsApp mappers determined that 75% of the water infrastructure was non-functional, providing local authorities with accurate, ground-level information to take quicker and more informed action.

      More case studies coming soon.

      `, }, { title: "Extreme Citizen Science", - content: `

      Kapta is inspired by Extreme Citizen Science (ExCiteS), a community-led approach to creating decision-useful maps via WhatsApp that values and integrates local needs, traditions, and cultures. This co-design-based approach is committed to empowering individuals anywhere to share their knowledge through the development of innovative tools and methods. -

      `, + content: `Kapta is inspired by Extreme Citizen Science (ExCiteS), a community-led approach to creating decision-useful maps via WhatsApp that values and integrates local needs, traditions, and cultures. This co-design-based approach is committed to empowering individuals anywhere to share their knowledge through the development of innovative tools and methods.`, }, ], }, @@ -125,7 +158,7 @@ TWe prioritise enhancing the capabilities of individuals and communities impacte }, { title: "Team", - content: `

      Founders:

        + content: ``, }, ], }, diff --git a/src/styles/App.css b/src/styles/App.css index 76c7304..718826f 100644 --- a/src/styles/App.css +++ b/src/styles/App.css @@ -48,6 +48,21 @@ main { background-color: var(--intrinsic-grey--translucent-2); z-index: 2; } +.kapta-logo--main { + z-index: 3; + position: fixed; + height: fit-content; + margin-left: 4.5rem; + margin-top: 1.5rem; + justify-self: flex-start; + align-self: flex-start; + width: 10vw; + display: flex; + gap: 1rem; + align-items: center; + opacity: 0.8; + pointer-events: none; +} .task-map-wrapper { display: grid; diff --git a/src/styles/burger-menu.css b/src/styles/burger-menu.css index 64e4683..0206e33 100644 --- a/src/styles/burger-menu.css +++ b/src/styles/burger-menu.css @@ -6,7 +6,10 @@ z-index: 3; justify-self: flex-start; align-self: flex-start; + border: 1px solid var(--mui-palette-secondary-main) !important; + border-radius: 8px !important; } + .bm__drawer { .btn--logout { margin-bottom: 4%; diff --git a/src/utils/PosterModal.jsx b/src/utils/PosterModal.jsx new file mode 100644 index 0000000..79861ca --- /dev/null +++ b/src/utils/PosterModal.jsx @@ -0,0 +1,17 @@ +import { CloseButton } from "./Buttons"; + +export default function PosterModal({ isVisible, setIsVisible }) { + return ( + <> + {isVisible && ( + + + Is this the first-ever WhatsApp Map? + + )} + + ); +} From 3903678c75aeb62b7925e79aac07a50485cb9da2 Mon Sep 17 00:00:00 2001 From: acholyn Date: Wed, 4 Dec 2024 13:39:46 +0000 Subject: [PATCH 39/48] adding waitlist widget --- package-lock.json | 28 ++++++++++++++++++++++++++++ package.json | 1 + src/App.jsx | 12 +++++++++--- src/LoginForm.jsx | 2 +- src/styles/App.css | 11 +++++++++++ src/utils/WaitlistWidget.jsx | 23 +++++++++++++++++++++++ 6 files changed, 73 insertions(+), 4 deletions(-) create mode 100644 src/utils/WaitlistWidget.jsx diff --git a/package-lock.json b/package-lock.json index 4db49fa..068ca2d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -21,6 +21,7 @@ "mapbox-gl": "^3.7.0", "react": "^18.3.1", "react-dom": "^18.3.1", + "react-helmet": "^6.1.0", "yup": "^1.4.0" }, "devDependencies": { @@ -7847,6 +7848,25 @@ "integrity": "sha512-suNP+J1VU1MWFKcyt7RtjiSWUjvidmQSlqu+eHslq+342xCbGTYmC0mEhPCOHxlW0CywylOC1u2DFAT+bv4dBw==", "license": "MIT" }, + "node_modules/react-helmet": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/react-helmet/-/react-helmet-6.1.0.tgz", + "integrity": "sha512-4uMzEY9nlDlgxr61NL3XbKRy1hEkXmKNXhjbAIOVw5vcFrsdYbH2FEwcNyWvWinl103nXgzYNlns9ca+8kFiWw==", + "dependencies": { + "object-assign": "^4.1.1", + "prop-types": "^15.7.2", + "react-fast-compare": "^3.1.1", + "react-side-effect": "^2.1.0" + }, + "peerDependencies": { + "react": ">=16.3.0" + } + }, + "node_modules/react-helmet/node_modules/react-fast-compare": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/react-fast-compare/-/react-fast-compare-3.2.2.tgz", + "integrity": "sha512-nsO+KSNgo1SbJqJEYRE9ERzo7YtYbou/OqjSQKxV7jcKox7+usiUVZOAC+XnDOABXggQTno0Y1CpVnuWEc1boQ==" + }, "node_modules/react-is": { "version": "16.13.1", "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", @@ -7858,6 +7878,14 @@ "resolved": "https://registry.npmjs.org/react-property/-/react-property-2.0.2.tgz", "integrity": "sha512-+PbtI3VuDV0l6CleQMsx2gtK0JZbZKbpdu5ynr+lbsuvtmgbNcS3VM0tuY2QjFNOcWxvXeHjDpy42RO+4U2rug==" }, + "node_modules/react-side-effect": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/react-side-effect/-/react-side-effect-2.1.2.tgz", + "integrity": "sha512-PVjOcvVOyIILrYoyGEpDN3vmYNLdy1CajSFNt4TDsVQC5KpTijDvWVoR+/7Rz2xT978D8/ZtFceXxzsPwZEDvw==", + "peerDependencies": { + "react": "^16.3.0 || ^17.0.0 || ^18.0.0" + } + }, "node_modules/react-transition-group": { "version": "4.4.5", "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz", diff --git a/package.json b/package.json index b20976a..a8f3b1c 100644 --- a/package.json +++ b/package.json @@ -23,6 +23,7 @@ "mapbox-gl": "^3.7.0", "react": "^18.3.1", "react-dom": "^18.3.1", + "react-helmet": "^6.1.0", "yup": "^1.4.0" }, "devDependencies": { diff --git a/src/App.jsx b/src/App.jsx index 17a0b2f..c574c3b 100644 --- a/src/App.jsx +++ b/src/App.jsx @@ -17,6 +17,7 @@ import SearchResults from "./SearchResultsList"; import LegalNotice from "./utils/LegalNoticeModal"; import PosterModal from "./utils/PosterModal"; import { KaptaSVGIconWhite } from "./utils/icons"; +import WaitlistWidget from "./utils/WaitlistWidget"; export default function App() { const [isTaskFormVisible, setTaskFormVisible] = useState(false); @@ -25,6 +26,7 @@ export default function App() { const [isLoginFormVisible, setLoginFormVisible] = useState(false); const [signUpFormVisible, setSignUpFormVisible] = useState(false); + const [waitlistVisible, setWaitlistVisible] = useState(false); const [email, setEmail] = useState(""); const [confirmModalVisible, setConfirmModalVisible] = useState(false); const [cmRecipient, setCMRecipient] = useState(null); @@ -165,18 +167,22 @@ export default function App() { color="secondary" variant="outlined" onClick={() => { - setSignUpFormVisible(true); + setWaitlistVisible(true); }} className="btn--signup" > - Sign Up + Join Waitlist
      )} + + +
      + + + + + + ); +} From bcf1955162a40ec32dec0bba6f268446018e9192 Mon Sep 17 00:00:00 2001 From: acholyn Date: Wed, 4 Dec 2024 13:42:39 +0000 Subject: [PATCH 40/48] updating chip suggestions --- src/SearchForm.jsx | 22 +++++++--------------- 1 file changed, 7 insertions(+), 15 deletions(-) diff --git a/src/SearchForm.jsx b/src/SearchForm.jsx index 1fb29dd..c281ad1 100644 --- a/src/SearchForm.jsx +++ b/src/SearchForm.jsx @@ -72,19 +72,19 @@ export default function SearchForm({ const chipSuggestions = [ { - label: "Show me all the sanitation tasks", + label: "Show me citizens complaints in Camden, London", icon: <>, action: (setFieldValue) => { - setFieldValue("query", "sanitation"); - handleSubmit("sanitation"); + setFieldValue("query", "citizen complaint"); + handleSubmit("citizen complaint"); }, }, { - label: "Display all tasks mentioning 'points'", + label: "Water points in Nyangatom, Ethiopia", icon: <>, action: (setFieldValue) => { - setFieldValue("query", "points"); - handleSubmit("points"); + setFieldValue("query", "water point"); + handleSubmit("water point"); }, }, { @@ -103,14 +103,6 @@ export default function SearchForm({ handleSubmit("bakeries"); }, }, - { - label: "Where are the elves?", - icon: <>, - action: (setFieldValue) => { - setFieldValue("query", "elf"); - handleSubmit("elf"); - }, - }, ]; return ( @@ -123,7 +115,7 @@ export default function SearchForm({ }`} > Date: Wed, 4 Dec 2024 13:52:13 +0000 Subject: [PATCH 41/48] fixing poster bug --- src/BurgerMenu.jsx | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/src/BurgerMenu.jsx b/src/BurgerMenu.jsx index ad0f6c8..627b57e 100644 --- a/src/BurgerMenu.jsx +++ b/src/BurgerMenu.jsx @@ -51,13 +51,12 @@ export default function BurgerMenu({ } }); - // Start observing the target node for configured mutations observer.observe(document.body, { childList: true, subtree: true }); return () => { observer.disconnect(); // Cleanup observer on component unmount }; - }, []); + }, [isOpen]); const toggleDrawer = (open) => (event) => { if ( @@ -122,10 +121,8 @@ export default function BurgerMenu({ icon: , subtitle: "We are open to building partnerships. Let's explore how Kapta can support your work.", - content: `Contact us at - info@kapta.earth - `, + content: `Contact us at + info@kapta.earth`, }, { title: "Discover", From f8f4a0af96bcff63a0226d4bd6604ccfbcdd4f96 Mon Sep 17 00:00:00 2001 From: acholyn Date: Wed, 4 Dec 2024 15:58:39 +0000 Subject: [PATCH 42/48] bm conent and success modal tweaks --- src/BurgerMenu.jsx | 7 +++++-- src/SuccessModal.jsx | 4 ++-- src/TaskForm.jsx | 24 +++++++++++++++--------- src/TaskList.jsx | 4 +++- src/styles/App.css | 2 +- src/styles/dialogs.css | 2 ++ src/styles/forms.css | 2 +- 7 files changed, 29 insertions(+), 16 deletions(-) diff --git a/src/BurgerMenu.jsx b/src/BurgerMenu.jsx index 627b57e..114fbb8 100644 --- a/src/BurgerMenu.jsx +++ b/src/BurgerMenu.jsx @@ -107,6 +107,8 @@ export default function BurgerMenu({ desUrl: "https://et.linkedin.com/in/dessalegn-tekle-02b848ba", satoUrl: "https://www.linkedin.com/in/satoki-kawabata/", gabrielUrl: "", + jeroneUrl: + "https://www.ucl.ac.uk/anthropology/people/academic-and-teaching-staff/jerome-lewis", }; const menuSections = [ { @@ -137,7 +139,7 @@ export default function BurgerMenu({ }, { title: "Extreme Citizen Science", - content: `Kapta is inspired by Extreme Citizen Science (ExCiteS), a community-led approach to creating decision-useful maps via WhatsApp that values and integrates local needs, traditions, and cultures. This co-design-based approach is committed to empowering individuals anywhere to share their knowledge through the development of innovative tools and methods.`, + content: `Kapta is inspired by Extreme Citizen Science, an inclusive approach to citizen science that enables people from all backgrounds, regardless of their literacy, technical, or scientific skills, to co-design and participate in scientific research addressing local challenges. It combines interdisciplinary methodologies and tailored technologies to empower communities, particularly in underrepresented or marginalised areas, to collect, visualise, analyse, and use data for informed decision-making and advocacy.`, }, ], }, @@ -150,7 +152,7 @@ export default function BurgerMenu({ { title: "Ethics", content: `

      -TWe prioritise enhancing the capabilities of individuals and communities impacted by our work, ensuring that every action serves a meaningful purpose and aligns with the public interest. Ethics is at the core of our decisions, helping us build trust and foster collective intelligence. By focusing on fairness, transparency, and inclusivity, we develop solutions that empower people to make better decisions in an increasingly complex world shaped by global environmental changes. Our work is guided by a commitment to contribute to a more equitable, sustainable, and socially responsible future for all. +We prioritise enhancing the capabilities of individuals and communities impacted by our work, ensuring that every action serves a meaningful purpose and aligns with the public interest. Ethics is at the core of our decisions, helping us build trust and foster collective intelligence. By focusing on fairness, transparency, and inclusivity, we develop solutions that empower people to make better decisions in an increasingly complex world shaped by global environmental changes. Our work is guided by a commitment to contribute to a more equitable, sustainable, and socially responsible future for all.

      We embrace open-source principles to promote collective progress and serve the public interest. By sharing our tools and methods openly, we enable others to adapt them to diverse challenges and encourage broader participation in knowledge sharing. This approach fosters collaboration across geographies and cultures, driving solutions that benefit society as a whole.

      `, }, { @@ -277,6 +279,7 @@ Advisors:
        onClick={handleLogout} endIcon={} className="btn--logout" + color="secondary" > Logout diff --git a/src/SuccessModal.jsx b/src/SuccessModal.jsx index 7f97ef3..2f3fb83 100644 --- a/src/SuccessModal.jsx +++ b/src/SuccessModal.jsx @@ -13,7 +13,7 @@ export default function SuccessModal({ }) { // if it's a not a task, the title will come through as taskTitle let title; - if (isTask) title = "Your submission has been successful. See details below"; + if (isTask) title = ""; else title = taskTitle; const [snackbarOpen, setSnackbarOpen] = useState(false); @@ -42,7 +42,7 @@ export default function SuccessModal({
        -

        Use this code to upload and search WhatsApp Maps.

        +

        Click to copy the code.

        handleCopy(campaignCode)} diff --git a/src/TaskForm.jsx b/src/TaskForm.jsx index 2bde781..75a7b76 100644 --- a/src/TaskForm.jsx +++ b/src/TaskForm.jsx @@ -63,16 +63,22 @@ export default function TaskForm({ const campaignCode = generateCampaignCode(); values = { ...values, taskID: taskID, campaignCode: campaignCode }; - + let msg = { + title: `Your task ${values.campaignCode} has been created`, + campaignCode: values.campaignCode, + description: `Ask your WhatsApp Mappers to send the code ${values.campaignCode} to Kapta at +44 7473522912. Kapta will then guide them through the next steps.`, + }; + showSuccess(msg); try { - const response = await createTask({ user, values }); - if (response) { - let msg = { - title: "Your task has been created", - campaignCode: values.campaignCode, - }; - showSuccess(msg); - } + // const response = await createTask({ user, values }); + // if (response) { + // let msg = { + // title: `Your task ${values.campaignCode} has been created`, + // campaignCode: values.campaignCode, + // description: `Ask your WhatsApp Mappers to send the code ${values.campaignCode} to Kapta at +34 678 38 09 44. Kapta will then guide them through the next steps.`, + // }; + // showSuccess(msg); + // } } catch (error) { console.error("Error:", error); } diff --git a/src/TaskList.jsx b/src/TaskList.jsx index 6a38673..6140a9c 100644 --- a/src/TaskList.jsx +++ b/src/TaskList.jsx @@ -169,7 +169,9 @@ export default function TaskList({ onChange={handleChangeTaskList} > My Tasks - Open Datasets + + Recent WhatsApp Maps created + Date: Wed, 4 Dec 2024 16:01:57 +0000 Subject: [PATCH 43/48] renabling actual task flow --- src/TaskForm.jsx | 24 +++++++++--------------- 1 file changed, 9 insertions(+), 15 deletions(-) diff --git a/src/TaskForm.jsx b/src/TaskForm.jsx index 75a7b76..4787acf 100644 --- a/src/TaskForm.jsx +++ b/src/TaskForm.jsx @@ -63,22 +63,16 @@ export default function TaskForm({ const campaignCode = generateCampaignCode(); values = { ...values, taskID: taskID, campaignCode: campaignCode }; - let msg = { - title: `Your task ${values.campaignCode} has been created`, - campaignCode: values.campaignCode, - description: `Ask your WhatsApp Mappers to send the code ${values.campaignCode} to Kapta at +44 7473522912. Kapta will then guide them through the next steps.`, - }; - showSuccess(msg); try { - // const response = await createTask({ user, values }); - // if (response) { - // let msg = { - // title: `Your task ${values.campaignCode} has been created`, - // campaignCode: values.campaignCode, - // description: `Ask your WhatsApp Mappers to send the code ${values.campaignCode} to Kapta at +34 678 38 09 44. Kapta will then guide them through the next steps.`, - // }; - // showSuccess(msg); - // } + const response = await createTask({ user, values }); + if (response) { + let msg = { + title: `Your task ${values.campaignCode} has been created`, + campaignCode: values.campaignCode, + description: `Ask your WhatsApp Mappers to send the code ${values.campaignCode} to Kapta at +44 7473522912. Kapta will then guide them through the next steps.`, + }; + showSuccess(msg); + } } catch (error) { console.error("Error:", error); } From 74bc2087e91ffc1a03d543bf387965171daa947b Mon Sep 17 00:00:00 2001 From: acholyn Date: Wed, 4 Dec 2024 16:03:12 +0000 Subject: [PATCH 44/48] explore others tasks --- src/TaskList.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/TaskList.jsx b/src/TaskList.jsx index 6140a9c..1abff77 100644 --- a/src/TaskList.jsx +++ b/src/TaskList.jsx @@ -170,7 +170,7 @@ export default function TaskList({ > My Tasks - Recent WhatsApp Maps created + Explore Others’ Tasks Date: Wed, 4 Dec 2024 16:09:56 +0000 Subject: [PATCH 45/48] bold kapta --- src/App.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/App.jsx b/src/App.jsx index c574c3b..eb0c959 100644 --- a/src/App.jsx +++ b/src/App.jsx @@ -148,7 +148,7 @@ export default function App() {
        - Kapta + Kapta
        {errorMsg && } {!isLoginFormVisible && !user.loggedIn && !signUpFormVisible && ( From 3e8471a9b8fd7f1215f740dc770bffbe426f6fd6 Mon Sep 17 00:00:00 2001 From: acholyn Date: Wed, 4 Dec 2024 16:10:49 +0000 Subject: [PATCH 46/48] fixing jerome typo --- src/BurgerMenu.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/BurgerMenu.jsx b/src/BurgerMenu.jsx index 114fbb8..4924522 100644 --- a/src/BurgerMenu.jsx +++ b/src/BurgerMenu.jsx @@ -107,7 +107,7 @@ export default function BurgerMenu({ desUrl: "https://et.linkedin.com/in/dessalegn-tekle-02b848ba", satoUrl: "https://www.linkedin.com/in/satoki-kawabata/", gabrielUrl: "", - jeroneUrl: + jeromeUrl: "https://www.ucl.ac.uk/anthropology/people/academic-and-teaching-staff/jerome-lewis", }; const menuSections = [ From 12a4e763cebfc9832a9e2b50fd8b6a5ca6f82d8d Mon Sep 17 00:00:00 2001 From: acholyn Date: Thu, 5 Dec 2024 07:28:24 +0000 Subject: [PATCH 47/48] careers --- src/BurgerMenu.jsx | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/BurgerMenu.jsx b/src/BurgerMenu.jsx index 4924522..13e6e70 100644 --- a/src/BurgerMenu.jsx +++ b/src/BurgerMenu.jsx @@ -34,8 +34,8 @@ export default function BurgerMenu({ const handlePosterClick = () => { setPosterVisible(true); setIsOpen(false); - console.log("handlePosterClick"); }; + const mailto = "mailto:info@kapta.earth?subject=Kapta Web Feedback"; useEffect(() => { const observer = new MutationObserver((mutationsList, observer) => { for (let mutation of mutationsList) { @@ -123,7 +123,7 @@ export default function BurgerMenu({ icon: , subtitle: "We are open to building partnerships. Let's explore how Kapta can support your work.", - content: `Contact us at + content: `Contact us at info@kapta.earth`, }, { @@ -154,6 +154,11 @@ export default function BurgerMenu({ content: `

        We prioritise enhancing the capabilities of individuals and communities impacted by our work, ensuring that every action serves a meaningful purpose and aligns with the public interest. Ethics is at the core of our decisions, helping us build trust and foster collective intelligence. By focusing on fairness, transparency, and inclusivity, we develop solutions that empower people to make better decisions in an increasingly complex world shaped by global environmental changes. Our work is guided by a commitment to contribute to a more equitable, sustainable, and socially responsible future for all.

        We embrace open-source principles to promote collective progress and serve the public interest. By sharing our tools and methods openly, we enable others to adapt them to diverse challenges and encourage broader participation in knowledge sharing. This approach fosters collaboration across geographies and cultures, driving solutions that benefit society as a whole.

        `, + }, + { + title: "Careers", + content: `

        Join our dynamic team! We combine the creativity of academic research with the agility of a company, guided by a shared commitment to ethics, citizen science technology and collective intelligence. If you are curious about our work and want to contribute to innovative solutions for real-world challenges, we would love to hear from you - reach out at info@kapta.earth.

        +`, }, { title: "Team", @@ -264,12 +269,7 @@ Advisors:
          WhatsApp {" "} or email us at{" "} - From 84b9849522866e88e70fdd35c3a0195841d29cf1 Mon Sep 17 00:00:00 2001 From: acholyn Date: Thu, 5 Dec 2024 08:06:51 +0000 Subject: [PATCH 48/48] updatinng map config --- src/Mapbox.jsx | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/src/Mapbox.jsx b/src/Mapbox.jsx index 9b8a48e..ed839b2 100644 --- a/src/Mapbox.jsx +++ b/src/Mapbox.jsx @@ -67,8 +67,8 @@ export function Map({ map.current = new mapboxgl.Map({ container: "map", style: "mapbox://styles/mapbox/dark-v11", - zoom: 1.3, - center: [30, 50], + zoom: 1.8, + center: [35, -25], projection: "globe", attributionControl: true, }); @@ -76,7 +76,7 @@ export function Map({ map.current.setFog({ color: "grey", "high-color": "#232222", - "horizon-blend": 0.02, + "horizon-blend": 0.01, "space-color": "#16161d", "star-intensity": 0, }); @@ -99,15 +99,15 @@ export function Map({ // resize the map when splitscreen useEffect(() => { // todo: this needs some polishing - if (map.current) { - const center = map.current.getCenter(); - const zoom = map.current.getZoom(); - map.current.resize().flyTo({ - center: center, - zoom: zoom, - speed: 0.8, - }); - } + if (map.current) { + const center = map.current.getCenter(); + const zoom = map.current.getZoom(); + map.current.resize().flyTo({ + center: center, + zoom: zoom, + speed: 0.8, + }); + } }, [taskListOpen]); // handle polygons