From ff45f289146403c54c66323086b3e14c11c67cef Mon Sep 17 00:00:00 2001 From: Milan Gruner Date: Thu, 4 Apr 2024 15:36:51 +0200 Subject: [PATCH 1/6] fix(ui): catch invalid callback URLs and accept relative URLs on signup page --- app/src/app/[lng]/auth/signup/page.tsx | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/app/src/app/[lng]/auth/signup/page.tsx b/app/src/app/[lng]/auth/signup/page.tsx index 9ad48f8f9..344d2d48d 100644 --- a/app/src/app/[lng]/auth/signup/page.tsx +++ b/app/src/app/[lng]/auth/signup/page.tsx @@ -52,10 +52,12 @@ export default function Signup({ const fullUrl = window.location.href; const urlParams = new URL(fullUrl); const callbackUrl = urlParams.searchParams.get("callbackUrl"); - if (callbackUrl) { + if (callbackUrl && callbackUrl != "null" && callbackUrl != "undefined") { try { - const url = new URL(callbackUrl); - const callbackUrlSegments = url.pathname.split("/"); + const path = callbackUrl.startsWith("/") + ? callbackUrl + : new URL(callbackUrl).pathname; + const callbackUrlSegments = path.split("/"); if (callbackUrlSegments.length > 2) { inventoryId = callbackUrlSegments.pop(); } From 00d2cfb8678a3b1ce33ac9410bf2caa20bce21fc Mon Sep 17 00:00:00 2001 From: Milan Gruner Date: Thu, 4 Apr 2024 15:43:52 +0200 Subject: [PATCH 2/6] fix(ui): dashboard crashing when inventory ID null or undefined are passed --- app/src/app/[lng]/[inventory]/page.tsx | 7 +++++-- app/src/components/Cards/SectorCard.tsx | 2 +- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/app/src/app/[lng]/[inventory]/page.tsx b/app/src/app/[lng]/[inventory]/page.tsx index edff8db05..30067c51e 100644 --- a/app/src/app/[lng]/[inventory]/page.tsx +++ b/app/src/app/[lng]/[inventory]/page.tsx @@ -76,8 +76,11 @@ export default function Home({ params: { lng } }: { params: { lng: string } }) { const { t } = useTranslation(lng, "dashboard"); const toast = useToast(); const router = useRouter(); - const { inventory: cityParam } = useParams(); - const inventoryId = cityParam as string; + const { inventory: inventoryParam } = useParams(); + let inventoryId = inventoryParam as string | null; + if (inventoryId === "null" || inventoryId === "undefined") { + inventoryId = null; + } // query API data // TODO maybe rework this logic into one RTK query: diff --git a/app/src/components/Cards/SectorCard.tsx b/app/src/components/Cards/SectorCard.tsx index aa610a5fa..b43ce4b5e 100644 --- a/app/src/components/Cards/SectorCard.tsx +++ b/app/src/components/Cards/SectorCard.tsx @@ -33,7 +33,7 @@ export function SectorCard({ sectorProgress: SectorProgress; stepNumber: number; t: TFunction; - inventory: string; + inventory: string | null; }) { const [isAccordionOpen, setAccordionOpen] = useState(false); const toggleAccordion = () => setAccordionOpen(!isAccordionOpen); From 0c4d3ba50f66ec59245b15b0596dca531fe3dc7f Mon Sep 17 00:00:00 2001 From: Milan Gruner Date: Thu, 4 Apr 2024 15:47:09 +0200 Subject: [PATCH 3/6] refactor(ui): remove unused imports from data review page --- app/src/app/[lng]/[inventory]/data/review/page.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/app/[lng]/[inventory]/data/review/page.tsx b/app/src/app/[lng]/[inventory]/data/review/page.tsx index 40ac9cc3a..f91b3a62e 100644 --- a/app/src/app/[lng]/[inventory]/data/review/page.tsx +++ b/app/src/app/[lng]/[inventory]/data/review/page.tsx @@ -11,8 +11,8 @@ import { ArrowBackIcon } from "@chakra-ui/icons"; import { Box, Button, Card, Heading, Icon, Text } from "@chakra-ui/react"; import { useRouter } from "next/navigation"; -import { FaRegTrashAlt, FaTrash } from "react-icons/fa"; -import { FiTrash, FiTrash2 } from "react-icons/fi"; +import { FaRegTrashAlt } from "react-icons/fa"; +import { FiTrash2 } from "react-icons/fi"; import { MdOutlineEdit } from "react-icons/md"; import { useSelector, useDispatch } from "react-redux"; import { clear, removeSectorData } from "@/features/city/inventoryDataSlice"; From cd083b6d7b52ab7deeaf9e5b9c2d383d7d094a95 Mon Sep 17 00:00:00 2001 From: Milan Gruner Date: Thu, 4 Apr 2024 15:52:44 +0200 Subject: [PATCH 4/6] fix(ui): data review page not redirecting back to city dashboard after finish --- app/src/app/[lng]/[inventory]/data/review/page.tsx | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/app/src/app/[lng]/[inventory]/data/review/page.tsx b/app/src/app/[lng]/[inventory]/data/review/page.tsx index f91b3a62e..9325f6069 100644 --- a/app/src/app/[lng]/[inventory]/data/review/page.tsx +++ b/app/src/app/[lng]/[inventory]/data/review/page.tsx @@ -9,7 +9,7 @@ import { RootState } from "@/lib/store"; import { ArrowBackIcon } from "@chakra-ui/icons"; import { Box, Button, Card, Heading, Icon, Text } from "@chakra-ui/react"; -import { useRouter } from "next/navigation"; +import { useParams, useRouter } from "next/navigation"; import { FaRegTrashAlt } from "react-icons/fa"; import { FiTrash2 } from "react-icons/fi"; @@ -21,11 +21,17 @@ import { appendFileToFormData } from "@/util/helpers"; import { useState } from "react"; export default function ReviewPage({ - params: { lng, inventoryId }, + params: { lng }, }: { - params: { lng: string; inventoryId: string }; + params: { lng: string }; }) { const { t } = useTranslation(lng, "data"); + const { inventory: inventoryParam } = useParams(); + let inventoryId = inventoryParam as string | null; + if (inventoryId === "null" || inventoryId === "undefined") { + inventoryId = null; + } + const router = useRouter(); const dispatch = useDispatch(); const getAllSectorData = useSelector( From 5be4a6624717702eaa77007472bf98aa7a96da24 Mon Sep 17 00:00:00 2001 From: Milan Gruner Date: Thu, 4 Apr 2024 16:00:47 +0200 Subject: [PATCH 5/6] fix(ui): catch invalid callback URLs on login page redirect to dashboard --- app/src/app/[lng]/auth/login/page.tsx | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/app/src/app/[lng]/auth/login/page.tsx b/app/src/app/[lng]/auth/login/page.tsx index fef69b33e..e7cc02fe3 100644 --- a/app/src/app/[lng]/auth/login/page.tsx +++ b/app/src/app/[lng]/auth/login/page.tsx @@ -53,8 +53,16 @@ export default function Login({ const searchParams = useSearchParams(); const [error, setError] = useState(""); - const defaultUrl = `https://${document.location.host}/${lng}`; - const callbackUrl = searchParams.get("callbackUrl") || defaultUrl; + const defaultUrl = `/${lng}`; + const callbackParam = searchParams.get("callbackUrl"); + let callbackUrl = defaultUrl; + if ( + callbackParam && + callbackParam !== "null" && + callbackParam !== "undefined" + ) { + callbackUrl = callbackParam; + } const onSubmit: SubmitHandler = async (data) => { try { const res = await signIn("credentials", { From 02c65216fac00d1bcd69db1298dd182191e29e0d Mon Sep 17 00:00:00 2001 From: Milan Gruner Date: Thu, 4 Apr 2024 16:13:35 +0200 Subject: [PATCH 6/6] fix(ui): rework callbackUrl handling on signup page and prevent null value --- app/src/app/[lng]/auth/signup/page.tsx | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/app/src/app/[lng]/auth/signup/page.tsx b/app/src/app/[lng]/auth/signup/page.tsx index 344d2d48d..8a44c38fe 100644 --- a/app/src/app/[lng]/auth/signup/page.tsx +++ b/app/src/app/[lng]/auth/signup/page.tsx @@ -16,7 +16,7 @@ import { Input, Text, } from "@chakra-ui/react"; -import { useRouter } from "next/navigation"; +import { useParams, useRouter, useSearchParams } from "next/navigation"; import { useState } from "react"; import { useForm, SubmitHandler } from "react-hook-form"; import { Trans } from "react-i18next/TransWithoutContext"; @@ -48,11 +48,14 @@ export default function Signup({ const [error, setError] = useState(""); // extract inventory id from callbackUrl search parameter + const searchParams = useSearchParams(); + let callbackUrl = searchParams.get("callbackUrl"); + if (!callbackUrl || callbackUrl === "null" || callbackUrl === "undefined") { + callbackUrl = null; + } + let inventoryId: string | undefined = undefined; - const fullUrl = window.location.href; - const urlParams = new URL(fullUrl); - const callbackUrl = urlParams.searchParams.get("callbackUrl"); - if (callbackUrl && callbackUrl != "null" && callbackUrl != "undefined") { + if (callbackUrl) { try { const path = callbackUrl.startsWith("/") ? callbackUrl @@ -91,7 +94,8 @@ export default function Signup({ return; } - const nextCallbackUrl = `/auth/check-email?email=${data.email}&callbackUrl=${callbackUrl}`; + const callbackParam = callbackUrl ? `&callbackUrl=${callbackUrl}` : ""; + const nextCallbackUrl = `/auth/check-email?email=${data.email}${callbackParam}`; router.push(nextCallbackUrl); // TODO automatic login required?