From 9c813dd12a868d16baa25343a2fbdb35b7343ccb Mon Sep 17 00:00:00 2001 From: vinaybadgujar102 Date: Wed, 14 Aug 2024 12:04:56 +0530 Subject: [PATCH 01/93] add: hook to handle goal navigation using keyboard --- src/hooks/useGoalSelection.ts | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 src/hooks/useGoalSelection.ts diff --git a/src/hooks/useGoalSelection.ts b/src/hooks/useGoalSelection.ts new file mode 100644 index 000000000..98c734b56 --- /dev/null +++ b/src/hooks/useGoalSelection.ts @@ -0,0 +1,26 @@ +import { GoalItem } from "@src/models/GoalItem"; +import { useEffect, useState } from "react"; +import { useKeyPress } from "./useKeyPress"; + +export const useGoalSelection = (goals: GoalItem[], handleClick: (langId: string) => void): number => { + const [focusedIndex, setFocusedIndex] = useState(0); + + const upPress = useKeyPress("ArrowUp"); + const downPress = useKeyPress("ArrowDown"); + const rightPress = useKeyPress("ArrowRight"); + const leftPress = useKeyPress("ArrowLeft"); + + useEffect(() => { + if (downPress) { + setFocusedIndex((prevIndex) => (prevIndex + 1) % goals.length); + } + }, [downPress]); + + useEffect(() => { + if (upPress) { + setFocusedIndex((prevIndex) => (prevIndex - 1 + goals.length) % goals.length); + } + }, [upPress]); + + return focusedIndex; +}; From fe8667d453988d274661b8418bd20c513a1850c0 Mon Sep 17 00:00:00 2001 From: vinaybadgujar102 Date: Wed, 14 Aug 2024 13:22:30 +0530 Subject: [PATCH 02/93] add: implement navigation using arrow keys --- src/components/GoalsComponents/GoalsList.scss | 4 ++ src/components/GoalsComponents/GoalsList.tsx | 15 ++++- src/hooks/useGoalSelection.ts | 61 +++++++++++++++++-- 3 files changed, 73 insertions(+), 7 deletions(-) create mode 100644 src/components/GoalsComponents/GoalsList.scss diff --git a/src/components/GoalsComponents/GoalsList.scss b/src/components/GoalsComponents/GoalsList.scss new file mode 100644 index 000000000..fff7f525f --- /dev/null +++ b/src/components/GoalsComponents/GoalsList.scss @@ -0,0 +1,4 @@ +.focused { + border: var(--icon-grad-2) 2px solid; + border-radius: 4px; +} diff --git a/src/components/GoalsComponents/GoalsList.tsx b/src/components/GoalsComponents/GoalsList.tsx index 933739cf8..dc4d2723d 100644 --- a/src/components/GoalsComponents/GoalsList.tsx +++ b/src/components/GoalsComponents/GoalsList.tsx @@ -15,7 +15,9 @@ import { useRecoilValue } from "recoil"; import { impossibleGoalsList } from "@src/store/ImpossibleGoalState"; import { ImpossibleGoal } from "@src/Interfaces"; +import { useGoalSelection } from "@src/hooks/useGoalSelection"; import SortableItem from "./MyGoal/SortableItem"; +import "./GoalsList.scss"; interface GoalsListProps { goals: GoalItem[]; @@ -72,13 +74,20 @@ const GoalsList = ({ goals, setGoals }: GoalsListProps) => { } }; + const handleGoalSelect = () => {}; + + const [focusedIndex, focusedGoal] = useGoalSelection(goals, handleGoalSelect); + return ( goal.id)} strategy={verticalListSortingStrategy}> - {updatedGoals.map((goal: ImpossibleGoal) => ( - + {updatedGoals.map((goal: ImpossibleGoal, index: number) => ( +
- +
))}
diff --git a/src/hooks/useGoalSelection.ts b/src/hooks/useGoalSelection.ts index 98c734b56..3e4987d59 100644 --- a/src/hooks/useGoalSelection.ts +++ b/src/hooks/useGoalSelection.ts @@ -1,9 +1,50 @@ import { GoalItem } from "@src/models/GoalItem"; import { useEffect, useState } from "react"; import { useKeyPress } from "./useKeyPress"; +import { extractLinks } from "@src/utils/patterns"; +import { ILocationState } from "@src/Interfaces"; +import { useLocation, useNavigate } from "react-router-dom"; -export const useGoalSelection = (goals: GoalItem[], handleClick: (langId: string) => void): number => { +export const useGoalSelection = ( + goals: GoalItem[], + handleRightNavigation: (langId: string) => void, +): [number, GoalItem] => { const [focusedIndex, setFocusedIndex] = useState(0); + const location = useLocation(); + const navigate = useNavigate(); + + const redirect = (goal: GoalItem, state: object) => { + const prefix = `${"/"}goals`; + navigate(`${prefix}/${goal.id}`, { state }); + }; + + console.log("focusedIndex", focusedIndex); + + const handleGoalClick = (goal: GoalItem) => { + if (goal === undefined) return; + const url = extractLinks(goal?.title); + if (url) { + const finalUrl = url.startsWith("http://") || url.startsWith("https://") ? url : `https://${url}`; + window.open(finalUrl, "_blank"); + } + const newState: ILocationState = { + ...location.state, + activeGoalId: goal.id, + goalsHistory: [ + ...(location.state?.goalsHistory || []), + { + goalID: goal.id || "root", + goalColor: goal.goalColor || "#ffffff", + goalTitle: goal.title || "", + }, + ], + }; + redirect(goal, newState); + }; + + const handleRight = (goal: GoalItem) => { + handleGoalClick(goal); + }; const upPress = useKeyPress("ArrowUp"); const downPress = useKeyPress("ArrowDown"); @@ -14,13 +55,25 @@ export const useGoalSelection = (goals: GoalItem[], handleClick: (langId: string if (downPress) { setFocusedIndex((prevIndex) => (prevIndex + 1) % goals.length); } - }, [downPress]); + }, [downPress, goals.length]); useEffect(() => { if (upPress) { setFocusedIndex((prevIndex) => (prevIndex - 1 + goals.length) % goals.length); } - }, [upPress]); + }, [upPress, goals.length]); + + useEffect(() => { + if (rightPress) { + handleRight(goals[focusedIndex]); + } + }, [rightPress]); + + useEffect(() => { + if (leftPress) { + window.history.back(); + } + }, [leftPress]); - return focusedIndex; + return [focusedIndex, goals[focusedIndex]]; }; From db9f139bb1de712debd02c79dda1205928e7ae0a Mon Sep 17 00:00:00 2001 From: vinaybadgujar102 Date: Wed, 14 Aug 2024 13:49:42 +0530 Subject: [PATCH 03/93] edit: style of focused goals --- src/components/GoalsComponents/GoalsList.scss | 3 +-- src/components/GoalsComponents/GoalsList.tsx | 5 +++-- src/hooks/useGoalSelection.ts | 7 ++----- 3 files changed, 6 insertions(+), 9 deletions(-) diff --git a/src/components/GoalsComponents/GoalsList.scss b/src/components/GoalsComponents/GoalsList.scss index fff7f525f..d34a64b73 100644 --- a/src/components/GoalsComponents/GoalsList.scss +++ b/src/components/GoalsComponents/GoalsList.scss @@ -1,4 +1,3 @@ .focused { - border: var(--icon-grad-2) 2px solid; - border-radius: 4px; + border-left: var(--icon-grad-2) 3px solid; } diff --git a/src/components/GoalsComponents/GoalsList.tsx b/src/components/GoalsComponents/GoalsList.tsx index dc4d2723d..d7cef6a18 100644 --- a/src/components/GoalsComponents/GoalsList.tsx +++ b/src/components/GoalsComponents/GoalsList.tsx @@ -76,15 +76,16 @@ const GoalsList = ({ goals, setGoals }: GoalsListProps) => { const handleGoalSelect = () => {}; - const [focusedIndex, focusedGoal] = useGoalSelection(goals, handleGoalSelect); + const focusedGoal = useGoalSelection(goals); return ( goal.id)} strategy={verticalListSortingStrategy}> - {updatedGoals.map((goal: ImpossibleGoal, index: number) => ( + {updatedGoals.map((goal: ImpossibleGoal) => (
diff --git a/src/hooks/useGoalSelection.ts b/src/hooks/useGoalSelection.ts index 3e4987d59..b804cd340 100644 --- a/src/hooks/useGoalSelection.ts +++ b/src/hooks/useGoalSelection.ts @@ -5,10 +5,7 @@ import { extractLinks } from "@src/utils/patterns"; import { ILocationState } from "@src/Interfaces"; import { useLocation, useNavigate } from "react-router-dom"; -export const useGoalSelection = ( - goals: GoalItem[], - handleRightNavigation: (langId: string) => void, -): [number, GoalItem] => { +export const useGoalSelection = (goals: GoalItem[]): GoalItem => { const [focusedIndex, setFocusedIndex] = useState(0); const location = useLocation(); const navigate = useNavigate(); @@ -75,5 +72,5 @@ export const useGoalSelection = ( } }, [leftPress]); - return [focusedIndex, goals[focusedIndex]]; + return goals[focusedIndex]; }; From 7cea13e153e218670fc272d5d349f527200cf4f0 Mon Sep 17 00:00:00 2001 From: vinaybadgujar102 Date: Thu, 15 Aug 2024 12:55:14 +0530 Subject: [PATCH 04/93] add: prevent default behaviour on key press --- src/hooks/useKeyPress.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/hooks/useKeyPress.ts b/src/hooks/useKeyPress.ts index 0645a4ff0..9f0daf657 100644 --- a/src/hooks/useKeyPress.ts +++ b/src/hooks/useKeyPress.ts @@ -5,6 +5,7 @@ export const useKeyPress = (targetKey: string) => { const keyHandler = useCallback( (event: KeyboardEvent) => { + event.preventDefault(); if (event.key === targetKey) { setKeyPressed(event.type === "keydown"); } From a88de1dadc6bc254b3da6510f264429235929b86 Mon Sep 17 00:00:00 2001 From: vinaybadgujar102 Date: Thu, 15 Aug 2024 13:04:15 +0530 Subject: [PATCH 05/93] fix: handle edge cases in right and left key navigation --- src/hooks/useGoalSelection.ts | 32 ++++++++++++++------------------ src/version.json | 6 +++--- 2 files changed, 17 insertions(+), 21 deletions(-) diff --git a/src/hooks/useGoalSelection.ts b/src/hooks/useGoalSelection.ts index b804cd340..a40da9fb3 100644 --- a/src/hooks/useGoalSelection.ts +++ b/src/hooks/useGoalSelection.ts @@ -1,28 +1,21 @@ import { GoalItem } from "@src/models/GoalItem"; import { useEffect, useState } from "react"; -import { useKeyPress } from "./useKeyPress"; import { extractLinks } from "@src/utils/patterns"; import { ILocationState } from "@src/Interfaces"; import { useLocation, useNavigate } from "react-router-dom"; +import { useKeyPress } from "./useKeyPress"; export const useGoalSelection = (goals: GoalItem[]): GoalItem => { const [focusedIndex, setFocusedIndex] = useState(0); const location = useLocation(); const navigate = useNavigate(); - const redirect = (goal: GoalItem, state: object) => { - const prefix = `${"/"}goals`; - navigate(`${prefix}/${goal.id}`, { state }); - }; - - console.log("focusedIndex", focusedIndex); - - const handleGoalClick = (goal: GoalItem) => { - if (goal === undefined) return; - const url = extractLinks(goal?.title); + const handleRightKeyPress = (goal: GoalItem) => { + const url = extractLinks(goal.title); if (url) { const finalUrl = url.startsWith("http://") || url.startsWith("https://") ? url : `https://${url}`; window.open(finalUrl, "_blank"); + return; } const newState: ILocationState = { ...location.state, @@ -36,11 +29,7 @@ export const useGoalSelection = (goals: GoalItem[]): GoalItem => { }, ], }; - redirect(goal, newState); - }; - - const handleRight = (goal: GoalItem) => { - handleGoalClick(goal); + navigate(`/goals/${goal.id}`, { state: newState }); }; const upPress = useKeyPress("ArrowUp"); @@ -61,16 +50,23 @@ export const useGoalSelection = (goals: GoalItem[]): GoalItem => { }, [upPress, goals.length]); useEffect(() => { - if (rightPress) { - handleRight(goals[focusedIndex]); + if (rightPress && goals.length > 0) { + handleRightKeyPress(goals[focusedIndex]); } }, [rightPress]); useEffect(() => { if (leftPress) { + if (window.location.pathname === "/goals") { + return; + } window.history.back(); } }, [leftPress]); + if (goals.length === 0) { + return undefined; + } + return goals[focusedIndex]; }; diff --git a/src/version.json b/src/version.json index afdb6aa51..2bf92ee69 100644 --- a/src/version.json +++ b/src/version.json @@ -1,7 +1,7 @@ { "buildHash": { - "schedulerFileHash": "b66a66a2", - "indexFileHash": "5013cdaa" + "schedulerFileHash": "409e79b3", + "indexFileHash": "10a6f235" }, - "buildDate": "2024-08-11T14:22:33.669Z" + "buildDate": "2024-08-14T13:23:54.232Z" } From 5ea230b710b186404a5a59a70890c2791c391f2d Mon Sep 17 00:00:00 2001 From: vinaybadgujar102 Date: Thu, 15 Aug 2024 13:14:11 +0530 Subject: [PATCH 06/93] edit: use inline style to add border on focused goal --- src/components/GoalsComponents/GoalsList.scss | 3 --- src/components/GoalsComponents/GoalsList.tsx | 5 +---- 2 files changed, 1 insertion(+), 7 deletions(-) delete mode 100644 src/components/GoalsComponents/GoalsList.scss diff --git a/src/components/GoalsComponents/GoalsList.scss b/src/components/GoalsComponents/GoalsList.scss deleted file mode 100644 index d34a64b73..000000000 --- a/src/components/GoalsComponents/GoalsList.scss +++ /dev/null @@ -1,3 +0,0 @@ -.focused { - border-left: var(--icon-grad-2) 3px solid; -} diff --git a/src/components/GoalsComponents/GoalsList.tsx b/src/components/GoalsComponents/GoalsList.tsx index d7cef6a18..b8e0c94a0 100644 --- a/src/components/GoalsComponents/GoalsList.tsx +++ b/src/components/GoalsComponents/GoalsList.tsx @@ -17,7 +17,6 @@ import { ImpossibleGoal } from "@src/Interfaces"; import { useGoalSelection } from "@src/hooks/useGoalSelection"; import SortableItem from "./MyGoal/SortableItem"; -import "./GoalsList.scss"; interface GoalsListProps { goals: GoalItem[]; @@ -74,8 +73,6 @@ const GoalsList = ({ goals, setGoals }: GoalsListProps) => { } }; - const handleGoalSelect = () => {}; - const focusedGoal = useGoalSelection(goals); return ( @@ -85,7 +82,7 @@ const GoalsList = ({ goals, setGoals }: GoalsListProps) => {
From a9b69c156b12c536476b467974c4527c49e2030e Mon Sep 17 00:00:00 2001 From: vinaybadgujar102 Date: Thu, 15 Aug 2024 13:15:13 +0530 Subject: [PATCH 07/93] remove: unnecessary classes --- src/components/GoalsComponents/GoalsList.tsx | 1 - 1 file changed, 1 deletion(-) diff --git a/src/components/GoalsComponents/GoalsList.tsx b/src/components/GoalsComponents/GoalsList.tsx index b8e0c94a0..a58990aa2 100644 --- a/src/components/GoalsComponents/GoalsList.tsx +++ b/src/components/GoalsComponents/GoalsList.tsx @@ -81,7 +81,6 @@ const GoalsList = ({ goals, setGoals }: GoalsListProps) => { {updatedGoals.map((goal: ImpossibleGoal) => (
From ad81cadff03622bb347f3654552c2b9f34f7165d Mon Sep 17 00:00:00 2001 From: vinaybadgujar102 Date: Thu, 15 Aug 2024 15:17:06 +0530 Subject: [PATCH 08/93] add: only allow keyboard based navigation when in goal list component --- src/components/GoalsComponents/GoalsList.tsx | 2 +- src/hooks/useGoalSelection.ts | 16 +++++++++++++--- src/hooks/useKeyPress.ts | 2 +- 3 files changed, 15 insertions(+), 5 deletions(-) diff --git a/src/components/GoalsComponents/GoalsList.tsx b/src/components/GoalsComponents/GoalsList.tsx index a58990aa2..3f4dc86a1 100644 --- a/src/components/GoalsComponents/GoalsList.tsx +++ b/src/components/GoalsComponents/GoalsList.tsx @@ -81,7 +81,7 @@ const GoalsList = ({ goals, setGoals }: GoalsListProps) => { {updatedGoals.map((goal: ImpossibleGoal) => (
diff --git a/src/hooks/useGoalSelection.ts b/src/hooks/useGoalSelection.ts index a40da9fb3..03459c772 100644 --- a/src/hooks/useGoalSelection.ts +++ b/src/hooks/useGoalSelection.ts @@ -1,16 +1,22 @@ import { GoalItem } from "@src/models/GoalItem"; -import { useEffect, useState } from "react"; +import { useEffect, useMemo, useState } from "react"; import { extractLinks } from "@src/utils/patterns"; import { ILocationState } from "@src/Interfaces"; import { useLocation, useNavigate } from "react-router-dom"; import { useKeyPress } from "./useKeyPress"; -export const useGoalSelection = (goals: GoalItem[]): GoalItem => { +export const useGoalSelection = (goals: GoalItem[]): GoalItem | undefined => { const [focusedIndex, setFocusedIndex] = useState(0); const location = useLocation(); const navigate = useNavigate(); + const disableKeyboardNavigation = useMemo(() => { + return location.search !== ""; + }, [location.search]); + const handleRightKeyPress = (goal: GoalItem) => { + if (disableKeyboardNavigation) return; + const url = extractLinks(goal.title); if (url) { const finalUrl = url.startsWith("http://") || url.startsWith("https://") ? url : `https://${url}`; @@ -38,26 +44,30 @@ export const useGoalSelection = (goals: GoalItem[]): GoalItem => { const leftPress = useKeyPress("ArrowLeft"); useEffect(() => { + if (disableKeyboardNavigation) return; if (downPress) { setFocusedIndex((prevIndex) => (prevIndex + 1) % goals.length); } }, [downPress, goals.length]); useEffect(() => { + if (disableKeyboardNavigation) return; if (upPress) { setFocusedIndex((prevIndex) => (prevIndex - 1 + goals.length) % goals.length); } }, [upPress, goals.length]); useEffect(() => { + if (disableKeyboardNavigation) return; if (rightPress && goals.length > 0) { handleRightKeyPress(goals[focusedIndex]); } }, [rightPress]); useEffect(() => { + if (disableKeyboardNavigation) return; if (leftPress) { - if (window.location.pathname === "/goals") { + if (location.pathname === "/goals") { return; } window.history.back(); diff --git a/src/hooks/useKeyPress.ts b/src/hooks/useKeyPress.ts index 9f0daf657..c2a7e7fa1 100644 --- a/src/hooks/useKeyPress.ts +++ b/src/hooks/useKeyPress.ts @@ -5,7 +5,7 @@ export const useKeyPress = (targetKey: string) => { const keyHandler = useCallback( (event: KeyboardEvent) => { - event.preventDefault(); + event.stopPropagation(); if (event.key === targetKey) { setKeyPressed(event.type === "keydown"); } From a90bdb609412af32ac04364cdbcc4c84af58f396 Mon Sep 17 00:00:00 2001 From: vinaybadgujar102 Date: Thu, 15 Aug 2024 15:51:07 +0530 Subject: [PATCH 09/93] add: only focus the goal when key is pressed --- src/hooks/useGoalSelection.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/hooks/useGoalSelection.ts b/src/hooks/useGoalSelection.ts index 03459c772..05e83005a 100644 --- a/src/hooks/useGoalSelection.ts +++ b/src/hooks/useGoalSelection.ts @@ -6,7 +6,7 @@ import { useLocation, useNavigate } from "react-router-dom"; import { useKeyPress } from "./useKeyPress"; export const useGoalSelection = (goals: GoalItem[]): GoalItem | undefined => { - const [focusedIndex, setFocusedIndex] = useState(0); + const [focusedIndex, setFocusedIndex] = useState(-1); const location = useLocation(); const navigate = useNavigate(); From c653d025da04863e8df95299c179d84a2efcbda6 Mon Sep 17 00:00:00 2001 From: vinaybadgujar102 Date: Thu, 15 Aug 2024 16:02:53 +0530 Subject: [PATCH 10/93] add: dont allow scrolling of goal container using keyboard button --- src/hooks/useGoalSelection.ts | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/src/hooks/useGoalSelection.ts b/src/hooks/useGoalSelection.ts index 05e83005a..9048771d7 100644 --- a/src/hooks/useGoalSelection.ts +++ b/src/hooks/useGoalSelection.ts @@ -43,8 +43,23 @@ export const useGoalSelection = (goals: GoalItem[]): GoalItem | undefined => { const rightPress = useKeyPress("ArrowRight"); const leftPress = useKeyPress("ArrowLeft"); + useEffect(() => { + const handleKeyDown = (e: KeyboardEvent) => { + if (["ArrowUp", "ArrowDown", "ArrowLeft", "ArrowRight"].includes(e.key)) { + e.preventDefault(); + } + }; + + window.addEventListener("keydown", handleKeyDown); + + return () => { + window.removeEventListener("keydown", handleKeyDown); + }; + }, []); + useEffect(() => { if (disableKeyboardNavigation) return; + if (downPress) { setFocusedIndex((prevIndex) => (prevIndex + 1) % goals.length); } @@ -52,6 +67,7 @@ export const useGoalSelection = (goals: GoalItem[]): GoalItem | undefined => { useEffect(() => { if (disableKeyboardNavigation) return; + if (upPress) { setFocusedIndex((prevIndex) => (prevIndex - 1 + goals.length) % goals.length); } @@ -59,13 +75,15 @@ export const useGoalSelection = (goals: GoalItem[]): GoalItem | undefined => { useEffect(() => { if (disableKeyboardNavigation) return; - if (rightPress && goals.length > 0) { + + if (rightPress && goals.length > 0 && focusedIndex !== -1) { handleRightKeyPress(goals[focusedIndex]); } }, [rightPress]); useEffect(() => { if (disableKeyboardNavigation) return; + if (leftPress) { if (location.pathname === "/goals") { return; From da379e5f50f23c66ac34b7ad61acd417213c78c9 Mon Sep 17 00:00:00 2001 From: vinaybadgujar102 Date: Thu, 15 Aug 2024 16:56:04 +0530 Subject: [PATCH 11/93] add: focus viewport on the focused goal --- src/hooks/useGoalSelection.ts | 28 +++++++++++++++++++++++----- 1 file changed, 23 insertions(+), 5 deletions(-) diff --git a/src/hooks/useGoalSelection.ts b/src/hooks/useGoalSelection.ts index 9048771d7..b597c0d23 100644 --- a/src/hooks/useGoalSelection.ts +++ b/src/hooks/useGoalSelection.ts @@ -1,5 +1,5 @@ import { GoalItem } from "@src/models/GoalItem"; -import { useEffect, useMemo, useState } from "react"; +import { useCallback, useEffect, useMemo, useState } from "react"; import { extractLinks } from "@src/utils/patterns"; import { ILocationState } from "@src/Interfaces"; import { useLocation, useNavigate } from "react-router-dom"; @@ -57,21 +57,39 @@ export const useGoalSelection = (goals: GoalItem[]): GoalItem | undefined => { }; }, []); + const scrollIntoView = useCallback( + (index: number) => { + const goalElement = document.getElementById(`goal-${goals[index]?.id}`); + if (goalElement) { + goalElement.scrollIntoView({ behavior: "smooth", block: "center" }); + } + }, + [goals], + ); + useEffect(() => { if (disableKeyboardNavigation) return; if (downPress) { - setFocusedIndex((prevIndex) => (prevIndex + 1) % goals.length); + setFocusedIndex((prevIndex) => { + const newIndex = (prevIndex + 1) % goals.length; + scrollIntoView(newIndex); + return newIndex; + }); } - }, [downPress, goals.length]); + }, [downPress, goals.length, scrollIntoView]); useEffect(() => { if (disableKeyboardNavigation) return; if (upPress) { - setFocusedIndex((prevIndex) => (prevIndex - 1 + goals.length) % goals.length); + setFocusedIndex((prevIndex) => { + const newIndex = (prevIndex - 1 + goals.length) % goals.length; + scrollIntoView(newIndex); + return newIndex; + }); } - }, [upPress, goals.length]); + }, [upPress, goals.length, scrollIntoView]); useEffect(() => { if (disableKeyboardNavigation) return; From 445f567152ed3807327d5962f139b106fb632c5d Mon Sep 17 00:00:00 2001 From: vinaybadgujar102 Date: Sun, 18 Aug 2024 13:38:18 +0530 Subject: [PATCH 12/93] edit: use recoil instead of local state for focused goal --- src/hooks/useGoalSelection.ts | 8 ++++++-- src/store/GoalsState.ts | 6 ++++++ 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/src/hooks/useGoalSelection.ts b/src/hooks/useGoalSelection.ts index b597c0d23..191cb8469 100644 --- a/src/hooks/useGoalSelection.ts +++ b/src/hooks/useGoalSelection.ts @@ -1,12 +1,14 @@ import { GoalItem } from "@src/models/GoalItem"; -import { useCallback, useEffect, useMemo, useState } from "react"; +import { useCallback, useEffect, useMemo } from "react"; import { extractLinks } from "@src/utils/patterns"; import { ILocationState } from "@src/Interfaces"; import { useLocation, useNavigate } from "react-router-dom"; +import { useRecoilState } from "recoil"; +import { focusedGoalState } from "@src/store/GoalsState"; import { useKeyPress } from "./useKeyPress"; export const useGoalSelection = (goals: GoalItem[]): GoalItem | undefined => { - const [focusedIndex, setFocusedIndex] = useState(-1); + const [focusedIndex, setFocusedIndex] = useRecoilState(focusedGoalState); const location = useLocation(); const navigate = useNavigate(); @@ -35,6 +37,7 @@ export const useGoalSelection = (goals: GoalItem[]): GoalItem | undefined => { }, ], }; + setFocusedIndex(-1); navigate(`/goals/${goal.id}`, { state: newState }); }; @@ -106,6 +109,7 @@ export const useGoalSelection = (goals: GoalItem[]): GoalItem | undefined => { if (location.pathname === "/goals") { return; } + setFocusedIndex(location.state.index === undefined ? -1 : location.state.index); window.history.back(); } }, [leftPress]); diff --git a/src/store/GoalsState.ts b/src/store/GoalsState.ts index 152548841..18cc0f681 100644 --- a/src/store/GoalsState.ts +++ b/src/store/GoalsState.ts @@ -80,7 +80,13 @@ export const allowAddingBudgetGoal = atom({ key: "allowAddingBudgetGoal", default: true, }); + export const completedGoalsState = atom({ key: "completedGoalsState", default: {} as Record, }); + +export const focusedGoalState = atom({ + key: "focusState", + default: -1, +}); From cc381f71a446e63212614fee565a974219428faa Mon Sep 17 00:00:00 2001 From: vinaybadgujar102 Date: Sun, 18 Aug 2024 20:01:07 +0530 Subject: [PATCH 13/93] add: focused index state in location state --- src/hooks/useGoalSelection.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/hooks/useGoalSelection.ts b/src/hooks/useGoalSelection.ts index 191cb8469..0f20c0774 100644 --- a/src/hooks/useGoalSelection.ts +++ b/src/hooks/useGoalSelection.ts @@ -28,6 +28,7 @@ export const useGoalSelection = (goals: GoalItem[]): GoalItem | undefined => { const newState: ILocationState = { ...location.state, activeGoalId: goal.id, + foucusedGoalIndex: focusedIndex, goalsHistory: [ ...(location.state?.goalsHistory || []), { @@ -109,7 +110,7 @@ export const useGoalSelection = (goals: GoalItem[]): GoalItem | undefined => { if (location.pathname === "/goals") { return; } - setFocusedIndex(location.state.index === undefined ? -1 : location.state.index); + setFocusedIndex(location.state.foucusedGoalIndex === undefined ? -1 : location.state.foucusedGoalIndex); window.history.back(); } }, [leftPress]); From 3aab013f230b862a51728f392a4402e099d08bcb Mon Sep 17 00:00:00 2001 From: vinaybadgujar102 Date: Wed, 21 Aug 2024 22:15:37 +0530 Subject: [PATCH 14/93] add: dont register up and down key press if no goal present --- src/hooks/useGoalSelection.ts | 34 ++++++++++++++++++++-------------- 1 file changed, 20 insertions(+), 14 deletions(-) diff --git a/src/hooks/useGoalSelection.ts b/src/hooks/useGoalSelection.ts index 0f20c0774..5b07b1a09 100644 --- a/src/hooks/useGoalSelection.ts +++ b/src/hooks/useGoalSelection.ts @@ -12,6 +12,11 @@ export const useGoalSelection = (goals: GoalItem[]): GoalItem | undefined => { const location = useLocation(); const navigate = useNavigate(); + const upPress = useKeyPress("ArrowUp"); + const downPress = useKeyPress("ArrowDown"); + const rightPress = useKeyPress("ArrowRight"); + const leftPress = useKeyPress("ArrowLeft"); + const disableKeyboardNavigation = useMemo(() => { return location.search !== ""; }, [location.search]); @@ -42,10 +47,15 @@ export const useGoalSelection = (goals: GoalItem[]): GoalItem | undefined => { navigate(`/goals/${goal.id}`, { state: newState }); }; - const upPress = useKeyPress("ArrowUp"); - const downPress = useKeyPress("ArrowDown"); - const rightPress = useKeyPress("ArrowRight"); - const leftPress = useKeyPress("ArrowLeft"); + const scrollIntoView = useCallback( + (index: number) => { + const goalElement = document.getElementById(`goal-${goals[index]?.id}`); + if (goalElement) { + goalElement.scrollIntoView({ behavior: "smooth", block: "center" }); + } + }, + [goals], + ); useEffect(() => { const handleKeyDown = (e: KeyboardEvent) => { @@ -61,20 +71,12 @@ export const useGoalSelection = (goals: GoalItem[]): GoalItem | undefined => { }; }, []); - const scrollIntoView = useCallback( - (index: number) => { - const goalElement = document.getElementById(`goal-${goals[index]?.id}`); - if (goalElement) { - goalElement.scrollIntoView({ behavior: "smooth", block: "center" }); - } - }, - [goals], - ); - + // handle down key press useEffect(() => { if (disableKeyboardNavigation) return; if (downPress) { + if (goals.length === 0) return; setFocusedIndex((prevIndex) => { const newIndex = (prevIndex + 1) % goals.length; scrollIntoView(newIndex); @@ -83,10 +85,12 @@ export const useGoalSelection = (goals: GoalItem[]): GoalItem | undefined => { } }, [downPress, goals.length, scrollIntoView]); + // handle up key press useEffect(() => { if (disableKeyboardNavigation) return; if (upPress) { + if (goals.length === 0) return; setFocusedIndex((prevIndex) => { const newIndex = (prevIndex - 1 + goals.length) % goals.length; scrollIntoView(newIndex); @@ -95,6 +99,7 @@ export const useGoalSelection = (goals: GoalItem[]): GoalItem | undefined => { } }, [upPress, goals.length, scrollIntoView]); + // handle right key press useEffect(() => { if (disableKeyboardNavigation) return; @@ -103,6 +108,7 @@ export const useGoalSelection = (goals: GoalItem[]): GoalItem | undefined => { } }, [rightPress]); + // handle left key press useEffect(() => { if (disableKeyboardNavigation) return; From 87ba6bc662d3961b4cfda04863ff9dad78c2c798 Mon Sep 17 00:00:00 2001 From: vinaybadgujar102 Date: Mon, 26 Aug 2024 14:22:52 +0530 Subject: [PATCH 15/93] add: set focused index to new added goal --- src/hooks/useGoalSelection.ts | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/hooks/useGoalSelection.ts b/src/hooks/useGoalSelection.ts index 5b07b1a09..aed7f03a6 100644 --- a/src/hooks/useGoalSelection.ts +++ b/src/hooks/useGoalSelection.ts @@ -3,15 +3,18 @@ import { useCallback, useEffect, useMemo } from "react"; import { extractLinks } from "@src/utils/patterns"; import { ILocationState } from "@src/Interfaces"; import { useLocation, useNavigate } from "react-router-dom"; -import { useRecoilState } from "recoil"; +import { useRecoilState, useRecoilValue } from "recoil"; import { focusedGoalState } from "@src/store/GoalsState"; import { useKeyPress } from "./useKeyPress"; +import { lastAction } from "@src/store"; export const useGoalSelection = (goals: GoalItem[]): GoalItem | undefined => { const [focusedIndex, setFocusedIndex] = useRecoilState(focusedGoalState); const location = useLocation(); const navigate = useNavigate(); + const action = useRecoilValue(lastAction); + const upPress = useKeyPress("ArrowUp"); const downPress = useKeyPress("ArrowDown"); const rightPress = useKeyPress("ArrowRight"); @@ -57,6 +60,12 @@ export const useGoalSelection = (goals: GoalItem[]): GoalItem | undefined => { [goals], ); + useEffect(() => { + if (action === "goalItemCreated") { + setFocusedIndex(0); + } + }, [action]); + useEffect(() => { const handleKeyDown = (e: KeyboardEvent) => { if (["ArrowUp", "ArrowDown", "ArrowLeft", "ArrowRight"].includes(e.key)) { From e2fb626bdc254f0d5de6bde40516dc8dbeb33a84 Mon Sep 17 00:00:00 2001 From: vinaybadgujar102 Date: Mon, 26 Aug 2024 14:27:24 +0530 Subject: [PATCH 16/93] edit: dont focus on goal if any goal is not focused and user adds new goal --- src/hooks/useGoalSelection.ts | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/src/hooks/useGoalSelection.ts b/src/hooks/useGoalSelection.ts index aed7f03a6..24c97ac8b 100644 --- a/src/hooks/useGoalSelection.ts +++ b/src/hooks/useGoalSelection.ts @@ -5,8 +5,8 @@ import { ILocationState } from "@src/Interfaces"; import { useLocation, useNavigate } from "react-router-dom"; import { useRecoilState, useRecoilValue } from "recoil"; import { focusedGoalState } from "@src/store/GoalsState"; -import { useKeyPress } from "./useKeyPress"; import { lastAction } from "@src/store"; +import { useKeyPress } from "./useKeyPress"; export const useGoalSelection = (goals: GoalItem[]): GoalItem | undefined => { const [focusedIndex, setFocusedIndex] = useRecoilState(focusedGoalState); @@ -60,11 +60,9 @@ export const useGoalSelection = (goals: GoalItem[]): GoalItem | undefined => { [goals], ); - useEffect(() => { - if (action === "goalItemCreated") { - setFocusedIndex(0); - } - }, [action]); + if (focusedIndex !== -1 && action === "goalItemCreated") { + setFocusedIndex(0); + } useEffect(() => { const handleKeyDown = (e: KeyboardEvent) => { From ee89fad339091fe9a300a39e334fad69d4097fd1 Mon Sep 17 00:00:00 2001 From: vinaybadgujar Date: Wed, 28 Aug 2024 15:37:35 +0530 Subject: [PATCH 17/93] edit: remove small goal misalignment when it is highlighted --- src/components/GoalsComponents/GoalsList.tsx | 1 + src/pages/GoalsPage/GoalsPage.scss | 6 ++++++ 2 files changed, 7 insertions(+) diff --git a/src/components/GoalsComponents/GoalsList.tsx b/src/components/GoalsComponents/GoalsList.tsx index 3f4dc86a1..61edf5651 100644 --- a/src/components/GoalsComponents/GoalsList.tsx +++ b/src/components/GoalsComponents/GoalsList.tsx @@ -82,6 +82,7 @@ const GoalsList = ({ goals, setGoals }: GoalsListProps) => {
diff --git a/src/pages/GoalsPage/GoalsPage.scss b/src/pages/GoalsPage/GoalsPage.scss index f5971af1d..7240564f9 100644 --- a/src/pages/GoalsPage/GoalsPage.scss +++ b/src/pages/GoalsPage/GoalsPage.scss @@ -599,3 +599,9 @@ border-bottom: 15px solid transparent; border-left: 20px solid white; } + +.focused-goal { + .user-goal-main { + margin-left: 17.5px; + } +} From e3c097933f6b65f444b5ec1bbe90980e779a1112 Mon Sep 17 00:00:00 2001 From: vinaybadgujar Date: Sat, 31 Aug 2024 12:55:50 +0530 Subject: [PATCH 18/93] edit: add function to handle focus change --- src/hooks/useGoalSelection.ts | 30 +++++++++++------------------- 1 file changed, 11 insertions(+), 19 deletions(-) diff --git a/src/hooks/useGoalSelection.ts b/src/hooks/useGoalSelection.ts index 24c97ac8b..fb6926f48 100644 --- a/src/hooks/useGoalSelection.ts +++ b/src/hooks/useGoalSelection.ts @@ -35,7 +35,6 @@ export const useGoalSelection = (goals: GoalItem[]): GoalItem | undefined => { } const newState: ILocationState = { ...location.state, - activeGoalId: goal.id, foucusedGoalIndex: focusedIndex, goalsHistory: [ ...(location.state?.goalsHistory || []), @@ -50,14 +49,17 @@ export const useGoalSelection = (goals: GoalItem[]): GoalItem | undefined => { navigate(`/goals/${goal.id}`, { state: newState }); }; - const scrollIntoView = useCallback( - (index: number) => { - const goalElement = document.getElementById(`goal-${goals[index]?.id}`); + const handleFocusChange = useCallback( + (newIndex: number) => { + if (goals.length === 0) return; + const adjustedIndex = (newIndex + goals.length) % goals.length; + setFocusedIndex(adjustedIndex); + const goalElement = document.getElementById(`goal-${goals[adjustedIndex]?.id}`); if (goalElement) { goalElement.scrollIntoView({ behavior: "smooth", block: "center" }); } }, - [goals], + [goals, setFocusedIndex], ); if (focusedIndex !== -1 && action === "goalItemCreated") { @@ -83,28 +85,18 @@ export const useGoalSelection = (goals: GoalItem[]): GoalItem | undefined => { if (disableKeyboardNavigation) return; if (downPress) { - if (goals.length === 0) return; - setFocusedIndex((prevIndex) => { - const newIndex = (prevIndex + 1) % goals.length; - scrollIntoView(newIndex); - return newIndex; - }); + handleFocusChange(focusedIndex + 1); } - }, [downPress, goals.length, scrollIntoView]); + }, [downPress, goals.length, handleFocusChange]); // handle up key press useEffect(() => { if (disableKeyboardNavigation) return; if (upPress) { - if (goals.length === 0) return; - setFocusedIndex((prevIndex) => { - const newIndex = (prevIndex - 1 + goals.length) % goals.length; - scrollIntoView(newIndex); - return newIndex; - }); + handleFocusChange(focusedIndex - 1); } - }, [upPress, goals.length, scrollIntoView]); + }, [upPress, goals.length, handleFocusChange]); // handle right key press useEffect(() => { From 1d404fdf5f82300a5c0c83461f56dfbcb8c272d8 Mon Sep 17 00:00:00 2001 From: Vinay Badgujar Date: Tue, 3 Sep 2024 15:06:44 +0530 Subject: [PATCH 19/93] edit: use query params to manage state of focused goals --- src/hooks/useGoalSelection.ts | 56 +++++++++++++---------------------- 1 file changed, 20 insertions(+), 36 deletions(-) diff --git a/src/hooks/useGoalSelection.ts b/src/hooks/useGoalSelection.ts index fb6926f48..df9c495f6 100644 --- a/src/hooks/useGoalSelection.ts +++ b/src/hooks/useGoalSelection.ts @@ -1,32 +1,21 @@ import { GoalItem } from "@src/models/GoalItem"; -import { useCallback, useEffect, useMemo } from "react"; +import { useCallback, useEffect } from "react"; import { extractLinks } from "@src/utils/patterns"; import { ILocationState } from "@src/Interfaces"; -import { useLocation, useNavigate } from "react-router-dom"; -import { useRecoilState, useRecoilValue } from "recoil"; -import { focusedGoalState } from "@src/store/GoalsState"; -import { lastAction } from "@src/store"; +import { useLocation, useNavigate, useSearchParams } from "react-router-dom"; import { useKeyPress } from "./useKeyPress"; export const useGoalSelection = (goals: GoalItem[]): GoalItem | undefined => { - const [focusedIndex, setFocusedIndex] = useRecoilState(focusedGoalState); + const [searchParams, setSeachParams] = useSearchParams(); const location = useLocation(); const navigate = useNavigate(); - const action = useRecoilValue(lastAction); - const upPress = useKeyPress("ArrowUp"); const downPress = useKeyPress("ArrowDown"); const rightPress = useKeyPress("ArrowRight"); const leftPress = useKeyPress("ArrowLeft"); - const disableKeyboardNavigation = useMemo(() => { - return location.search !== ""; - }, [location.search]); - const handleRightKeyPress = (goal: GoalItem) => { - if (disableKeyboardNavigation) return; - const url = extractLinks(goal.title); if (url) { const finalUrl = url.startsWith("http://") || url.startsWith("https://") ? url : `https://${url}`; @@ -35,7 +24,6 @@ export const useGoalSelection = (goals: GoalItem[]): GoalItem | undefined => { } const newState: ILocationState = { ...location.state, - foucusedGoalIndex: focusedIndex, goalsHistory: [ ...(location.state?.goalsHistory || []), { @@ -45,7 +33,6 @@ export const useGoalSelection = (goals: GoalItem[]): GoalItem | undefined => { }, ], }; - setFocusedIndex(-1); navigate(`/goals/${goal.id}`, { state: newState }); }; @@ -53,19 +40,25 @@ export const useGoalSelection = (goals: GoalItem[]): GoalItem | undefined => { (newIndex: number) => { if (goals.length === 0) return; const adjustedIndex = (newIndex + goals.length) % goals.length; - setFocusedIndex(adjustedIndex); + setSeachParams( + { + focus: adjustedIndex.toString(), + }, + { + replace: true, + state: { + ...location.state, + }, + }, + ); const goalElement = document.getElementById(`goal-${goals[adjustedIndex]?.id}`); if (goalElement) { goalElement.scrollIntoView({ behavior: "smooth", block: "center" }); } }, - [goals, setFocusedIndex], + [goals], ); - if (focusedIndex !== -1 && action === "goalItemCreated") { - setFocusedIndex(0); - } - useEffect(() => { const handleKeyDown = (e: KeyboardEvent) => { if (["ArrowUp", "ArrowDown", "ArrowLeft", "ArrowRight"].includes(e.key)) { @@ -82,40 +75,31 @@ export const useGoalSelection = (goals: GoalItem[]): GoalItem | undefined => { // handle down key press useEffect(() => { - if (disableKeyboardNavigation) return; - if (downPress) { - handleFocusChange(focusedIndex + 1); + handleFocusChange(Number(searchParams.get("focus")) + 1); } }, [downPress, goals.length, handleFocusChange]); // handle up key press useEffect(() => { - if (disableKeyboardNavigation) return; - if (upPress) { - handleFocusChange(focusedIndex - 1); + handleFocusChange(Number(searchParams.get("focus")) - 1); } }, [upPress, goals.length, handleFocusChange]); // handle right key press useEffect(() => { - if (disableKeyboardNavigation) return; - - if (rightPress && goals.length > 0 && focusedIndex !== -1) { - handleRightKeyPress(goals[focusedIndex]); + if (rightPress && goals.length > 0) { + handleRightKeyPress(goals[Number(searchParams.get("focus"))]); } }, [rightPress]); // handle left key press useEffect(() => { - if (disableKeyboardNavigation) return; - if (leftPress) { if (location.pathname === "/goals") { return; } - setFocusedIndex(location.state.foucusedGoalIndex === undefined ? -1 : location.state.foucusedGoalIndex); window.history.back(); } }, [leftPress]); @@ -124,5 +108,5 @@ export const useGoalSelection = (goals: GoalItem[]): GoalItem | undefined => { return undefined; } - return goals[focusedIndex]; + return goals[Number(searchParams.get("focus"))]; }; From 814f1f541c7dea0e401720fc866b740243332435 Mon Sep 17 00:00:00 2001 From: Vinay Badgujar Date: Wed, 4 Sep 2024 17:14:55 +0530 Subject: [PATCH 20/93] refactor: reduce redundancy --- src/hooks/useGoalSelection.ts | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/hooks/useGoalSelection.ts b/src/hooks/useGoalSelection.ts index df9c495f6..b3d5578ca 100644 --- a/src/hooks/useGoalSelection.ts +++ b/src/hooks/useGoalSelection.ts @@ -15,7 +15,10 @@ export const useGoalSelection = (goals: GoalItem[]): GoalItem | undefined => { const rightPress = useKeyPress("ArrowRight"); const leftPress = useKeyPress("ArrowLeft"); + const focusIndex = Number(searchParams.get("focus") || -1); + const handleRightKeyPress = (goal: GoalItem) => { + if (!goal) return; const url = extractLinks(goal.title); if (url) { const finalUrl = url.startsWith("http://") || url.startsWith("https://") ? url : `https://${url}`; @@ -76,21 +79,21 @@ export const useGoalSelection = (goals: GoalItem[]): GoalItem | undefined => { // handle down key press useEffect(() => { if (downPress) { - handleFocusChange(Number(searchParams.get("focus")) + 1); + handleFocusChange(focusIndex + 1); } }, [downPress, goals.length, handleFocusChange]); // handle up key press useEffect(() => { if (upPress) { - handleFocusChange(Number(searchParams.get("focus")) - 1); + handleFocusChange(focusIndex - 1); } }, [upPress, goals.length, handleFocusChange]); // handle right key press useEffect(() => { if (rightPress && goals.length > 0) { - handleRightKeyPress(goals[Number(searchParams.get("focus"))]); + handleRightKeyPress(goals[focusIndex]); } }, [rightPress]); @@ -108,5 +111,5 @@ export const useGoalSelection = (goals: GoalItem[]): GoalItem | undefined => { return undefined; } - return goals[Number(searchParams.get("focus"))]; + return goals[focusIndex]; }; From 54ba9bc68d5a68199c389f15bacde6b123a626b8 Mon Sep 17 00:00:00 2001 From: Vinay Badgujar Date: Wed, 4 Sep 2024 17:24:12 +0530 Subject: [PATCH 21/93] refactor: use only one useeffect --- src/hooks/useGoalSelection.ts | 24 ++++-------------------- 1 file changed, 4 insertions(+), 20 deletions(-) diff --git a/src/hooks/useGoalSelection.ts b/src/hooks/useGoalSelection.ts index b3d5578ca..040a69705 100644 --- a/src/hooks/useGoalSelection.ts +++ b/src/hooks/useGoalSelection.ts @@ -71,45 +71,29 @@ export const useGoalSelection = (goals: GoalItem[]): GoalItem | undefined => { window.addEventListener("keydown", handleKeyDown); - return () => { - window.removeEventListener("keydown", handleKeyDown); - }; - }, []); - - // handle down key press - useEffect(() => { if (downPress) { handleFocusChange(focusIndex + 1); } - }, [downPress, goals.length, handleFocusChange]); - // handle up key press - useEffect(() => { if (upPress) { handleFocusChange(focusIndex - 1); } - }, [upPress, goals.length, handleFocusChange]); - // handle right key press - useEffect(() => { if (rightPress && goals.length > 0) { handleRightKeyPress(goals[focusIndex]); } - }, [rightPress]); - // handle left key press - useEffect(() => { if (leftPress) { if (location.pathname === "/goals") { return; } window.history.back(); } - }, [leftPress]); - if (goals.length === 0) { - return undefined; - } + return () => { + window.removeEventListener("keydown", handleKeyDown); + }; + }, [downPress, upPress, rightPress, leftPress]); return goals[focusIndex]; }; From d79d4f5f459ab0904f10e0a39517efe9ff713565 Mon Sep 17 00:00:00 2001 From: Vinay Badgujar Date: Wed, 4 Sep 2024 17:27:32 +0530 Subject: [PATCH 22/93] remove: focusedGoal recoil state --- src/store/GoalsState.ts | 5 ----- 1 file changed, 5 deletions(-) diff --git a/src/store/GoalsState.ts b/src/store/GoalsState.ts index 18cc0f681..f01fac67e 100644 --- a/src/store/GoalsState.ts +++ b/src/store/GoalsState.ts @@ -85,8 +85,3 @@ export const completedGoalsState = atom({ key: "completedGoalsState", default: {} as Record, }); - -export const focusedGoalState = atom({ - key: "focusState", - default: -1, -}); From 69efdada22365def08c54f0c2468fc015da78b6a Mon Sep 17 00:00:00 2001 From: Vinay Badgujar Date: Wed, 11 Sep 2024 13:55:09 +0530 Subject: [PATCH 23/93] fix: goal hint option not updated correctly --- src/hooks/useGoalActions.tsx | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/hooks/useGoalActions.tsx b/src/hooks/useGoalActions.tsx index 6dc46edec..9fd2046a9 100644 --- a/src/hooks/useGoalActions.tsx +++ b/src/hooks/useGoalActions.tsx @@ -17,6 +17,7 @@ import { ILocationState } from "@src/Interfaces"; import { hashObject } from "@src/utils"; import { useActiveGoalContext } from "@src/contexts/activeGoal-context"; import { removeBackTicks } from "@src/utils/patterns"; +import { getGoalHintItem } from "@src/api/HintsAPI"; const useGoalActions = () => { const { state }: { state: ILocationState } = useLocation(); @@ -66,11 +67,14 @@ const useGoalActions = () => { const updateGoal = async (goal: GoalItem, hints: boolean) => { const addGoalSound = new Audio(plingSound); + const currentHint = await getGoalHintItem(goal.id); + const titleContainsCode = /```/.test(goal.title); if (goal.sublist.length > 0 && titleContainsCode) { showMessage("Action Failed!!", "Cannot update the title to include code if the goal has a subgoal."); return; } + if (isPartnerModeActive) { let rootGoal = goal; if (state.goalsHistory && state.goalsHistory.length > 0) { @@ -78,7 +82,7 @@ const useGoalActions = () => { rootGoal = (await getSharedWMGoalById(rootGoalId)) || goal; } suggestChanges(rootGoal, goal, subGoalsHistory.length); - } else if (activeGoal && hashObject(activeGoal) !== hashObject(goal)) { + } else if (activeGoal && (hashObject({ ...activeGoal }) !== hashObject(goal) || currentHint?.hint !== hints)) { // Comparing hashes of the old (activeGoal) and updated (goal) versions to check if the goal has changed await modifyGoal(goal.id, goal, [...ancestors, goal.id], hints); setLastAction("goalUpdated"); From 298f13144fc587129fc1f94bc14b394e3f87f153 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 12 Sep 2024 14:30:31 +0000 Subject: [PATCH 24/93] chore(deps): bump micromatch from 4.0.7 to 4.0.8 Bumps [micromatch](https://github.com/micromatch/micromatch) from 4.0.7 to 4.0.8. - [Release notes](https://github.com/micromatch/micromatch/releases) - [Changelog](https://github.com/micromatch/micromatch/blob/master/CHANGELOG.md) - [Commits](https://github.com/micromatch/micromatch/compare/4.0.7...4.0.8) --- updated-dependencies: - dependency-name: micromatch dependency-type: indirect ... Signed-off-by: dependabot[bot] --- package-lock.json | 787 ++-------------------------------------------- 1 file changed, 32 insertions(+), 755 deletions(-) diff --git a/package-lock.json b/package-lock.json index 569a3d888..8d054ed41 100644 --- a/package-lock.json +++ b/package-lock.json @@ -68,10 +68,7 @@ "serve": "^14.1.1", "tslint": "^6.1.3", "typescript": "^4.7.3", - "vite-plugin-pwa": "^0.12.0", - "webpack": "^5.93.0", - "webpack-assets-manifest": "^5.2.1", - "webpack-cli": "^5.1.4" + "vite-plugin-pwa": "^0.12.0" } }, "node_modules/@adobe/css-tools": { @@ -2226,15 +2223,6 @@ "node": ">=10" } }, - "node_modules/@discoveryjs/json-ext": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", - "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", - "dev": true, - "engines": { - "node": ">=10.0.0" - } - }, "node_modules/@dnd-kit/accessibility": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/@dnd-kit/accessibility/-/accessibility-3.1.0.tgz", @@ -3917,21 +3905,13 @@ "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.56.10.tgz", "integrity": "sha512-Shavhk87gCtY2fhXDctcfS3e6FdxWkCx1iUZ9eEUbh7rTqlZT0/IzOkCOVt0fCjcFuZ9FPYfuezTBImfHCDBGQ==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "@types/estree": "*", "@types/json-schema": "*" } }, - "node_modules/@types/eslint-scope": { - "version": "3.7.7", - "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz", - "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==", - "dev": true, - "dependencies": { - "@types/eslint": "*", - "@types/estree": "*" - } - }, "node_modules/@types/estree": { "version": "0.0.39", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz", @@ -4561,208 +4541,6 @@ "dev": true, "license": "ISC" }, - "node_modules/@webassemblyjs/ast": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.12.1.tgz", - "integrity": "sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg==", - "dev": true, - "dependencies": { - "@webassemblyjs/helper-numbers": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6" - } - }, - "node_modules/@webassemblyjs/floating-point-hex-parser": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz", - "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==", - "dev": true - }, - "node_modules/@webassemblyjs/helper-api-error": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", - "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==", - "dev": true - }, - "node_modules/@webassemblyjs/helper-buffer": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.12.1.tgz", - "integrity": "sha512-nzJwQw99DNDKr9BVCOZcLuJJUlqkJh+kVzVl6Fmq/tI5ZtEyWT1KZMyOXltXLZJmDtvLCDgwsyrkohEtopTXCw==", - "dev": true - }, - "node_modules/@webassemblyjs/helper-numbers": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz", - "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==", - "dev": true, - "dependencies": { - "@webassemblyjs/floating-point-hex-parser": "1.11.6", - "@webassemblyjs/helper-api-error": "1.11.6", - "@xtuc/long": "4.2.2" - } - }, - "node_modules/@webassemblyjs/helper-wasm-bytecode": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", - "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==", - "dev": true - }, - "node_modules/@webassemblyjs/helper-wasm-section": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.12.1.tgz", - "integrity": "sha512-Jif4vfB6FJlUlSbgEMHUyk1j234GTNG9dBJ4XJdOySoj518Xj0oGsNi59cUQF4RRMS9ouBUxDDdyBVfPTypa5g==", - "dev": true, - "dependencies": { - "@webassemblyjs/ast": "1.12.1", - "@webassemblyjs/helper-buffer": "1.12.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/wasm-gen": "1.12.1" - } - }, - "node_modules/@webassemblyjs/ieee754": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz", - "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==", - "dev": true, - "dependencies": { - "@xtuc/ieee754": "^1.2.0" - } - }, - "node_modules/@webassemblyjs/leb128": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz", - "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==", - "dev": true, - "dependencies": { - "@xtuc/long": "4.2.2" - } - }, - "node_modules/@webassemblyjs/utf8": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz", - "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==", - "dev": true - }, - "node_modules/@webassemblyjs/wasm-edit": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.12.1.tgz", - "integrity": "sha512-1DuwbVvADvS5mGnXbE+c9NfA8QRcZ6iKquqjjmR10k6o+zzsRVesil54DKexiowcFCPdr/Q0qaMgB01+SQ1u6g==", - "dev": true, - "dependencies": { - "@webassemblyjs/ast": "1.12.1", - "@webassemblyjs/helper-buffer": "1.12.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/helper-wasm-section": "1.12.1", - "@webassemblyjs/wasm-gen": "1.12.1", - "@webassemblyjs/wasm-opt": "1.12.1", - "@webassemblyjs/wasm-parser": "1.12.1", - "@webassemblyjs/wast-printer": "1.12.1" - } - }, - "node_modules/@webassemblyjs/wasm-gen": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.12.1.tgz", - "integrity": "sha512-TDq4Ojh9fcohAw6OIMXqiIcTq5KUXTGRkVxbSo1hQnSy6lAM5GSdfwWeSxpAo0YzgsgF182E/U0mDNhuA0tW7w==", - "dev": true, - "dependencies": { - "@webassemblyjs/ast": "1.12.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/ieee754": "1.11.6", - "@webassemblyjs/leb128": "1.11.6", - "@webassemblyjs/utf8": "1.11.6" - } - }, - "node_modules/@webassemblyjs/wasm-opt": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.12.1.tgz", - "integrity": "sha512-Jg99j/2gG2iaz3hijw857AVYekZe2SAskcqlWIZXjji5WStnOpVoat3gQfT/Q5tb2djnCjBtMocY/Su1GfxPBg==", - "dev": true, - "dependencies": { - "@webassemblyjs/ast": "1.12.1", - "@webassemblyjs/helper-buffer": "1.12.1", - "@webassemblyjs/wasm-gen": "1.12.1", - "@webassemblyjs/wasm-parser": "1.12.1" - } - }, - "node_modules/@webassemblyjs/wasm-parser": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.12.1.tgz", - "integrity": "sha512-xikIi7c2FHXysxXe3COrVUPSheuBtpcfhbpFj4gmu7KRLYOzANztwUU0IbsqvMqzuNK2+glRGWCEqZo1WCLyAQ==", - "dev": true, - "dependencies": { - "@webassemblyjs/ast": "1.12.1", - "@webassemblyjs/helper-api-error": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/ieee754": "1.11.6", - "@webassemblyjs/leb128": "1.11.6", - "@webassemblyjs/utf8": "1.11.6" - } - }, - "node_modules/@webassemblyjs/wast-printer": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.12.1.tgz", - "integrity": "sha512-+X4WAlOisVWQMikjbcvY2e0rwPsKQ9F688lksZhBcPycBBuii3O7m8FACbDMWDojpAqvjIncrG8J0XHKyQfVeA==", - "dev": true, - "dependencies": { - "@webassemblyjs/ast": "1.12.1", - "@xtuc/long": "4.2.2" - } - }, - "node_modules/@webpack-cli/configtest": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-2.1.1.tgz", - "integrity": "sha512-wy0mglZpDSiSS0XHrVR+BAdId2+yxPSoJW8fsna3ZpYSlufjvxnP4YbKTCBZnNIcGN4r6ZPXV55X4mYExOfLmw==", - "dev": true, - "engines": { - "node": ">=14.15.0" - }, - "peerDependencies": { - "webpack": "5.x.x", - "webpack-cli": "5.x.x" - } - }, - "node_modules/@webpack-cli/info": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-2.0.2.tgz", - "integrity": "sha512-zLHQdI/Qs1UyT5UBdWNqsARasIA+AaF8t+4u2aS2nEpBQh2mWIVb8qAklq0eUENnC5mOItrIB4LiS9xMtph18A==", - "dev": true, - "engines": { - "node": ">=14.15.0" - }, - "peerDependencies": { - "webpack": "5.x.x", - "webpack-cli": "5.x.x" - } - }, - "node_modules/@webpack-cli/serve": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-2.0.5.tgz", - "integrity": "sha512-lqaoKnRYBdo1UgDX8uF24AfGMifWK19TxPmM5FHc2vAGxrJ/qtyUyFBWoY1tISZdelsQ5fBcOusifo5o5wSJxQ==", - "dev": true, - "engines": { - "node": ">=14.15.0" - }, - "peerDependencies": { - "webpack": "5.x.x", - "webpack-cli": "5.x.x" - }, - "peerDependenciesMeta": { - "webpack-dev-server": { - "optional": true - } - } - }, - "node_modules/@xtuc/ieee754": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", - "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", - "dev": true - }, - "node_modules/@xtuc/long": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", - "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", - "dev": true - }, "node_modules/@zeit/schemas": { "version": "2.36.0", "resolved": "https://registry.npmjs.org/@zeit/schemas/-/schemas-2.36.0.tgz", @@ -4827,15 +4605,6 @@ "node": ">=0.4.0" } }, - "node_modules/acorn-import-attributes": { - "version": "1.9.5", - "resolved": "https://registry.npmjs.org/acorn-import-attributes/-/acorn-import-attributes-1.9.5.tgz", - "integrity": "sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==", - "dev": true, - "peerDependencies": { - "acorn": "^8" - } - }, "node_modules/acorn-jsx": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", @@ -4900,15 +4669,6 @@ "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "dev": true, - "peerDependencies": { - "ajv": "^6.9.1" - } - }, "node_modules/ajv/node_modules/json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", @@ -5899,15 +5659,6 @@ "fsevents": "~2.3.2" } }, - "node_modules/chrome-trace-event": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz", - "integrity": "sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==", - "dev": true, - "engines": { - "node": ">=6.0" - } - }, "node_modules/ci-info": { "version": "3.9.0", "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", @@ -6066,20 +5817,6 @@ "wrap-ansi": "^7.0.0" } }, - "node_modules/clone-deep": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", - "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", - "dev": true, - "dependencies": { - "is-plain-object": "^2.0.4", - "kind-of": "^6.0.2", - "shallow-clone": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/co": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", @@ -6748,31 +6485,6 @@ "dev": true, "license": "MIT" }, - "node_modules/enhanced-resolve": { - "version": "5.17.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.17.0.tgz", - "integrity": "sha512-dwDPwZL0dmye8Txp2gzFmA6sxALaSvdRDjPH0viLcKrtlOL3tw62nWWweVD1SdILDTJrbrL6tdWVN58Wo6U3eA==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.2.4", - "tapable": "^2.2.0" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/envinfo": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.13.0.tgz", - "integrity": "sha512-cvcaMr7KqXVh4nyzGTVqTum+gAiL265x5jUWQIDLq//zOGbW+gSW/C+OWLleY/rs9Qole6AZLMXPbtIFQbqu+Q==", - "dev": true, - "bin": { - "envinfo": "dist/cli.js" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/error-ex": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", @@ -6914,12 +6626,6 @@ "node": ">= 0.4" } }, - "node_modules/es-module-lexer": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.5.4.tgz", - "integrity": "sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==", - "dev": true - }, "node_modules/es-object-atoms": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz", @@ -7695,15 +7401,6 @@ "node": ">=0.10.0" } }, - "node_modules/events": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", - "dev": true, - "engines": { - "node": ">=0.8.x" - } - }, "node_modules/execa": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", @@ -7821,15 +7518,6 @@ "dev": true, "license": "MIT" }, - "node_modules/fastest-levenshtein": { - "version": "1.0.16", - "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", - "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==", - "dev": true, - "engines": { - "node": ">= 4.9.1" - } - }, "node_modules/fastq": { "version": "1.17.1", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", @@ -7920,15 +7608,6 @@ "node": ">=8" } }, - "node_modules/flat": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", - "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", - "dev": true, - "bin": { - "flat": "cli.js" - } - }, "node_modules/flat-cache": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", @@ -7998,6 +7677,19 @@ "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", "license": "ISC" }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, "node_modules/function-bind": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", @@ -8154,12 +7846,6 @@ "node": ">= 6" } }, - "node_modules/glob-to-regexp": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", - "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", - "dev": true - }, "node_modules/globals": { "version": "11.12.0", "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", @@ -8580,15 +8266,6 @@ "node": ">= 0.4" } }, - "node_modules/interpret": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-3.1.1.tgz", - "integrity": "sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ==", - "dev": true, - "engines": { - "node": ">=10.13.0" - } - }, "node_modules/is-arguments": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", @@ -8912,18 +8589,6 @@ "node": ">=8" } }, - "node_modules/is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "dev": true, - "dependencies": { - "isobject": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/is-port-reachable": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/is-port-reachable/-/is-port-reachable-4.0.0.tgz", @@ -9138,15 +8803,6 @@ "dev": true, "license": "ISC" }, - "node_modules/isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/istanbul-lib-coverage": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", @@ -9816,40 +9472,6 @@ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, - "node_modules/jest-runtime/node_modules/@jest/environment": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-27.5.1.tgz", - "integrity": "sha512-/WQjhPJe3/ghaol/4Bq480JKXV/Rfw8nQdN7f41fM8VDHLcxKXou6QyXAh3EFr9/bVG3x74z1NWDkP87EiY8gA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/fake-timers": "^27.5.1", - "@jest/types": "^27.5.1", - "@types/node": "*", - "jest-mock": "^27.5.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-runtime/node_modules/@jest/fake-timers": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-27.5.1.tgz", - "integrity": "sha512-/aPowoolwa07k7/oM3aASneNeBGCmGQsc3ugN4u6s4C/+s5M64MFo/+djTdiwcbQlRfFElGuDXWzaWj6QgKObQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/types": "^27.5.1", - "@sinonjs/fake-timers": "^8.0.1", - "@types/node": "*", - "jest-message-util": "^27.5.1", - "jest-mock": "^27.5.1", - "jest-util": "^27.5.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, "node_modules/jest-runtime/node_modules/@jest/globals": { "version": "27.5.1", "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-27.5.1.tgz", @@ -9865,32 +9487,6 @@ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, - "node_modules/jest-runtime/node_modules/@jest/types": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", - "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^16.0.0", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-runtime/node_modules/@types/yargs": { - "version": "16.0.9", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz", - "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==", - "dev": true, - "dependencies": { - "@types/yargs-parser": "*" - } - }, "node_modules/jest-runtime/node_modules/strip-bom": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", @@ -10290,15 +9886,6 @@ "json-buffer": "3.0.1" } }, - "node_modules/kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/kleur": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", @@ -10485,15 +10072,6 @@ "node": ">=8" } }, - "node_modules/loader-runner": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", - "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", - "dev": true, - "engines": { - "node": ">=6.11.5" - } - }, "node_modules/locate-path": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", @@ -10506,15 +10084,6 @@ "node": ">=8" } }, - "node_modules/lockfile": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/lockfile/-/lockfile-1.0.4.tgz", - "integrity": "sha512-cvbTwETRfsFh4nHsL1eGWapU1XFi5Ot9E85sWAwia7Y7EgB7vfqcZhTKZ+l7hCGxSPoushMv5GKhT5PdLv03WA==", - "dev": true, - "dependencies": { - "signal-exit": "^3.0.2" - } - }, "node_modules/lodash": { "version": "4.17.21", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", @@ -10528,18 +10097,6 @@ "dev": true, "license": "MIT" }, - "node_modules/lodash.get": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", - "integrity": "sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==", - "dev": true - }, - "node_modules/lodash.has": { - "version": "4.5.2", - "resolved": "https://registry.npmjs.org/lodash.has/-/lodash.has-4.5.2.tgz", - "integrity": "sha512-rnYUdIo6xRCJnQmbVFEwcxF144erlD+M3YcJUVesflU9paQaE8p+fJDcIQrlMYbxoANFL+AB9hZrzSBBk5PL+g==", - "dev": true - }, "node_modules/lodash.merge": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", @@ -10716,10 +10273,9 @@ } }, "node_modules/micromatch": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.7.tgz", - "integrity": "sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==", - "license": "MIT", + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", "dependencies": { "braces": "^3.0.3", "picomatch": "^2.3.1" @@ -10876,12 +10432,6 @@ "node": ">= 0.6" } }, - "node_modules/neo-async": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", - "dev": true - }, "node_modules/node-int64": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", @@ -11350,6 +10900,19 @@ "node": ">=18" } }, + "node_modules/playwright/node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, "node_modules/possible-typed-array-names": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", @@ -12328,18 +11891,6 @@ "node": ">=8.10.0" } }, - "node_modules/rechoir": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.8.0.tgz", - "integrity": "sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==", - "dev": true, - "dependencies": { - "resolve": "^1.20.0" - }, - "engines": { - "node": ">= 10.13.0" - } - }, "node_modules/recoil": { "version": "0.7.7", "resolved": "https://registry.npmjs.org/recoil/-/recoil-0.7.7.tgz", @@ -12844,24 +12395,6 @@ "loose-envify": "^1.1.0" } }, - "node_modules/schema-utils": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", - "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", - "dev": true, - "dependencies": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, "node_modules/scroll-into-view-if-needed": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/scroll-into-view-if-needed/-/scroll-into-view-if-needed-3.1.0.tgz", @@ -13020,18 +12553,6 @@ "node": ">= 0.4" } }, - "node_modules/shallow-clone": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", - "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", - "dev": true, - "dependencies": { - "kind-of": "^6.0.2" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -13520,15 +13041,6 @@ "url": "https://opencollective.com/unts" } }, - "node_modules/tapable": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", - "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, "node_modules/temp-dir": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-2.0.0.tgz", @@ -13607,49 +13119,6 @@ "node": ">=10" } }, - "node_modules/terser-webpack-plugin": { - "version": "5.3.10", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.10.tgz", - "integrity": "sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==", - "dev": true, - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.20", - "jest-worker": "^27.4.5", - "schema-utils": "^3.1.1", - "serialize-javascript": "^6.0.1", - "terser": "^5.26.0" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.1.0" - }, - "peerDependenciesMeta": { - "@swc/core": { - "optional": true - }, - "esbuild": { - "optional": true - }, - "uglify-js": { - "optional": true - } - } - }, - "node_modules/terser-webpack-plugin/node_modules/serialize-javascript": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", - "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", - "dev": true, - "dependencies": { - "randombytes": "^2.1.0" - } - }, "node_modules/test-exclude": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", @@ -14500,19 +13969,6 @@ "makeerror": "1.0.12" } }, - "node_modules/watchpack": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.1.tgz", - "integrity": "sha512-8wrBCMtVhqcXP2Sup1ctSkga6uc2Bx0IIvKyT7yTFier5AXHooSI+QyQQAtTb7+E0IUCCKyTFmXqdqgum2XWGg==", - "dev": true, - "dependencies": { - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.1.2" - }, - "engines": { - "node": ">=10.13.0" - } - }, "node_modules/webidl-conversions": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz", @@ -14523,179 +13979,6 @@ "node": ">=10.4" } }, - "node_modules/webpack": { - "version": "5.93.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.93.0.tgz", - "integrity": "sha512-Y0m5oEY1LRuwly578VqluorkXbvXKh7U3rLoQCEO04M97ScRr44afGVkI0FQFsXzysk5OgFAxjZAb9rsGQVihA==", - "dev": true, - "dependencies": { - "@types/eslint-scope": "^3.7.3", - "@types/estree": "^1.0.5", - "@webassemblyjs/ast": "^1.12.1", - "@webassemblyjs/wasm-edit": "^1.12.1", - "@webassemblyjs/wasm-parser": "^1.12.1", - "acorn": "^8.7.1", - "acorn-import-attributes": "^1.9.5", - "browserslist": "^4.21.10", - "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.17.0", - "es-module-lexer": "^1.2.1", - "eslint-scope": "5.1.1", - "events": "^3.2.0", - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.2.11", - "json-parse-even-better-errors": "^2.3.1", - "loader-runner": "^4.2.0", - "mime-types": "^2.1.27", - "neo-async": "^2.6.2", - "schema-utils": "^3.2.0", - "tapable": "^2.1.1", - "terser-webpack-plugin": "^5.3.10", - "watchpack": "^2.4.1", - "webpack-sources": "^3.2.3" - }, - "bin": { - "webpack": "bin/webpack.js" - }, - "engines": { - "node": ">=10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependenciesMeta": { - "webpack-cli": { - "optional": true - } - } - }, - "node_modules/webpack-assets-manifest": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/webpack-assets-manifest/-/webpack-assets-manifest-5.2.1.tgz", - "integrity": "sha512-MsEcXVio1GY6R+b4dVfTHIDMB0RB90KajQG8neRbH92vE2S1ClGw9mNa9NPlratYBvZOhExmN0qqMNFTaCTuIg==", - "dev": true, - "dependencies": { - "chalk": "^4.1.2", - "deepmerge": "^4.3.1", - "lockfile": "^1.0.4", - "lodash.get": "^4.4.2", - "lodash.has": "^4.5.2", - "schema-utils": "^3.3.0", - "tapable": "^2.2.1" - }, - "engines": { - "node": ">=10.13.0" - }, - "peerDependencies": { - "webpack": "^5.2.0" - } - }, - "node_modules/webpack-cli": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-5.1.4.tgz", - "integrity": "sha512-pIDJHIEI9LR0yxHXQ+Qh95k2EvXpWzZ5l+d+jIo+RdSm9MiHfzazIxwwni/p7+x4eJZuvG1AJwgC4TNQ7NRgsg==", - "dev": true, - "dependencies": { - "@discoveryjs/json-ext": "^0.5.0", - "@webpack-cli/configtest": "^2.1.1", - "@webpack-cli/info": "^2.0.2", - "@webpack-cli/serve": "^2.0.5", - "colorette": "^2.0.14", - "commander": "^10.0.1", - "cross-spawn": "^7.0.3", - "envinfo": "^7.7.3", - "fastest-levenshtein": "^1.0.12", - "import-local": "^3.0.2", - "interpret": "^3.1.1", - "rechoir": "^0.8.0", - "webpack-merge": "^5.7.3" - }, - "bin": { - "webpack-cli": "bin/cli.js" - }, - "engines": { - "node": ">=14.15.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "5.x.x" - }, - "peerDependenciesMeta": { - "@webpack-cli/generators": { - "optional": true - }, - "webpack-bundle-analyzer": { - "optional": true - }, - "webpack-dev-server": { - "optional": true - } - } - }, - "node_modules/webpack-cli/node_modules/commander": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", - "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", - "dev": true, - "engines": { - "node": ">=14" - } - }, - "node_modules/webpack-merge": { - "version": "5.10.0", - "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.10.0.tgz", - "integrity": "sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==", - "dev": true, - "dependencies": { - "clone-deep": "^4.0.1", - "flat": "^5.0.2", - "wildcard": "^2.0.0" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/webpack-sources": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", - "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", - "dev": true, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/webpack/node_modules/@types/estree": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", - "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", - "dev": true - }, - "node_modules/webpack/node_modules/eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "dev": true, - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/webpack/node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, "node_modules/whatwg-encoding": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", @@ -14890,12 +14173,6 @@ "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, - "node_modules/wildcard": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.1.tgz", - "integrity": "sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==", - "dev": true - }, "node_modules/word-wrap": { "version": "1.2.5", "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", From bf5461b4d5ad5200add6f68adc284ac1d88b5b67 Mon Sep 17 00:00:00 2001 From: Tijl Leenders <44887755+tijlleenders@users.noreply.github.com> Date: Fri, 13 Sep 2024 10:04:43 +0200 Subject: [PATCH 25/93] Create SECURITY.md --- SECURITY.md | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 SECURITY.md diff --git a/SECURITY.md b/SECURITY.md new file mode 100644 index 000000000..a12d22db0 --- /dev/null +++ b/SECURITY.md @@ -0,0 +1,17 @@ +# Security Policy + +## Supported Versions + +Use this section to tell people about which versions of your project are +currently being supported with security updates. + +| Version | Supported | +| ------- | ------------------ | +| latest | :white_check_mark: | + +## Reporting a Vulnerability + +1. Anonymous on https://zinzen.vercel.app/Feedback +2. Email gh-security@ZinZen.me +3. DM via Signal: ZinZen.01 +4. DM via Matrix: @tijlleenders:matrix.org From 31623b729390ef3f3b06e75947431de8d9609eab Mon Sep 17 00:00:00 2001 From: Vinay Badgujar Date: Sat, 14 Sep 2024 12:20:11 +0530 Subject: [PATCH 26/93] refactor: make hint related code more verbose for easy understanding --- src/api/HintsAPI/index.ts | 16 ++++++++-------- .../GoalConfigModal/ConfigGoal.tsx | 12 ++++++------ src/helpers/GoalController.ts | 6 +++--- src/hooks/useGoalActions.tsx | 15 +++++++++------ src/models/HintItem.ts | 4 ++-- src/models/dexie.ts | 2 +- 6 files changed, 29 insertions(+), 26 deletions(-) diff --git a/src/api/HintsAPI/index.ts b/src/api/HintsAPI/index.ts index 44bddfdb4..f5662ceaa 100644 --- a/src/api/HintsAPI/index.ts +++ b/src/api/HintsAPI/index.ts @@ -1,12 +1,12 @@ import { db } from "@src/models"; -import { IGoalHint } from "@src/models/HintItem"; +import { HintItem, IGoalHint } from "@src/models/HintItem"; import { v4 as uuidv4 } from "uuid"; export const checkForNewGoalHints = async (hintId: string, newGoalHints: IGoalHint[]) => { try { const hintItem = await db.hintsCollection.get(hintId); if (!hintItem) return false; - const currentGoalHints = hintItem.goalHints || []; + const currentGoalHints = hintItem.availableGoalHints || []; const combinedHints = [...currentGoalHints]; const existingTitles = new Set(combinedHints.map((hint) => hint.title)); @@ -32,14 +32,14 @@ export const getGoalHintItem = async (goalId: string) => { return hintItem.length > 0 ? hintItem[0] : null; }; -export const addHintItem = async (goalId: string, hint: boolean, goalHints: IGoalHint[]) => { +export const addHintItem = async (goalId: string, hintOption: boolean, goalHints: IGoalHint[]) => { const updatedHintsWithId = ensureGoalHintsHaveIds(goalHints); const now = new Date(); const oneDayLater = new Date(now.getTime() + 24 * 60 * 60 * 1000); - const hintObject = { + const hintObject: HintItem = { id: goalId, - hint, - goalHints: updatedHintsWithId, + hintOptionEnabled: hintOption, + availableGoalHints: updatedHintsWithId, lastCheckedDate: now.toISOString(), nextCheckDate: oneDayLater.toISOString(), }; @@ -108,8 +108,8 @@ export const deleteGoalHint = async (parentGoalId: string, goalId: string) => { const goalHintsItem = await db.hintsCollection.get(parentGoalId); if (goalHintsItem) { - const updatedGoalHints = goalHintsItem.goalHints.filter((hint) => hint.id !== goalId); - const deletedGoalHint = goalHintsItem.goalHints.find((hint) => hint.id === goalId); + const updatedGoalHints = goalHintsItem.availableGoalHints.filter((hint) => hint.id !== goalId); + const deletedGoalHint = goalHintsItem.availableGoalHints.find((hint) => hint.id === goalId); const updatedDeletedGoalHints = goalHintsItem.deletedGoalHints ? [...goalHintsItem.deletedGoalHints] : []; diff --git a/src/components/GoalsComponents/GoalConfigModal/ConfigGoal.tsx b/src/components/GoalsComponents/GoalConfigModal/ConfigGoal.tsx index c8c2f6b20..91a27d0b1 100644 --- a/src/components/GoalsComponents/GoalConfigModal/ConfigGoal.tsx +++ b/src/components/GoalsComponents/GoalConfigModal/ConfigGoal.tsx @@ -64,11 +64,11 @@ const ConfigGoal = ({ type, goal, mode }: { type: TGoalCategory; mode: TGoalConf const [betweenSliderUpdated, setBetweenSliderUpdated] = useState(false); - const [hints, setHints] = useState(false); + const [hintOption, setHintOption] = useState(false); useEffect(() => { getGoalHintItem(goal.id).then((hintItem) => { - setHints(!!hintItem?.hint); + setHintOption(!!hintItem?.hintOptionEnabled); }); }, [goal.id]); @@ -143,7 +143,7 @@ const ConfigGoal = ({ type, goal, mode }: { type: TGoalCategory; mode: TGoalConf extra: "", }); } - await (isEditMode ? updateGoal(getFinalTags(), hints) : addGoal(getFinalTags(), hints, parentGoal)); + await (isEditMode ? updateGoal(getFinalTags(), hintOption) : addGoal(getFinalTags(), hintOption, parentGoal)); } else { setShowToast({ open: true, @@ -261,7 +261,7 @@ const ConfigGoal = ({ type, goal, mode }: { type: TGoalCategory; mode: TGoalConf setPerWeekHrs(selectedPerWeekBudget); } const hint = await getGoalHintItem(selectedGoal.id); - setHints(hint?.hint || false); + setHintOption(hint?.hintOptionEnabled || false); }; const titlePlaceholder = t(`${type !== "Budget" ? "goal" : "budget"}Title`); @@ -398,7 +398,7 @@ const ConfigGoal = ({ type, goal, mode }: { type: TGoalCategory; mode: TGoalConf ))}
- + @@ -407,7 +407,7 @@ const ConfigGoal = ({ type, goal, mode }: { type: TGoalCategory; mode: TGoalConf ) : (
- + diff --git a/src/helpers/GoalController.ts b/src/helpers/GoalController.ts index 9b77a574c..d616da439 100644 --- a/src/helpers/GoalController.ts +++ b/src/helpers/GoalController.ts @@ -15,11 +15,11 @@ import { addHintItem, updateHintItem } from "@src/api/HintsAPI"; import { restoreUserGoal } from "@src/api/TrashAPI"; import { sendFinalUpdateOnGoal, sendUpdatedGoal } from "./PubSubController"; -export const createGoal = async (newGoal: GoalItem, parentGoalId: string, ancestors: string[], goalHint: boolean) => { +export const createGoal = async (newGoal: GoalItem, parentGoalId: string, ancestors: string[], hintOption: boolean) => { const level = ancestors.length; - if (goalHint) { + if (hintOption) { getHintsFromAPI(newGoal) - .then((hints) => addHintItem(newGoal.id, goalHint, hints || [])) + .then((hints) => addHintItem(newGoal.id, hintOption, hints || [])) .catch((error) => console.error("Error fetching hints:", error)); } diff --git a/src/hooks/useGoalActions.tsx b/src/hooks/useGoalActions.tsx index 9fd2046a9..67e75452a 100644 --- a/src/hooks/useGoalActions.tsx +++ b/src/hooks/useGoalActions.tsx @@ -65,9 +65,9 @@ const useGoalActions = () => { }); }; - const updateGoal = async (goal: GoalItem, hints: boolean) => { + const updateGoal = async (goal: GoalItem, updatedHintOption: boolean) => { const addGoalSound = new Audio(plingSound); - const currentHint = await getGoalHintItem(goal.id); + const currentHintItem = await getGoalHintItem(goal.id); const titleContainsCode = /```/.test(goal.title); if (goal.sublist.length > 0 && titleContainsCode) { @@ -82,9 +82,12 @@ const useGoalActions = () => { rootGoal = (await getSharedWMGoalById(rootGoalId)) || goal; } suggestChanges(rootGoal, goal, subGoalsHistory.length); - } else if (activeGoal && (hashObject({ ...activeGoal }) !== hashObject(goal) || currentHint?.hint !== hints)) { + } else if ( + activeGoal && + (hashObject({ ...activeGoal }) !== hashObject(goal) || currentHintItem?.hintOptionEnabled !== updatedHintOption) + ) { // Comparing hashes of the old (activeGoal) and updated (goal) versions to check if the goal has changed - await modifyGoal(goal.id, goal, [...ancestors, goal.id], hints); + await modifyGoal(goal.id, goal, [...ancestors, goal.id], updatedHintOption); setLastAction("goalUpdated"); setShowToast({ open: true, @@ -95,7 +98,7 @@ const useGoalActions = () => { } }; - const addGoal = async (newGoal: GoalItem, hints: boolean, parentGoal?: GoalItem) => { + const addGoal = async (newGoal: GoalItem, hintOption: boolean, parentGoal?: GoalItem) => { if (isPartnerModeActive && subGoalsHistory.length) { const rootGoalId = subGoalsHistory[0].goalID; const rootGoal = await getSharedWMGoalById(rootGoalId); @@ -104,7 +107,7 @@ const useGoalActions = () => { } suggestNewGoal(newGoal, parentGoal, rootGoal, subGoalsHistory.length); } else { - await createGoal(newGoal, newGoal.parentGoalId, ancestors, hints); + await createGoal(newGoal, newGoal.parentGoalId, ancestors, hintOption); if (!parentGoal && newGoal.title === "magic") { setDevMode(true); showMessage("Congratulations, you activated DEV mode", "Explore what's hidden"); diff --git a/src/models/HintItem.ts b/src/models/HintItem.ts index 0ad387cc1..80183bdf2 100644 --- a/src/models/HintItem.ts +++ b/src/models/HintItem.ts @@ -7,8 +7,8 @@ export interface IGoalHint { export interface HintItem { id: string; - hint: boolean; - goalHints: IGoalHint[]; + hintOptionEnabled: boolean; + availableGoalHints: IGoalHint[]; lastCheckedDate: string; nextCheckDate: string; deletedGoalHints?: Omit[]; diff --git a/src/models/dexie.ts b/src/models/dexie.ts index 6abfe8948..423927085 100644 --- a/src/models/dexie.ts +++ b/src/models/dexie.ts @@ -22,7 +22,7 @@ export const dbStoreSchema = { partnersCollection: null, goalTrashCollection: "id, category, deletedAt, title, duration, sublist, habit, on, start, due, afterTime, beforeTime, createdAt, parentGoalId, archived, participants, goalColor, language, link, rootGoalId, timeBudget, typeOfGoal", - hintsCollection: "id, hint, goalHints, lastCheckedDate, nextCheckDate", + hintsCollection: "id, hintOptionEnabled, availableGoalHints, lastCheckedDate, nextCheckDate", impossibleGoalsCollection: "goalId, goalTitle", }; export const syncVersion = (transaction: Transaction, currentVersion: number) => { From 05e186fc1f65cc771c2561489e5a35403270758e Mon Sep 17 00:00:00 2001 From: Vinay Badgujar Date: Sat, 14 Sep 2024 12:35:42 +0530 Subject: [PATCH 27/93] fix: cant add goal in mytimepage as app errors out --- src/App.tsx | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/App.tsx b/src/App.tsx index 4dbcab0b9..4511d7896 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -81,7 +81,14 @@ const App = () => { {!isLanguageChosen ? ( } /> ) : ( - } /> + + + + } + /> )} } /> Date: Sat, 14 Sep 2024 12:52:16 +0530 Subject: [PATCH 28/93] fix: color picker in config goal modal not clickable --- src/common/index.scss | 58 +++++++++++++++++++++---------------------- 1 file changed, 29 insertions(+), 29 deletions(-) diff --git a/src/common/index.scss b/src/common/index.scss index 2874511a0..9d781497b 100644 --- a/src/common/index.scss +++ b/src/common/index.scss @@ -4,36 +4,36 @@ position: absolute; top: -19px; left: 45%; -} -.goal-color { - width: 40px; - height: 40px; - border-radius: 50%; - cursor: pointer; -} + .goal-color { + width: 40px; + height: 40px; + border-radius: 50%; + cursor: pointer; + } -.color-palette-popup { - width: 145px; - overflow-x: auto; - position: absolute; - white-space: nowrap; - left: 0; - top: 45px; - display: flex; - padding: 5px; - border-radius: 10px; - background: var(--primary-background); - box-shadow: 0px 4px 8px rgba(0, 0, 0, 0.1); -} + .color-palette-popup { + width: 145px; + overflow-x: auto; + position: relative; + white-space: nowrap; + top: 5px; + z-index: 1; + display: flex; + padding: 5px; + border-radius: 10px; + background: var(--primary-background); + box-shadow: 0px 4px 8px rgba(0, 0, 0, 0.1); -.color-btn { - width: 24px; - height: 24px; - display: inline-block; - flex-shrink: 0; - border-radius: 50%; - margin: 2px; - border: none; - cursor: pointer; + .color-btn { + width: 24px; + height: 24px; + display: inline-block; + flex-shrink: 0; + border-radius: 50%; + margin: 2px; + border: none; + cursor: pointer; + } + } } From b2aab712b1fd17bccd3a5b26521b58c7717db79b Mon Sep 17 00:00:00 2001 From: Vinay Badgujar Date: Mon, 16 Sep 2024 09:36:38 +0530 Subject: [PATCH 29/93] chore: rename hint related properties --- src/api/HintsAPI/index.ts | 12 ++++++------ src/helpers/GoalController.ts | 6 +++--- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/api/HintsAPI/index.ts b/src/api/HintsAPI/index.ts index f5662ceaa..88306d1d9 100644 --- a/src/api/HintsAPI/index.ts +++ b/src/api/HintsAPI/index.ts @@ -52,8 +52,8 @@ export const addHintItem = async (goalId: string, hintOption: boolean, goalHints }); }; -export const updateHintItem = async (goalId: string, hint: boolean, goalHints: IGoalHint[]) => { - const updatedHintsWithId = ensureGoalHintsHaveIds(goalHints); +export const updateHintItem = async (goalId: string, hint: boolean, availableGoalHints: IGoalHint[]) => { + const updatedHintsWithId = ensureGoalHintsHaveIds(availableGoalHints); const isNewHintPresent = await checkForNewGoalHints(goalId, updatedHintsWithId); const oneDay = 24 * 60 * 60 * 1000; @@ -80,11 +80,11 @@ export const updateHintItem = async (goalId: string, hint: boolean, goalHints: I nextCheckDate: nextCheckDate.toISOString(), }); } else { - const newHints = goalHints.map((hintItem) => ({ - ...hintItem, - id: hintItem.id || uuidv4(), + const newGoalHints = availableGoalHints.map((hint) => ({ + ...hint, + id: hint.id || uuidv4(), })); - await addHintItem(goalId, hint, newHints); + await addHintItem(goalId, hint, newGoalHints); } }) .catch((e) => { diff --git a/src/helpers/GoalController.ts b/src/helpers/GoalController.ts index d616da439..3b254818d 100644 --- a/src/helpers/GoalController.ts +++ b/src/helpers/GoalController.ts @@ -48,10 +48,10 @@ export const createGoal = async (newGoal: GoalItem, parentGoalId: string, ancest }; export const modifyGoal = async (goalId: string, goalTags: GoalItem, ancestors: string[], goalHint: boolean) => { - const hintsPromise = getHintsFromAPI(goalTags); + const availableHintsPromise = getHintsFromAPI(goalTags); if (goalHint) { - hintsPromise - .then((hints) => updateHintItem(goalTags.id, goalHint, hints)) + availableHintsPromise + .then((availableGoalHints) => updateHintItem(goalTags.id, goalHint, availableGoalHints)) .catch((err) => console.error("Error updating hints:", err)); } else { updateHintItem(goalTags.id, goalHint, []); From e54f8ad084bcea26a77a4827448ce0ab7fbbd9ea Mon Sep 17 00:00:00 2001 From: Vinay Badgujar Date: Mon, 16 Sep 2024 13:32:52 +0530 Subject: [PATCH 30/93] fix: hints not visible --- src/api/GoalsAPI/index.ts | 4 +- .../GoalSublist/GoalSublist.tsx | 16 ++- src/contexts/availableGoalHint-context.tsx | 38 ++++++ .../components/AvailableGoalHints.tsx | 110 ++++++++++++++++++ 4 files changed, 161 insertions(+), 7 deletions(-) create mode 100644 src/contexts/availableGoalHint-context.tsx create mode 100644 src/pages/GoalsPage/components/AvailableGoalHints.tsx diff --git a/src/api/GoalsAPI/index.ts b/src/api/GoalsAPI/index.ts index dc4d53417..125c22a89 100644 --- a/src/api/GoalsAPI/index.ts +++ b/src/api/GoalsAPI/index.ts @@ -5,7 +5,7 @@ import { createGetHintsRequest, shareGoal } from "@src/services/goal.service"; import { getInstallId } from "@src/utils"; import { IHintRequestBody } from "@src/models/HintItem"; import { sortGoalsByProps } from "../GCustomAPI"; -import { deleteGoalHint, deleteHintItem, getGoalHintItem } from "../HintsAPI"; +import { deleteAvailableGoalHint, deleteHintItem, getGoalHintItem } from "../HintsAPI"; export const addDeletedGoal = async (goal: GoalItem) => { await db @@ -348,7 +348,7 @@ export const getAllLevelGoalsOfId = async (id: string, resetSharedStatus = false export const addHintGoaltoMyGoals = async (goal: GoalItem) => { await updateGoal(goal.parentGoalId, { sublist: [...goal.sublist, goal.id] }); await addGoal(goal); - await deleteGoalHint(goal.parentGoalId, goal.id); + await deleteAvailableGoalHint(goal.parentGoalId, goal.id); }; export const fetchArchivedGoalByTitle = async (value: string) => { diff --git a/src/components/GoalsComponents/GoalSublist/GoalSublist.tsx b/src/components/GoalsComponents/GoalSublist/GoalSublist.tsx index 73ee8dcb5..874bcbd5a 100644 --- a/src/components/GoalsComponents/GoalSublist/GoalSublist.tsx +++ b/src/components/GoalsComponents/GoalSublist/GoalSublist.tsx @@ -17,6 +17,8 @@ import GoalItemSummary from "@src/common/GoalItemSummary/GoalItemSummary"; import GoalsList from "../GoalsList"; import GoalHistory from "./components/GoalHistory"; import "./GoalSublist.scss"; +import AvailableGoalHints from "@pages/GoalsPage/components/AvailableGoalHints"; +import { AvailableGoalHintProvider } from "@src/contexts/availableGoalHint-context"; export const GoalSublist = () => { const { @@ -34,16 +36,17 @@ export const GoalSublist = () => { const showSuggestionModal = useRecoilValue(displaySuggestionsModal); useEffect(() => { - getGoalHintItem(goalID).then((hintItem) => { + if (parentGoal === undefined) return; + getGoalHintItem(parentGoal?.id).then((hintItem) => { const array: GoalItem[] = []; - hintItem?.goalHints?.forEach((hint) => { - if (hint) { - array.push(createGoalObjectFromTags({ ...hint, parentGoalId: goalID })); + hintItem?.availableGoalHints?.forEach((availableGoalHint) => { + if (availableGoalHint) { + array.push(createGoalObjectFromTags({ ...availableGoalHint, parentGoalId: parentGoal.id })); } }); setGoalHints(array || []); }); - }, [goalID, action]); + }, [action, parentGoal, showSuggestionModal, showChangesModal, subgoals, goalID]); useEffect(() => { async function init() { @@ -80,6 +83,9 @@ export const GoalSublist = () => { )}
+ + + {deletedGoals.length > 0 && } diff --git a/src/contexts/availableGoalHint-context.tsx b/src/contexts/availableGoalHint-context.tsx new file mode 100644 index 000000000..9b8f5555e --- /dev/null +++ b/src/contexts/availableGoalHint-context.tsx @@ -0,0 +1,38 @@ +import { GoalItem } from "@src/models/GoalItem"; +import React, { ReactNode, createContext, useContext, useEffect, useMemo, useState } from "react"; +import { useParams } from "react-router-dom"; + +type AvailableGoalHintContext = { + goal: GoalItem | undefined; + setGoal: React.Dispatch>; +}; + +export const AvailableGoalHintContext = createContext(undefined); + +export const AvailableGoalHintProvider = ({ children, goalHints }: { children: ReactNode; goalHints: GoalItem[] }) => { + const { activeGoalId, partnerId } = useParams(); + const [goal, setGoal] = useState(); + const isPartnerModeActive = !!partnerId; + + useEffect(() => { + if (activeGoalId) { + const hint = goalHints.find((goal) => { + return goal.id === activeGoalId; + }); + console.log(hint); + setGoal(hint ? hint : undefined); + } + }, [isPartnerModeActive, activeGoalId]); + + const value = useMemo(() => ({ goal, setGoal }), [goal]); + + return {children}; +}; + +export const useAvailableGoalHintContext = () => { + const context = useContext(AvailableGoalHintContext); + if (!context) { + throw new Error("useAvailableGoalHintContext must be used within a AvailableGoalHintContext"); + } + return context; +}; diff --git a/src/pages/GoalsPage/components/AvailableGoalHints.tsx b/src/pages/GoalsPage/components/AvailableGoalHints.tsx new file mode 100644 index 000000000..c2b7161fc --- /dev/null +++ b/src/pages/GoalsPage/components/AvailableGoalHints.tsx @@ -0,0 +1,110 @@ +import MyGoal from "@components/GoalsComponents/MyGoal/MyGoal"; +import ActionDiv from "@components/GoalsComponents/MyGoalActions/ActionDiv"; +import { unarchiveIcon } from "@src/assets"; +import ZAccordion from "@src/common/Accordion"; +import ZModal from "@src/common/ZModal"; +import { darkModeState, lastAction } from "@src/store"; +import React from "react"; +import { useTranslation } from "react-i18next"; +import { useSearchParams } from "react-router-dom"; +import { useRecoilValue, useSetRecoilState } from "recoil"; +import plingSound from "@assets/pling.mp3"; +import { GoalItem } from "@src/models/GoalItem"; +import { useAvailableGoalHintContext } from "@src/contexts/availableGoalHint-context"; +import { addHintGoaltoMyGoals } from "@src/api/GoalsAPI"; +import { deleteAvailableGoalHint } from "@src/api/HintsAPI"; + +const Actions = ({ goal }: { goal: GoalItem }) => { + const darkMode = useRecoilValue(darkModeState); + //const { restoreDeletedGoal, deleteGoalAction } = useGoalActions(); + const { t } = useTranslation(); + const restoreGoalSound = new Audio(plingSound); + const setLastAction = useSetRecoilState(lastAction); + + return ( + +
+

+ {t(`${goal.title}`)} +

+
+
+ + + + +
+
+ ); +}; + +const AvailableGoalHints = ({ goals }: { goals: GoalItem[] }) => { + const darkMode = useRecoilValue(darkModeState); + const [searchParams] = useSearchParams(); + const { goal: goalHint } = useAvailableGoalHintContext(); + const showOptions = !!searchParams.get("showOptions") && goalHint; + + return ( +
+ {showOptions && } + {goals.length > 0 && ( + ), + }, + ]} + /> + )} +
+ ); +}; + +export default AvailableGoalHints; From 57207ccfe7cb77cedcfa1115e6276c493b446647 Mon Sep 17 00:00:00 2001 From: Vinay Badgujar Date: Mon, 16 Sep 2024 13:33:27 +0530 Subject: [PATCH 31/93] enhance: delete hints api --- src/api/HintsAPI/index.ts | 56 +++++++++++-------- .../GoalsPage/components/ArchivedGoals.tsx | 2 +- 2 files changed, 33 insertions(+), 25 deletions(-) diff --git a/src/api/HintsAPI/index.ts b/src/api/HintsAPI/index.ts index 88306d1d9..ee69c736a 100644 --- a/src/api/HintsAPI/index.ts +++ b/src/api/HintsAPI/index.ts @@ -7,10 +7,7 @@ export const checkForNewGoalHints = async (hintId: string, newGoalHints: IGoalHi const hintItem = await db.hintsCollection.get(hintId); if (!hintItem) return false; const currentGoalHints = hintItem.availableGoalHints || []; - const combinedHints = [...currentGoalHints]; - - const existingTitles = new Set(combinedHints.map((hint) => hint.title)); - + const existingTitles = new Set(currentGoalHints.map((hint) => hint.title)); return newGoalHints.some((newHint) => !existingTitles.has(newHint.title)); } catch (error) { console.error("Error checking for new goal hints:", error); @@ -32,14 +29,14 @@ export const getGoalHintItem = async (goalId: string) => { return hintItem.length > 0 ? hintItem[0] : null; }; -export const addHintItem = async (goalId: string, hintOption: boolean, goalHints: IGoalHint[]) => { - const updatedHintsWithId = ensureGoalHintsHaveIds(goalHints); +export const addHintItem = async (goalId: string, hintOption: boolean, availableGoalHints: IGoalHint[]) => { + const updatedAvailableGoalHintsWithId = ensureGoalHintsHaveIds(availableGoalHints); const now = new Date(); const oneDayLater = new Date(now.getTime() + 24 * 60 * 60 * 1000); const hintObject: HintItem = { id: goalId, hintOptionEnabled: hintOption, - availableGoalHints: updatedHintsWithId, + availableGoalHints: updatedAvailableGoalHintsWithId, lastCheckedDate: now.toISOString(), nextCheckDate: oneDayLater.toISOString(), }; @@ -53,8 +50,8 @@ export const addHintItem = async (goalId: string, hintOption: boolean, goalHints }; export const updateHintItem = async (goalId: string, hint: boolean, availableGoalHints: IGoalHint[]) => { - const updatedHintsWithId = ensureGoalHintsHaveIds(availableGoalHints); - const isNewHintPresent = await checkForNewGoalHints(goalId, updatedHintsWithId); + const updatedAvailableGoalHintsWithId = ensureGoalHintsHaveIds(availableGoalHints); + const isNewHintPresent = await checkForNewGoalHints(goalId, updatedAvailableGoalHintsWithId); const oneDay = 24 * 60 * 60 * 1000; const oneWeek = 7 * oneDay; @@ -67,15 +64,15 @@ export const updateHintItem = async (goalId: string, hint: boolean, availableGoa const existingItem = await db.hintsCollection.where("id").equals(goalId).first(); if (existingItem) { - const filteredHintsWithId = updatedHintsWithId.filter( - (hintItem) => + const filteredAvailableGoalHintsWithId = updatedAvailableGoalHintsWithId.filter( + (availableGoalHint) => !existingItem.deletedGoalHints || - !existingItem.deletedGoalHints.some((deletedHint) => deletedHint.title === hintItem.title), + !existingItem.deletedGoalHints.some((deletedHint) => deletedHint.title === availableGoalHint.title), ); await db.hintsCollection.update(goalId, { hint, - goalHints: filteredHintsWithId, + goalHints: filteredAvailableGoalHintsWithId, lastCheckedDate: now.toISOString(), nextCheckDate: nextCheckDate.toISOString(), }); @@ -102,30 +99,41 @@ export const deleteHintItem = async (goalId: string) => { }); }; -export const deleteGoalHint = async (parentGoalId: string, goalId: string) => { - await db - .transaction("rw", db.hintsCollection, async () => { +export const deleteAvailableGoalHint = async (parentGoalId: string, goalId: string) => { + try { + await db.transaction("rw", db.hintsCollection, async () => { const goalHintsItem = await db.hintsCollection.get(parentGoalId); if (goalHintsItem) { - const updatedGoalHints = goalHintsItem.availableGoalHints.filter((hint) => hint.id !== goalId); - const deletedGoalHint = goalHintsItem.availableGoalHints.find((hint) => hint.id === goalId); + const { availableGoalHints } = goalHintsItem; + + // Find and remove the goal hint in a single step + const updatedGoalHints = []; + let deletedGoalHint = null; + + for (const hint of availableGoalHints) { + if (hint.id === goalId) { + deletedGoalHint = hint; + } else { + updatedGoalHints.push(hint); + } + } const updatedDeletedGoalHints = goalHintsItem.deletedGoalHints ? [...goalHintsItem.deletedGoalHints] : []; + // If we found the goal hint, remove the id and add it to deletedGoalHints if (deletedGoalHint) { - const deletedHintDetails: IGoalHint = { ...deletedGoalHint }; - delete deletedHintDetails.id; + const { id, ...deletedHintDetails } = deletedGoalHint; // Omitting 'id' updatedDeletedGoalHints.push(deletedHintDetails); } await db.hintsCollection.update(parentGoalId, { - goalHints: updatedGoalHints, + availableGoalHints: updatedGoalHints, deletedGoalHints: updatedDeletedGoalHints, }); } - }) - .catch((e) => { - console.log(e.stack || e); }); + } catch (e) { + console.error("Failed to delete available goal hint:", e); + } }; diff --git a/src/pages/GoalsPage/components/ArchivedGoals.tsx b/src/pages/GoalsPage/components/ArchivedGoals.tsx index 3b3705a3b..610080cba 100644 --- a/src/pages/GoalsPage/components/ArchivedGoals.tsx +++ b/src/pages/GoalsPage/components/ArchivedGoals.tsx @@ -94,7 +94,7 @@ const ArchivedGoals = ({ goals }: { goals: GoalItem[] }) => { panels={[ { header: "Done", - body: goals.map((goal) => ), + body: goals.map((goal) => ), }, ]} /> From 265333ff8c3b2225ea4164bc3a22e873ae920832 Mon Sep 17 00:00:00 2001 From: Vinay Badgujar Date: Mon, 16 Sep 2024 13:53:18 +0530 Subject: [PATCH 32/93] refactor: updatehintitem --- src/api/GoalsAPI/index.ts | 2 +- src/api/HintsAPI/index.ts | 55 ++++++++++++++++------------------- src/helpers/GoalController.ts | 15 ++++++---- 3 files changed, 36 insertions(+), 36 deletions(-) diff --git a/src/api/GoalsAPI/index.ts b/src/api/GoalsAPI/index.ts index 125c22a89..6beeab6d7 100644 --- a/src/api/GoalsAPI/index.ts +++ b/src/api/GoalsAPI/index.ts @@ -207,7 +207,7 @@ export const getHintsFromAPI = async (goal: GoalItem) => { if (goal.parentGoalId !== "root") { const parentGoal = await getGoal(goal.parentGoalId); parentGoalTitle = parentGoal?.title || ""; - parentGoalHint = (await getGoalHintItem(goal.parentGoalId))?.hint || false; + parentGoalHint = (await getGoalHintItem(goal.parentGoalId))?.hintOptionEnabled || false; } const { title, duration } = goal; diff --git a/src/api/HintsAPI/index.ts b/src/api/HintsAPI/index.ts index ee69c736a..6e33fcf67 100644 --- a/src/api/HintsAPI/index.ts +++ b/src/api/HintsAPI/index.ts @@ -2,19 +2,17 @@ import { db } from "@src/models"; import { HintItem, IGoalHint } from "@src/models/HintItem"; import { v4 as uuidv4 } from "uuid"; -export const checkForNewGoalHints = async (hintId: string, newGoalHints: IGoalHint[]) => { +export const checkForNewGoalHints = async (hintId: string, newGoalHints: IGoalHint[]): Promise => { try { const hintItem = await db.hintsCollection.get(hintId); if (!hintItem) return false; - const currentGoalHints = hintItem.availableGoalHints || []; - const existingTitles = new Set(currentGoalHints.map((hint) => hint.title)); + const existingTitles = new Set(hintItem.availableGoalHints?.map((hint) => hint.title) || []); return newGoalHints.some((newHint) => !existingTitles.has(newHint.title)); } catch (error) { console.error("Error checking for new goal hints:", error); return false; } }; - export const ensureGoalHintsHaveIds = (goalHints: IGoalHint[]): IGoalHint[] => { return goalHints.map((hintItem) => { if (!hintItem.id) { @@ -25,8 +23,8 @@ export const ensureGoalHintsHaveIds = (goalHints: IGoalHint[]): IGoalHint[] => { }; export const getGoalHintItem = async (goalId: string) => { - const hintItem = await db.hintsCollection.where("id").equals(goalId).toArray(); - return hintItem.length > 0 ? hintItem[0] : null; + const hintItem = await db.hintsCollection.where("id").equals(goalId).first(); + return hintItem; }; export const addHintItem = async (goalId: string, hintOption: boolean, availableGoalHints: IGoalHint[]) => { @@ -49,44 +47,43 @@ export const addHintItem = async (goalId: string, hintOption: boolean, available }); }; -export const updateHintItem = async (goalId: string, hint: boolean, availableGoalHints: IGoalHint[]) => { - const updatedAvailableGoalHintsWithId = ensureGoalHintsHaveIds(availableGoalHints); - const isNewHintPresent = await checkForNewGoalHints(goalId, updatedAvailableGoalHintsWithId); +export const updateHintItem = async (goalId: string, hintOptionEnabled: boolean, availableGoalHints: IGoalHint[]) => { + try { + const updatedGoalHintsWithId = ensureGoalHintsHaveIds(availableGoalHints); + const hasNewHints = await checkForNewGoalHints(goalId, updatedGoalHintsWithId); - const oneDay = 24 * 60 * 60 * 1000; - const oneWeek = 7 * oneDay; + const now = new Date(); + const nextCheckDate = new Date( + now.getTime() + (hasNewHints ? 24 * 60 * 60 * 1000 : 7 * 24 * 60 * 60 * 1000), + ).toISOString(); - const now = new Date(); - const nextCheckDate = new Date(now.getTime() + (isNewHintPresent ? oneDay : oneWeek)); - - await db - .transaction("rw", db.hintsCollection, async () => { + await db.transaction("rw", db.hintsCollection, async () => { const existingItem = await db.hintsCollection.where("id").equals(goalId).first(); if (existingItem) { - const filteredAvailableGoalHintsWithId = updatedAvailableGoalHintsWithId.filter( - (availableGoalHint) => + const filteredGoalHints = updatedGoalHintsWithId.filter( + (hint) => !existingItem.deletedGoalHints || - !existingItem.deletedGoalHints.some((deletedHint) => deletedHint.title === availableGoalHint.title), + !existingItem.deletedGoalHints.some((deletedHint) => deletedHint.title === hint.title), ); await db.hintsCollection.update(goalId, { - hint, - goalHints: filteredAvailableGoalHintsWithId, + hintOptionEnabled, + availableGoalHints: filteredGoalHints, lastCheckedDate: now.toISOString(), - nextCheckDate: nextCheckDate.toISOString(), + nextCheckDate, }); } else { - const newGoalHints = availableGoalHints.map((hint) => ({ + const newGoalHints = updatedGoalHintsWithId.map((hint) => ({ ...hint, id: hint.id || uuidv4(), })); - await addHintItem(goalId, hint, newGoalHints); + await addHintItem(goalId, hintOptionEnabled, newGoalHints); } - }) - .catch((e) => { - console.log(e.stack || e); }); + } catch (error) { + console.error("Failed to update hint item:", error); + } }; export const deleteHintItem = async (goalId: string) => { @@ -107,7 +104,6 @@ export const deleteAvailableGoalHint = async (parentGoalId: string, goalId: stri if (goalHintsItem) { const { availableGoalHints } = goalHintsItem; - // Find and remove the goal hint in a single step const updatedGoalHints = []; let deletedGoalHint = null; @@ -121,9 +117,8 @@ export const deleteAvailableGoalHint = async (parentGoalId: string, goalId: stri const updatedDeletedGoalHints = goalHintsItem.deletedGoalHints ? [...goalHintsItem.deletedGoalHints] : []; - // If we found the goal hint, remove the id and add it to deletedGoalHints if (deletedGoalHint) { - const { id, ...deletedHintDetails } = deletedGoalHint; // Omitting 'id' + const { id, ...deletedHintDetails } = deletedGoalHint; updatedDeletedGoalHints.push(deletedHintDetails); } diff --git a/src/helpers/GoalController.ts b/src/helpers/GoalController.ts index 3b254818d..eca44850a 100644 --- a/src/helpers/GoalController.ts +++ b/src/helpers/GoalController.ts @@ -47,14 +47,19 @@ export const createGoal = async (newGoal: GoalItem, parentGoalId: string, ancest return { parentGoal: null }; }; -export const modifyGoal = async (goalId: string, goalTags: GoalItem, ancestors: string[], goalHint: boolean) => { - const availableHintsPromise = getHintsFromAPI(goalTags); - if (goalHint) { +export const modifyGoal = async ( + goalId: string, + goalTags: GoalItem, + ancestors: string[], + hintOptionEnabled: boolean, +) => { + if (hintOptionEnabled) { + const availableHintsPromise = getHintsFromAPI(goalTags); availableHintsPromise - .then((availableGoalHints) => updateHintItem(goalTags.id, goalHint, availableGoalHints)) + .then((availableGoalHints) => updateHintItem(goalTags.id, hintOptionEnabled, availableGoalHints)) .catch((err) => console.error("Error updating hints:", err)); } else { - updateHintItem(goalTags.id, goalHint, []); + updateHintItem(goalTags.id, hintOptionEnabled, []); } console.log(goalTags); await updateGoal(goalId, goalTags); From 3aede6a31358ef3791466acdfaba01364d978a5e Mon Sep 17 00:00:00 2001 From: Vinay Badgujar Date: Mon, 16 Sep 2024 14:16:05 +0530 Subject: [PATCH 33/93] edit: add correct icons to hints actions --- src/hooks/useGoalActions.tsx | 5 +-- .../components/AvailableGoalHints.tsx | 31 +++++++++---------- 2 files changed, 18 insertions(+), 18 deletions(-) diff --git a/src/hooks/useGoalActions.tsx b/src/hooks/useGoalActions.tsx index 67e75452a..d46a7a965 100644 --- a/src/hooks/useGoalActions.tsx +++ b/src/hooks/useGoalActions.tsx @@ -19,6 +19,9 @@ import { useActiveGoalContext } from "@src/contexts/activeGoal-context"; import { removeBackTicks } from "@src/utils/patterns"; import { getGoalHintItem } from "@src/api/HintsAPI"; +const pageCrumple = new Audio(pageCrumplingSound); +const addGoalSound = new Audio(plingSound); + const useGoalActions = () => { const { state }: { state: ILocationState } = useLocation(); const { partnerId } = useParams(); @@ -30,7 +33,6 @@ const useGoalActions = () => { const { goal: activeGoal } = useActiveGoalContext(); const setShowToast = useSetRecoilState(displayToast); - const pageCrumple = new Audio(pageCrumplingSound); const showMessage = (message: string, extra = "") => { setShowToast({ @@ -66,7 +68,6 @@ const useGoalActions = () => { }; const updateGoal = async (goal: GoalItem, updatedHintOption: boolean) => { - const addGoalSound = new Audio(plingSound); const currentHintItem = await getGoalHintItem(goal.id); const titleContainsCode = /```/.test(goal.title); diff --git a/src/pages/GoalsPage/components/AvailableGoalHints.tsx b/src/pages/GoalsPage/components/AvailableGoalHints.tsx index c2b7161fc..bba2ba5e2 100644 --- a/src/pages/GoalsPage/components/AvailableGoalHints.tsx +++ b/src/pages/GoalsPage/components/AvailableGoalHints.tsx @@ -15,11 +15,10 @@ import { addHintGoaltoMyGoals } from "@src/api/GoalsAPI"; import { deleteAvailableGoalHint } from "@src/api/HintsAPI"; const Actions = ({ goal }: { goal: GoalItem }) => { - const darkMode = useRecoilValue(darkModeState); - //const { restoreDeletedGoal, deleteGoalAction } = useGoalActions(); const { t } = useTranslation(); const restoreGoalSound = new Audio(plingSound); const setLastAction = useSetRecoilState(lastAction); + const darkMode = useRecoilValue(darkModeState); return ( @@ -40,18 +39,7 @@ const Actions = ({ goal }: { goal: GoalItem }) => { window.history.back(); }} > - - } - /> +
From c5af2bd1c10254e223c7782746fcfe19e6d1b76d Mon Sep 17 00:00:00 2001 From: vinod kumar <88377243+codervinod123@users.noreply.github.com> Date: Mon, 16 Sep 2024 21:20:08 +0530 Subject: [PATCH 34/93] fix: Highlight extra stars --- src/pages/FeedbackPage/FeedbackPage.tsx | 2 +- src/pages/FeedbackPage/feedbackpage.scss | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/pages/FeedbackPage/FeedbackPage.tsx b/src/pages/FeedbackPage/FeedbackPage.tsx index aba9e8a94..d39af238f 100644 --- a/src/pages/FeedbackPage/FeedbackPage.tsx +++ b/src/pages/FeedbackPage/FeedbackPage.tsx @@ -52,7 +52,7 @@ export const FeedbackPage = () => { }} > userRating ? { color: `${darkModeStatus ? "#2e2e2e" : "#f1f1f1"}` } : {}} + style={idx > userRating ? { color: `${darkModeStatus ? "#d1cfcf" : "#6b6767"}` } : {}} className="star" > ★ diff --git a/src/pages/FeedbackPage/feedbackpage.scss b/src/pages/FeedbackPage/feedbackpage.scss index 92bb777ca..ea880c23c 100644 --- a/src/pages/FeedbackPage/feedbackpage.scss +++ b/src/pages/FeedbackPage/feedbackpage.scss @@ -30,6 +30,7 @@ .star { font-size: xxx-large; + } #feedback-textbox, From 2a3db56c54917314fd18086d2db19311b24be57a Mon Sep 17 00:00:00 2001 From: vinod kumar <88377243+codervinod123@users.noreply.github.com> Date: Mon, 16 Sep 2024 22:27:02 +0530 Subject: [PATCH 35/93] fix:extra space --- src/pages/FeedbackPage/feedbackpage.scss | 1 - 1 file changed, 1 deletion(-) diff --git a/src/pages/FeedbackPage/feedbackpage.scss b/src/pages/FeedbackPage/feedbackpage.scss index ea880c23c..92bb777ca 100644 --- a/src/pages/FeedbackPage/feedbackpage.scss +++ b/src/pages/FeedbackPage/feedbackpage.scss @@ -30,7 +30,6 @@ .star { font-size: xxx-large; - } #feedback-textbox, From 6bcf160ec2fbd31c6c20309fcdb0d3c465bc3fe6 Mon Sep 17 00:00:00 2001 From: vinod kumar <88377243+codervinod123@users.noreply.github.com> Date: Wed, 18 Sep 2024 11:58:02 +0530 Subject: [PATCH 36/93] fit:removed % Done bar --- .../pull_request_template.md | 2 +- documentation/technical/PRGuide.md | 59 +++++++------------ documentation/technical/Setup.md | 2 + documentation/technical/conventions/Readme.md | 5 +- documentation/technical/conventions/code.md | 3 + documentation/technical/conventions/git.md | 3 + pkg/README.md | 5 +- src/api/GoalsAPI/index.ts | 2 +- src/components/GoalsComponents/GoalsList.tsx | 2 +- .../MyGoal/components/GoalDropdown.tsx | 2 +- .../MyTimeComponents/ColorBands.tsx | 31 ++++------ src/override.scss | 12 ++-- src/pages/FeedbackPage/feedbackpage.scss | 11 ++-- src/utils/patterns.ts | 2 +- 14 files changed, 63 insertions(+), 78 deletions(-) diff --git a/.github/PULL_REQUEST_TEMPLATE/pull_request_template.md b/.github/PULL_REQUEST_TEMPLATE/pull_request_template.md index ce4acbc0b..fa6482a5d 100644 --- a/.github/PULL_REQUEST_TEMPLATE/pull_request_template.md +++ b/.github/PULL_REQUEST_TEMPLATE/pull_request_template.md @@ -4,7 +4,7 @@ Resolves # - [x] The PR title is of form 'issue_title #issue_number' - [x] If no issue is referenced, my changes are simple and summarized in title - and in max three sentences in the description. - If not please make an issue - so need for change is validated. + If not please make an issue - so need for change is validated. - [x] I'll be patient as I understand responses can take days. - [x] I have formatted according to project guidelines. - [x] I have not introduced any new failing lints or tests. diff --git a/documentation/technical/PRGuide.md b/documentation/technical/PRGuide.md index 6d88db769..922f36967 100644 --- a/documentation/technical/PRGuide.md +++ b/documentation/technical/PRGuide.md @@ -9,37 +9,26 @@ Follow these simple steps to propose changes or fixes to ZinZen: ### Keep Your Repositories in Sync 1. Before starting any work, make sure your local project matches ZinZen's latest version: - - Switch to your local project's main branch: - - `git checkout main` - - - Get the latest changes from ZinZen's repository (without merging them into your main branch): - - `git fetch upstream` - - - Merge these changes into your main branch: - - `git merge upstream/main` - - - Update your GitHub repository (origin) with these changes: - - `git push origin main` - + - Switch to your local project's main branch: + `git checkout main` + - Get the latest changes from ZinZen's repository (without merging them into your main branch): + `git fetch upstream` + - Merge these changes into your main branch: + `git merge upstream/main` + - Update your GitHub repository (origin) with these changes: + `git push origin main` ### Setup a feature branch -1. Make a new branch in your local project for your fixes or features (called a "feature branch"). +1. Make a new branch in your local project for your fixes or features (called a "feature branch"). 2. Follow [branch naming conventions](./conventions/git.md): `[developer shortcut]/[issue number]/[meaningful name]` - - To create and switch to a new branch locally: - - `git checkout -b vin/01/my-fix-branch` - - - Push this branch to your GitHub repository: - - `git push origin vin/01/my-fix-branch` - + + - To create and switch to a new branch locally: + `git checkout -b vin/01/my-fix-branch` + - Push this branch to your GitHub repository: + `git push origin vin/01/my-fix-branch` ### Work on Your Changes @@ -87,19 +76,13 @@ ZinZen's main branch must always be error-free. Pull requests that fail tests or If your pull request receives feedback, make more commits to your branch and push them to your GitHub repository. They'll be added to the pull request automatically. Follow these steps: 1. Update your local repository: - - Switch to the correct branch: - - `git checkout vin/01/my-fix-branch` - - - Get changes from ZinZen: - - `git pull --rebase upstream main` - - - Make the required changes in your branch. - - Once satisfied, push them to your GitHub repository to update your pull request: - - `git push origin vin/01/my-fix-branch` - + - Switch to the correct branch: + `git checkout vin/01/my-fix-branch` + - Get changes from ZinZen: + `git pull --rebase upstream main` + - Make the required changes in your branch. + - Once satisfied, push them to your GitHub repository to update your pull request: + `git push origin vin/01/my-fix-branch` Repeat this process until your changes are accepted and merged. diff --git a/documentation/technical/Setup.md b/documentation/technical/Setup.md index eaf0aff73..b5b56e97e 100644 --- a/documentation/technical/Setup.md +++ b/documentation/technical/Setup.md @@ -9,10 +9,12 @@ The steps outlined in this section are a one-time process necessary for contribu Here's how to establish and maintain a fork of ZinZen and make periodic contributions: 1. **Fork ZinZen:** + - To begin, create a fork of the [ZinZen repository](https://github.com/tijlleenders/ZinZen) on GitHub. - Click the "Fork" button and choose a suitable GitHub account, such as your personal GitHub account, for the fork. 2. **Clone Your Fork:** + - Access your GitHub account and go to your Fork of ZinZen. - Click on the "<> Code" tab located in the upper left corner. - Within the dropdown menu that appears, select "HTTPS" (you can choose SSH if preferred, but this tutorial uses HTTPS for simplicity). diff --git a/documentation/technical/conventions/Readme.md b/documentation/technical/conventions/Readme.md index 42ccf4446..6172d18e7 100644 --- a/documentation/technical/conventions/Readme.md +++ b/documentation/technical/conventions/Readme.md @@ -1,14 +1,17 @@ # Getting Started + Before you start contributing to the ZinZen project, it's important to familiarize yourself with our conventions and workflows. This ensures a smooth and consistent development process for everyone involved. ### Code Conventions + Our [Code Conventions](code.md) document outlines the coding standards, naming conventions, and best practices for maintaining code quality and readability. It's crucial to adhere to these guidelines to ensure consistency across the codebase. ### Git Conventions + The [Git Conventions](git.md) document provides detailed instructions on the commit process, branching strategy, and pull request guidelines. Following these conventions is essential for efficient collaboration and code integration. ## Contributing + We welcome contributions from everyone! Please read our contributing guidelines to understand how you can contribute effectively. If you have any questions, feel free to open an issue for discussion. Thank you for being a part of the ZinZen project! - diff --git a/documentation/technical/conventions/code.md b/documentation/technical/conventions/code.md index d863906df..516447d8e 100644 --- a/documentation/technical/conventions/code.md +++ b/documentation/technical/conventions/code.md @@ -3,6 +3,7 @@ This document provides a set of coding standards and best practices for contributing to the ZinZen project. It aims to ensure consistency, readability, and maintainability of the codebase. ### Naming Conventions + Proper naming enhances code readability: - **General:** Use clear, descriptive names. @@ -15,6 +16,7 @@ Proper naming enhances code readability: - **Type Names:** Use PascalCase (e.g., `User`). ### TypeScript Practices + Follow these TypeScript-specific practices: - **Type Annotations:** Always use type annotations. @@ -22,6 +24,7 @@ Follow these TypeScript-specific practices: - **Avoid `any`:** Minimize the use of `any` for better type checking. ### Code Quality and Robustness + To ensure the reliability and maintainability of the code: - **Simplicity:** Write simple and clear code. diff --git a/documentation/technical/conventions/git.md b/documentation/technical/conventions/git.md index 3998552a9..b3f907b31 100644 --- a/documentation/technical/conventions/git.md +++ b/documentation/technical/conventions/git.md @@ -3,15 +3,18 @@ Before merging code into the main branch, it undergoes a thorough peer review to ensure quality and readiness for deployment. Your code submissions should be crafted for clarity and ease of review. ## Committing Process + - **Small Commits:** Make commits small and logical, easy to understand and follow. - **Review Before Committing:** Before committing, review each file for temporary or test code, warnings, formatting issues, and unnecessary packages. - **Frequent Commits:** Commit often to track progress and create a transparent history of your work. - **Early Pull Requests:** Make PRs as soon as possible to integrate changes quickly and reduce conflicts. ## Before Pushing Your Code + - **No Warnings:** Ensure there are no warnings in your code. The development and main branches should be free of warnings to make it easier to spot new issues introduced by recent code changes. ## Branching Convention + - **Naming Format:** Use the format `[developer shortcut]/[issue number]/[meaningful name]`, like `alice/411/fix-budgets-on-weekends`. - **Developer Specific:** Branches should be developed by the assigned developer only to maintain clarity in the development process. - **Merging and Deletion:** Once finished, branches should be merged into the main branch after PR review and then deleted. diff --git a/pkg/README.md b/pkg/README.md index 28456759c..973a2e551 100644 --- a/pkg/README.md +++ b/pkg/README.md @@ -5,8 +5,8 @@ can talk big-O, add features or optimize hot loops. > Please contact me tijl@zinzen.me or open an issue. - ## ZinZen® + ZinZen® is a platform for stress-free life planning. It works by defining life goals with constraints and dependencies. An automatic scheduler then schedules tasks in a calendar to reach these goals, auto-magically updating the schedule when goals or constraints change. @@ -16,9 +16,8 @@ that can be called from the React-based UI application. The ZinZen® UI application can be found here: [ZinZen® Github](https://github.com/tijlleenders/ZinZen) - - ## Getting started + All documentation can be found in the folder [documentation](documentation/Readme.md). In this folder you will find a [technical know-how base](documentation/technical/Readme.md), as well as all the necessary [functional documentation](documentation/functional/Readme.md) to understand the diff --git a/src/api/GoalsAPI/index.ts b/src/api/GoalsAPI/index.ts index dc4d53417..c3f13164e 100644 --- a/src/api/GoalsAPI/index.ts +++ b/src/api/GoalsAPI/index.ts @@ -91,7 +91,7 @@ export const updateGoal = async (id: string, changes: Partial) => { await db .transaction("rw", db.goalsCollection, async () => { await db.goalsCollection.update(id, changes).then((updated) => { - updateStatus = updated === 1 ? true : false; + updateStatus = updated === 1; }); }) .catch((e) => { diff --git a/src/components/GoalsComponents/GoalsList.tsx b/src/components/GoalsComponents/GoalsList.tsx index e7f237ee8..9a0b1cf54 100644 --- a/src/components/GoalsComponents/GoalsList.tsx +++ b/src/components/GoalsComponents/GoalsList.tsx @@ -15,7 +15,7 @@ import { useRecoilValue } from "recoil"; import { impossibleGoalsList } from "@src/store/ImpossibleGoalState"; import { ImpossibleGoal } from "@src/Interfaces"; import { useGoalSelection } from "@src/hooks/useGoalSelection"; - + import SortableItem from "./MyGoal/SortableItem"; interface GoalsListProps { diff --git a/src/components/GoalsComponents/MyGoal/components/GoalDropdown.tsx b/src/components/GoalsComponents/MyGoal/components/GoalDropdown.tsx index f8f691f4f..14f755392 100644 --- a/src/components/GoalsComponents/MyGoal/components/GoalDropdown.tsx +++ b/src/components/GoalsComponents/MyGoal/components/GoalDropdown.tsx @@ -1,9 +1,9 @@ import React from "react"; import NotificationSymbol from "@src/common/NotificationSymbol"; import { GoalItem } from "@src/models/GoalItem"; -import TriangleIcon from "../../../../assets/TriangleIcon"; import CopyIcon from "@src/assets/CopyIcon"; import { isGoalCode } from "@src/utils/patterns"; +import TriangleIcon from "../../../../assets/TriangleIcon"; interface GoalDropdownProps { goal: GoalItem; diff --git a/src/components/MyTimeComponents/ColorBands.tsx b/src/components/MyTimeComponents/ColorBands.tsx index 6875f08fb..6355de093 100644 --- a/src/components/MyTimeComponents/ColorBands.tsx +++ b/src/components/MyTimeComponents/ColorBands.tsx @@ -14,20 +14,16 @@ interface IColorBands { } const ColorBands: React.FC = ({ list, tasksStatus, day, active }) => { - let dayCompleted = 0; - let dayTotal = 0; const taskProgress: ITaskProgress = {}; const completion: { [goalId: string]: number } = {}; list.scheduled.forEach((ele) => { const { goalid } = ele; if (!taskProgress[goalid]) { const completedToday = tasksStatus[goalid]?.completedToday || 0; - dayCompleted += completedToday; completion[goalid] = completedToday + (completion[goalid] || 0); taskProgress[goalid] = { total: 0, completed: completedToday, goalColor: ele.goalColor }; } taskProgress[goalid].total += ele.duration; - dayTotal += ele.duration; }); const completed: React.CSSProperties[] = []; @@ -48,22 +44,17 @@ const ColorBands: React.FC = ({ list, tasksStatus, day, active }) = ))}
{active && day === "Today" && ( - <> -
-

{`${dayTotal > 0 ? `${Math.floor((dayCompleted / dayTotal) * 100)}% done` : "No tasks today"}`}

-
-
- {[ - ...completed, - { - width: "100%", - background: "#d9cccc", - }, - ].map((ele, index) => ( -
- ))} -
- +
+ {[ + ...completed, + { + width: "100%", + background: "#d9cccc", + }, + ].map((ele, index) => ( +
+ ))} +
)} ); diff --git a/src/override.scss b/src/override.scss index 2c8a7da6f..185b63239 100644 --- a/src/override.scss +++ b/src/override.scss @@ -102,12 +102,15 @@ .ant-switch-dark { background: #8c8c8c !important; } -.ant-switch:hover:not(.ant-switch-disabled), .ant-switch-dark:hover:not(.ant-switch-dark-disabled) { +.ant-switch:hover:not(.ant-switch-disabled), +.ant-switch-dark:hover:not(.ant-switch-dark-disabled) { background: #8c8c8c !important; } -.ant-switch-checked, .ant-switch-dark-checked { - .ant-switch-inner, .ant-switch-dark-inner { +.ant-switch-checked, +.ant-switch-dark-checked { + .ant-switch-inner, + .ant-switch-dark-inner { background: var(--selection-color) !important; } } @@ -115,8 +118,7 @@ .ant-switch-inner-checked, .ant-switch-inner-unchecked, .ant-switch-dark-inner-checked, -.ant-switch-dark-inner-unchecked - { +.ant-switch-dark-inner-unchecked { img { width: 15px; height: 15px; diff --git a/src/pages/FeedbackPage/feedbackpage.scss b/src/pages/FeedbackPage/feedbackpage.scss index 92bb777ca..fe00bae66 100644 --- a/src/pages/FeedbackPage/feedbackpage.scss +++ b/src/pages/FeedbackPage/feedbackpage.scss @@ -49,11 +49,10 @@ padding: 8px 16px; background-color: var(--selection-color); } -#build-info-line{ +#build-info-line { margin-top: 20px; } -#build-info-line p{ - color:grey; - font-size: small; - -} \ No newline at end of file +#build-info-line p { + color: grey; + font-size: small; +} diff --git a/src/utils/patterns.ts b/src/utils/patterns.ts index 53e4055db..c048eafc8 100644 --- a/src/utils/patterns.ts +++ b/src/utils/patterns.ts @@ -39,7 +39,7 @@ export function isJSONParsable(str: string | null | undefined): boolean { } export const extractLinks = (text: string) => { - let regex = /([\w+]+\:\/\/)?([\w\d-]+\.)*[\w-]+[\.\:]\w+([\/\?\=\&\#\.]?[\w-]+)*\/?/gm; + const regex = /([\w+]+\:\/\/)?([\w\d-]+\.)*[\w-]+[\.\:]\w+([\/\?\=\&\#\.]?[\w-]+)*\/?/gm; const matches = text.match(regex); return matches ? matches[0] : null; }; From d0be75717ab0e69a429bc37157adebd74d891e62 Mon Sep 17 00:00:00 2001 From: vinod kumar <88377243+codervinod123@users.noreply.github.com> Date: Wed, 18 Sep 2024 12:41:31 +0530 Subject: [PATCH 37/93] fix:removed gray bar --- .../MyTimeComponents/ColorBands.tsx | 25 ++++--------------- 1 file changed, 5 insertions(+), 20 deletions(-) diff --git a/src/components/MyTimeComponents/ColorBands.tsx b/src/components/MyTimeComponents/ColorBands.tsx index 6355de093..928e83084 100644 --- a/src/components/MyTimeComponents/ColorBands.tsx +++ b/src/components/MyTimeComponents/ColorBands.tsx @@ -37,26 +37,11 @@ const ColorBands: React.FC = ({ list, tasksStatus, day, active }) = } }); return ( - <> -
- {(list.colorBands || []).map((ele, index) => ( -
- ))} -
- {active && day === "Today" && ( -
- {[ - ...completed, - { - width: "100%", - background: "#d9cccc", - }, - ].map((ele, index) => ( -
- ))} -
- )} - +
+ {(list.colorBands || []).map((ele, index) => ( +
+ ))} +
); }; From cba7fa7b25dbe4b656b366a416b6150b254c2acd Mon Sep 17 00:00:00 2001 From: vinod kumar <88377243+codervinod123@users.noreply.github.com> Date: Thu, 19 Sep 2024 07:03:34 +0530 Subject: [PATCH 38/93] fix:removed dead codes --- src/components/MyTimeComponents/MyTimeline/index.scss | 8 -------- 1 file changed, 8 deletions(-) diff --git a/src/components/MyTimeComponents/MyTimeline/index.scss b/src/components/MyTimeComponents/MyTimeline/index.scss index f113049ae..1d93a5b49 100644 --- a/src/components/MyTimeComponents/MyTimeline/index.scss +++ b/src/components/MyTimeComponents/MyTimeline/index.scss @@ -131,11 +131,3 @@ transition: opacity 0.5s ease-out; } -.task-progress { - display: flex; - justify-content: flex-end; - padding-right: 3%; - padding-top: 12px; - font-weight: 400; - font-size: 0.875em; -} From f5a8f5cc839bd17aecbfc711b323f519d9e575fd Mon Sep 17 00:00:00 2001 From: vinod kumar <88377243+codervinod123@users.noreply.github.com> Date: Thu, 19 Sep 2024 15:45:51 +0530 Subject: [PATCH 39/93] fix:removed unnecessary code --- src/components/MyTimeComponents/ColorBands.tsx | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/components/MyTimeComponents/ColorBands.tsx b/src/components/MyTimeComponents/ColorBands.tsx index 928e83084..b92d0531c 100644 --- a/src/components/MyTimeComponents/ColorBands.tsx +++ b/src/components/MyTimeComponents/ColorBands.tsx @@ -10,10 +10,9 @@ interface IColorBands { }; active: boolean; list: ITaskOfDay; - day: string; } -const ColorBands: React.FC = ({ list, tasksStatus, day, active }) => { +const ColorBands: React.FC = ({ list, tasksStatus, active }) => { const taskProgress: ITaskProgress = {}; const completion: { [goalId: string]: number } = {}; list.scheduled.forEach((ele) => { From 6f12a59552492db7a3ede55d4915b95daa9bf400 Mon Sep 17 00:00:00 2001 From: Tijl Leenders Date: Fri, 20 Sep 2024 11:11:09 +0200 Subject: [PATCH 40/93] Revert misguided change. --- vite.config.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/vite.config.ts b/vite.config.ts index a299a6da2..a509fc523 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -33,8 +33,8 @@ export default defineConfig({ srcDir: "src/service-worker", filename: "service-worker.ts", manifest: { - short_name: "zinzen", - name: "zinzen-me.zinzen", + short_name: "ZinZen", + name: "ZinZen.me", icons: [ { src: "pwa-192x192.png", From 2ec039a8f1dcfcaae0df1eb4b8462d37a0b1bd7f Mon Sep 17 00:00:00 2001 From: Tijl Leenders Date: Sun, 22 Sep 2024 17:34:41 +0200 Subject: [PATCH 41/93] update playwright --- package-lock.json | 29 +++++++++++++++++------------ package.json | 2 +- src/version.json | 6 +++--- 3 files changed, 21 insertions(+), 16 deletions(-) diff --git a/package-lock.json b/package-lock.json index 8d054ed41..bbc877829 100644 --- a/package-lock.json +++ b/package-lock.json @@ -12,7 +12,6 @@ "@dnd-kit/sortable": "^8.0.0", "@dnd-kit/utilities": "^3.2.2", "@jest/globals": "^28.1.0", - "@playwright/test": "^1.38.1", "@testing-library/jest-dom": "^5.16.1", "@testing-library/react": "^11.2.7", "@types/node": "^17.0.31", @@ -49,6 +48,7 @@ "@babel/preset-env": "^7.18.2", "@babel/preset-react": "^7.17.12", "@babel/preset-typescript": "^7.17.12", + "@playwright/test": "^1.47.2", "@types/crypto-js": "^4.1.1", "@typescript-eslint/eslint-plugin": "^5.22.0", "@typescript-eslint/parser": "^5.22.0", @@ -3374,12 +3374,13 @@ } }, "node_modules/@playwright/test": { - "version": "1.45.1", - "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.45.1.tgz", - "integrity": "sha512-Wo1bWTzQvGA7LyKGIZc8nFSTFf2TkthGIFBR+QVNilvwouGzFd4PYukZe3rvf5PSqjHi1+1NyKSDZKcQWETzaA==", + "version": "1.47.2", + "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.47.2.tgz", + "integrity": "sha512-jTXRsoSPONAs8Za9QEQdyjFn+0ZQFjCiIztAIF6bi1HqhBzG9Ma7g1WotyiGqFSBRZjIEqMdT8RUlbk1QVhzCQ==", + "dev": true, "license": "Apache-2.0", "dependencies": { - "playwright": "1.45.1" + "playwright": "1.47.2" }, "bin": { "playwright": "cli.js" @@ -10871,12 +10872,13 @@ } }, "node_modules/playwright": { - "version": "1.45.1", - "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.45.1.tgz", - "integrity": "sha512-Hjrgae4kpSQBr98nhCj3IScxVeVUixqj+5oyif8TdIn2opTCPEzqAqNMeK42i3cWDCVu9MI+ZsGWw+gVR4ISBg==", + "version": "1.47.2", + "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.47.2.tgz", + "integrity": "sha512-nx1cLMmQWqmA3UsnjaaokyoUpdVaaDhJhMoxX2qj3McpjnsqFHs516QAKYhqHAgOP+oCFTEOCOAaD1RgD/RQfA==", + "dev": true, "license": "Apache-2.0", "dependencies": { - "playwright-core": "1.45.1" + "playwright-core": "1.47.2" }, "bin": { "playwright": "cli.js" @@ -10889,9 +10891,10 @@ } }, "node_modules/playwright-core": { - "version": "1.45.1", - "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.45.1.tgz", - "integrity": "sha512-LF4CUUtrUu2TCpDw4mcrAIuYrEjVDfT1cHbJMfwnE2+1b8PZcFzPNgvZCvq2JfQ4aTjRCCHw5EJ2tmr2NSzdPg==", + "version": "1.47.2", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.47.2.tgz", + "integrity": "sha512-3JvMfF+9LJfe16l7AbSmU555PaTl2tPyQsVInqm3id16pdDfvZ8TTZ/pyzmkbDrZTQefyzU7AIHlZqQnxpqHVQ==", + "dev": true, "license": "Apache-2.0", "bin": { "playwright-core": "cli.js" @@ -10904,7 +10907,9 @@ "version": "2.3.2", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, "hasInstallScript": true, + "license": "MIT", "optional": true, "os": [ "darwin" diff --git a/package.json b/package.json index 4163aec1e..647a8f278 100644 --- a/package.json +++ b/package.json @@ -12,7 +12,6 @@ "@dnd-kit/sortable": "^8.0.0", "@dnd-kit/utilities": "^3.2.2", "@jest/globals": "^28.1.0", - "@playwright/test": "^1.38.1", "@testing-library/jest-dom": "^5.16.1", "@testing-library/react": "^11.2.7", "@types/node": "^17.0.31", @@ -84,6 +83,7 @@ "@babel/preset-env": "^7.18.2", "@babel/preset-react": "^7.17.12", "@babel/preset-typescript": "^7.17.12", + "@playwright/test": "^1.47.2", "@types/crypto-js": "^4.1.1", "@typescript-eslint/eslint-plugin": "^5.22.0", "@typescript-eslint/parser": "^5.22.0", diff --git a/src/version.json b/src/version.json index 2bf92ee69..045d6e1ae 100644 --- a/src/version.json +++ b/src/version.json @@ -1,7 +1,7 @@ { "buildHash": { - "schedulerFileHash": "409e79b3", - "indexFileHash": "10a6f235" + "schedulerFileHash": "b66a66a2", + "indexFileHash": "94f0e947" }, - "buildDate": "2024-08-14T13:23:54.232Z" + "buildDate": "2024-09-22T10:46:12.194Z" } From 2c1cdd891f2cb75722f825cdf2f076afeb8bfc7c Mon Sep 17 00:00:00 2001 From: Tijl Leenders Date: Sun, 22 Sep 2024 17:34:59 +0200 Subject: [PATCH 42/93] fix local server port --- playwright.config.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/playwright.config.ts b/playwright.config.ts index 4b3137558..33e4d1b68 100644 --- a/playwright.config.ts +++ b/playwright.config.ts @@ -71,7 +71,7 @@ export default defineConfig({ /* Run your local dev server before starting the tests */ webServer: { command: "npm run dev", - url: "http://127.0.0.1:3000", + url: "http://127.0.0.1:5173", reuseExistingServer: !process.env.CI, }, }); From dff4f572c0251c4e724f9a9d06b269f85c783eec Mon Sep 17 00:00:00 2001 From: Tijl Leenders Date: Sun, 22 Sep 2024 17:35:33 +0200 Subject: [PATCH 43/93] github action to run latest playwright --- .github/workflows/playwright.yml | 36 ++++++++++++++++---------------- 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/.github/workflows/playwright.yml b/.github/workflows/playwright.yml index 181221158..3eb13143c 100644 --- a/.github/workflows/playwright.yml +++ b/.github/workflows/playwright.yml @@ -1,27 +1,27 @@ name: Playwright Tests on: push: - branches: [main, master] + branches: [ main, master ] pull_request: - branches: [main, master] + branches: [ main, master ] jobs: test: timeout-minutes: 60 runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 - - uses: actions/setup-node@v4 - with: - node-version: 18 - - name: Install dependencies - run: npm ci - - name: Install Playwright Browsers - run: npx playwright install --with-deps - - name: Run Playwright tests - run: npx playwright test - - uses: actions/upload-artifact@v4 - if: always() - with: - name: playwright-report - path: playwright-report/ - retention-days: 30 + - uses: actions/checkout@v4 + - uses: actions/setup-node@v4 + with: + node-version: lts/* + - name: Install dependencies + run: npm ci + - name: Install Playwright Browsers + run: npx playwright install --with-deps + - name: Run Playwright tests + run: npx playwright test + - uses: actions/upload-artifact@v4 + if: ${{ !cancelled() }} + with: + name: playwright-report + path: playwright-report/ + retention-days: 30 From 44d63efe61cd6813b097c78d3cd754c0d517c68d Mon Sep 17 00:00:00 2001 From: Tijl Leenders Date: Sun, 22 Sep 2024 17:49:20 +0200 Subject: [PATCH 44/93] set port to 3000 --- playwright.config.ts | 2 +- vite.config.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/playwright.config.ts b/playwright.config.ts index 33e4d1b68..4b3137558 100644 --- a/playwright.config.ts +++ b/playwright.config.ts @@ -71,7 +71,7 @@ export default defineConfig({ /* Run your local dev server before starting the tests */ webServer: { command: "npm run dev", - url: "http://127.0.0.1:5173", + url: "http://127.0.0.1:3000", reuseExistingServer: !process.env.CI, }, }); diff --git a/vite.config.ts b/vite.config.ts index a509fc523..7a0b86b10 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -24,7 +24,7 @@ export default defineConfig({ }, server: { host: "127.0.0.1", - port: 5173, + port: 3000, }, plugins: [ VitePWA({ From 14baa29ea8e34c0a2046e270c1062db396281d25 Mon Sep 17 00:00:00 2001 From: Vinay Badgujar Date: Tue, 24 Sep 2024 18:05:51 +0530 Subject: [PATCH 45/93] remove: unnecessary business logic from colorbands component --- .../MyTimeComponents/ColorBands.tsx | 32 ++----------------- src/pages/MyTimePage/MyTimePage.scss | 4 --- src/pages/MyTimePage/MyTimePage.tsx | 4 +-- 3 files changed, 3 insertions(+), 37 deletions(-) diff --git a/src/components/MyTimeComponents/ColorBands.tsx b/src/components/MyTimeComponents/ColorBands.tsx index b92d0531c..2feeb5852 100644 --- a/src/components/MyTimeComponents/ColorBands.tsx +++ b/src/components/MyTimeComponents/ColorBands.tsx @@ -1,42 +1,14 @@ -import { ITaskProgress } from "@src/Interfaces/IPages"; import { ITaskOfDay } from "@src/Interfaces/Task"; -import { TaskItem } from "@src/models/TaskItem"; import React from "react"; import { v4 as uuidv4 } from "uuid"; interface IColorBands { - tasksStatus: { - [goalId: string]: TaskItem; - }; - active: boolean; list: ITaskOfDay; } -const ColorBands: React.FC = ({ list, tasksStatus, active }) => { - const taskProgress: ITaskProgress = {}; - const completion: { [goalId: string]: number } = {}; - list.scheduled.forEach((ele) => { - const { goalid } = ele; - if (!taskProgress[goalid]) { - const completedToday = tasksStatus[goalid]?.completedToday || 0; - completion[goalid] = completedToday + (completion[goalid] || 0); - taskProgress[goalid] = { total: 0, completed: completedToday, goalColor: ele.goalColor }; - } - taskProgress[goalid].total += ele.duration; - }); - - const completed: React.CSSProperties[] = []; - let acc = 0; - [...(list.colorBands || [])].forEach((ele) => { - const customStyle = { ...ele.style }; - if (completion[ele.goalId]) { - acc += ele.duration; - completion[ele.goalId] -= ele.duration; - completed.push({ ...customStyle, width: `${(acc / 24) * 100}%` }); - } - }); +const ColorBands: React.FC = ({ list }) => { return ( -
+
{(list.colorBands || []).map((ele, index) => (
))} diff --git a/src/pages/MyTimePage/MyTimePage.scss b/src/pages/MyTimePage/MyTimePage.scss index 6cfb3019b..67b4e759e 100644 --- a/src/pages/MyTimePage/MyTimePage.scss +++ b/src/pages/MyTimePage/MyTimePage.scss @@ -40,10 +40,6 @@ width: calc(100vw - 15%); } -.MyTime_colorPalette.active { - background: var(--bottom-nav-color); -} - .colorBand { position: absolute; left: 4%; diff --git a/src/pages/MyTimePage/MyTimePage.tsx b/src/pages/MyTimePage/MyTimePage.tsx index ad246fb27..7c4890f1b 100644 --- a/src/pages/MyTimePage/MyTimePage.tsx +++ b/src/pages/MyTimePage/MyTimePage.tsx @@ -68,9 +68,7 @@ export const MyTimePage = () => {
- {tasks[day] && ( - - )} + {tasks[day] && }
{showTasks.includes(day) && tasks[day] && tasks[day].scheduled.length > 0 && ( From ebc36ff44daccbb20b292b048cda4239981cb728 Mon Sep 17 00:00:00 2001 From: Vinay Badgujar Date: Mon, 30 Sep 2024 19:00:30 +0530 Subject: [PATCH 46/93] fix: ts issues --- src/api/HintsAPI/index.ts | 29 +++++++------------ .../GoalSublist/GoalSublist.tsx | 10 +++---- src/contexts/availableGoalHint-context.tsx | 7 ++--- 3 files changed, 18 insertions(+), 28 deletions(-) diff --git a/src/api/HintsAPI/index.ts b/src/api/HintsAPI/index.ts index 6e33fcf67..e5deedcde 100644 --- a/src/api/HintsAPI/index.ts +++ b/src/api/HintsAPI/index.ts @@ -102,30 +102,21 @@ export const deleteAvailableGoalHint = async (parentGoalId: string, goalId: stri const goalHintsItem = await db.hintsCollection.get(parentGoalId); if (goalHintsItem) { - const { availableGoalHints } = goalHintsItem; + const { availableGoalHints, deletedGoalHints = [] } = goalHintsItem; - const updatedGoalHints = []; - let deletedGoalHint = null; - - for (const hint of availableGoalHints) { - if (hint.id === goalId) { - deletedGoalHint = hint; - } else { - updatedGoalHints.push(hint); - } - } - - const updatedDeletedGoalHints = goalHintsItem.deletedGoalHints ? [...goalHintsItem.deletedGoalHints] : []; + const deletedGoalHint = availableGoalHints.find((hint) => hint.id === goalId); + const updatedGoalHints = availableGoalHints.filter((hint) => hint.id !== goalId); if (deletedGoalHint) { + // eslint-disable-next-line @typescript-eslint/no-unused-vars const { id, ...deletedHintDetails } = deletedGoalHint; - updatedDeletedGoalHints.push(deletedHintDetails); - } + const updatedDeletedGoalHints = [...deletedGoalHints, deletedHintDetails]; - await db.hintsCollection.update(parentGoalId, { - availableGoalHints: updatedGoalHints, - deletedGoalHints: updatedDeletedGoalHints, - }); + await db.hintsCollection.update(parentGoalId, { + availableGoalHints: updatedGoalHints, + deletedGoalHints: updatedDeletedGoalHints, + }); + } } }); } catch (e) { diff --git a/src/components/GoalsComponents/GoalSublist/GoalSublist.tsx b/src/components/GoalsComponents/GoalSublist/GoalSublist.tsx index 874bcbd5a..2d53a725b 100644 --- a/src/components/GoalsComponents/GoalSublist/GoalSublist.tsx +++ b/src/components/GoalsComponents/GoalSublist/GoalSublist.tsx @@ -9,16 +9,16 @@ import { lastAction } from "@src/store"; import { getGoalHintItem } from "@src/api/HintsAPI"; import { priotizeImpossibleGoals } from "@src/utils/priotizeImpossibleGoals"; import { useParentGoalContext } from "@src/contexts/parentGoal-context"; +import { AvailableGoalHintProvider } from "@src/contexts/availableGoalHint-context"; import { DeletedGoalProvider } from "@src/contexts/deletedGoal-context"; import DeletedGoals from "@pages/GoalsPage/components/DeletedGoals"; import ArchivedGoals from "@pages/GoalsPage/components/ArchivedGoals"; import { TrashItem } from "@src/models/TrashItem"; import GoalItemSummary from "@src/common/GoalItemSummary/GoalItemSummary"; +import AvailableGoalHints from "@pages/GoalsPage/components/AvailableGoalHints"; import GoalsList from "../GoalsList"; import GoalHistory from "./components/GoalHistory"; import "./GoalSublist.scss"; -import AvailableGoalHints from "@pages/GoalsPage/components/AvailableGoalHints"; -import { AvailableGoalHintProvider } from "@src/contexts/availableGoalHint-context"; export const GoalSublist = () => { const { @@ -28,7 +28,7 @@ export const GoalSublist = () => { const [activeGoals, setActiveGoals] = useState([]); const [deletedGoals, setDeletedGoals] = useState([]); const [archivedChildren, setArchivedChildren] = useState([]); - const [goalhints, setGoalHints] = useState([]); + const [goalHints, setGoalHints] = useState([]); const { t } = useTranslation(); const action = useRecoilValue(lastAction); const goalID = useRecoilValue(displayGoalId); @@ -83,8 +83,8 @@ export const GoalSublist = () => { )}
- - + + {deletedGoals.length > 0 && } diff --git a/src/contexts/availableGoalHint-context.tsx b/src/contexts/availableGoalHint-context.tsx index 9b8f5555e..2ef2ac273 100644 --- a/src/contexts/availableGoalHint-context.tsx +++ b/src/contexts/availableGoalHint-context.tsx @@ -16,11 +16,10 @@ export const AvailableGoalHintProvider = ({ children, goalHints }: { children: R useEffect(() => { if (activeGoalId) { - const hint = goalHints.find((goal) => { - return goal.id === activeGoalId; + const hint = goalHints.find((goalItem) => { + return goalItem.id === activeGoalId; }); - console.log(hint); - setGoal(hint ? hint : undefined); + setGoal(hint); } }, [isPartnerModeActive, activeGoalId]); From 63848acf99ff02b9286b599a55073630c7c97c79 Mon Sep 17 00:00:00 2001 From: Vinay Badgujar Date: Mon, 30 Sep 2024 19:01:33 +0530 Subject: [PATCH 47/93] refactor: use promise.all for multiple awaits in addHintGoalToMyGoals function --- src/api/GoalsAPI/index.ts | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/api/GoalsAPI/index.ts b/src/api/GoalsAPI/index.ts index 6beeab6d7..8384467c7 100644 --- a/src/api/GoalsAPI/index.ts +++ b/src/api/GoalsAPI/index.ts @@ -346,9 +346,11 @@ export const getAllLevelGoalsOfId = async (id: string, resetSharedStatus = false }; export const addHintGoaltoMyGoals = async (goal: GoalItem) => { - await updateGoal(goal.parentGoalId, { sublist: [...goal.sublist, goal.id] }); - await addGoal(goal); - await deleteAvailableGoalHint(goal.parentGoalId, goal.id); + await Promise.all([ + updateGoal(goal.parentGoalId, { sublist: [...goal.sublist, goal.id] }), + addGoal(goal), + deleteAvailableGoalHint(goal.parentGoalId, goal.id), + ]); }; export const fetchArchivedGoalByTitle = async (value: string) => { From 3bae6e0e91449dba1e378da44aaf8dbe4d13ad9b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 1 Oct 2024 15:12:26 +0000 Subject: [PATCH 48/93] chore(deps): bump rollup and vite Bumps [rollup](https://github.com/rollup/rollup) to 2.79.2 and updates ancestor dependency [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite). These dependencies need to be updated together. Updates `rollup` from 2.79.1 to 2.79.2 - [Release notes](https://github.com/rollup/rollup/releases) - [Changelog](https://github.com/rollup/rollup/blob/master/CHANGELOG.md) - [Commits](https://github.com/rollup/rollup/compare/v2.79.1...v2.79.2) Updates `vite` from 2.9.18 to 5.4.8 - [Release notes](https://github.com/vitejs/vite/releases) - [Changelog](https://github.com/vitejs/vite/blob/v5.4.8/packages/vite/CHANGELOG.md) - [Commits](https://github.com/vitejs/vite/commits/v5.4.8/packages/vite) --- updated-dependencies: - dependency-name: rollup dependency-type: indirect - dependency-name: vite dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- package-lock.json | 734 ++++++++++++++++++++++++++++++++++++++++------ package.json | 2 +- 2 files changed, 652 insertions(+), 84 deletions(-) diff --git a/package-lock.json b/package-lock.json index 8d054ed41..8c6c19743 100644 --- a/package-lock.json +++ b/package-lock.json @@ -36,7 +36,7 @@ "sass": "^1.50.0", "ts-node": "^10.9.2", "uuidv4": "^6.2.13", - "vite": "^2.9.18", + "vite": "^5.4.8", "workbox-core": "^5.1.4", "workbox-expiration": "^5.1.4", "workbox-precaching": "^5.1.4", @@ -2285,6 +2285,351 @@ "integrity": "sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg==", "license": "MIT" }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", + "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", + "cpu": [ + "ppc64" + ], + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", + "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", + "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", + "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", + "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", + "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", + "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", + "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", + "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", + "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", + "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", + "cpu": [ + "ia32" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", + "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", + "cpu": [ + "loong64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", + "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", + "cpu": [ + "mips64el" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", + "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", + "cpu": [ + "ppc64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", + "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", + "cpu": [ + "riscv64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", + "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", + "cpu": [ + "s390x" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", + "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", + "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", + "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", + "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", + "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", + "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", + "cpu": [ + "ia32" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", + "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, "node_modules/@eslint-community/eslint-utils": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", @@ -3299,7 +3644,7 @@ "version": "0.3.6", "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz", "integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", @@ -3636,6 +3981,198 @@ "rollup": "^1.20.0||^2.0.0" } }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.23.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.23.0.tgz", + "integrity": "sha512-8OR+Ok3SGEMsAZispLx8jruuXw0HVF16k+ub2eNXKHDmdxL4cf9NlNpAzhlOhNyXzKDEJuFeq0nZm+XlNb1IFw==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.23.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.23.0.tgz", + "integrity": "sha512-rEFtX1nP8gqmLmPZsXRMoLVNB5JBwOzIAk/XAcEPuKrPa2nPJ+DuGGpfQUR0XjRm8KjHfTZLpWbKXkA5BoFL3w==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.23.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.23.0.tgz", + "integrity": "sha512-ZbqlMkJRMMPeapfaU4drYHns7Q5MIxjM/QeOO62qQZGPh9XWziap+NF9fsqPHT0KzEL6HaPspC7sOwpgyA3J9g==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.23.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.23.0.tgz", + "integrity": "sha512-PfmgQp78xx5rBCgn2oYPQ1rQTtOaQCna0kRaBlc5w7RlA3TDGGo7m3XaptgitUZ54US9915i7KeVPHoy3/W8tA==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.23.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.23.0.tgz", + "integrity": "sha512-WAeZfAAPus56eQgBioezXRRzArAjWJGjNo/M+BHZygUcs9EePIuGI1Wfc6U/Ki+tMW17FFGvhCfYnfcKPh18SA==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.23.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.23.0.tgz", + "integrity": "sha512-v7PGcp1O5XKZxKX8phTXtmJDVpE20Ub1eF6w9iMmI3qrrPak6yR9/5eeq7ziLMrMTjppkkskXyxnmm00HdtXjA==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.23.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.23.0.tgz", + "integrity": "sha512-nAbWsDZ9UkU6xQiXEyXBNHAKbzSAi95H3gTStJq9UGiS1v+YVXwRHcQOQEF/3CHuhX5BVhShKoeOf6Q/1M+Zhg==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.23.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.23.0.tgz", + "integrity": "sha512-5QT/Di5FbGNPaVw8hHO1wETunwkPuZBIu6W+5GNArlKHD9fkMHy7vS8zGHJk38oObXfWdsuLMogD4sBySLJ54g==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { + "version": "4.23.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.23.0.tgz", + "integrity": "sha512-Sefl6vPyn5axzCsO13r1sHLcmPuiSOrKIImnq34CBurntcJ+lkQgAaTt/9JkgGmaZJ+OkaHmAJl4Bfd0DmdtOQ==", + "cpu": [ + "ppc64" + ], + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.23.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.23.0.tgz", + "integrity": "sha512-o4QI2KU/QbP7ZExMse6ULotdV3oJUYMrdx3rBZCgUF3ur3gJPfe8Fuasn6tia16c5kZBBw0aTmaUygad6VB/hQ==", + "cpu": [ + "riscv64" + ], + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.23.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.23.0.tgz", + "integrity": "sha512-+bxqx+V/D4FGrpXzPGKp/SEZIZ8cIW3K7wOtcJAoCrmXvzRtmdUhYNbgd+RztLzfDEfA2WtKj5F4tcbNPuqgeg==", + "cpu": [ + "s390x" + ], + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.23.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.23.0.tgz", + "integrity": "sha512-I/eXsdVoCKtSgK9OwyQKPAfricWKUMNCwJKtatRYMmDo5N859tbO3UsBw5kT3dU1n6ZcM1JDzPRSGhAUkxfLxw==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.23.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.23.0.tgz", + "integrity": "sha512-4ZoDZy5ShLbbe1KPSafbFh1vbl0asTVfkABC7eWqIs01+66ncM82YJxV2VtV3YVJTqq2P8HMx3DCoRSWB/N3rw==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.23.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.23.0.tgz", + "integrity": "sha512-+5Ky8dhft4STaOEbZu3/NU4QIyYssKO+r1cD3FzuusA0vO5gso15on7qGzKdNXnc1gOrsgCqZjRw1w+zL4y4hQ==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.23.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.23.0.tgz", + "integrity": "sha512-0SPJk4cPZQhq9qA1UhIRumSE3+JJIBBjtlGl5PNC///BoaByckNZd53rOYD0glpTkYFBQSt7AkMeLVPfx65+BQ==", + "cpu": [ + "ia32" + ], + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.23.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.23.0.tgz", + "integrity": "sha512-lqCK5GQC8fNo0+JvTSxcG7YB1UKYp8yrNLhsArlvPWN+16ovSZgoehlVHg6X0sSWPUkpjRBR5TuR12ZugowZ4g==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "win32" + ] + }, "node_modules/@sinclair/typebox": { "version": "0.24.51", "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.24.51.tgz", @@ -5507,7 +6044,7 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "dev": true, + "devOptional": true, "license": "MIT" }, "node_modules/builtin-modules": { @@ -5877,7 +6414,7 @@ "version": "2.20.3", "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true, + "devOptional": true, "license": "MIT" }, "node_modules/common-tags": { @@ -6683,11 +7220,10 @@ } }, "node_modules/esbuild": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.14.54.tgz", - "integrity": "sha512-Cy9llcy8DvET5uznocPyqL3BFRrFXSVqbgpMJ9Wz8oVjZlh/zUSNbPRbov0VX7VxN2JH1Oa0uNxZ7eLRb62pJA==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", + "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", "hasInstallScript": true, - "license": "MIT", "bin": { "esbuild": "bin/esbuild" }, @@ -6695,43 +7231,29 @@ "node": ">=12" }, "optionalDependencies": { - "@esbuild/linux-loong64": "0.14.54", - "esbuild-android-64": "0.14.54", - "esbuild-android-arm64": "0.14.54", - "esbuild-darwin-64": "0.14.54", - "esbuild-darwin-arm64": "0.14.54", - "esbuild-freebsd-64": "0.14.54", - "esbuild-freebsd-arm64": "0.14.54", - "esbuild-linux-32": "0.14.54", - "esbuild-linux-64": "0.14.54", - "esbuild-linux-arm": "0.14.54", - "esbuild-linux-arm64": "0.14.54", - "esbuild-linux-mips64le": "0.14.54", - "esbuild-linux-ppc64le": "0.14.54", - "esbuild-linux-riscv64": "0.14.54", - "esbuild-linux-s390x": "0.14.54", - "esbuild-netbsd-64": "0.14.54", - "esbuild-openbsd-64": "0.14.54", - "esbuild-sunos-64": "0.14.54", - "esbuild-windows-32": "0.14.54", - "esbuild-windows-64": "0.14.54", - "esbuild-windows-arm64": "0.14.54" - } - }, - "node_modules/esbuild-windows-64": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.14.54.tgz", - "integrity": "sha512-AoHTRBUuYwXtZhjXZbA1pGfTo8cJo3vZIcWGLiUcTNgHpJJMC1rVA44ZereBHMJtotyN71S8Qw0npiCIkW96cQ==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" + "@esbuild/aix-ppc64": "0.21.5", + "@esbuild/android-arm": "0.21.5", + "@esbuild/android-arm64": "0.21.5", + "@esbuild/android-x64": "0.21.5", + "@esbuild/darwin-arm64": "0.21.5", + "@esbuild/darwin-x64": "0.21.5", + "@esbuild/freebsd-arm64": "0.21.5", + "@esbuild/freebsd-x64": "0.21.5", + "@esbuild/linux-arm": "0.21.5", + "@esbuild/linux-arm64": "0.21.5", + "@esbuild/linux-ia32": "0.21.5", + "@esbuild/linux-loong64": "0.21.5", + "@esbuild/linux-mips64el": "0.21.5", + "@esbuild/linux-ppc64": "0.21.5", + "@esbuild/linux-riscv64": "0.21.5", + "@esbuild/linux-s390x": "0.21.5", + "@esbuild/linux-x64": "0.21.5", + "@esbuild/netbsd-x64": "0.21.5", + "@esbuild/openbsd-x64": "0.21.5", + "@esbuild/sunos-x64": "0.21.5", + "@esbuild/win32-arm64": "0.21.5", + "@esbuild/win32-ia32": "0.21.5", + "@esbuild/win32-x64": "0.21.5" } }, "node_modules/escalade": { @@ -7694,6 +8216,7 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" @@ -8003,6 +8526,7 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dev": true, "license": "MIT", "dependencies": { "function-bind": "^1.1.2" @@ -8382,6 +8906,7 @@ "version": "2.14.0", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.14.0.tgz", "integrity": "sha512-a5dFJih5ZLYlRtDc0dZWP7RiKr6xIKzmn/oAYCDvdLThadVgyJwlaoQPmRtMSpz+rk0OGAgIu+TcM9HUF0fk1A==", + "dev": true, "license": "MIT", "dependencies": { "hasown": "^2.0.2" @@ -10401,7 +10926,6 @@ "url": "https://github.com/sponsors/ai" } ], - "license": "MIT", "bin": { "nanoid": "bin/nanoid.cjs" }, @@ -10798,6 +11322,7 @@ "version": "1.0.7", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true, "license": "MIT" }, "node_modules/path-to-regexp": { @@ -10818,10 +11343,9 @@ } }, "node_modules/picocolors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", - "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==", - "license": "ISC" + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.0.tgz", + "integrity": "sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==" }, "node_modules/picomatch": { "version": "2.3.1", @@ -10924,9 +11448,9 @@ } }, "node_modules/postcss": { - "version": "8.4.39", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.39.tgz", - "integrity": "sha512-0vzE+lAiG7hZl1/9I8yzKLx3aR9Xbof3fBHKunvMfOCYAtMhrsnccJY2iTURb9EZd5+pLuiNV9/c/GZJOHsgIw==", + "version": "8.4.47", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.47.tgz", + "integrity": "sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ==", "funding": [ { "type": "opencollective", @@ -10941,11 +11465,10 @@ "url": "https://github.com/sponsors/ai" } ], - "license": "MIT", "dependencies": { "nanoid": "^3.3.7", - "picocolors": "^1.0.1", - "source-map-js": "^1.2.0" + "picocolors": "^1.1.0", + "source-map-js": "^1.2.1" }, "engines": { "node": "^10 || ^12 || >=14" @@ -12108,6 +12631,7 @@ "version": "1.22.8", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "dev": true, "license": "MIT", "dependencies": { "is-core-module": "^2.13.0", @@ -12201,11 +12725,10 @@ } }, "node_modules/rollup": { - "version": "2.79.1", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.79.1.tgz", - "integrity": "sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw==", + "version": "2.79.2", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.79.2.tgz", + "integrity": "sha512-fS6iqSPZDs3dr/y7Od6y5nha8dW1YnbgtsyotCVvoFGKbERG++CVRFv1meyGDE1SNItQA8BrnCw7ScdAhRJ3XQ==", "dev": true, - "license": "MIT", "bin": { "rollup": "dist/bin/rollup" }, @@ -12664,17 +13187,16 @@ "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, + "devOptional": true, "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } }, "node_modules/source-map-js": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", - "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==", - "license": "BSD-3-Clause", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", "engines": { "node": ">=0.10.0" } @@ -12683,7 +13205,7 @@ "version": "0.5.21", "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "buffer-from": "^1.0.0", @@ -13009,6 +13531,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" @@ -13104,7 +13627,7 @@ "version": "5.31.2", "resolved": "https://registry.npmjs.org/terser/-/terser-5.31.2.tgz", "integrity": "sha512-LGyRZVFm/QElZHy/CPr/O4eNZOZIzsrQ92y4v9UJe/pFJjypje2yI3C2FmPtvUEnhadlSbmG2nXtdcjHOjCfxw==", - "dev": true, + "devOptional": true, "license": "BSD-2-Clause", "dependencies": { "@jridgewell/source-map": "^0.3.3", @@ -13854,39 +14377,60 @@ } }, "node_modules/vite": { - "version": "2.9.18", - "resolved": "https://registry.npmjs.org/vite/-/vite-2.9.18.tgz", - "integrity": "sha512-sAOqI5wNM9QvSEE70W3UGMdT8cyEn0+PmJMTFvTB8wB0YbYUWw3gUbY62AOyrXosGieF2htmeLATvNxpv/zNyQ==", - "license": "MIT", + "version": "5.4.8", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.8.tgz", + "integrity": "sha512-FqrItQ4DT1NC4zCUqMB4c4AZORMKIa0m8/URVCZ77OZ/QSNeJ54bU1vrFADbDsuwfIPcgknRkmqakQcgnL4GiQ==", "dependencies": { - "esbuild": "^0.14.27", - "postcss": "^8.4.13", - "resolve": "^1.22.0", - "rollup": ">=2.59.0 <2.78.0" + "esbuild": "^0.21.3", + "postcss": "^8.4.43", + "rollup": "^4.20.0" }, "bin": { "vite": "bin/vite.js" }, "engines": { - "node": ">=12.2.0" + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" }, "optionalDependencies": { - "fsevents": "~2.3.2" + "fsevents": "~2.3.3" }, "peerDependencies": { + "@types/node": "^18.0.0 || >=20.0.0", "less": "*", + "lightningcss": "^1.21.0", "sass": "*", - "stylus": "*" + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" }, "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, "less": { "optional": true }, + "lightningcss": { + "optional": true + }, "sass": { "optional": true }, + "sass-embedded": { + "optional": true + }, "stylus": { "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true } } }, @@ -13913,18 +14457,42 @@ "workbox-window": "^6.4.0" } }, + "node_modules/vite/node_modules/@types/estree": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", + "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==" + }, "node_modules/vite/node_modules/rollup": { - "version": "2.77.3", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.77.3.tgz", - "integrity": "sha512-/qxNTG7FbmefJWoeeYJFbHehJ2HNWnjkAFRKzWN/45eNBBF/r8lo992CwcJXEzyVxs5FmfId+vTSTQDb+bxA+g==", - "license": "MIT", + "version": "4.23.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.23.0.tgz", + "integrity": "sha512-vXB4IT9/KLDrS2WRXmY22sVB2wTsTwkpxjB8Q3mnakTENcYw3FRmfdYDy/acNmls+lHmDazgrRjK/yQ6hQAtwA==", + "dependencies": { + "@types/estree": "1.0.6" + }, "bin": { "rollup": "dist/bin/rollup" }, "engines": { - "node": ">=10.0.0" + "node": ">=18.0.0", + "npm": ">=8.0.0" }, "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.23.0", + "@rollup/rollup-android-arm64": "4.23.0", + "@rollup/rollup-darwin-arm64": "4.23.0", + "@rollup/rollup-darwin-x64": "4.23.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.23.0", + "@rollup/rollup-linux-arm-musleabihf": "4.23.0", + "@rollup/rollup-linux-arm64-gnu": "4.23.0", + "@rollup/rollup-linux-arm64-musl": "4.23.0", + "@rollup/rollup-linux-powerpc64le-gnu": "4.23.0", + "@rollup/rollup-linux-riscv64-gnu": "4.23.0", + "@rollup/rollup-linux-s390x-gnu": "4.23.0", + "@rollup/rollup-linux-x64-gnu": "4.23.0", + "@rollup/rollup-linux-x64-musl": "4.23.0", + "@rollup/rollup-win32-arm64-msvc": "4.23.0", + "@rollup/rollup-win32-ia32-msvc": "4.23.0", + "@rollup/rollup-win32-x64-msvc": "4.23.0", "fsevents": "~2.3.2" } }, diff --git a/package.json b/package.json index 4163aec1e..845be0580 100644 --- a/package.json +++ b/package.json @@ -36,7 +36,7 @@ "sass": "^1.50.0", "ts-node": "^10.9.2", "uuidv4": "^6.2.13", - "vite": "^2.9.18", + "vite": "^5.4.8", "workbox-core": "^5.1.4", "workbox-expiration": "^5.1.4", "workbox-precaching": "^5.1.4", From d4538b9b65ca6d23f9de2c76d442fdf3d28ff9d5 Mon Sep 17 00:00:00 2001 From: Vinay Badgujar Date: Fri, 4 Oct 2024 12:19:34 +0530 Subject: [PATCH 49/93] update: config goal ui playwright test --- playwright/tests/config-goal-ui.spec.ts | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/playwright/tests/config-goal-ui.spec.ts b/playwright/tests/config-goal-ui.spec.ts index 8a8d18257..4265c70de 100644 --- a/playwright/tests/config-goal-ui.spec.ts +++ b/playwright/tests/config-goal-ui.spec.ts @@ -10,8 +10,7 @@ test.describe("Config Goal UI", () => { test("should add a new goal after pressing Enter key", async ({ page }) => { await page.getByRole("button", { name: "Goals" }).click(); - await page.getByRole("button", { name: "add goal | add feeling | add group", exact: true }).click(); - await page.getByRole("button", { name: "Goal add goal", exact: true }).click(); + await page.getByRole("button", { name: "add goal | add feeling | add group", exact: true }).click({}); const titleInputContainer = page.getByPlaceholder("Goal title"); const testGoalTitle = "Test Goal"; @@ -24,7 +23,9 @@ test.describe("Config Goal UI", () => { test("should add a new budget after pressing Enter key", async ({ page }) => { await page.getByRole("button", { name: "Goals" }).click(); - await page.getByRole("button", { name: "add goal | add feeling | add group", exact: true }).click(); + await page.getByRole("button", { name: "add goal | add feeling | add group", exact: true }).click({ + delay: 1000, + }); await page.getByRole("button", { name: "Budget add goal", exact: true }).click(); const titleInputContainer = page.getByPlaceholder("Budget title"); From a6a8dc44a0dc4e9240e58bd52468fd361e98ce41 Mon Sep 17 00:00:00 2001 From: Vinay Badgujar Date: Fri, 4 Oct 2024 13:53:23 +0530 Subject: [PATCH 50/93] fix: collaboration playwright test --- .../goal-collaboration-feature.spec.ts | 19 +++++++++++++------ .../utils/collaboration-feature-utils.ts | 6 ++---- .../MyGoalActions/RegularGoalActions.tsx | 1 + 3 files changed, 16 insertions(+), 10 deletions(-) diff --git a/playwright/tests/collaboration-feature/goal-collaboration-feature.spec.ts b/playwright/tests/collaboration-feature/goal-collaboration-feature.spec.ts index e0f4a335d..f87fad817 100644 --- a/playwright/tests/collaboration-feature/goal-collaboration-feature.spec.ts +++ b/playwright/tests/collaboration-feature/goal-collaboration-feature.spec.ts @@ -15,9 +15,6 @@ import { test.describe.configure({ mode: "serial" }); test.describe("Goal Sharing Feature", () => { - let userAContext; - let userBContext; - let userCContext; let userAPage: Page; let userBPage: Page; let userCPage: Page; @@ -25,9 +22,18 @@ test.describe("Goal Sharing Feature", () => { let currentGoalTitle: string; test.beforeAll(async ({ browser }) => { - ({ context: userAContext, page: userAPage } = await createUserContextAndPage(browser, STORAGE_STATE)); - ({ context: userBContext, page: userBPage } = await createUserContextAndPage(browser, STORAGE_STATE)); - ({ context: userCContext, page: userCPage } = await createUserContextAndPage(browser, STORAGE_STATE)); + ({ page: userAPage } = await createUserContextAndPage(browser)); + ({ page: userBPage } = await createUserContextAndPage(browser)); + ({ page: userCPage } = await createUserContextAndPage(browser)); + await userAPage.goto("http://127.0.0.1:3000/"); + await userAPage.getByText("English").click(); + await userAPage.getByRole("button", { name: "Continue zinzen faq" }).click(); + await userBPage.goto("http://127.0.0.1:3000/"); + await userBPage.getByText("English").click(); + await userBPage.getByRole("button", { name: "Continue zinzen faq" }).click(); + await userCPage.goto("http://127.0.0.1:3000/"); + await userCPage.getByText("English").click(); + await userCPage.getByRole("button", { name: "Continue zinzen faq" }).click(); }); const userCollaborationScenarios = [ @@ -94,6 +100,7 @@ test.describe("Goal Sharing Feature", () => { }); test(`check if collaborated goal is visible in User ${receiver}'s MyGoal`, async () => { + await receiverPage().goto("http://127.0.0.1:3000/"); await receiverPage().getByRole("button", { name: "Goals" }).click(); await expect(receiverPage().locator(".goal-title").first().locator("span")).toContainText(currentGoalTitle); }); diff --git a/playwright/utils/collaboration-feature-utils.ts b/playwright/utils/collaboration-feature-utils.ts index fb4440fc6..e37d1027a 100644 --- a/playwright/utils/collaboration-feature-utils.ts +++ b/playwright/utils/collaboration-feature-utils.ts @@ -1,9 +1,7 @@ import { Browser, Page, expect } from "@playwright/test"; -export async function createUserContextAndPage(browser: Browser, storageState: string) { - const context = await browser.newContext({ - storageState, - }); +export async function createUserContextAndPage(browser: Browser) { + const context = await browser.newContext(); const page = await context.newPage(); return { context, page }; } diff --git a/src/components/GoalsComponents/MyGoalActions/RegularGoalActions.tsx b/src/components/GoalsComponents/MyGoalActions/RegularGoalActions.tsx index 28d006f16..fed2f1dec 100644 --- a/src/components/GoalsComponents/MyGoalActions/RegularGoalActions.tsx +++ b/src/components/GoalsComponents/MyGoalActions/RegularGoalActions.tsx @@ -62,6 +62,7 @@ const RegularGoalActions = ({ goal }: { goal: GoalItem }) => { await handleArchiveGoal(goal, ancestors); } else if (action === "colabRequest") { await convertSharedWMGoalToColab(goal); + setLastAction("goalColabRequest"); } window.history.back(); }; From 254c002221c41f4e27455b53850f2da00fe3b557 Mon Sep 17 00:00:00 2001 From: Vinay Badgujar Date: Fri, 4 Oct 2024 14:02:23 +0530 Subject: [PATCH 51/93] fix: other playwright tests --- .../tests/bottom-nav/navigation.spec.ts | 4 +- .../goal-sharing-feature.spec.ts | 58 ------------------- playwright/tests/header-ui.spec.ts | 5 +- playwright/tests/landing-page.spec.ts | 2 +- 4 files changed, 5 insertions(+), 64 deletions(-) delete mode 100644 playwright/tests/collaboration-feature/goal-sharing-feature.spec.ts diff --git a/playwright/tests/bottom-nav/navigation.spec.ts b/playwright/tests/bottom-nav/navigation.spec.ts index 388e0e38f..d49317783 100644 --- a/playwright/tests/bottom-nav/navigation.spec.ts +++ b/playwright/tests/bottom-nav/navigation.spec.ts @@ -2,10 +2,10 @@ import { test, expect } from "@playwright/test"; import { STORAGE_STATE } from "playwright/config/constants"; test.describe("BottomNavbar", () => { - test.use({ storageState: STORAGE_STATE }); - test.beforeEach(async ({ page }) => { await page.goto("http://127.0.0.1:3000/"); + await page.getByText("English").click(); + await page.getByRole("button", { name: "Continue zinzen faq" }).click(); }); test("should navigate to MyTime when Schedule button is clicked", async ({ page }) => { diff --git a/playwright/tests/collaboration-feature/goal-sharing-feature.spec.ts b/playwright/tests/collaboration-feature/goal-sharing-feature.spec.ts deleted file mode 100644 index 10cb4cf78..000000000 --- a/playwright/tests/collaboration-feature/goal-sharing-feature.spec.ts +++ /dev/null @@ -1,58 +0,0 @@ -import { test, expect, Page } from "@playwright/test"; -import { API_SERVER_URL, API_SERVER_URL_GOAL } from "playwright/config/constants"; -import { - acceptContactInvitation, - addContact, - goToMyGoalsPageFlow, - goToShareGoalModalFlow, - waitForResponseConfirmation, -} from "playwright/utils/collaboration-feature-utils"; - -test.describe.configure({ mode: "serial" }); - -test.describe("Goal Sharing Feature", () => { - let userOneContext; - let userTwoContext; - let userOnePage: Page; - let userTwoPage: Page; - let invitationLink: string; - let currentGoalTitle: string; - - test.beforeAll(async ({ browser }) => { - userOneContext = await browser.newContext({ - storageState: "playwright/userOnboarding.json", - }); - userTwoContext = await browser.newContext({ - storageState: "playwright/userOnboarding.json", - }); - - userOnePage = await userOneContext.newPage(); - userTwoPage = await userTwoContext.newPage(); - }); - - test("from User One share invitation to User Two", async () => { - await goToMyGoalsPageFlow(userOnePage); - currentGoalTitle = await userOnePage.locator(".goal-title").first().locator("span").innerText(); - invitationLink = await addContact(userOnePage, "User Two", "relId", "relationshipId"); - await goToMyGoalsPageFlow(userOnePage); - await goToShareGoalModalFlow(userOnePage); - }); - - test("from User Two accept invitation of User One", async () => { - await acceptContactInvitation(userTwoPage, invitationLink, "User Two"); - await waitForResponseConfirmation(userTwoPage, API_SERVER_URL, "accepted"); - }); - - test("share goal from User One to User Two", async () => { - await userOnePage.getByRole("button", { name: "U", exact: true }).click(); - await userOnePage.waitForSelector(".ant-notification-notice"); - }); - - test("check whether shared goal is visible in User Two's patner goal", async () => { - await userTwoPage.reload(); - await waitForResponseConfirmation(userTwoPage, API_SERVER_URL_GOAL, "shareMessage"); - await userTwoPage.getByRole("img", { name: "ZinZen" }).click(); - await userTwoPage.reload(); - await expect(userTwoPage.locator(".user-goal-main")).toBeVisible(); - }); -}); diff --git a/playwright/tests/header-ui.spec.ts b/playwright/tests/header-ui.spec.ts index fa1d288bc..69f9cbf2b 100644 --- a/playwright/tests/header-ui.spec.ts +++ b/playwright/tests/header-ui.spec.ts @@ -1,11 +1,10 @@ import { test, expect } from "@playwright/test"; -import { STORAGE_STATE } from "playwright/config/constants"; test.describe("Header component", () => { - test.use({ storageState: STORAGE_STATE }); - test.beforeEach(async ({ page }) => { await page.goto("http://127.0.0.1:3000/"); + await page.getByText("English").click(); + await page.getByRole("button", { name: "Continue zinzen faq" }).click(); }); test("should display the title correctly", async ({ page }) => { diff --git a/playwright/tests/landing-page.spec.ts b/playwright/tests/landing-page.spec.ts index 841569148..1d23ade72 100644 --- a/playwright/tests/landing-page.spec.ts +++ b/playwright/tests/landing-page.spec.ts @@ -10,7 +10,7 @@ test.describe("Onboarding", () => { test("should select a language and navigate to the FAQ page", async () => { await page.goto("http://127.0.0.1:3000/"); - await page.getByRole("button", { name: "English" }).click(); + await page.getByText("English").click(); await expect(page).toHaveURL("http://127.0.0.1:3000/ZinZenFAQ"); }); From 7e462af0b9f13e1c95b38f837e008dc084684e2e Mon Sep 17 00:00:00 2001 From: Vinay Badgujar Date: Fri, 4 Oct 2024 14:26:16 +0530 Subject: [PATCH 52/93] add: retires to collaboration playwright test for response confirmation --- .../utils/collaboration-feature-utils.ts | 80 +++++++++++++++---- 1 file changed, 65 insertions(+), 15 deletions(-) diff --git a/playwright/utils/collaboration-feature-utils.ts b/playwright/utils/collaboration-feature-utils.ts index e37d1027a..c35b88958 100644 --- a/playwright/utils/collaboration-feature-utils.ts +++ b/playwright/utils/collaboration-feature-utils.ts @@ -23,15 +23,42 @@ export async function waitForResponseConfirmation( page: Page, urlContains: string, responseBodyIncludes: string, + maxRetries: number = 3, + retryDelay: number = 15000, ): Promise { - await page.waitForResponse( - async (response) => - response.status() === 200 && - response.url().includes(urlContains) && - (await response.text()).includes(responseBodyIncludes), - ); -} + for (let attempt = 1; attempt <= maxRetries; attempt++) { + try { + const response = await page.waitForResponse( + async (response) => { + const status = response.status(); + const url = response.url(); + const text = await response.text(); + const isMatch = status === 200 && url.includes(urlContains) && text.includes(responseBodyIncludes); + + console.log(`Attempt ${attempt} - Response details: + Status: ${status} + URL: ${url} + Includes expected body: ${text.includes(responseBodyIncludes)} + Is match: ${isMatch}`); + return isMatch; + }, + { timeout: 10000 }, + ); + + console.log(`Success on attempt ${attempt}`); + console.log(`Response: ${JSON.stringify(response)}`); + return; + } catch (error) { + if (attempt === maxRetries) { + console.error(`All ${maxRetries} attempts failed. Last error: ${error.message}`); + throw new Error(`Failed to get response confirmation after ${maxRetries} attempts: ${error.message}`); + } + console.warn(`Attempt ${attempt} failed. Retrying in ${retryDelay}ms...`); + await page.waitForTimeout(retryDelay); + } + } +} export async function addContact( page: Page, contactName: string, @@ -71,13 +98,36 @@ export async function goToMyGoalsPageFlow(page: Page) { await page.getByRole("button", { name: "Goals" }).click(); } -export async function verifyUpdatedGoal(page: Page, expectedGoalTitle: string, apiUrlGoal: string): Promise { - await page.goto("http://127.0.0.1:3000/"); - await Promise.all([page.waitForResponse((res) => res.status() === 200 && res.url().includes(apiUrlGoal))]); +export async function verifyUpdatedGoal( + page: Page, + expectedGoalTitle: string, + apiUrlGoal: string, + maxRetries: number = 3, + retryDelay: number = 2000, +): Promise { + for (let attempt = 1; attempt <= maxRetries; attempt++) { + try { + await page.goto("http://127.0.0.1:3000/"); + await Promise.all([ + page.waitForResponse((res) => res.status() === 200 && res.url().includes(apiUrlGoal), { timeout: 10000 }), + ]); - await page.getByRole("button", { name: "Goals" }).click(); - await page.locator(".goal-dd-outer").first().click(); - await expect(page.getByText(expectedGoalTitle).first()).toBeVisible(); - await page.getByRole("button", { name: "add changes Make all checked" }).click(); - await expect(page.getByText(expectedGoalTitle).first()).toBeVisible(); + await page.getByRole("button", { name: "Goals" }).click(); + await page.locator(".goal-dd-outer").first().click(); + + await page.waitForSelector(`text=${expectedGoalTitle}`, { timeout: 10000 }); + + await page.getByRole("button", { name: "add changes Make all checked" }).click(); + + await page.waitForSelector(`text=${expectedGoalTitle}`, { timeout: 10000 }); + + return; + } catch (error) { + if (attempt === maxRetries) { + throw new Error(`Failed to verify updated goal after ${maxRetries} attempts: ${error.message}`); + } + console.warn(`Attempt ${attempt} failed. Retrying in ${retryDelay}ms...`); + await page.waitForTimeout(retryDelay); + } + } } From deabe69d59366ce7b07e034f8777d938651ab8d3 Mon Sep 17 00:00:00 2001 From: Vinay Badgujar Date: Fri, 4 Oct 2024 14:49:29 +0530 Subject: [PATCH 53/93] edit: increase collaboration timeout limit --- .../collaboration-feature/goal-collaboration-feature.spec.ts | 2 +- playwright/utils/collaboration-feature-utils.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/playwright/tests/collaboration-feature/goal-collaboration-feature.spec.ts b/playwright/tests/collaboration-feature/goal-collaboration-feature.spec.ts index f87fad817..ca8854eb4 100644 --- a/playwright/tests/collaboration-feature/goal-collaboration-feature.spec.ts +++ b/playwright/tests/collaboration-feature/goal-collaboration-feature.spec.ts @@ -12,7 +12,7 @@ import { waitForResponseConfirmation, } from "../../utils/collaboration-feature-utils"; -test.describe.configure({ mode: "serial" }); +test.describe.configure({ mode: "serial", timeout: 100000 }); test.describe("Goal Sharing Feature", () => { let userAPage: Page; diff --git a/playwright/utils/collaboration-feature-utils.ts b/playwright/utils/collaboration-feature-utils.ts index c35b88958..1f6f2345d 100644 --- a/playwright/utils/collaboration-feature-utils.ts +++ b/playwright/utils/collaboration-feature-utils.ts @@ -24,7 +24,7 @@ export async function waitForResponseConfirmation( urlContains: string, responseBodyIncludes: string, maxRetries: number = 3, - retryDelay: number = 15000, + retryDelay: number = 2000, ): Promise { for (let attempt = 1; attempt <= maxRetries; attempt++) { try { From 8e368ad9fb95e3dd993830fcf88ae1fe73103ea5 Mon Sep 17 00:00:00 2001 From: Vinay Badgujar Date: Fri, 4 Oct 2024 18:27:51 +0530 Subject: [PATCH 54/93] add: run playwright in headful mode in ci/cd --- .github/workflows/playwright.yml | 36 +++++++++---------- .../goal-collaboration-feature.spec.ts | 2 +- .../utils/collaboration-feature-utils.ts | 4 +-- 3 files changed, 21 insertions(+), 21 deletions(-) diff --git a/.github/workflows/playwright.yml b/.github/workflows/playwright.yml index 3eb13143c..7b991f5e8 100644 --- a/.github/workflows/playwright.yml +++ b/.github/workflows/playwright.yml @@ -1,27 +1,27 @@ name: Playwright Tests on: push: - branches: [ main, master ] + branches: [main, master] pull_request: - branches: [ main, master ] + branches: [main, master] jobs: test: timeout-minutes: 60 runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 - - uses: actions/setup-node@v4 - with: - node-version: lts/* - - name: Install dependencies - run: npm ci - - name: Install Playwright Browsers - run: npx playwright install --with-deps - - name: Run Playwright tests - run: npx playwright test - - uses: actions/upload-artifact@v4 - if: ${{ !cancelled() }} - with: - name: playwright-report - path: playwright-report/ - retention-days: 30 + - uses: actions/checkout@v4 + - uses: actions/setup-node@v4 + with: + node-version: lts/* + - name: Install dependencies + run: npm ci + - name: Install Playwright Browsers + run: npx playwright install --with-deps + - name: Run Playwright tests + run: xvfb-run npx playwright test + - uses: actions/upload-artifact@v4 + if: ${{ !cancelled() }} + with: + name: playwright-report + path: playwright-report/ + retention-days: 30 diff --git a/playwright/tests/collaboration-feature/goal-collaboration-feature.spec.ts b/playwright/tests/collaboration-feature/goal-collaboration-feature.spec.ts index ca8854eb4..a8d317a7b 100644 --- a/playwright/tests/collaboration-feature/goal-collaboration-feature.spec.ts +++ b/playwright/tests/collaboration-feature/goal-collaboration-feature.spec.ts @@ -1,5 +1,5 @@ import { test, expect, Page } from "@playwright/test"; -import { API_SERVER_URL, API_SERVER_URL_GOAL, STORAGE_STATE } from "playwright/config/constants"; +import { API_SERVER_URL, API_SERVER_URL_GOAL } from "playwright/config/constants"; import { acceptContactInvitation, addContact, diff --git a/playwright/utils/collaboration-feature-utils.ts b/playwright/utils/collaboration-feature-utils.ts index 1f6f2345d..469a07b8c 100644 --- a/playwright/utils/collaboration-feature-utils.ts +++ b/playwright/utils/collaboration-feature-utils.ts @@ -24,7 +24,7 @@ export async function waitForResponseConfirmation( urlContains: string, responseBodyIncludes: string, maxRetries: number = 3, - retryDelay: number = 2000, + retryDelay: number = 3000, ): Promise { for (let attempt = 1; attempt <= maxRetries; attempt++) { try { @@ -43,7 +43,7 @@ export async function waitForResponseConfirmation( return isMatch; }, - { timeout: 10000 }, + { timeout: 30000 }, ); console.log(`Success on attempt ${attempt}`); From 7f11bc6aaeee7296e24c0bf69c839aad702c0017 Mon Sep 17 00:00:00 2001 From: Vinay Badgujar Date: Fri, 4 Oct 2024 19:22:10 +0530 Subject: [PATCH 55/93] edit: increase retries for collaboration playwright test --- .github/workflows/playwright.yml | 2 +- playwright.config.ts | 2 +- playwright/utils/collaboration-feature-utils.ts | 1 + 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/.github/workflows/playwright.yml b/.github/workflows/playwright.yml index 7b991f5e8..884700bb1 100644 --- a/.github/workflows/playwright.yml +++ b/.github/workflows/playwright.yml @@ -18,7 +18,7 @@ jobs: - name: Install Playwright Browsers run: npx playwright install --with-deps - name: Run Playwright tests - run: xvfb-run npx playwright test + run: xvfb-run npx playwright test --headed - uses: actions/upload-artifact@v4 if: ${{ !cancelled() }} with: diff --git a/playwright.config.ts b/playwright.config.ts index 4b3137558..addd0293e 100644 --- a/playwright.config.ts +++ b/playwright.config.ts @@ -16,7 +16,7 @@ export default defineConfig({ /* Fail the build on CI if you accidentally left test.only in the source code. */ forbidOnly: !!process.env.CI, /* Retry on CI only */ - retries: process.env.CI ? 2 : 0, + retries: process.env.CI ? 3 : 0, /* Opt out of parallel tests on CI. */ workers: process.env.CI ? 1 : undefined, /* Reporter to use. See https://playwright.dev/docs/test-reporters */ diff --git a/playwright/utils/collaboration-feature-utils.ts b/playwright/utils/collaboration-feature-utils.ts index 469a07b8c..ae727292c 100644 --- a/playwright/utils/collaboration-feature-utils.ts +++ b/playwright/utils/collaboration-feature-utils.ts @@ -34,6 +34,7 @@ export async function waitForResponseConfirmation( const url = response.url(); const text = await response.text(); const isMatch = status === 200 && url.includes(urlContains) && text.includes(responseBodyIncludes); + console.log(text); console.log(`Attempt ${attempt} - Response details: Status: ${status} From e18f2863663c581b5ca3e99b05fe2d8d63a28941 Mon Sep 17 00:00:00 2001 From: Vinay Badgujar Date: Sat, 5 Oct 2024 14:17:07 +0530 Subject: [PATCH 56/93] fix: add appropriate reloads --- playwright.config.ts | 2 +- .../goal-collaboration-feature.spec.ts | 4 +-- .../utils/collaboration-feature-utils.ts | 27 +++++-------------- 3 files changed, 9 insertions(+), 24 deletions(-) diff --git a/playwright.config.ts b/playwright.config.ts index addd0293e..f8e6d32d9 100644 --- a/playwright.config.ts +++ b/playwright.config.ts @@ -16,7 +16,7 @@ export default defineConfig({ /* Fail the build on CI if you accidentally left test.only in the source code. */ forbidOnly: !!process.env.CI, /* Retry on CI only */ - retries: process.env.CI ? 3 : 0, + retries: process.env.CI ? 5 : 0, /* Opt out of parallel tests on CI. */ workers: process.env.CI ? 1 : undefined, /* Reporter to use. See https://playwright.dev/docs/test-reporters */ diff --git a/playwright/tests/collaboration-feature/goal-collaboration-feature.spec.ts b/playwright/tests/collaboration-feature/goal-collaboration-feature.spec.ts index a8d317a7b..f0371885e 100644 --- a/playwright/tests/collaboration-feature/goal-collaboration-feature.spec.ts +++ b/playwright/tests/collaboration-feature/goal-collaboration-feature.spec.ts @@ -79,7 +79,7 @@ test.describe("Goal Sharing Feature", () => { test(`from User ${receiver} accept invitation of User ${sharer}`, async () => { await acceptContactInvitation(receiverPage(), invitationLink, receiver); - await waitForResponseConfirmation(receiverPage(), API_SERVER_URL, "accepted"); + await waitForResponseConfirmation(receiverPage(), API_SERVER_URL); }); test(`share goal from User ${receiver} to User ${sharer}`, async () => { @@ -89,7 +89,7 @@ test.describe("Goal Sharing Feature", () => { test(`check whether shared goal is visible in User ${receiver}'s patner goal`, async () => { await receiverPage().reload(); - await waitForResponseConfirmation(receiverPage(), API_SERVER_URL_GOAL, "shareMessage"); + await waitForResponseConfirmation(receiverPage(), API_SERVER_URL_GOAL); await receiverPage().getByRole("img", { name: "ZinZen" }).click(); await receiverPage().reload(); await expect(receiverPage().locator(".user-goal-main")).toBeVisible(); diff --git a/playwright/utils/collaboration-feature-utils.ts b/playwright/utils/collaboration-feature-utils.ts index ae727292c..2fbcce310 100644 --- a/playwright/utils/collaboration-feature-utils.ts +++ b/playwright/utils/collaboration-feature-utils.ts @@ -22,30 +22,15 @@ export async function goToShareGoalModalFlow(page: Page) { export async function waitForResponseConfirmation( page: Page, urlContains: string, - responseBodyIncludes: string, maxRetries: number = 3, retryDelay: number = 3000, ): Promise { for (let attempt = 1; attempt <= maxRetries; attempt++) { try { - const response = await page.waitForResponse( - async (response) => { - const status = response.status(); - const url = response.url(); - const text = await response.text(); - const isMatch = status === 200 && url.includes(urlContains) && text.includes(responseBodyIncludes); - console.log(text); - - console.log(`Attempt ${attempt} - Response details: - Status: ${status} - URL: ${url} - Includes expected body: ${text.includes(responseBodyIncludes)} - Is match: ${isMatch}`); - - return isMatch; - }, - { timeout: 30000 }, - ); + if (attempt > 1) { + await page.reload(); + } + const response = await page.waitForResponse((res) => res.url().includes(urlContains) && res.status() === 200); console.log(`Success on attempt ${attempt}`); console.log(`Response: ${JSON.stringify(response)}`); @@ -74,10 +59,10 @@ export async function addContact( await page.getByPlaceholder("Name").click(); await page.getByPlaceholder("Name").fill(contactName); await page.getByRole("button", { name: "add contact Share invitation" }).click(); - await waitForResponseConfirmation(page, apiServerUrl, expectedApiResponse1); + await waitForResponseConfirmation(page, apiServerUrl); await page.goBack(); await page.getByRole("button", { name: contactName.slice(0, 1), exact: true }).click(); - await waitForResponseConfirmation(page, apiServerUrl, expectedApiResponse2); + await waitForResponseConfirmation(page, apiServerUrl); await page.waitForSelector(".ant-notification-notice"); return page.evaluate("navigator.clipboard.readText()"); } From c358394503d877df9e04d6ca230b8abb16f418e0 Mon Sep 17 00:00:00 2001 From: Vinay Badgujar Date: Sat, 5 Oct 2024 15:22:30 +0530 Subject: [PATCH 57/93] edit: create new goal and share that goal in test --- .../goal-collaboration-feature.spec.ts | 24 ++++++--- .../utils/collaboration-feature-utils.ts | 53 +++++++++++++------ 2 files changed, 55 insertions(+), 22 deletions(-) diff --git a/playwright/tests/collaboration-feature/goal-collaboration-feature.spec.ts b/playwright/tests/collaboration-feature/goal-collaboration-feature.spec.ts index f0371885e..d8a44d4d5 100644 --- a/playwright/tests/collaboration-feature/goal-collaboration-feature.spec.ts +++ b/playwright/tests/collaboration-feature/goal-collaboration-feature.spec.ts @@ -19,7 +19,7 @@ test.describe("Goal Sharing Feature", () => { let userBPage: Page; let userCPage: Page; let invitationLink: string; - let currentGoalTitle: string; + let currentGoalTitle = "Test Goal"; test.beforeAll(async ({ browser }) => { ({ page: userAPage } = await createUserContextAndPage(browser)); @@ -36,6 +36,12 @@ test.describe("Goal Sharing Feature", () => { await userCPage.getByRole("button", { name: "Continue zinzen faq" }).click(); }); + test.afterAll(async () => { + await userAPage.close(); + await userBPage.close(); + await userCPage.close(); + }); + const userCollaborationScenarios = [ { sharer: "A", receiver: "B", sharerPage: () => userAPage, receiverPage: () => userBPage }, { sharer: "B", receiver: "C", sharerPage: () => userBPage, receiverPage: () => userCPage }, @@ -71,10 +77,16 @@ test.describe("Goal Sharing Feature", () => { userCollaborationScenarios.forEach(({ sharer, receiver, sharerPage, receiverPage }) => { test(`from User ${sharer} share invitation to User ${receiver}`, async () => { await goToMyGoalsPageFlow(sharerPage()); - currentGoalTitle = await sharerPage().locator(".goal-title").first().locator("span").innerText(); - invitationLink = await addContact(sharerPage(), receiver, "relId", "relationshipId"); + if (sharer === "A") { + await sharerPage().getByRole("button", { name: "add goal | add feeling | add group", exact: true }).click({}); + + const titleInputContainer = sharerPage().getByPlaceholder("Goal title"); + await titleInputContainer.fill(currentGoalTitle); + await titleInputContainer.press("Enter"); + } + invitationLink = await addContact(sharerPage(), receiver, currentGoalTitle, "relId", "relationshipId"); await goToMyGoalsPageFlow(sharerPage()); - await goToShareGoalModalFlow(sharerPage()); + await goToShareGoalModalFlow(sharerPage(), currentGoalTitle); }); test(`from User ${receiver} accept invitation of User ${sharer}`, async () => { @@ -96,7 +108,7 @@ test.describe("Goal Sharing Feature", () => { }); test(`initiate collaboration between User ${sharer} and User ${receiver}`, async () => { - await collaborateFlow(receiverPage()); + await collaborateFlow(receiverPage(), currentGoalTitle); }); test(`check if collaborated goal is visible in User ${receiver}'s MyGoal`, async () => { @@ -110,7 +122,7 @@ test.describe("Goal Sharing Feature", () => { ({ sharer, receiverFirst, receiverSecond, sharerPage, receiverPageFirst, receiverPageSecond }) => { test(`goal update by ${sharer}: edit goal in User ${sharer}`, async () => { await goToMyGoalsPageFlow(sharerPage()); - await goalActionFlow(sharerPage(), "Edit"); + await goalActionFlow(sharerPage(), "Edit", currentGoalTitle); await sharerPage().locator(".header-title").locator("input").fill(`${currentGoalTitle} edited by ${sharer}`); await sharerPage().locator(".action-btn-container").locator(".action-btn").click(); currentGoalTitle = await sharerPage().locator(".goal-title").first().locator("span").innerText(); diff --git a/playwright/utils/collaboration-feature-utils.ts b/playwright/utils/collaboration-feature-utils.ts index 2fbcce310..af395c99f 100644 --- a/playwright/utils/collaboration-feature-utils.ts +++ b/playwright/utils/collaboration-feature-utils.ts @@ -6,8 +6,21 @@ export async function createUserContextAndPage(browser: Browser) { return { context, page }; } -export async function goalActionFlow(page: Page, action: string) { - await page.locator(".goal-dd-outer").first().click(); +export async function goalActionFlow(page: Page, action: string, goalTitle: string) { + const goalDiv = await page.locator(".user-goal-main").filter({ hasText: new RegExp(`^${goalTitle}$`) }); + console.log(goalDiv); + + // Find the .goal-dd-outer associated with the goal title 'Test Goal' + const goalDropdown = await page + .locator(".user-goal-main") + .filter({ + has: page.locator('.goal-title:has-text("Test Goal")'), + }) + .locator(".goal-dd-outer"); + + // Click the specific .goal-dd-outer + await goalDropdown.click(); + await page .locator("div") .filter({ hasText: new RegExp(`^${action}$`) }) @@ -15,44 +28,53 @@ export async function goalActionFlow(page: Page, action: string) { .click({ force: true }); } -export async function goToShareGoalModalFlow(page: Page) { - await goalActionFlow(page, "Share"); +export async function goToShareGoalModalFlow(page: Page, goalTitle: string) { + await goalActionFlow(page, "Share", goalTitle); } export async function waitForResponseConfirmation( page: Page, urlContains: string, maxRetries: number = 3, - retryDelay: number = 3000, + retryDelay: number = 2000, ): Promise { + let response; for (let attempt = 1; attempt <= maxRetries; attempt++) { try { if (attempt > 1) { - await page.reload(); + page.reload(); } - const response = await page.waitForResponse((res) => res.url().includes(urlContains) && res.status() === 200); + response = await page.waitForResponse((res) => res.url().includes(urlContains) && res.status() === 200, { + timeout: 5000, + }); console.log(`Success on attempt ${attempt}`); - console.log(`Response: ${JSON.stringify(response)}`); - return; + const responseBody = await response.text(); + console.log(`Response status: ${response.status()}`); + console.log(`Response body: ${responseBody}`); + + return; // Exit after success } catch (error) { + console.warn(`Attempt ${attempt} failed. Retrying in ${retryDelay}ms...`); if (attempt === maxRetries) { - console.error(`All ${maxRetries} attempts failed. Last error: ${error.message}`); - throw new Error(`Failed to get response confirmation after ${maxRetries} attempts: ${error.message}`); + console.error(`Failed after ${maxRetries} attempts. Last error: ${error.message}`); + throw new Error(`Failed to get response confirmation: ${error.message}`); } - console.warn(`Attempt ${attempt} failed. Retrying in ${retryDelay}ms...`); + await page.waitForTimeout(retryDelay); } } } + export async function addContact( page: Page, contactName: string, + goalTitle: string, expectedApiResponse1: string, expectedApiResponse2: string, ): Promise { const apiServerUrl = "https://sfk3sq5mfzgfjfy3hytp4tmon40bbjpu.lambda-url.eu-west-1.on.aws/"; - await goToShareGoalModalFlow(page); + await goToShareGoalModalFlow(page, goalTitle); // Add contact flow await page.getByRole("button", { name: "add contact", exact: true }).click(); @@ -67,8 +89,8 @@ export async function addContact( return page.evaluate("navigator.clipboard.readText()"); } -export async function collaborateFlow(page: Page) { - await goalActionFlow(page, "Collaborate"); +export async function collaborateFlow(page: Page, goalTitle: string) { + await goalActionFlow(page, "Collaborate", goalTitle); await page.getByRole("button", { name: "Collaborate on goal" }).click(); } @@ -97,7 +119,6 @@ export async function verifyUpdatedGoal( await Promise.all([ page.waitForResponse((res) => res.status() === 200 && res.url().includes(apiUrlGoal), { timeout: 10000 }), ]); - await page.getByRole("button", { name: "Goals" }).click(); await page.locator(".goal-dd-outer").first().click(); From 6c791f9255cfdfdaf98b3852bce1cdbb9bc0a02f Mon Sep 17 00:00:00 2001 From: Vinay Badgujar Date: Sat, 5 Oct 2024 16:11:34 +0530 Subject: [PATCH 58/93] add network idles --- .../goal-collaboration-feature.spec.ts | 18 +++++++++++++-- .../utils/collaboration-feature-utils.ts | 22 +++++++++---------- 2 files changed, 27 insertions(+), 13 deletions(-) diff --git a/playwright/tests/collaboration-feature/goal-collaboration-feature.spec.ts b/playwright/tests/collaboration-feature/goal-collaboration-feature.spec.ts index d8a44d4d5..57ba9118a 100644 --- a/playwright/tests/collaboration-feature/goal-collaboration-feature.spec.ts +++ b/playwright/tests/collaboration-feature/goal-collaboration-feature.spec.ts @@ -108,13 +108,20 @@ test.describe("Goal Sharing Feature", () => { }); test(`initiate collaboration between User ${sharer} and User ${receiver}`, async () => { + await receiverPage().waitForLoadState("networkidle"); await collaborateFlow(receiverPage(), currentGoalTitle); }); test(`check if collaborated goal is visible in User ${receiver}'s MyGoal`, async () => { await receiverPage().goto("http://127.0.0.1:3000/"); await receiverPage().getByRole("button", { name: "Goals" }).click(); - await expect(receiverPage().locator(".goal-title").first().locator("span")).toContainText(currentGoalTitle); + const userGoalWithContact = receiverPage() + .locator(".user-goal-dark") + .filter({ + has: receiverPage().locator(".contact-icon"), + }); + + await expect(userGoalWithContact.locator(".goal-title span")).toContainText(currentGoalTitle); }); }); @@ -125,7 +132,14 @@ test.describe("Goal Sharing Feature", () => { await goalActionFlow(sharerPage(), "Edit", currentGoalTitle); await sharerPage().locator(".header-title").locator("input").fill(`${currentGoalTitle} edited by ${sharer}`); await sharerPage().locator(".action-btn-container").locator(".action-btn").click(); - currentGoalTitle = await sharerPage().locator(".goal-title").first().locator("span").innerText(); + // Locate the .goal-title span within the user-goal-dark div that also contains the .contact-icon + currentGoalTitle = await sharerPage() + .locator(".user-goal-dark") + .filter({ + has: sharerPage().locator(".contact-icon"), + }) + .locator(".goal-title span") + .innerText(); }); test(`goal update by ${sharer}: check if User ${receiverFirst} received updated goal from User ${sharer}`, async () => { diff --git a/playwright/utils/collaboration-feature-utils.ts b/playwright/utils/collaboration-feature-utils.ts index af395c99f..0d4eb5c50 100644 --- a/playwright/utils/collaboration-feature-utils.ts +++ b/playwright/utils/collaboration-feature-utils.ts @@ -10,7 +10,6 @@ export async function goalActionFlow(page: Page, action: string, goalTitle: stri const goalDiv = await page.locator(".user-goal-main").filter({ hasText: new RegExp(`^${goalTitle}$`) }); console.log(goalDiv); - // Find the .goal-dd-outer associated with the goal title 'Test Goal' const goalDropdown = await page .locator(".user-goal-main") .filter({ @@ -18,7 +17,6 @@ export async function goalActionFlow(page: Page, action: string, goalTitle: stri }) .locator(".goal-dd-outer"); - // Click the specific .goal-dd-outer await goalDropdown.click(); await page @@ -53,7 +51,7 @@ export async function waitForResponseConfirmation( console.log(`Response status: ${response.status()}`); console.log(`Response body: ${responseBody}`); - return; // Exit after success + return; } catch (error) { console.warn(`Attempt ${attempt} failed. Retrying in ${retryDelay}ms...`); if (attempt === maxRetries) { @@ -66,13 +64,7 @@ export async function waitForResponseConfirmation( } } -export async function addContact( - page: Page, - contactName: string, - goalTitle: string, - expectedApiResponse1: string, - expectedApiResponse2: string, -): Promise { +export async function addContact(page: Page, contactName: string, goalTitle: string): Promise { const apiServerUrl = "https://sfk3sq5mfzgfjfy3hytp4tmon40bbjpu.lambda-url.eu-west-1.on.aws/"; await goToShareGoalModalFlow(page, goalTitle); @@ -120,7 +112,15 @@ export async function verifyUpdatedGoal( page.waitForResponse((res) => res.status() === 200 && res.url().includes(apiUrlGoal), { timeout: 10000 }), ]); await page.getByRole("button", { name: "Goals" }).click(); - await page.locator(".goal-dd-outer").first().click(); + await page.waitForLoadState("networkidle"); + const goalDropdownWithContact = page + .locator(".user-goal-dark") + .filter({ + has: page.locator(".contact-icon"), + }) + .locator(".goal-dd-outer"); + + await goalDropdownWithContact.click(); await page.waitForSelector(`text=${expectedGoalTitle}`, { timeout: 10000 }); From cf8adddd678fd0580481a536dacee83425af1318 Mon Sep 17 00:00:00 2001 From: Vinay Badgujar Date: Sat, 5 Oct 2024 16:36:04 +0530 Subject: [PATCH 59/93] check for notification symbol --- .../goal-collaboration-feature.spec.ts | 4 ++-- playwright/utils/collaboration-feature-utils.ts | 6 ++++-- src/common/NotificationSymbol.tsx | 1 + 3 files changed, 7 insertions(+), 4 deletions(-) diff --git a/playwright/tests/collaboration-feature/goal-collaboration-feature.spec.ts b/playwright/tests/collaboration-feature/goal-collaboration-feature.spec.ts index 57ba9118a..c5723894c 100644 --- a/playwright/tests/collaboration-feature/goal-collaboration-feature.spec.ts +++ b/playwright/tests/collaboration-feature/goal-collaboration-feature.spec.ts @@ -84,7 +84,7 @@ test.describe("Goal Sharing Feature", () => { await titleInputContainer.fill(currentGoalTitle); await titleInputContainer.press("Enter"); } - invitationLink = await addContact(sharerPage(), receiver, currentGoalTitle, "relId", "relationshipId"); + invitationLink = await addContact(sharerPage(), receiver, currentGoalTitle); await goToMyGoalsPageFlow(sharerPage()); await goToShareGoalModalFlow(sharerPage(), currentGoalTitle); }); @@ -108,7 +108,7 @@ test.describe("Goal Sharing Feature", () => { }); test(`initiate collaboration between User ${sharer} and User ${receiver}`, async () => { - await receiverPage().waitForLoadState("networkidle"); + await receiverPage().waitForLoadState("networkidle", { timeout: 5000 }); await collaborateFlow(receiverPage(), currentGoalTitle); }); diff --git a/playwright/utils/collaboration-feature-utils.ts b/playwright/utils/collaboration-feature-utils.ts index 0d4eb5c50..0fc8baf9f 100644 --- a/playwright/utils/collaboration-feature-utils.ts +++ b/playwright/utils/collaboration-feature-utils.ts @@ -83,6 +83,8 @@ export async function addContact(page: Page, contactName: string, goalTitle: str export async function collaborateFlow(page: Page, goalTitle: string) { await goalActionFlow(page, "Collaborate", goalTitle); + await expect(page.getByRole("button", { name: "Collaborate on goal" })).toBeVisible(); + await page.getByRole("button", { name: "Collaborate on goal" }).click(); } @@ -112,14 +114,14 @@ export async function verifyUpdatedGoal( page.waitForResponse((res) => res.status() === 200 && res.url().includes(apiUrlGoal), { timeout: 10000 }), ]); await page.getByRole("button", { name: "Goals" }).click(); - await page.waitForLoadState("networkidle"); + await page.waitForLoadState("networkidle", { timeout: 5000 }); const goalDropdownWithContact = page .locator(".user-goal-dark") .filter({ has: page.locator(".contact-icon"), }) .locator(".goal-dd-outer"); - + await expect(goalDropdownWithContact.getByTestId("notification-dot")).toBeVisible(); await goalDropdownWithContact.click(); await page.waitForSelector(`text=${expectedGoalTitle}`, { timeout: 10000 }); diff --git a/src/common/NotificationSymbol.tsx b/src/common/NotificationSymbol.tsx index fa3b81ff4..5181d6e83 100644 --- a/src/common/NotificationSymbol.tsx +++ b/src/common/NotificationSymbol.tsx @@ -2,6 +2,7 @@ import React from "react"; const NotificationSymbol = ({ color }: { color: string }) => (
Date: Sat, 5 Oct 2024 17:10:13 +0530 Subject: [PATCH 60/93] add console logs --- .../goal-collaboration-feature.spec.ts | 46 +++++++++++++++---- .../utils/collaboration-feature-utils.ts | 28 +++++++++-- 2 files changed, 59 insertions(+), 15 deletions(-) diff --git a/playwright/tests/collaboration-feature/goal-collaboration-feature.spec.ts b/playwright/tests/collaboration-feature/goal-collaboration-feature.spec.ts index c5723894c..47219d95d 100644 --- a/playwright/tests/collaboration-feature/goal-collaboration-feature.spec.ts +++ b/playwright/tests/collaboration-feature/goal-collaboration-feature.spec.ts @@ -9,6 +9,7 @@ import { goToShareGoalModalFlow, goalActionFlow, verifyUpdatedGoal, + waitForPageLoad, waitForResponseConfirmation, } from "../../utils/collaboration-feature-utils"; @@ -22,21 +23,29 @@ test.describe("Goal Sharing Feature", () => { let currentGoalTitle = "Test Goal"; test.beforeAll(async ({ browser }) => { + console.log("Setting up users A, B, and C pages..."); ({ page: userAPage } = await createUserContextAndPage(browser)); ({ page: userBPage } = await createUserContextAndPage(browser)); ({ page: userCPage } = await createUserContextAndPage(browser)); + + console.log("Navigating User A to the main page..."); await userAPage.goto("http://127.0.0.1:3000/"); await userAPage.getByText("English").click(); await userAPage.getByRole("button", { name: "Continue zinzen faq" }).click(); + + console.log("Navigating User B to the main page..."); await userBPage.goto("http://127.0.0.1:3000/"); await userBPage.getByText("English").click(); await userBPage.getByRole("button", { name: "Continue zinzen faq" }).click(); + + console.log("Navigating User C to the main page..."); await userCPage.goto("http://127.0.0.1:3000/"); await userCPage.getByText("English").click(); await userCPage.getByRole("button", { name: "Continue zinzen faq" }).click(); }); test.afterAll(async () => { + console.log("Closing all user pages..."); await userAPage.close(); await userBPage.close(); await userCPage.close(); @@ -76,30 +85,41 @@ test.describe("Goal Sharing Feature", () => { userCollaborationScenarios.forEach(({ sharer, receiver, sharerPage, receiverPage }) => { test(`from User ${sharer} share invitation to User ${receiver}`, async () => { + console.log(`User ${sharer} is navigating to their goals page...`); await goToMyGoalsPageFlow(sharerPage()); - if (sharer === "A") { - await sharerPage().getByRole("button", { name: "add goal | add feeling | add group", exact: true }).click({}); + if (sharer === "A") { + console.log(`User ${sharer} is creating a new goal titled "${currentGoalTitle}"...`); + await sharerPage().getByRole("button", { name: "add goal | add feeling | add group", exact: true }).click(); const titleInputContainer = sharerPage().getByPlaceholder("Goal title"); await titleInputContainer.fill(currentGoalTitle); await titleInputContainer.press("Enter"); } + + console.log(`User ${sharer} is adding User ${receiver} as a contact...`); invitationLink = await addContact(sharerPage(), receiver, currentGoalTitle); + + console.log(`User ${sharer} is navigating to their goals page again...`); await goToMyGoalsPageFlow(sharerPage()); + + console.log(`User ${sharer} is opening the share goal modal for "${currentGoalTitle}"...`); await goToShareGoalModalFlow(sharerPage(), currentGoalTitle); }); test(`from User ${receiver} accept invitation of User ${sharer}`, async () => { + console.log(`User ${receiver} is accepting the invitation from User ${sharer}...`); await acceptContactInvitation(receiverPage(), invitationLink, receiver); await waitForResponseConfirmation(receiverPage(), API_SERVER_URL); }); test(`share goal from User ${receiver} to User ${sharer}`, async () => { + console.log(`User ${sharer} is sharing the goal with User ${receiver}...`); await sharerPage().getByRole("button", { name: receiver, exact: true }).click(); await sharerPage().waitForSelector(".ant-notification-notice"); }); - test(`check whether shared goal is visible in User ${receiver}'s patner goal`, async () => { + test(`check whether shared goal is visible in User ${receiver}'s partner goal`, async () => { + console.log(`User ${receiver} is reloading the page to check for shared goal visibility...`); await receiverPage().reload(); await waitForResponseConfirmation(receiverPage(), API_SERVER_URL_GOAL); await receiverPage().getByRole("img", { name: "ZinZen" }).click(); @@ -108,11 +128,12 @@ test.describe("Goal Sharing Feature", () => { }); test(`initiate collaboration between User ${sharer} and User ${receiver}`, async () => { - await receiverPage().waitForLoadState("networkidle", { timeout: 5000 }); + console.log(`Initiating collaboration between User ${sharer} and User ${receiver}...`); await collaborateFlow(receiverPage(), currentGoalTitle); }); test(`check if collaborated goal is visible in User ${receiver}'s MyGoal`, async () => { + console.log(`Checking if collaborated goal is visible in User ${receiver}'s MyGoal...`); await receiverPage().goto("http://127.0.0.1:3000/"); await receiverPage().getByRole("button", { name: "Goals" }).click(); const userGoalWithContact = receiverPage() @@ -120,7 +141,6 @@ test.describe("Goal Sharing Feature", () => { .filter({ has: receiverPage().locator(".contact-icon"), }); - await expect(userGoalWithContact.locator(".goal-title span")).toContainText(currentGoalTitle); }); }); @@ -128,11 +148,15 @@ test.describe("Goal Sharing Feature", () => { editAndConfirmScenarios.forEach( ({ sharer, receiverFirst, receiverSecond, sharerPage, receiverPageFirst, receiverPageSecond }) => { test(`goal update by ${sharer}: edit goal in User ${sharer}`, async () => { - await goToMyGoalsPageFlow(sharerPage()); - await goalActionFlow(sharerPage(), "Edit", currentGoalTitle); - await sharerPage().locator(".header-title").locator("input").fill(`${currentGoalTitle} edited by ${sharer}`); - await sharerPage().locator(".action-btn-container").locator(".action-btn").click(); - // Locate the .goal-title span within the user-goal-dark div that also contains the .contact-icon + console.log(`User ${sharer} is updating the goal "${currentGoalTitle}"...`); + await expect(async () => { + await goToMyGoalsPageFlow(sharerPage()); + await goalActionFlow(sharerPage(), "Edit", currentGoalTitle); + await sharerPage().locator(".header-title").locator("input").fill(`${currentGoalTitle} edited by ${sharer}`); + await sharerPage().locator(".action-btn-container").locator(".action-btn").click(); + }).toPass(); + + console.log(`Getting the updated goal title from User ${sharer}'s page...`); currentGoalTitle = await sharerPage() .locator(".user-goal-dark") .filter({ @@ -143,10 +167,12 @@ test.describe("Goal Sharing Feature", () => { }); test(`goal update by ${sharer}: check if User ${receiverFirst} received updated goal from User ${sharer}`, async () => { + console.log(`Checking if User ${receiverFirst} received the updated goal from User ${sharer}...`); await verifyUpdatedGoal(receiverPageFirst(), currentGoalTitle, API_SERVER_URL_GOAL); }); test(`goal update by ${sharer}: check if User ${receiverSecond} received updated goal from User ${sharer}`, async () => { + console.log(`Checking if User ${receiverSecond} received the updated goal from User ${sharer}...`); await verifyUpdatedGoal(receiverPageSecond(), currentGoalTitle, API_SERVER_URL_GOAL); }); }, diff --git a/playwright/utils/collaboration-feature-utils.ts b/playwright/utils/collaboration-feature-utils.ts index 0fc8baf9f..0a2c2b306 100644 --- a/playwright/utils/collaboration-feature-utils.ts +++ b/playwright/utils/collaboration-feature-utils.ts @@ -82,10 +82,11 @@ export async function addContact(page: Page, contactName: string, goalTitle: str } export async function collaborateFlow(page: Page, goalTitle: string) { - await goalActionFlow(page, "Collaborate", goalTitle); - await expect(page.getByRole("button", { name: "Collaborate on goal" })).toBeVisible(); - - await page.getByRole("button", { name: "Collaborate on goal" }).click(); + await expect(async () => { + await goalActionFlow(page, "Collaborate", goalTitle); + await expect(page.getByRole("button", { name: "Collaborate on goal" })).toBeVisible(); + await page.getByRole("button", { name: "Collaborate on goal" }).click(); + }).toPass(); } export async function acceptContactInvitation(page: Page, invitationLink: string, patnerName: string) { @@ -114,7 +115,6 @@ export async function verifyUpdatedGoal( page.waitForResponse((res) => res.status() === 200 && res.url().includes(apiUrlGoal), { timeout: 10000 }), ]); await page.getByRole("button", { name: "Goals" }).click(); - await page.waitForLoadState("networkidle", { timeout: 5000 }); const goalDropdownWithContact = page .locator(".user-goal-dark") .filter({ @@ -140,3 +140,21 @@ export async function verifyUpdatedGoal( } } } + +export async function waitForPageLoad(page: Page, retries: number = 3, retryDelay: number = 3000) { + for (let attempt = 1; attempt <= retries; attempt++) { + try { + console.log(`Attempting to wait for networkidle state (Attempt ${attempt})...`); + await page.waitForLoadState("networkidle", { timeout: 5000 }); + console.log("Page load state reached networkidle successfully."); + return; // Success, exit the function + } catch (error) { + console.warn(`Page load attempt ${attempt} failed. Retrying in ${retryDelay}ms...`); + if (attempt === retries) { + console.error(`Failed after ${retries} attempts: ${error.message}`); + throw new Error(`Failed to wait for page load state: ${error.message}`); + } + await page.waitForTimeout(retryDelay); // Wait before retrying + } + } +} From 4f2a7bb96ce07be9836e7b3bee4f626072e5b235 Mon Sep 17 00:00:00 2001 From: Vinay Badgujar Date: Sat, 5 Oct 2024 17:26:11 +0530 Subject: [PATCH 61/93] add more console log --- .../goal-collaboration-feature.spec.ts | 10 ++++- .../utils/collaboration-feature-utils.ts | 44 ++++++++++++++++--- 2 files changed, 47 insertions(+), 7 deletions(-) diff --git a/playwright/tests/collaboration-feature/goal-collaboration-feature.spec.ts b/playwright/tests/collaboration-feature/goal-collaboration-feature.spec.ts index 47219d95d..5d90741a6 100644 --- a/playwright/tests/collaboration-feature/goal-collaboration-feature.spec.ts +++ b/playwright/tests/collaboration-feature/goal-collaboration-feature.spec.ts @@ -114,8 +114,14 @@ test.describe("Goal Sharing Feature", () => { test(`share goal from User ${receiver} to User ${sharer}`, async () => { console.log(`User ${sharer} is sharing the goal with User ${receiver}...`); - await sharerPage().getByRole("button", { name: receiver, exact: true }).click(); - await sharerPage().waitForSelector(".ant-notification-notice"); + await goToMyGoalsPageFlow(sharerPage()); + + console.log(`User ${sharer} is opening the share goal modal for "${currentGoalTitle}"...`); + await goToShareGoalModalFlow(sharerPage(), currentGoalTitle); + await expect(async () => { + await sharerPage().getByRole("button", { name: receiver, exact: true }).click(); + await sharerPage().waitForLoadState("networkidle"); + }).toPass(); }); test(`check whether shared goal is visible in User ${receiver}'s partner goal`, async () => { diff --git a/playwright/utils/collaboration-feature-utils.ts b/playwright/utils/collaboration-feature-utils.ts index 0a2c2b306..6b4f2601e 100644 --- a/playwright/utils/collaboration-feature-utils.ts +++ b/playwright/utils/collaboration-feature-utils.ts @@ -1,14 +1,17 @@ import { Browser, Page, expect } from "@playwright/test"; export async function createUserContextAndPage(browser: Browser) { + console.log("Creating a new user context and page..."); const context = await browser.newContext(); const page = await context.newPage(); + console.log("User context and page created successfully."); return { context, page }; } export async function goalActionFlow(page: Page, action: string, goalTitle: string) { + console.log(`Executing action "${action}" on goal titled "${goalTitle}"...`); const goalDiv = await page.locator(".user-goal-main").filter({ hasText: new RegExp(`^${goalTitle}$`) }); - console.log(goalDiv); + console.log("Located goal div:", goalDiv); const goalDropdown = await page .locator(".user-goal-main") @@ -17,8 +20,10 @@ export async function goalActionFlow(page: Page, action: string, goalTitle: stri }) .locator(".goal-dd-outer"); + console.log("Clicking on the goal dropdown..."); await goalDropdown.click(); + console.log(`Clicking on the action "${action}"...`); await page .locator("div") .filter({ hasText: new RegExp(`^${action}$`) }) @@ -27,6 +32,7 @@ export async function goalActionFlow(page: Page, action: string, goalTitle: stri } export async function goToShareGoalModalFlow(page: Page, goalTitle: string) { + console.log(`Navigating to Share Goal modal for goal titled "${goalTitle}"...`); await goalActionFlow(page, "Share", goalTitle); } @@ -36,10 +42,13 @@ export async function waitForResponseConfirmation( maxRetries: number = 3, retryDelay: number = 2000, ): Promise { + console.log(`Waiting for response confirmation for URL containing "${urlContains}"...`); let response; for (let attempt = 1; attempt <= maxRetries; attempt++) { + console.log(`Attempt ${attempt}...`); try { if (attempt > 1) { + console.log("Reloading the page..."); page.reload(); } response = await page.waitForResponse((res) => res.url().includes(urlContains) && res.status() === 200, { @@ -65,38 +74,54 @@ export async function waitForResponseConfirmation( } export async function addContact(page: Page, contactName: string, goalTitle: string): Promise { + console.log(`Adding contact "${contactName}" to goal "${goalTitle}"...`); const apiServerUrl = "https://sfk3sq5mfzgfjfy3hytp4tmon40bbjpu.lambda-url.eu-west-1.on.aws/"; await goToShareGoalModalFlow(page, goalTitle); - // Add contact flow + console.log("Opening 'Add contact' modal..."); await page.getByRole("button", { name: "add contact", exact: true }).click(); await page.getByPlaceholder("Name").click(); await page.getByPlaceholder("Name").fill(contactName); await page.getByRole("button", { name: "add contact Share invitation" }).click(); + + console.log("Waiting for response confirmation after adding contact..."); await waitForResponseConfirmation(page, apiServerUrl); + + console.log("Navigating back and clicking on the contact..."); await page.goBack(); await page.getByRole("button", { name: contactName.slice(0, 1), exact: true }).click(); + + console.log("Waiting for confirmation of contact invitation..."); await waitForResponseConfirmation(page, apiServerUrl); await page.waitForSelector(".ant-notification-notice"); + + console.log("Reading invitation link from clipboard..."); return page.evaluate("navigator.clipboard.readText()"); } export async function collaborateFlow(page: Page, goalTitle: string) { + console.log(`Initiating collaboration on goal titled "${goalTitle}"...`); await expect(async () => { await goalActionFlow(page, "Collaborate", goalTitle); await expect(page.getByRole("button", { name: "Collaborate on goal" })).toBeVisible(); + + console.log("Clicking 'Collaborate on goal'..."); await page.getByRole("button", { name: "Collaborate on goal" }).click(); }).toPass(); } -export async function acceptContactInvitation(page: Page, invitationLink: string, patnerName: string) { +export async function acceptContactInvitation(page: Page, invitationLink: string, partnerName: string) { + console.log(`Accepting contact invitation using link: ${invitationLink}`); await page.goto(`${invitationLink}`); + + console.log(`Filling in partner name "${partnerName}"...`); await page.getByPlaceholder("Contact name").click(); - await page.getByPlaceholder("Contact name").fill(patnerName); + await page.getByPlaceholder("Contact name").fill(partnerName); await page.getByRole("button", { name: "Add to my contacts" }).click(); } export async function goToMyGoalsPageFlow(page: Page) { + console.log("Navigating to 'My Goals' page..."); await page.goto("http://127.0.0.1:3000/"); await page.getByRole("button", { name: "Goals" }).click(); } @@ -108,32 +133,41 @@ export async function verifyUpdatedGoal( maxRetries: number = 3, retryDelay: number = 2000, ): Promise { + console.log(`Verifying updated goal titled "${expectedGoalTitle}"...`); for (let attempt = 1; attempt <= maxRetries; attempt++) { + console.log(`Attempt ${attempt}...`); try { await page.goto("http://127.0.0.1:3000/"); await Promise.all([ page.waitForResponse((res) => res.status() === 200 && res.url().includes(apiUrlGoal), { timeout: 10000 }), ]); await page.getByRole("button", { name: "Goals" }).click(); + const goalDropdownWithContact = page .locator(".user-goal-dark") .filter({ has: page.locator(".contact-icon"), }) .locator(".goal-dd-outer"); + + console.log("Checking for notification dot..."); await expect(goalDropdownWithContact.getByTestId("notification-dot")).toBeVisible(); await goalDropdownWithContact.click(); + console.log(`Waiting for goal titled "${expectedGoalTitle}" to be visible...`); await page.waitForSelector(`text=${expectedGoalTitle}`, { timeout: 10000 }); + console.log("Applying changes..."); await page.getByRole("button", { name: "add changes Make all checked" }).click(); + console.log(`Verifying if the goal "${expectedGoalTitle}" is updated successfully...`); await page.waitForSelector(`text=${expectedGoalTitle}`, { timeout: 10000 }); return; } catch (error) { if (attempt === maxRetries) { - throw new Error(`Failed to verify updated goal after ${maxRetries} attempts: ${error.message}`); + console.error(`Failed to verify updated goal after ${maxRetries} attempts: ${error.message}`); + throw new Error(`Failed to verify updated goal: ${error.message}`); } console.warn(`Attempt ${attempt} failed. Retrying in ${retryDelay}ms...`); await page.waitForTimeout(retryDelay); From abd24fd1e946e9f320b4ecca19d9231666adacff Mon Sep 17 00:00:00 2001 From: Vinay Badgujar Date: Sat, 5 Oct 2024 17:37:20 +0530 Subject: [PATCH 62/93] await for modal to display --- playwright/utils/collaboration-feature-utils.ts | 2 +- src/common/ZModal.tsx | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/playwright/utils/collaboration-feature-utils.ts b/playwright/utils/collaboration-feature-utils.ts index 6b4f2601e..f65441dac 100644 --- a/playwright/utils/collaboration-feature-utils.ts +++ b/playwright/utils/collaboration-feature-utils.ts @@ -22,7 +22,7 @@ export async function goalActionFlow(page: Page, action: string, goalTitle: stri console.log("Clicking on the goal dropdown..."); await goalDropdown.click(); - + await expect(page.getByTestId("zmodal")).toBeVisible(); console.log(`Clicking on the action "${action}"...`); await page .locator("div") diff --git a/src/common/ZModal.tsx b/src/common/ZModal.tsx index 25ebb14f5..fc5a39ca2 100644 --- a/src/common/ZModal.tsx +++ b/src/common/ZModal.tsx @@ -29,6 +29,7 @@ const ZModal: React.FC = ({ children, type, open, onCancel, width, styles={{ mask: maskStyle }} width={width} style={style} + data-testid="zmodal" > {children} From b38620d5f19e562c852ad41cb8636ea6caf6d9b8 Mon Sep 17 00:00:00 2001 From: Vinay Badgujar Date: Sat, 5 Oct 2024 17:41:37 +0530 Subject: [PATCH 63/93] fix: replace isvisible with inviewport --- playwright/utils/collaboration-feature-utils.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/playwright/utils/collaboration-feature-utils.ts b/playwright/utils/collaboration-feature-utils.ts index f65441dac..14ba050b3 100644 --- a/playwright/utils/collaboration-feature-utils.ts +++ b/playwright/utils/collaboration-feature-utils.ts @@ -22,7 +22,7 @@ export async function goalActionFlow(page: Page, action: string, goalTitle: stri console.log("Clicking on the goal dropdown..."); await goalDropdown.click(); - await expect(page.getByTestId("zmodal")).toBeVisible(); + await expect(page.getByTestId("zmodal")).toBeInViewport(); console.log(`Clicking on the action "${action}"...`); await page .locator("div") From adb862a01dc416681853478c7e21e520d46c3c89 Mon Sep 17 00:00:00 2001 From: Vinay Badgujar Date: Sat, 5 Oct 2024 17:53:12 +0530 Subject: [PATCH 64/93] small fix --- .../collaboration-feature/goal-collaboration-feature.spec.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/playwright/tests/collaboration-feature/goal-collaboration-feature.spec.ts b/playwright/tests/collaboration-feature/goal-collaboration-feature.spec.ts index 5d90741a6..6e0c0f12c 100644 --- a/playwright/tests/collaboration-feature/goal-collaboration-feature.spec.ts +++ b/playwright/tests/collaboration-feature/goal-collaboration-feature.spec.ts @@ -145,7 +145,7 @@ test.describe("Goal Sharing Feature", () => { const userGoalWithContact = receiverPage() .locator(".user-goal-dark") .filter({ - has: receiverPage().locator(".contact-icon"), + has: receiverPage().locator(".contact-button"), }); await expect(userGoalWithContact.locator(".goal-title span")).toContainText(currentGoalTitle); }); @@ -166,7 +166,7 @@ test.describe("Goal Sharing Feature", () => { currentGoalTitle = await sharerPage() .locator(".user-goal-dark") .filter({ - has: sharerPage().locator(".contact-icon"), + has: sharerPage().locator(".contact-button"), }) .locator(".goal-title span") .innerText(); From b571ceecfb9120dbf7964df7f1e5ff8a63c551ab Mon Sep 17 00:00:00 2001 From: Vinay Badgujar Date: Sat, 5 Oct 2024 18:05:45 +0530 Subject: [PATCH 65/93] small fix --- .../goal-collaboration-feature.spec.ts | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/playwright/tests/collaboration-feature/goal-collaboration-feature.spec.ts b/playwright/tests/collaboration-feature/goal-collaboration-feature.spec.ts index 6e0c0f12c..242aca8bc 100644 --- a/playwright/tests/collaboration-feature/goal-collaboration-feature.spec.ts +++ b/playwright/tests/collaboration-feature/goal-collaboration-feature.spec.ts @@ -121,7 +121,9 @@ test.describe("Goal Sharing Feature", () => { await expect(async () => { await sharerPage().getByRole("button", { name: receiver, exact: true }).click(); await sharerPage().waitForLoadState("networkidle"); - }).toPass(); + }).toPass({ + timeout: 2000, + }); }); test(`check whether shared goal is visible in User ${receiver}'s partner goal`, async () => { @@ -142,12 +144,8 @@ test.describe("Goal Sharing Feature", () => { console.log(`Checking if collaborated goal is visible in User ${receiver}'s MyGoal...`); await receiverPage().goto("http://127.0.0.1:3000/"); await receiverPage().getByRole("button", { name: "Goals" }).click(); - const userGoalWithContact = receiverPage() - .locator(".user-goal-dark") - .filter({ - has: receiverPage().locator(".contact-button"), - }); - await expect(userGoalWithContact.locator(".goal-title span")).toContainText(currentGoalTitle); + + await expect(receiverPage().locator(".goal-title span").first()).toContainText(currentGoalTitle); }); }); From 4560c5e2fb33c4a2aab7eff806cf5a1b182e07de Mon Sep 17 00:00:00 2001 From: Vinay Badgujar Date: Sat, 5 Oct 2024 19:08:28 +0530 Subject: [PATCH 66/93] remove: dead function --- .../utils/collaboration-feature-utils.ts | 18 ------------------ 1 file changed, 18 deletions(-) diff --git a/playwright/utils/collaboration-feature-utils.ts b/playwright/utils/collaboration-feature-utils.ts index 14ba050b3..678e02a2c 100644 --- a/playwright/utils/collaboration-feature-utils.ts +++ b/playwright/utils/collaboration-feature-utils.ts @@ -174,21 +174,3 @@ export async function verifyUpdatedGoal( } } } - -export async function waitForPageLoad(page: Page, retries: number = 3, retryDelay: number = 3000) { - for (let attempt = 1; attempt <= retries; attempt++) { - try { - console.log(`Attempting to wait for networkidle state (Attempt ${attempt})...`); - await page.waitForLoadState("networkidle", { timeout: 5000 }); - console.log("Page load state reached networkidle successfully."); - return; // Success, exit the function - } catch (error) { - console.warn(`Page load attempt ${attempt} failed. Retrying in ${retryDelay}ms...`); - if (attempt === retries) { - console.error(`Failed after ${retries} attempts: ${error.message}`); - throw new Error(`Failed to wait for page load state: ${error.message}`); - } - await page.waitForTimeout(retryDelay); // Wait before retrying - } - } -} From 31cefde77dc374146d7094b15563305255f494c2 Mon Sep 17 00:00:00 2001 From: Vinay Badgujar Date: Sun, 6 Oct 2024 13:13:29 +0530 Subject: [PATCH 67/93] edit: check for the updated goal in my goals container --- .../collaboration-feature/goal-collaboration-feature.spec.ts | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/playwright/tests/collaboration-feature/goal-collaboration-feature.spec.ts b/playwright/tests/collaboration-feature/goal-collaboration-feature.spec.ts index 242aca8bc..01eba22de 100644 --- a/playwright/tests/collaboration-feature/goal-collaboration-feature.spec.ts +++ b/playwright/tests/collaboration-feature/goal-collaboration-feature.spec.ts @@ -9,7 +9,6 @@ import { goToShareGoalModalFlow, goalActionFlow, verifyUpdatedGoal, - waitForPageLoad, waitForResponseConfirmation, } from "../../utils/collaboration-feature-utils"; @@ -122,7 +121,7 @@ test.describe("Goal Sharing Feature", () => { await sharerPage().getByRole("button", { name: receiver, exact: true }).click(); await sharerPage().waitForLoadState("networkidle"); }).toPass({ - timeout: 2000, + timeout: 10_000, }); }); @@ -145,7 +144,7 @@ test.describe("Goal Sharing Feature", () => { await receiverPage().goto("http://127.0.0.1:3000/"); await receiverPage().getByRole("button", { name: "Goals" }).click(); - await expect(receiverPage().locator(".goal-title span").first()).toContainText(currentGoalTitle); + await expect(receiverPage().locator(".my-goals-content").first()).toContainText(currentGoalTitle); }); }); From 396936f9e9d32fca615622fd299c1a14081cf266 Mon Sep 17 00:00:00 2001 From: Vinay Badgujar Date: Sun, 6 Oct 2024 13:24:28 +0530 Subject: [PATCH 68/93] add page reload --- .../collaboration-feature/goal-collaboration-feature.spec.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/playwright/tests/collaboration-feature/goal-collaboration-feature.spec.ts b/playwright/tests/collaboration-feature/goal-collaboration-feature.spec.ts index 01eba22de..dd1c0a7ac 100644 --- a/playwright/tests/collaboration-feature/goal-collaboration-feature.spec.ts +++ b/playwright/tests/collaboration-feature/goal-collaboration-feature.spec.ts @@ -143,7 +143,8 @@ test.describe("Goal Sharing Feature", () => { console.log(`Checking if collaborated goal is visible in User ${receiver}'s MyGoal...`); await receiverPage().goto("http://127.0.0.1:3000/"); await receiverPage().getByRole("button", { name: "Goals" }).click(); - + await receiverPage().reload(); + await receiverPage().waitForLoadState("networkidle"); await expect(receiverPage().locator(".my-goals-content").first()).toContainText(currentGoalTitle); }); }); From 8de42fd90e9056d605ea4f4de937c44977de3dbb Mon Sep 17 00:00:00 2001 From: Vinay Badgujar Date: Sun, 6 Oct 2024 13:47:08 +0530 Subject: [PATCH 69/93] fix: minor error related to navigation --- .../collaboration-feature/goal-collaboration-feature.spec.ts | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/playwright/tests/collaboration-feature/goal-collaboration-feature.spec.ts b/playwright/tests/collaboration-feature/goal-collaboration-feature.spec.ts index dd1c0a7ac..c74ed7013 100644 --- a/playwright/tests/collaboration-feature/goal-collaboration-feature.spec.ts +++ b/playwright/tests/collaboration-feature/goal-collaboration-feature.spec.ts @@ -141,10 +141,7 @@ test.describe("Goal Sharing Feature", () => { test(`check if collaborated goal is visible in User ${receiver}'s MyGoal`, async () => { console.log(`Checking if collaborated goal is visible in User ${receiver}'s MyGoal...`); - await receiverPage().goto("http://127.0.0.1:3000/"); - await receiverPage().getByRole("button", { name: "Goals" }).click(); - await receiverPage().reload(); - await receiverPage().waitForLoadState("networkidle"); + await goToMyGoalsPageFlow(receiverPage()); await expect(receiverPage().locator(".my-goals-content").first()).toContainText(currentGoalTitle); }); }); From c84045be49fee73b4afd25814b2a27664a8bd631 Mon Sep 17 00:00:00 2001 From: Vinay Badgujar Date: Sun, 6 Oct 2024 13:57:25 +0530 Subject: [PATCH 70/93] edit: click on partner goal switch mode button instead of navigating to home page after initiating collaboration --- .../collaboration-feature/goal-collaboration-feature.spec.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/playwright/tests/collaboration-feature/goal-collaboration-feature.spec.ts b/playwright/tests/collaboration-feature/goal-collaboration-feature.spec.ts index c74ed7013..1c055c133 100644 --- a/playwright/tests/collaboration-feature/goal-collaboration-feature.spec.ts +++ b/playwright/tests/collaboration-feature/goal-collaboration-feature.spec.ts @@ -141,7 +141,7 @@ test.describe("Goal Sharing Feature", () => { test(`check if collaborated goal is visible in User ${receiver}'s MyGoal`, async () => { console.log(`Checking if collaborated goal is visible in User ${receiver}'s MyGoal...`); - await goToMyGoalsPageFlow(receiverPage()); + await receiverPage().locator(".header-logo-wrapper").click(); await expect(receiverPage().locator(".my-goals-content").first()).toContainText(currentGoalTitle); }); }); From 979b8366b1dd523143fedc4ded1568b3a9d8166c Mon Sep 17 00:00:00 2001 From: Vinay Badgujar Date: Sun, 6 Oct 2024 14:26:13 +0530 Subject: [PATCH 71/93] move back to headless mode --- .github/workflows/playwright.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/playwright.yml b/.github/workflows/playwright.yml index 884700bb1..281239171 100644 --- a/.github/workflows/playwright.yml +++ b/.github/workflows/playwright.yml @@ -18,7 +18,7 @@ jobs: - name: Install Playwright Browsers run: npx playwright install --with-deps - name: Run Playwright tests - run: xvfb-run npx playwright test --headed + run: npx playwright test - uses: actions/upload-artifact@v4 if: ${{ !cancelled() }} with: From 87fd6bc4311746846f10c78f40ae95e449fc1cc2 Mon Sep 17 00:00:00 2001 From: Vinay Badgujar Date: Sat, 12 Oct 2024 14:50:06 +0530 Subject: [PATCH 72/93] refactor: use nullish coalescing operator as its more safe than logical OR --- .../GoalsComponents/GoalConfigModal/ConfigGoal.tsx | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/components/GoalsComponents/GoalConfigModal/ConfigGoal.tsx b/src/components/GoalsComponents/GoalConfigModal/ConfigGoal.tsx index 91a27d0b1..c3768e8a4 100644 --- a/src/components/GoalsComponents/GoalConfigModal/ConfigGoal.tsx +++ b/src/components/GoalsComponents/GoalConfigModal/ConfigGoal.tsx @@ -225,16 +225,16 @@ const ConfigGoal = ({ type, goal, mode }: { type: TGoalCategory; mode: TGoalConf const { openEditMode } = useGoalStore(); const onSuggestionClick = async (selectedGoal: GoalItem) => { - await openEditMode(selectedGoal); + openEditMode(selectedGoal); setSuggestedGoal(selectedGoal); setTitle(selectedGoal.title); setColorIndex(colorPalleteList.indexOf(selectedGoal.goalColor)); - setAfterTime(selectedGoal.afterTime || 9); - setBeforeTime(selectedGoal.beforeTime || 18); + setAfterTime(selectedGoal.afterTime ?? 9); + setBeforeTime(selectedGoal.beforeTime ?? 18); setTags({ on: selectedGoal.on || convertOnFilterToArray("weekdays"), repeatWeekly: selectedGoal.habit === "weekly", - duration: selectedGoal.duration || "", + duration: selectedGoal.duration ?? "", }); setDue(selectedGoal.due ? new Date(selectedGoal.due).toISOString().slice(0, 10) : ""); if (type === "Budget") { From 82b06b8e0fa84e00a4fa393a860446500cf90e97 Mon Sep 17 00:00:00 2001 From: Vinay Badgujar Date: Sat, 12 Oct 2024 14:58:06 +0530 Subject: [PATCH 73/93] refactor: configgoal component --- .../GoalConfigModal/ConfigGoal.tsx | 30 +++++++++---------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/src/components/GoalsComponents/GoalConfigModal/ConfigGoal.tsx b/src/components/GoalsComponents/GoalConfigModal/ConfigGoal.tsx index c3768e8a4..c47e1704d 100644 --- a/src/components/GoalsComponents/GoalConfigModal/ConfigGoal.tsx +++ b/src/components/GoalsComponents/GoalConfigModal/ConfigGoal.tsx @@ -42,15 +42,15 @@ const ConfigGoal = ({ type, goal, mode }: { type: TGoalCategory; mode: TGoalConf } = useParentGoalContext(); let defaultColorIndex = Math.floor(Math.random() * colorPalleteList.length - 1) + 1; - let defaultAfterTime = isEditMode ? goal.afterTime || 9 : 9; - let defaultBeforeTime = isEditMode ? goal.beforeTime || 18 : 18; + let defaultAfterTime = isEditMode ? (goal.afterTime ?? 9) : 9; + let defaultBeforeTime = isEditMode ? (goal.beforeTime ?? 18) : 18; if (isEditMode) { defaultColorIndex = colorPalleteList.indexOf(goal.goalColor); } else if (parentGoal) { defaultColorIndex = colorPalleteList.indexOf(parentGoal.goalColor); - defaultAfterTime = parentGoal.afterTime || 18; - defaultBeforeTime = parentGoal.beforeTime || 9; + defaultAfterTime = parentGoal.afterTime ?? 18; + defaultBeforeTime = parentGoal.beforeTime ?? 9; } const { t } = useTranslation(); @@ -72,7 +72,7 @@ const ConfigGoal = ({ type, goal, mode }: { type: TGoalCategory; mode: TGoalConf }); }, [goal.id]); - const [title, setTitle] = useState(t(goal.title) as string); + const [title, setTitle] = useState(t(goal.title)); const handleTitleChange = (value: string) => { setTitle(value); }; @@ -83,7 +83,7 @@ const ConfigGoal = ({ type, goal, mode }: { type: TGoalCategory; mode: TGoalConf const [tags, setTags] = useState({ on: goal.on || convertOnFilterToArray("weekdays"), repeatWeekly: goal.habit === "weekly", - duration: goal.duration || "", + duration: goal.duration ?? "", }); const numberOfDays = tags.on.length; @@ -107,6 +107,9 @@ const ConfigGoal = ({ type, goal, mode }: { type: TGoalCategory; mode: TGoalConf const [isBudgetAccordianOpen, setIsBudgetAccordianOpen] = useState(false); const marks: SliderMarks = { 0: "0", 24: "24" }; + const goalCategoryType = tags.duration !== "" ? "Standard" : "Cluster"; + const category = type === "Budget" ? "Budget" : goalCategoryType; + const getFinalTags = (): GoalItem => ({ ...goal, due: due && due !== "" ? new Date(due).toISOString() : null, @@ -123,13 +126,13 @@ const ConfigGoal = ({ type, goal, mode }: { type: TGoalCategory; mode: TGoalConf perWeek: perWeekHrs.join("-"), } : undefined, - category: type === "Budget" ? "Budget" : tags.duration !== "" ? "Standard" : "Cluster", + category, title: title .split(" ") .filter((ele: string) => ele !== "") .join(" "), goalColor: colorPalleteList[colorIndex], - parentGoalId: parentGoal?.id || "root", + parentGoalId: parentGoal?.id ?? "root", language: getSelectedLanguage(), }); @@ -176,12 +179,9 @@ const ConfigGoal = ({ type, goal, mode }: { type: TGoalCategory; mode: TGoalConf if (betweenSliderUpdated) { const timeRange = beforeTime - afterTime; const weeklyRange = timeRange * numberOfDays; - const updatedPerDayHrs = perDayHrs.map((hour) => - hour > timeRange ? timeRange : hour < timeRange ? timeRange : hour, - ); - const updatedPerWeekHrs = perWeekHrs.map((hour) => - hour > weeklyRange ? weeklyRange : hour < weeklyRange ? weeklyRange : hour, - ); + const updatedPerDayHrs = perDayHrs.map((hour) => Math.min(Math.max(hour, timeRange), timeRange)); + const updatedPerWeekHrs = perWeekHrs.map((hour) => Math.min(Math.max(hour, weeklyRange), weeklyRange)); + setPerDayHrs(updatedPerDayHrs); setPerWeekHrs(updatedPerWeekHrs); setBetweenSliderUpdated(false); @@ -250,7 +250,7 @@ const ConfigGoal = ({ type, goal, mode }: { type: TGoalCategory; mode: TGoalConf .map((ele) => Number(ele)); setPerDayHrs(selectedPerDayBudget); - const selectedNumberOfDays = selectedGoal.on?.length || 7; + const selectedNumberOfDays = selectedGoal.on?.length ?? 7; const selectedPerWeekBudget = ( selectedGoal.timeBudget?.perWeek?.includes("-") ? selectedGoal.timeBudget.perWeek From d10881db48d20621f320291e7e6d42d838d725f8 Mon Sep 17 00:00:00 2001 From: Vinay Badgujar Date: Sat, 12 Oct 2024 14:59:00 +0530 Subject: [PATCH 74/93] edit: allow goal suggestion click from the whole title input area --- .../GoalConfigModal/components/AutoComplete.scss | 2 +- .../GoalConfigModal/components/AutoComplete.tsx | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/components/GoalsComponents/GoalConfigModal/components/AutoComplete.scss b/src/components/GoalsComponents/GoalConfigModal/components/AutoComplete.scss index 174793c94..f2586bda1 100644 --- a/src/components/GoalsComponents/GoalConfigModal/components/AutoComplete.scss +++ b/src/components/GoalsComponents/GoalConfigModal/components/AutoComplete.scss @@ -25,7 +25,7 @@ input { background: transparent; border: none; - font-size: 1.2em; + font-size: 1.3rem; outline: none; padding-right: 0; margin: 0; diff --git a/src/components/GoalsComponents/GoalConfigModal/components/AutoComplete.tsx b/src/components/GoalsComponents/GoalConfigModal/components/AutoComplete.tsx index cfad38a42..72fd8a3de 100644 --- a/src/components/GoalsComponents/GoalConfigModal/components/AutoComplete.tsx +++ b/src/components/GoalsComponents/GoalConfigModal/components/AutoComplete.tsx @@ -62,8 +62,8 @@ const AutocompleteComponent: React.FC = ({ const suggestion = getSuggestion(inputvalue); return ( -
- -
+
+ ); }; From 738a56eaa41b72c3f671407df619168ef7ff8f9a Mon Sep 17 00:00:00 2001 From: Vinay Badgujar Date: Sat, 12 Oct 2024 20:03:07 +0530 Subject: [PATCH 75/93] fix: dependency conflicts by updating @types/node and vite-plugin-pwa --- package-lock.json | 817 ++++++++++++++++++---------------------------- package.json | 4 +- 2 files changed, 322 insertions(+), 499 deletions(-) diff --git a/package-lock.json b/package-lock.json index 8c6c19743..9c3249402 100644 --- a/package-lock.json +++ b/package-lock.json @@ -15,7 +15,7 @@ "@playwright/test": "^1.38.1", "@testing-library/jest-dom": "^5.16.1", "@testing-library/react": "^11.2.7", - "@types/node": "^17.0.31", + "@types/node": "^20.0.0", "@types/react": "^18.0.9", "@types/react-dom": "^18.0.3", "@types/uuid": "^8.3.4", @@ -68,7 +68,7 @@ "serve": "^14.1.1", "tslint": "^6.1.3", "typescript": "^4.7.3", - "vite-plugin-pwa": "^0.12.0" + "vite-plugin-pwa": "^0.20.5" } }, "node_modules/@adobe/css-tools": { @@ -2814,16 +2814,6 @@ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, - "node_modules/@jest/console/node_modules/@types/node": { - "version": "20.14.10", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.10.tgz", - "integrity": "sha512-MdiXf+nDuMvY0gJKxyfZ7/6UFsETO7mGKF54MVD/ekJS6HdFtpZFBgrh6Pseu64XTb2MLyFPlbW6hj8HYRQNOQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "undici-types": "~5.26.4" - } - }, "node_modules/@jest/core": { "version": "27.5.1", "resolved": "https://registry.npmjs.org/@jest/core/-/core-27.5.1.tgz", @@ -2872,16 +2862,6 @@ } } }, - "node_modules/@jest/core/node_modules/@types/node": { - "version": "20.14.10", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.10.tgz", - "integrity": "sha512-MdiXf+nDuMvY0gJKxyfZ7/6UFsETO7mGKF54MVD/ekJS6HdFtpZFBgrh6Pseu64XTb2MLyFPlbW6hj8HYRQNOQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "undici-types": "~5.26.4" - } - }, "node_modules/@jest/environment": { "version": "27.5.1", "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-27.5.1.tgz", @@ -2898,16 +2878,6 @@ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, - "node_modules/@jest/environment/node_modules/@types/node": { - "version": "20.14.10", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.10.tgz", - "integrity": "sha512-MdiXf+nDuMvY0gJKxyfZ7/6UFsETO7mGKF54MVD/ekJS6HdFtpZFBgrh6Pseu64XTb2MLyFPlbW6hj8HYRQNOQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "undici-types": "~5.26.4" - } - }, "node_modules/@jest/expect": { "version": "28.1.3", "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-28.1.3.tgz", @@ -2985,15 +2955,6 @@ "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" } }, - "node_modules/@jest/expect/node_modules/@types/node": { - "version": "20.14.10", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.10.tgz", - "integrity": "sha512-MdiXf+nDuMvY0gJKxyfZ7/6UFsETO7mGKF54MVD/ekJS6HdFtpZFBgrh6Pseu64XTb2MLyFPlbW6hj8HYRQNOQ==", - "license": "MIT", - "dependencies": { - "undici-types": "~5.26.4" - } - }, "node_modules/@jest/expect/node_modules/ansi-styles": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", @@ -3262,16 +3223,6 @@ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, - "node_modules/@jest/fake-timers/node_modules/@types/node": { - "version": "20.14.10", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.10.tgz", - "integrity": "sha512-MdiXf+nDuMvY0gJKxyfZ7/6UFsETO7mGKF54MVD/ekJS6HdFtpZFBgrh6Pseu64XTb2MLyFPlbW6hj8HYRQNOQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "undici-types": "~5.26.4" - } - }, "node_modules/@jest/globals": { "version": "28.1.3", "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-28.1.3.tgz", @@ -3344,15 +3295,6 @@ "@sinonjs/commons": "^1.7.0" } }, - "node_modules/@jest/globals/node_modules/@types/node": { - "version": "20.14.10", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.10.tgz", - "integrity": "sha512-MdiXf+nDuMvY0gJKxyfZ7/6UFsETO7mGKF54MVD/ekJS6HdFtpZFBgrh6Pseu64XTb2MLyFPlbW6hj8HYRQNOQ==", - "license": "MIT", - "dependencies": { - "undici-types": "~5.26.4" - } - }, "node_modules/@jest/globals/node_modules/ansi-styles": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", @@ -3475,16 +3417,6 @@ } } }, - "node_modules/@jest/reporters/node_modules/@types/node": { - "version": "20.14.10", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.10.tgz", - "integrity": "sha512-MdiXf+nDuMvY0gJKxyfZ7/6UFsETO7mGKF54MVD/ekJS6HdFtpZFBgrh6Pseu64XTb2MLyFPlbW6hj8HYRQNOQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "undici-types": "~5.26.4" - } - }, "node_modules/@jest/schemas": { "version": "28.1.3", "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-28.1.3.tgz", @@ -3588,16 +3520,6 @@ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, - "node_modules/@jest/types/node_modules/@types/node": { - "version": "20.14.10", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.10.tgz", - "integrity": "sha512-MdiXf+nDuMvY0gJKxyfZ7/6UFsETO7mGKF54MVD/ekJS6HdFtpZFBgrh6Pseu64XTb2MLyFPlbW6hj8HYRQNOQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "undici-types": "~5.26.4" - } - }, "node_modules/@jest/types/node_modules/@types/yargs": { "version": "16.0.9", "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz", @@ -3916,39 +3838,67 @@ } }, "node_modules/@rollup/plugin-node-resolve": { - "version": "11.2.1", - "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-11.2.1.tgz", - "integrity": "sha512-yc2n43jcqVyGE2sqV5/YCmocy9ArjVAP/BeXyTtADTBBX6V0e5UMqwO8CdQ0kzjb6zu5P1qMzsScCMRvE9OlVg==", + "version": "15.3.0", + "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-15.3.0.tgz", + "integrity": "sha512-9eO5McEICxMzJpDW9OnMYSv4Sta3hmt7VtBFz5zR9273suNOydOyq/FrGeGy+KsTRFm8w0SLVhzig2ILFT63Ag==", "dev": true, "license": "MIT", "dependencies": { - "@rollup/pluginutils": "^3.1.0", - "@types/resolve": "1.17.1", - "builtin-modules": "^3.1.0", + "@rollup/pluginutils": "^5.0.1", + "@types/resolve": "1.20.2", "deepmerge": "^4.2.2", "is-module": "^1.0.0", - "resolve": "^1.19.0" + "resolve": "^1.22.1" }, "engines": { - "node": ">= 10.0.0" + "node": ">=14.0.0" }, "peerDependencies": { - "rollup": "^1.20.0||^2.0.0" + "rollup": "^2.78.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } } }, - "node_modules/@rollup/plugin-node-resolve/node_modules/builtin-modules": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz", - "integrity": "sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==", + "node_modules/@rollup/plugin-node-resolve/node_modules/@rollup/pluginutils": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.1.2.tgz", + "integrity": "sha512-/FIdS3PyZ39bjZlwqFnWqCOVnW7o963LtKMwQOD0NhQqw22gSr2YY1afu3FxRip4ZCZNsD5jq6Aaz6QV3D/Njw==", "dev": true, "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "estree-walker": "^2.0.2", + "picomatch": "^2.3.1" + }, "engines": { - "node": ">=6" + "node": ">=14.0.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } } }, + "node_modules/@rollup/plugin-node-resolve/node_modules/@types/estree": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", + "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@rollup/plugin-node-resolve/node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "dev": true, + "license": "MIT" + }, "node_modules/@rollup/plugin-replace": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/@rollup/plugin-replace/-/plugin-replace-2.4.2.tgz", @@ -3963,6 +3913,29 @@ "rollup": "^1.20.0 || ^2.0.0" } }, + "node_modules/@rollup/plugin-terser": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/@rollup/plugin-terser/-/plugin-terser-0.4.4.tgz", + "integrity": "sha512-XHeJC5Bgvs8LfukDwWZp7yeqin6ns8RTl2B9avbejt6tZqsqvVoWI7ZTQrcNsfKEDWBTnTxM8nMDkO2IFFbd0A==", + "dev": true, + "license": "MIT", + "dependencies": { + "serialize-javascript": "^6.0.1", + "smob": "^1.0.0", + "terser": "^5.17.4" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^2.0.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, "node_modules/@rollup/pluginutils": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.1.0.tgz", @@ -4246,15 +4219,6 @@ "node": ">= 10.14.2" } }, - "node_modules/@testing-library/dom/node_modules/@types/node": { - "version": "20.14.10", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.10.tgz", - "integrity": "sha512-MdiXf+nDuMvY0gJKxyfZ7/6UFsETO7mGKF54MVD/ekJS6HdFtpZFBgrh6Pseu64XTb2MLyFPlbW6hj8HYRQNOQ==", - "license": "MIT", - "dependencies": { - "undici-types": "~5.26.4" - } - }, "node_modules/@testing-library/dom/node_modules/@types/yargs": { "version": "15.0.19", "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.19.tgz", @@ -4465,15 +4429,6 @@ "@types/node": "*" } }, - "node_modules/@types/graceful-fs/node_modules/@types/node": { - "version": "20.14.10", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.10.tgz", - "integrity": "sha512-MdiXf+nDuMvY0gJKxyfZ7/6UFsETO7mGKF54MVD/ekJS6HdFtpZFBgrh6Pseu64XTb2MLyFPlbW6hj8HYRQNOQ==", - "license": "MIT", - "dependencies": { - "undici-types": "~5.26.4" - } - }, "node_modules/@types/istanbul-lib-coverage": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", @@ -4555,15 +4510,6 @@ "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", "license": "MIT" }, - "node_modules/@types/jest/node_modules/@types/node": { - "version": "20.14.10", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.10.tgz", - "integrity": "sha512-MdiXf+nDuMvY0gJKxyfZ7/6UFsETO7mGKF54MVD/ekJS6HdFtpZFBgrh6Pseu64XTb2MLyFPlbW6hj8HYRQNOQ==", - "license": "MIT", - "dependencies": { - "undici-types": "~5.26.4" - } - }, "node_modules/@types/jest/node_modules/ansi-styles": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", @@ -4706,10 +4652,13 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "17.0.45", - "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.45.tgz", - "integrity": "sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw==", - "license": "MIT" + "version": "20.16.11", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.16.11.tgz", + "integrity": "sha512-y+cTCACu92FyA5fgQSAI8A1H429g7aSK2HsO7K4XYUWc4dY5IUz55JSDIYT6/VsOLfGy8vmvQYC2hfb0iF16Uw==", + "license": "MIT", + "dependencies": { + "undici-types": "~6.19.2" + } }, "node_modules/@types/prettier": { "version": "2.7.3", @@ -4743,24 +4692,11 @@ } }, "node_modules/@types/resolve": { - "version": "1.17.1", - "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.17.1.tgz", - "integrity": "sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw==", + "version": "1.20.2", + "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.20.2.tgz", + "integrity": "sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==", "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/resolve/node_modules/@types/node": { - "version": "20.14.10", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.10.tgz", - "integrity": "sha512-MdiXf+nDuMvY0gJKxyfZ7/6UFsETO7mGKF54MVD/ekJS6HdFtpZFBgrh6Pseu64XTb2MLyFPlbW6hj8HYRQNOQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "undici-types": "~5.26.4" - } + "license": "MIT" }, "node_modules/@types/semver": { "version": "7.5.8", @@ -5604,9 +5540,9 @@ } }, "node_modules/async": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.5.tgz", - "integrity": "sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==", + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", + "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==", "dev": true, "license": "MIT" }, @@ -6720,12 +6656,12 @@ "license": "MIT" }, "node_modules/debug": { - "version": "4.3.5", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.5.tgz", - "integrity": "sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==", + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", "license": "MIT", "dependencies": { - "ms": "2.1.2" + "ms": "^2.1.3" }, "engines": { "node": ">=6.0" @@ -7433,13 +7369,6 @@ "ms": "^2.1.1" } }, - "node_modules/eslint-import-resolver-node/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true, - "license": "MIT" - }, "node_modules/eslint-import-resolver-typescript": { "version": "2.7.1", "resolved": "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-2.7.1.tgz", @@ -7489,13 +7418,6 @@ "ms": "^2.1.1" } }, - "node_modules/eslint-module-utils/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true, - "license": "MIT" - }, "node_modules/eslint-plugin-import": { "version": "2.29.1", "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.29.1.tgz", @@ -7538,13 +7460,6 @@ "ms": "^2.1.1" } }, - "node_modules/eslint-plugin-import/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true, - "license": "MIT" - }, "node_modules/eslint-plugin-jsx-a11y": { "version": "6.9.0", "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.9.0.tgz", @@ -8017,9 +7932,9 @@ "license": "MIT" }, "node_modules/fast-uri": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.1.tgz", - "integrity": "sha512-MWipKbbYiYI0UC7cl8m/i/IWTqfC8YXsqjzybjddLsFjStroQzsHXkc73JutMvBiXmOvapk+axIl79ig5t55Bw==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.2.tgz", + "integrity": "sha512-GR6f0hD7XXyNJa25Tb9BuIdN0tdr+0BMi6/CJPH3wJO1JjNG3n/VsSw38AwRdKZABm8lGbPfakLRkYzx2V9row==", "dev": true, "license": "MIT" }, @@ -9412,9 +9327,9 @@ } }, "node_modules/jake": { - "version": "10.9.1", - "resolved": "https://registry.npmjs.org/jake/-/jake-10.9.1.tgz", - "integrity": "sha512-61btcOHNnLnsOdtLgA5efqQWjnSi/vow5HbI7HMdKKWqvrKR1bLK3BPlJn9gcSaP2ewuamUSMB5XEy76KUIS2w==", + "version": "10.9.2", + "resolved": "https://registry.npmjs.org/jake/-/jake-10.9.2.tgz", + "integrity": "sha512-2P4SQ0HrLQ+fw6llpLnOaGAvN2Zu6778SJMrCUwns4fOoG9ayrTiZk3VV8sCPkVZF8ab0zksVpS8FDY5pRCNBA==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -9502,16 +9417,6 @@ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, - "node_modules/jest-circus/node_modules/@types/node": { - "version": "20.14.10", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.10.tgz", - "integrity": "sha512-MdiXf+nDuMvY0gJKxyfZ7/6UFsETO7mGKF54MVD/ekJS6HdFtpZFBgrh6Pseu64XTb2MLyFPlbW6hj8HYRQNOQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "undici-types": "~5.26.4" - } - }, "node_modules/jest-cli": { "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-27.5.1.tgz", @@ -9656,16 +9561,6 @@ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, - "node_modules/jest-environment-jsdom/node_modules/@types/node": { - "version": "20.14.10", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.10.tgz", - "integrity": "sha512-MdiXf+nDuMvY0gJKxyfZ7/6UFsETO7mGKF54MVD/ekJS6HdFtpZFBgrh6Pseu64XTb2MLyFPlbW6hj8HYRQNOQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "undici-types": "~5.26.4" - } - }, "node_modules/jest-environment-node": { "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-27.5.1.tgz", @@ -9684,16 +9579,6 @@ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, - "node_modules/jest-environment-node/node_modules/@types/node": { - "version": "20.14.10", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.10.tgz", - "integrity": "sha512-MdiXf+nDuMvY0gJKxyfZ7/6UFsETO7mGKF54MVD/ekJS6HdFtpZFBgrh6Pseu64XTb2MLyFPlbW6hj8HYRQNOQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "undici-types": "~5.26.4" - } - }, "node_modules/jest-get-type": { "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.5.1.tgz", @@ -9731,16 +9616,6 @@ "fsevents": "^2.3.2" } }, - "node_modules/jest-haste-map/node_modules/@types/node": { - "version": "20.14.10", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.10.tgz", - "integrity": "sha512-MdiXf+nDuMvY0gJKxyfZ7/6UFsETO7mGKF54MVD/ekJS6HdFtpZFBgrh6Pseu64XTb2MLyFPlbW6hj8HYRQNOQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "undici-types": "~5.26.4" - } - }, "node_modules/jest-jasmine2": { "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-27.5.1.tgz", @@ -9770,16 +9645,6 @@ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, - "node_modules/jest-jasmine2/node_modules/@types/node": { - "version": "20.14.10", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.10.tgz", - "integrity": "sha512-MdiXf+nDuMvY0gJKxyfZ7/6UFsETO7mGKF54MVD/ekJS6HdFtpZFBgrh6Pseu64XTb2MLyFPlbW6hj8HYRQNOQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "undici-types": "~5.26.4" - } - }, "node_modules/jest-leak-detector": { "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-27.5.1.tgz", @@ -9845,16 +9710,6 @@ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, - "node_modules/jest-mock/node_modules/@types/node": { - "version": "20.14.10", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.10.tgz", - "integrity": "sha512-MdiXf+nDuMvY0gJKxyfZ7/6UFsETO7mGKF54MVD/ekJS6HdFtpZFBgrh6Pseu64XTb2MLyFPlbW6hj8HYRQNOQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "undici-types": "~5.26.4" - } - }, "node_modules/jest-pnp-resolver": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", @@ -9953,16 +9808,6 @@ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, - "node_modules/jest-runner/node_modules/@types/node": { - "version": "20.14.10", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.10.tgz", - "integrity": "sha512-MdiXf+nDuMvY0gJKxyfZ7/6UFsETO7mGKF54MVD/ekJS6HdFtpZFBgrh6Pseu64XTb2MLyFPlbW6hj8HYRQNOQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "undici-types": "~5.26.4" - } - }, "node_modules/jest-runtime": { "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-27.5.1.tgz", @@ -10036,16 +9881,6 @@ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, - "node_modules/jest-serializer/node_modules/@types/node": { - "version": "20.14.10", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.10.tgz", - "integrity": "sha512-MdiXf+nDuMvY0gJKxyfZ7/6UFsETO7mGKF54MVD/ekJS6HdFtpZFBgrh6Pseu64XTb2MLyFPlbW6hj8HYRQNOQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "undici-types": "~5.26.4" - } - }, "node_modules/jest-snapshot": { "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-27.5.1.tgz", @@ -10111,16 +9946,6 @@ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, - "node_modules/jest-util/node_modules/@types/node": { - "version": "20.14.10", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.10.tgz", - "integrity": "sha512-MdiXf+nDuMvY0gJKxyfZ7/6UFsETO7mGKF54MVD/ekJS6HdFtpZFBgrh6Pseu64XTb2MLyFPlbW6hj8HYRQNOQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "undici-types": "~5.26.4" - } - }, "node_modules/jest-validate": { "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-27.5.1.tgz", @@ -10171,16 +9996,6 @@ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, - "node_modules/jest-watcher/node_modules/@types/node": { - "version": "20.14.10", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.10.tgz", - "integrity": "sha512-MdiXf+nDuMvY0gJKxyfZ7/6UFsETO7mGKF54MVD/ekJS6HdFtpZFBgrh6Pseu64XTb2MLyFPlbW6hj8HYRQNOQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "undici-types": "~5.26.4" - } - }, "node_modules/jest-worker": { "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", @@ -10196,16 +10011,6 @@ "node": ">= 10.13.0" } }, - "node_modules/jest-worker/node_modules/@types/node": { - "version": "20.14.10", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.10.tgz", - "integrity": "sha512-MdiXf+nDuMvY0gJKxyfZ7/6UFsETO7mGKF54MVD/ekJS6HdFtpZFBgrh6Pseu64XTb2MLyFPlbW6hj8HYRQNOQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "undici-types": "~5.26.4" - } - }, "node_modules/jest-worker/node_modules/supports-color": { "version": "8.1.1", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", @@ -10902,9 +10707,9 @@ } }, "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "license": "MIT" }, "node_modules/nano-time": { @@ -12729,6 +12534,7 @@ "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.79.2.tgz", "integrity": "sha512-fS6iqSPZDs3dr/y7Od6y5nha8dW1YnbgtsyotCVvoFGKbERG++CVRFv1meyGDE1SNItQA8BrnCw7ScdAhRJ3XQ==", "dev": true, + "license": "MIT", "bin": { "rollup": "dist/bin/rollup" }, @@ -12739,47 +12545,6 @@ "fsevents": "~2.3.2" } }, - "node_modules/rollup-plugin-terser": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/rollup-plugin-terser/-/rollup-plugin-terser-7.0.2.tgz", - "integrity": "sha512-w3iIaU4OxcF52UUXiZNsNeuXIMDvFrr+ZXK6bFZ0Q60qyVfq4uLptoS4bbq3paG3x216eQllFZX7zt6TIImguQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.10.4", - "jest-worker": "^26.2.1", - "serialize-javascript": "^4.0.0", - "terser": "^5.0.0" - }, - "peerDependencies": { - "rollup": "^2.0.0" - } - }, - "node_modules/rollup-plugin-terser/node_modules/@types/node": { - "version": "20.14.10", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.10.tgz", - "integrity": "sha512-MdiXf+nDuMvY0gJKxyfZ7/6UFsETO7mGKF54MVD/ekJS6HdFtpZFBgrh6Pseu64XTb2MLyFPlbW6hj8HYRQNOQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "undici-types": "~5.26.4" - } - }, - "node_modules/rollup-plugin-terser/node_modules/jest-worker": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz", - "integrity": "sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^7.0.0" - }, - "engines": { - "node": ">= 10.13.0" - } - }, "node_modules/run-parallel": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", @@ -12937,9 +12702,9 @@ } }, "node_modules/serialize-javascript": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", - "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", + "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -13183,6 +12948,13 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/smob": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/smob/-/smob-1.5.0.tgz", + "integrity": "sha512-g6T+p7QO8npa+/hNx9ohv1E5pVCmWrVCUzUXJyLdMmftX6ER0oiWY/w9knEonLpnOp6b6FenKnMfR8gqwWdwig==", + "dev": true, + "license": "MIT" + }, "node_modules/source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -13216,6 +12988,7 @@ "version": "1.4.8", "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", + "deprecated": "Please use @jridgewell/sourcemap-codec instead", "dev": true, "license": "MIT" }, @@ -13686,6 +13459,48 @@ "dev": true, "license": "MIT" }, + "node_modules/tinyglobby": { + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.9.tgz", + "integrity": "sha512-8or1+BGEdk1Zkkw2ii16qSS7uVrQJPre5A9o/XkWPATkk23FZh/15BKFxPnlTy6vkljZxLqYCzzBMj30ZrSvjw==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.4.0", + "picomatch": "^4.0.2" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/tinyglobby/node_modules/fdir": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.0.tgz", + "integrity": "sha512-3oB133prH1o4j/L5lLW7uOCF1PlD+/It2L0eL/iAqWMB91RBbqTewABqxhj0ibBd90EEmWZq7ntIWzVaWcXTGQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/tinyglobby/node_modules/picomatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", + "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/tmpl": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", @@ -14162,9 +13977,9 @@ } }, "node_modules/undici-types": { - "version": "5.26.5", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", - "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", + "version": "6.19.8", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", + "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==", "license": "MIT" }, "node_modules/unicode-canonical-property-names-ecmascript": { @@ -14435,26 +14250,34 @@ } }, "node_modules/vite-plugin-pwa": { - "version": "0.12.8", - "resolved": "https://registry.npmjs.org/vite-plugin-pwa/-/vite-plugin-pwa-0.12.8.tgz", - "integrity": "sha512-pSiFHmnJGMQJJL8aJzQ8SaraZBSBPMGvGUkCNzheIq9UQCEk/eP3UmANNmS9eupuhIpTK8AdxTOHcaMcAqAbCA==", + "version": "0.20.5", + "resolved": "https://registry.npmjs.org/vite-plugin-pwa/-/vite-plugin-pwa-0.20.5.tgz", + "integrity": "sha512-aweuI/6G6n4C5Inn0vwHumElU/UEpNuO+9iZzwPZGTCH87TeZ6YFMrEY6ZUBQdIHHlhTsbMDryFARcSuOdsz9Q==", "dev": true, "license": "MIT", "dependencies": { - "debug": "^4.3.4", - "fast-glob": "^3.2.11", - "pretty-bytes": "^6.0.0", - "rollup": "^2.75.7", - "workbox-build": "^6.5.3", - "workbox-window": "^6.5.3" + "debug": "^4.3.6", + "pretty-bytes": "^6.1.1", + "tinyglobby": "^0.2.0", + "workbox-build": "^7.1.0", + "workbox-window": "^7.1.0" + }, + "engines": { + "node": ">=16.0.0" }, "funding": { "url": "https://github.com/sponsors/antfu" }, "peerDependencies": { - "vite": "^2.0.0 || ^3.0.0-0", - "workbox-build": "^6.4.0", - "workbox-window": "^6.4.0" + "@vite-pwa/assets-generator": "^0.2.6", + "vite": "^3.1.0 || ^4.0.0 || ^5.0.0", + "workbox-build": "^7.1.0", + "workbox-window": "^7.1.0" + }, + "peerDependenciesMeta": { + "@vite-pwa/assets-generator": { + "optional": true + } } }, "node_modules/vite/node_modules/@types/estree": { @@ -14752,54 +14575,55 @@ } }, "node_modules/workbox-background-sync": { - "version": "6.6.1", - "resolved": "https://registry.npmjs.org/workbox-background-sync/-/workbox-background-sync-6.6.1.tgz", - "integrity": "sha512-trJd3ovpWCvzu4sW0E8rV3FUyIcC0W8G+AZ+VcqzzA890AsWZlUGOTSxIMmIHVusUw/FDq1HFWfy/kC/WTRqSg==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/workbox-background-sync/-/workbox-background-sync-7.1.0.tgz", + "integrity": "sha512-rMbgrzueVWDFcEq1610YyDW71z0oAXLfdRHRQcKw4SGihkfOK0JUEvqWHFwA6rJ+6TClnMIn7KQI5PNN1XQXwQ==", "dev": true, "license": "MIT", "dependencies": { "idb": "^7.0.1", - "workbox-core": "6.6.1" + "workbox-core": "7.1.0" } }, "node_modules/workbox-background-sync/node_modules/workbox-core": { - "version": "6.6.1", - "resolved": "https://registry.npmjs.org/workbox-core/-/workbox-core-6.6.1.tgz", - "integrity": "sha512-ZrGBXjjaJLqzVothoE12qTbVnOAjFrHDXpZe7coCb6q65qI/59rDLwuFMO4PcZ7jcbxY+0+NhUVztzR/CbjEFw==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/workbox-core/-/workbox-core-7.1.0.tgz", + "integrity": "sha512-5KB4KOY8rtL31nEF7BfvU7FMzKT4B5TkbYa2tzkS+Peqj0gayMT9SytSFtNzlrvMaWgv6y/yvP9C0IbpFjV30Q==", "dev": true, "license": "MIT" }, "node_modules/workbox-broadcast-update": { - "version": "6.6.1", - "resolved": "https://registry.npmjs.org/workbox-broadcast-update/-/workbox-broadcast-update-6.6.1.tgz", - "integrity": "sha512-fBhffRdaANdeQ1V8s692R9l/gzvjjRtydBOvR6WCSB0BNE2BacA29Z4r9/RHd9KaXCPl6JTdI9q0bR25YKP8TQ==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/workbox-broadcast-update/-/workbox-broadcast-update-7.1.0.tgz", + "integrity": "sha512-O36hIfhjej/c5ar95pO67k1GQw0/bw5tKP7CERNgK+JdxBANQhDmIuOXZTNvwb2IHBx9hj2kxvcDyRIh5nzOgQ==", "dev": true, "license": "MIT", "dependencies": { - "workbox-core": "6.6.1" + "workbox-core": "7.1.0" } }, "node_modules/workbox-broadcast-update/node_modules/workbox-core": { - "version": "6.6.1", - "resolved": "https://registry.npmjs.org/workbox-core/-/workbox-core-6.6.1.tgz", - "integrity": "sha512-ZrGBXjjaJLqzVothoE12qTbVnOAjFrHDXpZe7coCb6q65qI/59rDLwuFMO4PcZ7jcbxY+0+NhUVztzR/CbjEFw==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/workbox-core/-/workbox-core-7.1.0.tgz", + "integrity": "sha512-5KB4KOY8rtL31nEF7BfvU7FMzKT4B5TkbYa2tzkS+Peqj0gayMT9SytSFtNzlrvMaWgv6y/yvP9C0IbpFjV30Q==", "dev": true, "license": "MIT" }, "node_modules/workbox-build": { - "version": "6.6.1", - "resolved": "https://registry.npmjs.org/workbox-build/-/workbox-build-6.6.1.tgz", - "integrity": "sha512-INPgDx6aRycAugUixbKgiEQBWD0MPZqU5r0jyr24CehvNuLPSXp/wGOpdRJmts656lNiXwqV7dC2nzyrzWEDnw==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/workbox-build/-/workbox-build-7.1.1.tgz", + "integrity": "sha512-WdkVdC70VMpf5NBCtNbiwdSZeKVuhTEd5PV3mAwpTQCGAB5XbOny1P9egEgNdetv4srAMmMKjvBk4RD58LpooA==", "dev": true, "license": "MIT", "dependencies": { "@apideck/better-ajv-errors": "^0.3.1", - "@babel/core": "^7.11.1", + "@babel/core": "^7.24.4", "@babel/preset-env": "^7.11.0", "@babel/runtime": "^7.11.2", "@rollup/plugin-babel": "^5.2.0", - "@rollup/plugin-node-resolve": "^11.2.1", + "@rollup/plugin-node-resolve": "^15.2.3", "@rollup/plugin-replace": "^2.4.1", + "@rollup/plugin-terser": "^0.4.3", "@surma/rollup-plugin-off-main-thread": "^2.2.3", "ajv": "^8.6.0", "common-tags": "^1.8.0", @@ -14809,27 +14633,26 @@ "lodash": "^4.17.20", "pretty-bytes": "^5.3.0", "rollup": "^2.43.1", - "rollup-plugin-terser": "^7.0.0", "source-map": "^0.8.0-beta.0", "stringify-object": "^3.3.0", "strip-comments": "^2.0.1", "tempy": "^0.6.0", "upath": "^1.2.0", - "workbox-background-sync": "6.6.1", - "workbox-broadcast-update": "6.6.1", - "workbox-cacheable-response": "6.6.1", - "workbox-core": "6.6.1", - "workbox-expiration": "6.6.1", - "workbox-google-analytics": "6.6.1", - "workbox-navigation-preload": "6.6.1", - "workbox-precaching": "6.6.1", - "workbox-range-requests": "6.6.1", - "workbox-recipes": "6.6.1", - "workbox-routing": "6.6.1", - "workbox-strategies": "6.6.1", - "workbox-streams": "6.6.1", - "workbox-sw": "6.6.1", - "workbox-window": "6.6.1" + "workbox-background-sync": "7.1.0", + "workbox-broadcast-update": "7.1.0", + "workbox-cacheable-response": "7.1.0", + "workbox-core": "7.1.0", + "workbox-expiration": "7.1.0", + "workbox-google-analytics": "7.1.0", + "workbox-navigation-preload": "7.1.0", + "workbox-precaching": "7.1.0", + "workbox-range-requests": "7.1.0", + "workbox-recipes": "7.1.0", + "workbox-routing": "7.1.0", + "workbox-strategies": "7.1.0", + "workbox-streams": "7.1.0", + "workbox-sw": "7.1.0", + "workbox-window": "7.1.0" }, "engines": { "node": ">=16.0.0" @@ -14926,69 +14749,69 @@ } }, "node_modules/workbox-build/node_modules/workbox-core": { - "version": "6.6.1", - "resolved": "https://registry.npmjs.org/workbox-core/-/workbox-core-6.6.1.tgz", - "integrity": "sha512-ZrGBXjjaJLqzVothoE12qTbVnOAjFrHDXpZe7coCb6q65qI/59rDLwuFMO4PcZ7jcbxY+0+NhUVztzR/CbjEFw==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/workbox-core/-/workbox-core-7.1.0.tgz", + "integrity": "sha512-5KB4KOY8rtL31nEF7BfvU7FMzKT4B5TkbYa2tzkS+Peqj0gayMT9SytSFtNzlrvMaWgv6y/yvP9C0IbpFjV30Q==", "dev": true, "license": "MIT" }, "node_modules/workbox-build/node_modules/workbox-expiration": { - "version": "6.6.1", - "resolved": "https://registry.npmjs.org/workbox-expiration/-/workbox-expiration-6.6.1.tgz", - "integrity": "sha512-qFiNeeINndiOxaCrd2DeL1Xh1RFug3JonzjxUHc5WkvkD2u5abY3gZL1xSUNt3vZKsFFGGORItSjVTVnWAZO4A==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/workbox-expiration/-/workbox-expiration-7.1.0.tgz", + "integrity": "sha512-m5DcMY+A63rJlPTbbBNtpJ20i3enkyOtSgYfv/l8h+D6YbbNiA0zKEkCUaMsdDlxggla1oOfRkyqTvl5Ni5KQQ==", "dev": true, "license": "MIT", "dependencies": { "idb": "^7.0.1", - "workbox-core": "6.6.1" + "workbox-core": "7.1.0" } }, "node_modules/workbox-build/node_modules/workbox-precaching": { - "version": "6.6.1", - "resolved": "https://registry.npmjs.org/workbox-precaching/-/workbox-precaching-6.6.1.tgz", - "integrity": "sha512-K4znSJ7IKxCnCYEdhNkMr7X1kNh8cz+mFgx9v5jFdz1MfI84pq8C2zG+oAoeE5kFrUf7YkT5x4uLWBNg0DVZ5A==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/workbox-precaching/-/workbox-precaching-7.1.0.tgz", + "integrity": "sha512-LyxzQts+UEpgtmfnolo0hHdNjoB7EoRWcF7EDslt+lQGd0lW4iTvvSe3v5JiIckQSB5KTW5xiCqjFviRKPj1zA==", "dev": true, "license": "MIT", "dependencies": { - "workbox-core": "6.6.1", - "workbox-routing": "6.6.1", - "workbox-strategies": "6.6.1" + "workbox-core": "7.1.0", + "workbox-routing": "7.1.0", + "workbox-strategies": "7.1.0" } }, "node_modules/workbox-build/node_modules/workbox-routing": { - "version": "6.6.1", - "resolved": "https://registry.npmjs.org/workbox-routing/-/workbox-routing-6.6.1.tgz", - "integrity": "sha512-j4ohlQvfpVdoR8vDYxTY9rA9VvxTHogkIDwGdJ+rb2VRZQ5vt1CWwUUZBeD/WGFAni12jD1HlMXvJ8JS7aBWTg==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/workbox-routing/-/workbox-routing-7.1.0.tgz", + "integrity": "sha512-oOYk+kLriUY2QyHkIilxUlVcFqwduLJB7oRZIENbqPGeBP/3TWHYNNdmGNhz1dvKuw7aqvJ7CQxn27/jprlTdg==", "dev": true, "license": "MIT", "dependencies": { - "workbox-core": "6.6.1" + "workbox-core": "7.1.0" } }, "node_modules/workbox-build/node_modules/workbox-strategies": { - "version": "6.6.1", - "resolved": "https://registry.npmjs.org/workbox-strategies/-/workbox-strategies-6.6.1.tgz", - "integrity": "sha512-WQLXkRnsk4L81fVPkkgon1rZNxnpdO5LsO+ws7tYBC6QQQFJVI6v98klrJEjFtZwzw/mB/HT5yVp7CcX0O+mrw==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/workbox-strategies/-/workbox-strategies-7.1.0.tgz", + "integrity": "sha512-/UracPiGhUNehGjRm/tLUQ+9PtWmCbRufWtV0tNrALuf+HZ4F7cmObSEK+E4/Bx1p8Syx2tM+pkIrvtyetdlew==", "dev": true, "license": "MIT", "dependencies": { - "workbox-core": "6.6.1" + "workbox-core": "7.1.0" } }, "node_modules/workbox-cacheable-response": { - "version": "6.6.1", - "resolved": "https://registry.npmjs.org/workbox-cacheable-response/-/workbox-cacheable-response-6.6.1.tgz", - "integrity": "sha512-85LY4veT2CnTCDxaVG7ft3NKaFbH6i4urZXgLiU4AiwvKqS2ChL6/eILiGRYXfZ6gAwDnh5RkuDbr/GMS4KSag==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/workbox-cacheable-response/-/workbox-cacheable-response-7.1.0.tgz", + "integrity": "sha512-iwsLBll8Hvua3xCuBB9h92+/e0wdsmSVgR2ZlvcfjepZWwhd3osumQB3x9o7flj+FehtWM2VHbZn8UJeBXXo6Q==", "dev": true, "license": "MIT", "dependencies": { - "workbox-core": "6.6.1" + "workbox-core": "7.1.0" } }, "node_modules/workbox-cacheable-response/node_modules/workbox-core": { - "version": "6.6.1", - "resolved": "https://registry.npmjs.org/workbox-core/-/workbox-core-6.6.1.tgz", - "integrity": "sha512-ZrGBXjjaJLqzVothoE12qTbVnOAjFrHDXpZe7coCb6q65qI/59rDLwuFMO4PcZ7jcbxY+0+NhUVztzR/CbjEFw==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/workbox-core/-/workbox-core-7.1.0.tgz", + "integrity": "sha512-5KB4KOY8rtL31nEF7BfvU7FMzKT4B5TkbYa2tzkS+Peqj0gayMT9SytSFtNzlrvMaWgv6y/yvP9C0IbpFjV30Q==", "dev": true, "license": "MIT" }, @@ -15008,59 +14831,59 @@ } }, "node_modules/workbox-google-analytics": { - "version": "6.6.1", - "resolved": "https://registry.npmjs.org/workbox-google-analytics/-/workbox-google-analytics-6.6.1.tgz", - "integrity": "sha512-1TjSvbFSLmkpqLcBsF7FuGqqeDsf+uAXO/pjiINQKg3b1GN0nBngnxLcXDYo1n/XxK4N7RaRrpRlkwjY/3ocuA==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/workbox-google-analytics/-/workbox-google-analytics-7.1.0.tgz", + "integrity": "sha512-FvE53kBQHfVTcZyczeBVRexhh7JTkyQ8HAvbVY6mXd2n2A7Oyz/9fIwnY406ZcDhvE4NFfKGjW56N4gBiqkrew==", "dev": true, "license": "MIT", "dependencies": { - "workbox-background-sync": "6.6.1", - "workbox-core": "6.6.1", - "workbox-routing": "6.6.1", - "workbox-strategies": "6.6.1" + "workbox-background-sync": "7.1.0", + "workbox-core": "7.1.0", + "workbox-routing": "7.1.0", + "workbox-strategies": "7.1.0" } }, "node_modules/workbox-google-analytics/node_modules/workbox-core": { - "version": "6.6.1", - "resolved": "https://registry.npmjs.org/workbox-core/-/workbox-core-6.6.1.tgz", - "integrity": "sha512-ZrGBXjjaJLqzVothoE12qTbVnOAjFrHDXpZe7coCb6q65qI/59rDLwuFMO4PcZ7jcbxY+0+NhUVztzR/CbjEFw==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/workbox-core/-/workbox-core-7.1.0.tgz", + "integrity": "sha512-5KB4KOY8rtL31nEF7BfvU7FMzKT4B5TkbYa2tzkS+Peqj0gayMT9SytSFtNzlrvMaWgv6y/yvP9C0IbpFjV30Q==", "dev": true, "license": "MIT" }, "node_modules/workbox-google-analytics/node_modules/workbox-routing": { - "version": "6.6.1", - "resolved": "https://registry.npmjs.org/workbox-routing/-/workbox-routing-6.6.1.tgz", - "integrity": "sha512-j4ohlQvfpVdoR8vDYxTY9rA9VvxTHogkIDwGdJ+rb2VRZQ5vt1CWwUUZBeD/WGFAni12jD1HlMXvJ8JS7aBWTg==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/workbox-routing/-/workbox-routing-7.1.0.tgz", + "integrity": "sha512-oOYk+kLriUY2QyHkIilxUlVcFqwduLJB7oRZIENbqPGeBP/3TWHYNNdmGNhz1dvKuw7aqvJ7CQxn27/jprlTdg==", "dev": true, "license": "MIT", "dependencies": { - "workbox-core": "6.6.1" + "workbox-core": "7.1.0" } }, "node_modules/workbox-google-analytics/node_modules/workbox-strategies": { - "version": "6.6.1", - "resolved": "https://registry.npmjs.org/workbox-strategies/-/workbox-strategies-6.6.1.tgz", - "integrity": "sha512-WQLXkRnsk4L81fVPkkgon1rZNxnpdO5LsO+ws7tYBC6QQQFJVI6v98klrJEjFtZwzw/mB/HT5yVp7CcX0O+mrw==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/workbox-strategies/-/workbox-strategies-7.1.0.tgz", + "integrity": "sha512-/UracPiGhUNehGjRm/tLUQ+9PtWmCbRufWtV0tNrALuf+HZ4F7cmObSEK+E4/Bx1p8Syx2tM+pkIrvtyetdlew==", "dev": true, "license": "MIT", "dependencies": { - "workbox-core": "6.6.1" + "workbox-core": "7.1.0" } }, "node_modules/workbox-navigation-preload": { - "version": "6.6.1", - "resolved": "https://registry.npmjs.org/workbox-navigation-preload/-/workbox-navigation-preload-6.6.1.tgz", - "integrity": "sha512-DQCZowCecO+wRoIxJI2V6bXWK6/53ff+hEXLGlQL4Rp9ZaPDLrgV/32nxwWIP7QpWDkVEtllTAK5h6cnhxNxDA==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/workbox-navigation-preload/-/workbox-navigation-preload-7.1.0.tgz", + "integrity": "sha512-4wyAbo0vNI/X0uWNJhCMKxnPanNyhybsReMGN9QUpaePLTiDpKxPqFxl4oUmBNddPwIXug01eTSLVIFXimRG/A==", "dev": true, "license": "MIT", "dependencies": { - "workbox-core": "6.6.1" + "workbox-core": "7.1.0" } }, "node_modules/workbox-navigation-preload/node_modules/workbox-core": { - "version": "6.6.1", - "resolved": "https://registry.npmjs.org/workbox-core/-/workbox-core-6.6.1.tgz", - "integrity": "sha512-ZrGBXjjaJLqzVothoE12qTbVnOAjFrHDXpZe7coCb6q65qI/59rDLwuFMO4PcZ7jcbxY+0+NhUVztzR/CbjEFw==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/workbox-core/-/workbox-core-7.1.0.tgz", + "integrity": "sha512-5KB4KOY8rtL31nEF7BfvU7FMzKT4B5TkbYa2tzkS+Peqj0gayMT9SytSFtNzlrvMaWgv6y/yvP9C0IbpFjV30Q==", "dev": true, "license": "MIT" }, @@ -15074,85 +14897,85 @@ } }, "node_modules/workbox-range-requests": { - "version": "6.6.1", - "resolved": "https://registry.npmjs.org/workbox-range-requests/-/workbox-range-requests-6.6.1.tgz", - "integrity": "sha512-4BDzk28govqzg2ZpX0IFkthdRmCKgAKreontYRC5YsAPB2jDtPNxqx3WtTXgHw1NZalXpcH/E4LqUa9+2xbv1g==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/workbox-range-requests/-/workbox-range-requests-7.1.0.tgz", + "integrity": "sha512-m7+O4EHolNs5yb/79CrnwPR/g/PRzMFYEdo01LqwixVnc/sbzNSvKz0d04OE3aMRel1CwAAZQheRsqGDwATgPQ==", "dev": true, "license": "MIT", "dependencies": { - "workbox-core": "6.6.1" + "workbox-core": "7.1.0" } }, "node_modules/workbox-range-requests/node_modules/workbox-core": { - "version": "6.6.1", - "resolved": "https://registry.npmjs.org/workbox-core/-/workbox-core-6.6.1.tgz", - "integrity": "sha512-ZrGBXjjaJLqzVothoE12qTbVnOAjFrHDXpZe7coCb6q65qI/59rDLwuFMO4PcZ7jcbxY+0+NhUVztzR/CbjEFw==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/workbox-core/-/workbox-core-7.1.0.tgz", + "integrity": "sha512-5KB4KOY8rtL31nEF7BfvU7FMzKT4B5TkbYa2tzkS+Peqj0gayMT9SytSFtNzlrvMaWgv6y/yvP9C0IbpFjV30Q==", "dev": true, "license": "MIT" }, "node_modules/workbox-recipes": { - "version": "6.6.1", - "resolved": "https://registry.npmjs.org/workbox-recipes/-/workbox-recipes-6.6.1.tgz", - "integrity": "sha512-/oy8vCSzromXokDA+X+VgpeZJvtuf8SkQ8KL0xmRivMgJZrjwM3c2tpKTJn6PZA6TsbxGs3Sc7KwMoZVamcV2g==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/workbox-recipes/-/workbox-recipes-7.1.0.tgz", + "integrity": "sha512-NRrk4ycFN9BHXJB6WrKiRX3W3w75YNrNrzSX9cEZgFB5ubeGoO8s/SDmOYVrFYp9HMw6sh1Pm3eAY/1gVS8YLg==", "dev": true, "license": "MIT", "dependencies": { - "workbox-cacheable-response": "6.6.1", - "workbox-core": "6.6.1", - "workbox-expiration": "6.6.1", - "workbox-precaching": "6.6.1", - "workbox-routing": "6.6.1", - "workbox-strategies": "6.6.1" + "workbox-cacheable-response": "7.1.0", + "workbox-core": "7.1.0", + "workbox-expiration": "7.1.0", + "workbox-precaching": "7.1.0", + "workbox-routing": "7.1.0", + "workbox-strategies": "7.1.0" } }, "node_modules/workbox-recipes/node_modules/workbox-core": { - "version": "6.6.1", - "resolved": "https://registry.npmjs.org/workbox-core/-/workbox-core-6.6.1.tgz", - "integrity": "sha512-ZrGBXjjaJLqzVothoE12qTbVnOAjFrHDXpZe7coCb6q65qI/59rDLwuFMO4PcZ7jcbxY+0+NhUVztzR/CbjEFw==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/workbox-core/-/workbox-core-7.1.0.tgz", + "integrity": "sha512-5KB4KOY8rtL31nEF7BfvU7FMzKT4B5TkbYa2tzkS+Peqj0gayMT9SytSFtNzlrvMaWgv6y/yvP9C0IbpFjV30Q==", "dev": true, "license": "MIT" }, "node_modules/workbox-recipes/node_modules/workbox-expiration": { - "version": "6.6.1", - "resolved": "https://registry.npmjs.org/workbox-expiration/-/workbox-expiration-6.6.1.tgz", - "integrity": "sha512-qFiNeeINndiOxaCrd2DeL1Xh1RFug3JonzjxUHc5WkvkD2u5abY3gZL1xSUNt3vZKsFFGGORItSjVTVnWAZO4A==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/workbox-expiration/-/workbox-expiration-7.1.0.tgz", + "integrity": "sha512-m5DcMY+A63rJlPTbbBNtpJ20i3enkyOtSgYfv/l8h+D6YbbNiA0zKEkCUaMsdDlxggla1oOfRkyqTvl5Ni5KQQ==", "dev": true, "license": "MIT", "dependencies": { "idb": "^7.0.1", - "workbox-core": "6.6.1" + "workbox-core": "7.1.0" } }, "node_modules/workbox-recipes/node_modules/workbox-precaching": { - "version": "6.6.1", - "resolved": "https://registry.npmjs.org/workbox-precaching/-/workbox-precaching-6.6.1.tgz", - "integrity": "sha512-K4znSJ7IKxCnCYEdhNkMr7X1kNh8cz+mFgx9v5jFdz1MfI84pq8C2zG+oAoeE5kFrUf7YkT5x4uLWBNg0DVZ5A==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/workbox-precaching/-/workbox-precaching-7.1.0.tgz", + "integrity": "sha512-LyxzQts+UEpgtmfnolo0hHdNjoB7EoRWcF7EDslt+lQGd0lW4iTvvSe3v5JiIckQSB5KTW5xiCqjFviRKPj1zA==", "dev": true, "license": "MIT", "dependencies": { - "workbox-core": "6.6.1", - "workbox-routing": "6.6.1", - "workbox-strategies": "6.6.1" + "workbox-core": "7.1.0", + "workbox-routing": "7.1.0", + "workbox-strategies": "7.1.0" } }, "node_modules/workbox-recipes/node_modules/workbox-routing": { - "version": "6.6.1", - "resolved": "https://registry.npmjs.org/workbox-routing/-/workbox-routing-6.6.1.tgz", - "integrity": "sha512-j4ohlQvfpVdoR8vDYxTY9rA9VvxTHogkIDwGdJ+rb2VRZQ5vt1CWwUUZBeD/WGFAni12jD1HlMXvJ8JS7aBWTg==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/workbox-routing/-/workbox-routing-7.1.0.tgz", + "integrity": "sha512-oOYk+kLriUY2QyHkIilxUlVcFqwduLJB7oRZIENbqPGeBP/3TWHYNNdmGNhz1dvKuw7aqvJ7CQxn27/jprlTdg==", "dev": true, "license": "MIT", "dependencies": { - "workbox-core": "6.6.1" + "workbox-core": "7.1.0" } }, "node_modules/workbox-recipes/node_modules/workbox-strategies": { - "version": "6.6.1", - "resolved": "https://registry.npmjs.org/workbox-strategies/-/workbox-strategies-6.6.1.tgz", - "integrity": "sha512-WQLXkRnsk4L81fVPkkgon1rZNxnpdO5LsO+ws7tYBC6QQQFJVI6v98klrJEjFtZwzw/mB/HT5yVp7CcX0O+mrw==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/workbox-strategies/-/workbox-strategies-7.1.0.tgz", + "integrity": "sha512-/UracPiGhUNehGjRm/tLUQ+9PtWmCbRufWtV0tNrALuf+HZ4F7cmObSEK+E4/Bx1p8Syx2tM+pkIrvtyetdlew==", "dev": true, "license": "MIT", "dependencies": { - "workbox-core": "6.6.1" + "workbox-core": "7.1.0" } }, "node_modules/workbox-routing": { @@ -15175,55 +14998,55 @@ } }, "node_modules/workbox-streams": { - "version": "6.6.1", - "resolved": "https://registry.npmjs.org/workbox-streams/-/workbox-streams-6.6.1.tgz", - "integrity": "sha512-maKG65FUq9e4BLotSKWSTzeF0sgctQdYyTMq529piEN24Dlu9b6WhrAfRpHdCncRS89Zi2QVpW5V33NX8PgH3Q==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/workbox-streams/-/workbox-streams-7.1.0.tgz", + "integrity": "sha512-WyHAVxRXBMfysM8ORwiZnI98wvGWTVAq/lOyBjf00pXFvG0mNaVz4Ji+u+fKa/mf1i2SnTfikoYKto4ihHeS6w==", "dev": true, "license": "MIT", "dependencies": { - "workbox-core": "6.6.1", - "workbox-routing": "6.6.1" + "workbox-core": "7.1.0", + "workbox-routing": "7.1.0" } }, "node_modules/workbox-streams/node_modules/workbox-core": { - "version": "6.6.1", - "resolved": "https://registry.npmjs.org/workbox-core/-/workbox-core-6.6.1.tgz", - "integrity": "sha512-ZrGBXjjaJLqzVothoE12qTbVnOAjFrHDXpZe7coCb6q65qI/59rDLwuFMO4PcZ7jcbxY+0+NhUVztzR/CbjEFw==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/workbox-core/-/workbox-core-7.1.0.tgz", + "integrity": "sha512-5KB4KOY8rtL31nEF7BfvU7FMzKT4B5TkbYa2tzkS+Peqj0gayMT9SytSFtNzlrvMaWgv6y/yvP9C0IbpFjV30Q==", "dev": true, "license": "MIT" }, "node_modules/workbox-streams/node_modules/workbox-routing": { - "version": "6.6.1", - "resolved": "https://registry.npmjs.org/workbox-routing/-/workbox-routing-6.6.1.tgz", - "integrity": "sha512-j4ohlQvfpVdoR8vDYxTY9rA9VvxTHogkIDwGdJ+rb2VRZQ5vt1CWwUUZBeD/WGFAni12jD1HlMXvJ8JS7aBWTg==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/workbox-routing/-/workbox-routing-7.1.0.tgz", + "integrity": "sha512-oOYk+kLriUY2QyHkIilxUlVcFqwduLJB7oRZIENbqPGeBP/3TWHYNNdmGNhz1dvKuw7aqvJ7CQxn27/jprlTdg==", "dev": true, "license": "MIT", "dependencies": { - "workbox-core": "6.6.1" + "workbox-core": "7.1.0" } }, "node_modules/workbox-sw": { - "version": "6.6.1", - "resolved": "https://registry.npmjs.org/workbox-sw/-/workbox-sw-6.6.1.tgz", - "integrity": "sha512-R7whwjvU2abHH/lR6kQTTXLHDFU2izht9kJOvBRYK65FbwutT4VvnUAJIgHvfWZ/fokrOPhfoWYoPCMpSgUKHQ==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/workbox-sw/-/workbox-sw-7.1.0.tgz", + "integrity": "sha512-Hml/9+/njUXBglv3dtZ9WBKHI235AQJyLBV1G7EFmh4/mUdSQuXui80RtjDeVRrXnm/6QWgRUEHG3/YBVbxtsA==", "dev": true, "license": "MIT" }, "node_modules/workbox-window": { - "version": "6.6.1", - "resolved": "https://registry.npmjs.org/workbox-window/-/workbox-window-6.6.1.tgz", - "integrity": "sha512-wil4nwOY58nTdCvif/KEZjQ2NP8uk3gGeRNy2jPBbzypU4BT4D9L8xiwbmDBpZlSgJd2xsT9FvSNU0gsxV51JQ==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/workbox-window/-/workbox-window-7.1.0.tgz", + "integrity": "sha512-ZHeROyqR+AS5UPzholQRDttLFqGMwP0Np8MKWAdyxsDETxq3qOAyXvqessc3GniohG6e0mAqSQyKOHmT8zPF7g==", "dev": true, "license": "MIT", "dependencies": { "@types/trusted-types": "^2.0.2", - "workbox-core": "6.6.1" + "workbox-core": "7.1.0" } }, "node_modules/workbox-window/node_modules/workbox-core": { - "version": "6.6.1", - "resolved": "https://registry.npmjs.org/workbox-core/-/workbox-core-6.6.1.tgz", - "integrity": "sha512-ZrGBXjjaJLqzVothoE12qTbVnOAjFrHDXpZe7coCb6q65qI/59rDLwuFMO4PcZ7jcbxY+0+NhUVztzR/CbjEFw==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/workbox-core/-/workbox-core-7.1.0.tgz", + "integrity": "sha512-5KB4KOY8rtL31nEF7BfvU7FMzKT4B5TkbYa2tzkS+Peqj0gayMT9SytSFtNzlrvMaWgv6y/yvP9C0IbpFjV30Q==", "dev": true, "license": "MIT" }, diff --git a/package.json b/package.json index 845be0580..a946178d0 100644 --- a/package.json +++ b/package.json @@ -15,7 +15,7 @@ "@playwright/test": "^1.38.1", "@testing-library/jest-dom": "^5.16.1", "@testing-library/react": "^11.2.7", - "@types/node": "^17.0.31", + "@types/node": "^20.0.0", "@types/react": "^18.0.9", "@types/react-dom": "^18.0.3", "@types/uuid": "^8.3.4", @@ -103,6 +103,6 @@ "serve": "^14.1.1", "tslint": "^6.1.3", "typescript": "^4.7.3", - "vite-plugin-pwa": "^0.12.0" + "vite-plugin-pwa": "^0.20.5" } } From 23220b836294afca2d92005a7a6213049024ef54 Mon Sep 17 00:00:00 2001 From: Harshal Ranjhani Date: Sat, 12 Oct 2024 21:15:05 +0530 Subject: [PATCH 76/93] feat: remove confirmation and show toast on goal delete --- .../MyGoalActions/RegularGoalActions.tsx | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/src/components/GoalsComponents/MyGoalActions/RegularGoalActions.tsx b/src/components/GoalsComponents/MyGoalActions/RegularGoalActions.tsx index fed2f1dec..b63bfe6a3 100644 --- a/src/components/GoalsComponents/MyGoalActions/RegularGoalActions.tsx +++ b/src/components/GoalsComponents/MyGoalActions/RegularGoalActions.tsx @@ -8,7 +8,7 @@ import ConfirmationModal from "@src/common/ConfirmationModal"; import ZModal from "@src/common/ZModal"; import archiveSound from "@assets/archive.mp3"; -import { lastAction, openDevMode, displayConfirmation } from "@src/store"; +import { lastAction, openDevMode, displayConfirmation, displayToast, displayToast } from "@src/store"; import { GoalItem } from "@src/models/GoalItem"; import { TConfirmAction } from "@src/Interfaces/IPopupModals"; import useGoalActions from "@src/hooks/useGoalActions"; @@ -40,8 +40,18 @@ const RegularGoalActions = ({ goal }: { goal: GoalItem }) => { const setLastAction = useSetRecoilState(lastAction); const ancestors = (state?.goalsHistory || []).map((ele) => ele.goalID); + const setShowToast = useSetRecoilState(displayToast); + const [confirmationAction, setConfirmationAction] = useState(null); + const showMessage = (message: string, extra = "") => { + setShowToast({ + open: true, + message, + extra, + }); + }; + const handleArchiveGoal = async (goalToArchive: GoalItem, goalAncestors: string[]) => { await archiveThisGoal(goalToArchive, goalAncestors); setLastAction("goalArchived"); @@ -58,6 +68,7 @@ const RegularGoalActions = ({ goal }: { goal: GoalItem }) => { if (action === "delete") { await deleteGoalAction(goal); setLastAction("goalDeleted"); + showMessage("Moved to trash!", "We'll delete it in 7 days."); } else if (action === "archive") { await handleArchiveGoal(goal, ancestors); } else if (action === "colabRequest") { @@ -106,7 +117,7 @@ const RegularGoalActions = ({ goal }: { goal: GoalItem }) => { className="goal-action shareOptions-btn" onClickCapture={async (e) => { e.stopPropagation(); - await openConfirmationPopUp({ actionCategory: confirmActionCategory, actionName: "delete" }); + await handleActionClick("delete"); }} > From 83da4f366ea8eb258366365d8835f67b22d879dc Mon Sep 17 00:00:00 2001 From: Harshal Ranjhani Date: Sun, 13 Oct 2024 12:05:03 +0530 Subject: [PATCH 77/93] fix: remove duplicate import for displayToast --- .../GoalsComponents/MyGoalActions/RegularGoalActions.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/GoalsComponents/MyGoalActions/RegularGoalActions.tsx b/src/components/GoalsComponents/MyGoalActions/RegularGoalActions.tsx index b63bfe6a3..39c6d6774 100644 --- a/src/components/GoalsComponents/MyGoalActions/RegularGoalActions.tsx +++ b/src/components/GoalsComponents/MyGoalActions/RegularGoalActions.tsx @@ -8,7 +8,7 @@ import ConfirmationModal from "@src/common/ConfirmationModal"; import ZModal from "@src/common/ZModal"; import archiveSound from "@assets/archive.mp3"; -import { lastAction, openDevMode, displayConfirmation, displayToast, displayToast } from "@src/store"; +import { lastAction, openDevMode, displayConfirmation, displayToast } from "@src/store"; import { GoalItem } from "@src/models/GoalItem"; import { TConfirmAction } from "@src/Interfaces/IPopupModals"; import useGoalActions from "@src/hooks/useGoalActions"; From 6167b992097e7c7d21775e62076bee884510eda1 Mon Sep 17 00:00:00 2001 From: Vinay Badgujar Date: Sun, 13 Oct 2024 14:33:15 +0530 Subject: [PATCH 78/93] edit: only show the archived goal suggestion for the childrens of a parent --- src/api/GoalsAPI/index.ts | 28 +++++++++++++------ .../components/ArchivedAutoComplete.tsx | 17 ++++++++--- src/contexts/parentGoal-context.tsx | 8 ++++++ 3 files changed, 41 insertions(+), 12 deletions(-) diff --git a/src/api/GoalsAPI/index.ts b/src/api/GoalsAPI/index.ts index 9290c9050..a21c159c3 100644 --- a/src/api/GoalsAPI/index.ts +++ b/src/api/GoalsAPI/index.ts @@ -353,14 +353,26 @@ export const addHintGoaltoMyGoals = async (goal: GoalItem) => { ]); }; -export const fetchArchivedGoalByTitle = async (value: string) => { - if (value.trim() === "") { +export const fetchArchivedGoalByTitle = async (goalId: string, parentGoalId: string) => { + if (goalId.trim() === "") { return []; } - const lowerCaseValue = value.toLowerCase(); - return db.goalsCollection - .where("archived") - .equals("true") - .and((goal) => goal.title.toLowerCase().startsWith(lowerCaseValue)) - .toArray(); + + const lowerCaseValue = goalId.toLowerCase(); + + const getAllChildrenGoals = async (id: string): Promise => { + const directChildren = await getChildrenGoals(id); + let allChildren = [...directChildren]; + + for (const child of directChildren) { + const grandchildren = await getAllChildrenGoals(child.id); + allChildren = allChildren.concat(grandchildren); + } + + return allChildren; + }; + + const allChildren = await getAllChildrenGoals(parentGoalId); + + return allChildren.filter((goal) => goal.archived === "true" && goal.title.toLowerCase().startsWith(lowerCaseValue)); }; diff --git a/src/components/GoalsComponents/GoalConfigModal/components/ArchivedAutoComplete.tsx b/src/components/GoalsComponents/GoalConfigModal/components/ArchivedAutoComplete.tsx index 85e670573..63eac5ec2 100644 --- a/src/components/GoalsComponents/GoalConfigModal/components/ArchivedAutoComplete.tsx +++ b/src/components/GoalsComponents/GoalConfigModal/components/ArchivedAutoComplete.tsx @@ -2,6 +2,7 @@ import React, { useState, useCallback } from "react"; import { GoalItem } from "@src/models/GoalItem"; import AutocompleteComponent from "@components/GoalsComponents/GoalConfigModal/components/AutoComplete"; import { fetchArchivedGoalByTitle } from "@src/api/GoalsAPI"; +import { useParentGoalContext } from "@src/contexts/parentGoal-context"; interface ArchivedAutoCompleteProps { onGoalSelect: (goal: GoalItem) => void; @@ -17,11 +18,19 @@ const ArchivedAutoComplete: React.FC = ({ placeholder, }) => { const [filteredGoals, setFilteredGoals] = useState([]); + const { + parentData: { parentGoal }, + } = useParentGoalContext(); - const searchArchivedGoals = useCallback(async (value: string) => { - const goals = await fetchArchivedGoalByTitle(value); - setFilteredGoals(goals); - }, []); + const parentGoalId = parentGoal ? parentGoal.id : "root"; + + const searchArchivedGoals = useCallback( + async (value: string) => { + const goals = await fetchArchivedGoalByTitle(value, parentGoalId); + setFilteredGoals(goals); + }, + [parentGoalId], + ); const handleInputChange = useCallback( (value: string) => { diff --git a/src/contexts/parentGoal-context.tsx b/src/contexts/parentGoal-context.tsx index acfec0532..5d21ec52e 100644 --- a/src/contexts/parentGoal-context.tsx +++ b/src/contexts/parentGoal-context.tsx @@ -3,6 +3,7 @@ import { getSharedWMChildrenGoals, getSharedWMGoalById } from "@src/api/SharedWM import { GoalItem } from "@src/models/GoalItem"; import { lastAction } from "@src/store"; import { allowAddingBudgetGoal } from "@src/store/GoalsState"; +import { suggestedGoalState } from "@src/store/SuggestedGoalState"; import React, { ReactNode, createContext, useContext, useEffect, useMemo, useReducer } from "react"; import { useParams } from "react-router-dom"; import { useRecoilValue, useSetRecoilState } from "recoil"; @@ -46,6 +47,7 @@ export const ParentGoalProvider = ({ children }: { children: ReactNode }) => { const setAllowBudgetGoal = useSetRecoilState(allowAddingBudgetGoal); const [parentData, dispatch] = useReducer(parentGoalReducer, initialState); const isPartnerModeActive = !!partnerId; + const suggestedGoal = useRecoilValue(suggestedGoalState); async function init() { if (parentId !== "root") { @@ -67,6 +69,12 @@ export const ParentGoalProvider = ({ children }: { children: ReactNode }) => { init(); }, [parentId]); + useEffect(() => { + if (suggestedGoal === null) { + init(); + } + }, [suggestedGoal]); + useEffect(() => { if (action === "goalArchived") { return; From 39a712b232ee57a1c16eb7e05c8fe0e5f5209926 Mon Sep 17 00:00:00 2001 From: Aarif Khan Date: Sun, 13 Oct 2024 14:42:41 +0530 Subject: [PATCH 79/93] Add esc key event listener to call cancel func --- src/common/ZModal.tsx | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/src/common/ZModal.tsx b/src/common/ZModal.tsx index fc5a39ca2..79aa2039f 100644 --- a/src/common/ZModal.tsx +++ b/src/common/ZModal.tsx @@ -1,4 +1,4 @@ -import React from "react"; +import React, { useEffect } from "react"; import { Modal } from "antd"; import { useRecoilValue } from "recoil"; import { darkModeState } from "@src/store"; @@ -8,6 +8,7 @@ import { ZModalProps } from "@src/Interfaces/ICommon"; const ZModal: React.FC = ({ children, type, open, onCancel, width, style }) => { const theme = useRecoilValue(themeState); const darkModeStatus = useRecoilValue(darkModeState); + const handleCancel = onCancel || (() => window.history.back()); const commonClassName = `popupModal${darkModeStatus ? "-dark" : ""} ${darkModeStatus ? "dark" : "light"}-theme${ theme[darkModeStatus ? "dark" : "light"] @@ -18,13 +19,28 @@ const ZModal: React.FC = ({ children, type, open, onCancel, width, backgroundColor: darkModeStatus ? "rgba(0, 0, 0, 0.50)" : "rgba(87, 87, 87, 0.4)", }; + useEffect(() => { + const handleKeyDown = (event: any) => { + event.stopPropagation(); + if (event.key === "Escape") { + handleCancel(); + } + }; + + window.addEventListener("keydown", handleKeyDown); + + return () => { + window.removeEventListener("keydown", handleKeyDown); + }; + }, [handleCancel]); + return ( window.history.back())} + onCancel={handleCancel} className={combinedClassName} styles={{ mask: maskStyle }} width={width} From 79398e13f57fe0e2a0b8b725501f176901df067e Mon Sep 17 00:00:00 2001 From: Harshal Ranjhani Date: Sun, 13 Oct 2024 16:57:03 +0530 Subject: [PATCH 80/93] feat: open goal modal with spacebar key --- src/hooks/useGoalSelection.ts | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/hooks/useGoalSelection.ts b/src/hooks/useGoalSelection.ts index 040a69705..afc87f874 100644 --- a/src/hooks/useGoalSelection.ts +++ b/src/hooks/useGoalSelection.ts @@ -14,6 +14,7 @@ export const useGoalSelection = (goals: GoalItem[]): GoalItem | undefined => { const downPress = useKeyPress("ArrowDown"); const rightPress = useKeyPress("ArrowRight"); const leftPress = useKeyPress("ArrowLeft"); + const spacePress = useKeyPress(" "); const focusIndex = Number(searchParams.get("focus") || -1); @@ -62,6 +63,11 @@ export const useGoalSelection = (goals: GoalItem[]): GoalItem | undefined => { [goals], ); + const openGoalActionsModal = (goal: GoalItem) => { + if (!goal) return; + navigate(`/goals/root/${goal.id}?showOptions=true`); + }; + useEffect(() => { const handleKeyDown = (e: KeyboardEvent) => { if (["ArrowUp", "ArrowDown", "ArrowLeft", "ArrowRight"].includes(e.key)) { @@ -90,10 +96,14 @@ export const useGoalSelection = (goals: GoalItem[]): GoalItem | undefined => { window.history.back(); } + if (spacePress && goals.length > 0) { + openGoalActionsModal(goals[focusIndex]); + } + return () => { window.removeEventListener("keydown", handleKeyDown); }; - }, [downPress, upPress, rightPress, leftPress]); + }, [downPress, upPress, rightPress, leftPress, spacePress]); return goals[focusIndex]; }; From 6d11f1e529b9b6bfa31737e5256d391abc43b4c0 Mon Sep 17 00:00:00 2001 From: Harshal Ranjhani Date: Sun, 13 Oct 2024 18:12:29 +0530 Subject: [PATCH 81/93] fix: background navigates to a higher lever when one presses spacebar at a lower level --- src/hooks/useGoalSelection.ts | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/hooks/useGoalSelection.ts b/src/hooks/useGoalSelection.ts index afc87f874..2119eda10 100644 --- a/src/hooks/useGoalSelection.ts +++ b/src/hooks/useGoalSelection.ts @@ -65,7 +65,11 @@ export const useGoalSelection = (goals: GoalItem[]): GoalItem | undefined => { const openGoalActionsModal = (goal: GoalItem) => { if (!goal) return; - navigate(`/goals/root/${goal.id}?showOptions=true`); + if (goal.parentGoalId === "root") { + navigate(`/goals/root/${goal.id}?showOptions=true`); + } else { + navigate(`/goals/${goal.parentGoalId}/${goal.id}?showOptions=true`); + } }; useEffect(() => { From 8a966f9ab9e5311bf887a0ce8cb7e90adab0453e Mon Sep 17 00:00:00 2001 From: Harshal Ranjhani Date: Sun, 13 Oct 2024 18:33:37 +0530 Subject: [PATCH 82/93] fix: preserve state when showing modal --- .../GoalSublist/components/GoalHistory.tsx | 1 + src/hooks/useGoalSelection.ts | 10 +++++----- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/src/components/GoalsComponents/GoalSublist/components/GoalHistory.tsx b/src/components/GoalsComponents/GoalSublist/components/GoalHistory.tsx index bd9542906..de161590c 100644 --- a/src/components/GoalsComponents/GoalSublist/components/GoalHistory.tsx +++ b/src/components/GoalsComponents/GoalSublist/components/GoalHistory.tsx @@ -24,6 +24,7 @@ const breadcrumbStyle: React.CSSProperties = { }; const BreadcrumbItem = ({ goal }: { goal: ISubGoalHistory }) => { + console.log(goal.goalTitle); const { t } = useTranslation(); return ( { const openGoalActionsModal = (goal: GoalItem) => { if (!goal) return; - if (goal.parentGoalId === "root") { - navigate(`/goals/root/${goal.id}?showOptions=true`); - } else { - navigate(`/goals/${goal.parentGoalId}/${goal.id}?showOptions=true`); - } + const newPath = goal.parentGoalId === "root" ? `/goals/root/${goal.id}` : `/goals/${goal.parentGoalId}/${goal.id}`; + + navigate(`${newPath}?showOptions=true`, { + state: location.state, + }); }; useEffect(() => { From 2bb7910da0bed49546c499284efb6ca12ddcb9cb Mon Sep 17 00:00:00 2001 From: Harshal Ranjhani Date: Sun, 13 Oct 2024 18:59:40 +0530 Subject: [PATCH 83/93] fix: use 'Space' instead of ' ' for the event code --- src/hooks/useGoalSelection.ts | 2 +- src/hooks/useKeyPress.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/hooks/useGoalSelection.ts b/src/hooks/useGoalSelection.ts index 05259c954..aadd8d437 100644 --- a/src/hooks/useGoalSelection.ts +++ b/src/hooks/useGoalSelection.ts @@ -14,7 +14,7 @@ export const useGoalSelection = (goals: GoalItem[]): GoalItem | undefined => { const downPress = useKeyPress("ArrowDown"); const rightPress = useKeyPress("ArrowRight"); const leftPress = useKeyPress("ArrowLeft"); - const spacePress = useKeyPress(" "); + const spacePress = useKeyPress("Space"); const focusIndex = Number(searchParams.get("focus") || -1); diff --git a/src/hooks/useKeyPress.ts b/src/hooks/useKeyPress.ts index c2a7e7fa1..9470cd1a1 100644 --- a/src/hooks/useKeyPress.ts +++ b/src/hooks/useKeyPress.ts @@ -6,7 +6,7 @@ export const useKeyPress = (targetKey: string) => { const keyHandler = useCallback( (event: KeyboardEvent) => { event.stopPropagation(); - if (event.key === targetKey) { + if (event.key === targetKey || (targetKey === "Space" && event.key === " ")) { setKeyPressed(event.type === "keydown"); } }, From 446042d29fc4606f082067938f188bac66140fdb Mon Sep 17 00:00:00 2001 From: Harshal Ranjhani Date: Sun, 13 Oct 2024 19:10:29 +0530 Subject: [PATCH 84/93] remove log --- .../GoalsComponents/GoalSublist/components/GoalHistory.tsx | 1 - 1 file changed, 1 deletion(-) diff --git a/src/components/GoalsComponents/GoalSublist/components/GoalHistory.tsx b/src/components/GoalsComponents/GoalSublist/components/GoalHistory.tsx index de161590c..bd9542906 100644 --- a/src/components/GoalsComponents/GoalSublist/components/GoalHistory.tsx +++ b/src/components/GoalsComponents/GoalSublist/components/GoalHistory.tsx @@ -24,7 +24,6 @@ const breadcrumbStyle: React.CSSProperties = { }; const BreadcrumbItem = ({ goal }: { goal: ISubGoalHistory }) => { - console.log(goal.goalTitle); const { t } = useTranslation(); return ( Date: Sun, 13 Oct 2024 19:15:41 +0530 Subject: [PATCH 85/93] patch: replace e.key with e.code --- src/hooks/useKeyPress.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/hooks/useKeyPress.ts b/src/hooks/useKeyPress.ts index 9470cd1a1..ade7d7d36 100644 --- a/src/hooks/useKeyPress.ts +++ b/src/hooks/useKeyPress.ts @@ -6,7 +6,7 @@ export const useKeyPress = (targetKey: string) => { const keyHandler = useCallback( (event: KeyboardEvent) => { event.stopPropagation(); - if (event.key === targetKey || (targetKey === "Space" && event.key === " ")) { + if (event.code === targetKey) { setKeyPressed(event.type === "keydown"); } }, From 8c75e7ca2ea1bd3591a7cce2ec6ec06278202081 Mon Sep 17 00:00:00 2001 From: Aarif Khan Date: Sun, 13 Oct 2024 20:19:50 +0530 Subject: [PATCH 86/93] useKeyPress hook for escape key press --- src/common/ZModal.tsx | 19 ++++++------------- 1 file changed, 6 insertions(+), 13 deletions(-) diff --git a/src/common/ZModal.tsx b/src/common/ZModal.tsx index 79aa2039f..a75723d27 100644 --- a/src/common/ZModal.tsx +++ b/src/common/ZModal.tsx @@ -4,11 +4,13 @@ import { useRecoilValue } from "recoil"; import { darkModeState } from "@src/store"; import { themeState } from "@src/store/ThemeState"; import { ZModalProps } from "@src/Interfaces/ICommon"; +import { useKeyPress } from "@src/hooks/useKeyPress"; const ZModal: React.FC = ({ children, type, open, onCancel, width, style }) => { const theme = useRecoilValue(themeState); const darkModeStatus = useRecoilValue(darkModeState); const handleCancel = onCancel || (() => window.history.back()); + const escapePress = useKeyPress("Escape"); const commonClassName = `popupModal${darkModeStatus ? "-dark" : ""} ${darkModeStatus ? "dark" : "light"}-theme${ theme[darkModeStatus ? "dark" : "light"] @@ -20,19 +22,10 @@ const ZModal: React.FC = ({ children, type, open, onCancel, width, }; useEffect(() => { - const handleKeyDown = (event: any) => { - event.stopPropagation(); - if (event.key === "Escape") { - handleCancel(); - } - }; - - window.addEventListener("keydown", handleKeyDown); - - return () => { - window.removeEventListener("keydown", handleKeyDown); - }; - }, [handleCancel]); + if (escapePress) { + handleCancel(); + } + }, [escapePress]); return ( Date: Mon, 14 Oct 2024 15:12:07 +0530 Subject: [PATCH 87/93] fix: location history problem while try to add suggested subgoal --- .../GoalConfigModal/ConfigGoal.tsx | 25 ++++++++++++++----- src/hooks/useGoalStore.tsx | 17 ++++++++----- 2 files changed, 30 insertions(+), 12 deletions(-) diff --git a/src/components/GoalsComponents/GoalConfigModal/ConfigGoal.tsx b/src/components/GoalsComponents/GoalConfigModal/ConfigGoal.tsx index 91a27d0b1..f05a21b7a 100644 --- a/src/components/GoalsComponents/GoalConfigModal/ConfigGoal.tsx +++ b/src/components/GoalsComponents/GoalConfigModal/ConfigGoal.tsx @@ -17,7 +17,10 @@ import { useParentGoalContext } from "@src/contexts/parentGoal-context"; import useGoalActions from "@src/hooks/useGoalActions"; import useGoalStore from "@src/hooks/useGoalStore"; import { unarchiveUserGoal } from "@src/api/GoalsAPI"; +import { ILocationState } from "@src/Interfaces"; +import { useLocation, useNavigate } from "react-router-dom"; import { suggestedGoalState } from "@src/store/SuggestedGoalState"; +import { getHistoryUptoGoal } from "@src/helpers/GoalProcessor"; import { colorPalleteList, calDays, convertOnFilterToArray, getSelectedLanguage } from "../../../utils"; import "./ConfigGoal.scss"; @@ -41,6 +44,9 @@ const ConfigGoal = ({ type, goal, mode }: { type: TGoalCategory; mode: TGoalConf parentData: { parentGoal }, } = useParentGoalContext(); + const location = useLocation(); + const navigate = useNavigate(); + let defaultColorIndex = Math.floor(Math.random() * colorPalleteList.length - 1) + 1; let defaultAfterTime = isEditMode ? goal.afterTime || 9 : 9; let defaultBeforeTime = isEditMode ? goal.beforeTime || 18 : 18; @@ -153,7 +159,12 @@ const ConfigGoal = ({ type, goal, mode }: { type: TGoalCategory; mode: TGoalConf } if (suggestedGoal) { await unarchiveUserGoal(suggestedGoal); + navigate(`/goals/${suggestedGoal.parentGoalId === "root" ? "" : suggestedGoal.parentGoalId}`, { + state: { ...location.state }, + replace: true, + }); setSuggestedGoal(null); + return; } window.history.back(); }; @@ -217,15 +228,17 @@ const ConfigGoal = ({ type, goal, mode }: { type: TGoalCategory; mode: TGoalConf handleWeekSliderChange(perWeekHrs); }, [perDayHrs, setPerDayHrs, tags.on]); - // const modalStyle = { - // transform: `translate(0, ${isKeyboardOpen ? "-45%" : "0"})`, - // transition: "transform 0.3s ease-in-out", - // }; - const { openEditMode } = useGoalStore(); const onSuggestionClick = async (selectedGoal: GoalItem) => { - await openEditMode(selectedGoal); + const updatedGoalsHistory = await getHistoryUptoGoal(selectedGoal.parentGoalId); + + const newState: ILocationState = { + ...location.state, + goalsHistory: updatedGoalsHistory, + }; + + openEditMode(selectedGoal, newState); setSuggestedGoal(selectedGoal); setTitle(selectedGoal.title); setColorIndex(colorPalleteList.indexOf(selectedGoal.goalColor)); diff --git a/src/hooks/useGoalStore.tsx b/src/hooks/useGoalStore.tsx index bb89e762c..6393e7bbb 100644 --- a/src/hooks/useGoalStore.tsx +++ b/src/hooks/useGoalStore.tsx @@ -1,7 +1,8 @@ import { useLocation, useNavigate, useParams } from "react-router-dom"; import { useRecoilValue } from "recoil"; -import { GoalItem, TGoalCategory } from "@src/models/GoalItem"; +import { GoalItem } from "@src/models/GoalItem"; import { displayConfirmation } from "@src/store"; +import { ILocationState } from "@src/Interfaces"; const useGoalStore = () => { const { partnerId } = useParams(); @@ -9,13 +10,17 @@ const useGoalStore = () => { const location = useLocation(); const showConfirmation = useRecoilValue(displayConfirmation); - const openEditMode = (goal: GoalItem) => { + const openEditMode = (goal: GoalItem, customState?: ILocationState) => { const prefix = `${partnerId ? `/partners/${partnerId}/` : "/"}goals`; + + const newState = { + ...location.state, + goalType: goal.category === "Budget" ? "Budget" : "Goal", + ...customState, + }; + navigate(`${prefix}/${goal.parentGoalId}/${goal.id}?type=${goal.category}&mode=edit`, { - state: { - ...location.state, - goalType: goal.category === "Budget" ? "Budget" : "Goal", - }, + state: newState, replace: true, }); }; From 6ecd74102a1e13442d7ba82c7412dd270ae9e4f4 Mon Sep 17 00:00:00 2001 From: Vinay Badgujar Date: Mon, 14 Oct 2024 15:19:14 +0530 Subject: [PATCH 88/93] patch: fix eslint warning --- src/api/GoalsAPI/index.ts | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/src/api/GoalsAPI/index.ts b/src/api/GoalsAPI/index.ts index a21c159c3..f5f264337 100644 --- a/src/api/GoalsAPI/index.ts +++ b/src/api/GoalsAPI/index.ts @@ -362,14 +362,15 @@ export const fetchArchivedGoalByTitle = async (goalId: string, parentGoalId: str const getAllChildrenGoals = async (id: string): Promise => { const directChildren = await getChildrenGoals(id); - let allChildren = [...directChildren]; - for (const child of directChildren) { - const grandchildren = await getAllChildrenGoals(child.id); - allChildren = allChildren.concat(grandchildren); - } + const allChildren = await Promise.all( + directChildren.map(async (child) => { + const grandchildren = await getAllChildrenGoals(child.id); + return [child, ...grandchildren]; + }), + ); - return allChildren; + return allChildren.flat(); }; const allChildren = await getAllChildrenGoals(parentGoalId); From 446ed227bba05d27265265741300a4ca6b7f7d0d Mon Sep 17 00:00:00 2001 From: Vinay Badgujar Date: Mon, 14 Oct 2024 15:25:50 +0530 Subject: [PATCH 89/93] edit: add new toast message when suggested goal is added --- src/hooks/useGoalActions.tsx | 23 +++++++++++++++++------ 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/src/hooks/useGoalActions.tsx b/src/hooks/useGoalActions.tsx index d46a7a965..5ebc4b507 100644 --- a/src/hooks/useGoalActions.tsx +++ b/src/hooks/useGoalActions.tsx @@ -10,7 +10,7 @@ import { useLocation, useParams } from "react-router-dom"; import pageCrumplingSound from "@assets/page-crumpling-sound.mp3"; import plingSound from "@assets/pling.mp3"; -import { useSetRecoilState } from "recoil"; +import { useRecoilValue, useSetRecoilState } from "recoil"; import { shareGoalWithContact } from "@src/services/contact.service"; import { addToSharingQueue } from "@src/api/ContactsAPI"; import { ILocationState } from "@src/Interfaces"; @@ -18,6 +18,7 @@ import { hashObject } from "@src/utils"; import { useActiveGoalContext } from "@src/contexts/activeGoal-context"; import { removeBackTicks } from "@src/utils/patterns"; import { getGoalHintItem } from "@src/api/HintsAPI"; +import { suggestedGoalState } from "@src/store/SuggestedGoalState"; const pageCrumple = new Audio(pageCrumplingSound); const addGoalSound = new Audio(plingSound); @@ -31,6 +32,7 @@ const useGoalActions = () => { const subGoalsHistory = state?.goalsHistory || []; const ancestors = subGoalsHistory.map((ele) => ele.goalID); const { goal: activeGoal } = useActiveGoalContext(); + const suggestedGoal = useRecoilValue(suggestedGoalState); const setShowToast = useSetRecoilState(displayToast); @@ -90,11 +92,20 @@ const useGoalActions = () => { // Comparing hashes of the old (activeGoal) and updated (goal) versions to check if the goal has changed await modifyGoal(goal.id, goal, [...ancestors, goal.id], updatedHintOption); setLastAction("goalUpdated"); - setShowToast({ - open: true, - message: "Goal updated!", - extra: "", - }); + if (suggestedGoal) { + setShowToast({ + open: true, + message: "Goal (re)created!", + extra: "", + }); + } else { + setShowToast({ + open: true, + message: "Goal updated!", + extra: "", + }); + } + addGoalSound.play(); } }; From 1254eec194f2d27a36b09707d473eb0ff3689e47 Mon Sep 17 00:00:00 2001 From: Vinay Badgujar Date: Tue, 15 Oct 2024 13:59:22 +0530 Subject: [PATCH 90/93] refactor: made requested changes --- src/api/GoalsAPI/index.ts | 16 +++++++++------- .../components/ArchivedAutoComplete.tsx | 4 ++-- src/contexts/parentGoal-context.tsx | 2 +- src/hooks/useGoalActions.tsx | 19 +++++-------------- src/hooks/useGoalStore.tsx | 12 +++++------- 5 files changed, 22 insertions(+), 31 deletions(-) diff --git a/src/api/GoalsAPI/index.ts b/src/api/GoalsAPI/index.ts index f5f264337..b0cd37cae 100644 --- a/src/api/GoalsAPI/index.ts +++ b/src/api/GoalsAPI/index.ts @@ -353,27 +353,29 @@ export const addHintGoaltoMyGoals = async (goal: GoalItem) => { ]); }; -export const fetchArchivedGoalByTitle = async (goalId: string, parentGoalId: string) => { - if (goalId.trim() === "") { +export const fetchArchivedDescendantGoalByTitle = async (goalTitle: string, parentGoalId: string) => { + if (!goalTitle.trim()) { return []; } - const lowerCaseValue = goalId.toLowerCase(); + const searchTitle = goalTitle.toLowerCase(); const getAllChildrenGoals = async (id: string): Promise => { const directChildren = await getChildrenGoals(id); - const allChildren = await Promise.all( + const allDescendantGoals = await Promise.all( directChildren.map(async (child) => { const grandchildren = await getAllChildrenGoals(child.id); return [child, ...grandchildren]; }), ); - return allChildren.flat(); + return allDescendantGoals.flat(); }; - const allChildren = await getAllChildrenGoals(parentGoalId); + const allDescendantGoals = await getAllChildrenGoals(parentGoalId); - return allChildren.filter((goal) => goal.archived === "true" && goal.title.toLowerCase().startsWith(lowerCaseValue)); + return allDescendantGoals.filter( + (goal) => goal.archived === "true" && goal.title.toLowerCase().startsWith(searchTitle), + ); }; diff --git a/src/components/GoalsComponents/GoalConfigModal/components/ArchivedAutoComplete.tsx b/src/components/GoalsComponents/GoalConfigModal/components/ArchivedAutoComplete.tsx index 63eac5ec2..ff0c91fb3 100644 --- a/src/components/GoalsComponents/GoalConfigModal/components/ArchivedAutoComplete.tsx +++ b/src/components/GoalsComponents/GoalConfigModal/components/ArchivedAutoComplete.tsx @@ -1,7 +1,7 @@ import React, { useState, useCallback } from "react"; import { GoalItem } from "@src/models/GoalItem"; import AutocompleteComponent from "@components/GoalsComponents/GoalConfigModal/components/AutoComplete"; -import { fetchArchivedGoalByTitle } from "@src/api/GoalsAPI"; +import { fetchArchivedDescendantGoalByTitle } from "@src/api/GoalsAPI"; import { useParentGoalContext } from "@src/contexts/parentGoal-context"; interface ArchivedAutoCompleteProps { @@ -26,7 +26,7 @@ const ArchivedAutoComplete: React.FC = ({ const searchArchivedGoals = useCallback( async (value: string) => { - const goals = await fetchArchivedGoalByTitle(value, parentGoalId); + const goals = await fetchArchivedDescendantGoalByTitle(value, parentGoalId); setFilteredGoals(goals); }, [parentGoalId], diff --git a/src/contexts/parentGoal-context.tsx b/src/contexts/parentGoal-context.tsx index 5d21ec52e..413be6d6a 100644 --- a/src/contexts/parentGoal-context.tsx +++ b/src/contexts/parentGoal-context.tsx @@ -70,7 +70,7 @@ export const ParentGoalProvider = ({ children }: { children: ReactNode }) => { }, [parentId]); useEffect(() => { - if (suggestedGoal === null) { + if (!suggestedGoal) { init(); } }, [suggestedGoal]); diff --git a/src/hooks/useGoalActions.tsx b/src/hooks/useGoalActions.tsx index 5ebc4b507..20d0925e7 100644 --- a/src/hooks/useGoalActions.tsx +++ b/src/hooks/useGoalActions.tsx @@ -92,20 +92,11 @@ const useGoalActions = () => { // Comparing hashes of the old (activeGoal) and updated (goal) versions to check if the goal has changed await modifyGoal(goal.id, goal, [...ancestors, goal.id], updatedHintOption); setLastAction("goalUpdated"); - if (suggestedGoal) { - setShowToast({ - open: true, - message: "Goal (re)created!", - extra: "", - }); - } else { - setShowToast({ - open: true, - message: "Goal updated!", - extra: "", - }); - } - + setShowToast({ + open: true, + message: suggestedGoal ? "Goal (re)created!" : "Goal updated!", + extra: "", + }); addGoalSound.play(); } }; diff --git a/src/hooks/useGoalStore.tsx b/src/hooks/useGoalStore.tsx index 6393e7bbb..238e4a495 100644 --- a/src/hooks/useGoalStore.tsx +++ b/src/hooks/useGoalStore.tsx @@ -13,14 +13,12 @@ const useGoalStore = () => { const openEditMode = (goal: GoalItem, customState?: ILocationState) => { const prefix = `${partnerId ? `/partners/${partnerId}/` : "/"}goals`; - const newState = { - ...location.state, - goalType: goal.category === "Budget" ? "Budget" : "Goal", - ...customState, - }; - navigate(`${prefix}/${goal.parentGoalId}/${goal.id}?type=${goal.category}&mode=edit`, { - state: newState, + state: { + ...location.state, + goalType: goal.category === "Budget" ? "Budget" : "Goal", + ...customState, + }, replace: true, }); }; From 6aa3da5b1735b515b699c6c1355cae1beedbcd92 Mon Sep 17 00:00:00 2001 From: Rupali Haldiya <78981177+rupali-codes@users.noreply.github.com> Date: Wed, 16 Oct 2024 08:55:10 +0530 Subject: [PATCH 91/93] fix: show scrollbar on overflow (#2061) * fix: show scrollbar on overflow * chore: put CSS back in the JSX file --- src/global.scss | 11 +++++++++++ src/layouts/AppLayout.tsx | 7 +++++-- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/src/global.scss b/src/global.scss index f052e0a4a..3d62b2048 100644 --- a/src/global.scss +++ b/src/global.scss @@ -4,6 +4,17 @@ div::-webkit-scrollbar { display: none; } +/* App Layout */ +.appLayout::-webkit-scrollbar { + display: block; + width: 8px; +} + +.appLayout::-webkit-scrollbar-thumb { + background-color: rgba(140, 140, 140, 0.5); + border-radius: 4px; +} + img { width: 24px; height: 24px; diff --git a/src/layouts/AppLayout.tsx b/src/layouts/AppLayout.tsx index 5f019be3e..72b382821 100644 --- a/src/layouts/AppLayout.tsx +++ b/src/layouts/AppLayout.tsx @@ -13,12 +13,15 @@ const AppLayout: React.FC = ({ children, title, debounceSearch } maxWidth: 600, minWidth: 236, overflow: "scroll", + scrollBehavior: "smooth", width: "100%", marginTop: 60, + marginBottom: 7, height: "calc(100vh - 112px)", - position: "sticky", - paddingBottom: 150, + paddingBottom: 100, + zIndex: 0, }} + className="appLayout" > {children}
From 86d8faf6449c4fdc24574302dc8b3aa28db53049 Mon Sep 17 00:00:00 2001 From: Tijl Leenders Date: Fri, 25 Oct 2024 14:24:46 +0200 Subject: [PATCH 92/93] scheduler optimized for speed - no debug info --- pkg/scheduler.d.ts | 9 +- pkg/scheduler.js | 453 ++++++++++++++++-------------------------- pkg/scheduler_bg.wasm | Bin 1035320 -> 183324 bytes 3 files changed, 179 insertions(+), 283 deletions(-) diff --git a/pkg/scheduler.d.ts b/pkg/scheduler.d.ts index bee3360d1..0966b36d1 100644 --- a/pkg/scheduler.d.ts +++ b/pkg/scheduler.d.ts @@ -1,14 +1,11 @@ /* tslint:disable */ /* eslint-disable */ - -import { ISchedulerInput, ISchedulerOutput } from "@src/Interfaces/IScheduler"; - /** * The main wasm function to call - * @param {ISchedulerInput} input - * @returns {ISchedulerOutput} + * @param {any} input + * @returns {any} */ -export function schedule(input: ISchedulerInput): ISchedulerOutput | undefined; +export function schedule(input: any): any; interface Input { startDate: string; diff --git a/pkg/scheduler.js b/pkg/scheduler.js index e2d5ab236..3aafb9e83 100644 --- a/pkg/scheduler.js +++ b/pkg/scheduler.js @@ -1,5 +1,36 @@ let wasm; +const heap = new Array(128).fill(undefined); + +heap.push(undefined, null, true, false); + +function getObject(idx) { + return heap[idx]; +} + +let heap_next = heap.length; + +function dropObject(idx) { + if (idx < 132) return; + heap[idx] = heap_next; + heap_next = idx; +} + +function takeObject(idx) { + const ret = getObject(idx); + dropObject(idx); + return ret; +} + +function addHeapObject(obj) { + if (heap_next === heap.length) heap.push(heap.length + 1); + const idx = heap_next; + heap_next = heap[idx]; + + heap[idx] = obj; + return idx; +} + const cachedTextDecoder = typeof TextDecoder !== "undefined" ? new TextDecoder("utf-8", { ignoreBOM: true, fatal: true }) @@ -27,33 +58,6 @@ function getStringFromWasm0(ptr, len) { return cachedTextDecoder.decode(getUint8Memory0().subarray(ptr, ptr + len)); } -const heap = new Array(128).fill(undefined); - -heap.push(undefined, null, true, false); - -let heap_next = heap.length; - -function addHeapObject(obj) { - if (heap_next === heap.length) heap.push(heap.length + 1); - const idx = heap_next; - heap_next = heap[idx]; - - if (typeof heap_next !== "number") throw new Error("corrupt heap"); - - heap[idx] = obj; - return idx; -} - -function getObject(idx) { - return heap[idx]; -} - -function _assertBoolean(n) { - if (typeof n !== "boolean") { - throw new Error(`expected a boolean argument, found ${typeof n}`); - } -} - let WASM_VECTOR_LEN = 0; const cachedTextEncoder = @@ -80,8 +84,6 @@ const encodeString = }; function passStringToWasm0(arg, malloc, realloc) { - if (typeof arg !== "string") throw new Error(`expected a string argument, found ${typeof arg}`); - if (realloc === undefined) { const buf = cachedTextEncoder.encode(arg); const ptr = malloc(buf.length, 1) >>> 0; @@ -112,7 +114,7 @@ function passStringToWasm0(arg, malloc, realloc) { ptr = realloc(ptr, len, (len = offset + arg.length * 3), 1) >>> 0; const view = getUint8Memory0().subarray(ptr + offset, ptr + len); const ret = encodeString(arg, view); - if (ret.read !== arg.length) throw new Error("failed to pass whole string"); + offset += ret.written; ptr = realloc(ptr, len, offset, 1) >>> 0; } @@ -134,10 +136,6 @@ function getInt32Memory0() { return cachedInt32Memory0; } -function _assertNum(n) { - if (typeof n !== "number") throw new Error(`expected a number argument, found ${typeof n}`); -} - let cachedFloat64Memory0 = null; function getFloat64Memory0() { @@ -147,6 +145,15 @@ function getFloat64Memory0() { return cachedFloat64Memory0; } +let cachedBigInt64Memory0 = null; + +function getBigInt64Memory0() { + if (cachedBigInt64Memory0 === null || cachedBigInt64Memory0.byteLength === 0) { + cachedBigInt64Memory0 = new BigInt64Array(wasm.memory.buffer); + } + return cachedBigInt64Memory0; +} + function debugString(val) { // primitive types const type = typeof val; @@ -212,31 +219,6 @@ function debugString(val) { return className; } -function _assertBigInt(n) { - if (typeof n !== "bigint") throw new Error(`expected a bigint argument, found ${typeof n}`); -} - -let cachedBigInt64Memory0 = null; - -function getBigInt64Memory0() { - if (cachedBigInt64Memory0 === null || cachedBigInt64Memory0.byteLength === 0) { - cachedBigInt64Memory0 = new BigInt64Array(wasm.memory.buffer); - } - return cachedBigInt64Memory0; -} - -function dropObject(idx) { - if (idx < 132) return; - heap[idx] = heap_next; - heap_next = idx; -} - -function takeObject(idx) { - const ret = getObject(idx); - dropObject(idx); - return ret; -} - let stack_pointer = 128; function addBorrowedObject(obj) { @@ -266,22 +248,6 @@ export function schedule(input) { } } -function logError(f, args) { - try { - return f.apply(this, args); - } catch (e) { - let error = (function () { - try { - return e instanceof Error ? `${e.message}\n\nStack:\n${e.stack}` : e.toString(); - } catch (_) { - return ""; - } - })(); - console.error("wasm-bindgen: imported JS function that was not marked as `catch` threw an error:", error); - throw e; - } -} - function handleError(f, args) { try { return f.apply(this, args); @@ -323,20 +289,25 @@ async function __wbg_load(module, imports) { function __wbg_get_imports() { const imports = {}; imports.wbg = {}; - imports.wbg.__wbindgen_error_new = function (arg0, arg1) { - const ret = new Error(getStringFromWasm0(arg0, arg1)); - return addHeapObject(ret); + imports.wbg.__wbindgen_object_drop_ref = function (arg0) { + takeObject(arg0); }; - imports.wbg.__wbindgen_is_undefined = function (arg0) { - const ret = getObject(arg0) === undefined; - _assertBoolean(ret); + imports.wbg.__wbindgen_is_bigint = function (arg0) { + const ret = typeof getObject(arg0) === "bigint"; return ret; }; - imports.wbg.__wbindgen_in = function (arg0, arg1) { - const ret = getObject(arg0) in getObject(arg1); - _assertBoolean(ret); + imports.wbg.__wbindgen_bigint_from_u64 = function (arg0) { + const ret = BigInt.asUintN(64, arg0); + return addHeapObject(ret); + }; + imports.wbg.__wbindgen_jsval_eq = function (arg0, arg1) { + const ret = getObject(arg0) === getObject(arg1); return ret; }; + imports.wbg.__wbindgen_error_new = function (arg0, arg1) { + const ret = new Error(getStringFromWasm0(arg0, arg1)); + return addHeapObject(ret); + }; imports.wbg.__wbindgen_string_get = function (arg0, arg1) { const obj = getObject(arg1); const ret = typeof obj === "string" ? obj : undefined; @@ -345,72 +316,66 @@ function __wbg_get_imports() { getInt32Memory0()[arg0 / 4 + 1] = len1; getInt32Memory0()[arg0 / 4 + 0] = ptr1; }; - imports.wbg.__wbindgen_is_bigint = function (arg0) { - const ret = typeof getObject(arg0) === "bigint"; - _assertBoolean(ret); - return ret; - }; imports.wbg.__wbindgen_is_object = function (arg0) { const val = getObject(arg0); const ret = typeof val === "object" && val !== null; - _assertBoolean(ret); + return ret; + }; + imports.wbg.__wbindgen_is_undefined = function (arg0) { + const ret = getObject(arg0) === undefined; + return ret; + }; + imports.wbg.__wbindgen_in = function (arg0, arg1) { + const ret = getObject(arg0) in getObject(arg1); return ret; }; imports.wbg.__wbindgen_object_clone_ref = function (arg0) { const ret = getObject(arg0); return addHeapObject(ret); }; - imports.wbg.__wbindgen_jsval_eq = function (arg0, arg1) { - const ret = getObject(arg0) === getObject(arg1); - _assertBoolean(ret); - return ret; - }; - imports.wbg.__wbindgen_bigint_from_u64 = function (arg0) { - const ret = BigInt.asUintN(64, arg0); + imports.wbg.__wbg_new_abda76e883ba8a5f = function () { + const ret = new Error(); return addHeapObject(ret); }; - imports.wbg.__wbg_error_f851667af71bcfc6 = function () { - return logError(function (arg0, arg1) { - let deferred0_0; - let deferred0_1; - try { - deferred0_0 = arg0; - deferred0_1 = arg1; - console.error(getStringFromWasm0(arg0, arg1)); - } finally { - wasm.__wbindgen_free(deferred0_0, deferred0_1, 1); - } - }, arguments); + imports.wbg.__wbg_stack_658279fe44541cf6 = function (arg0, arg1) { + const ret = getObject(arg1).stack; + const ptr1 = passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); + const len1 = WASM_VECTOR_LEN; + getInt32Memory0()[arg0 / 4 + 1] = len1; + getInt32Memory0()[arg0 / 4 + 0] = ptr1; }; - imports.wbg.__wbg_new_abda76e883ba8a5f = function () { - return logError(function () { - const ret = new Error(); - return addHeapObject(ret); - }, arguments); + imports.wbg.__wbg_error_f851667af71bcfc6 = function (arg0, arg1) { + let deferred0_0; + let deferred0_1; + try { + deferred0_0 = arg0; + deferred0_1 = arg1; + console.error(getStringFromWasm0(arg0, arg1)); + } finally { + wasm.__wbindgen_free(deferred0_0, deferred0_1, 1); + } }; - imports.wbg.__wbg_stack_658279fe44541cf6 = function () { - return logError(function (arg0, arg1) { - const ret = getObject(arg1).stack; - const ptr1 = passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); - const len1 = WASM_VECTOR_LEN; - getInt32Memory0()[arg0 / 4 + 1] = len1; - getInt32Memory0()[arg0 / 4 + 0] = ptr1; - }, arguments); + imports.wbg.__wbindgen_jsval_loose_eq = function (arg0, arg1) { + const ret = getObject(arg0) == getObject(arg1); + return ret; + }; + imports.wbg.__wbindgen_boolean_get = function (arg0) { + const v = getObject(arg0); + const ret = typeof v === "boolean" ? (v ? 1 : 0) : 2; + return ret; }; imports.wbg.__wbindgen_number_get = function (arg0, arg1) { const obj = getObject(arg1); const ret = typeof obj === "number" ? obj : undefined; - if (!isLikeNone(ret)) { - _assertNum(ret); - } getFloat64Memory0()[arg0 / 8 + 1] = isLikeNone(ret) ? 0 : ret; getInt32Memory0()[arg0 / 4 + 0] = !isLikeNone(ret); }; - imports.wbg.__wbindgen_boolean_get = function (arg0) { - const v = getObject(arg0); - const ret = typeof v === "boolean" ? (v ? 1 : 0) : 2; - _assertNum(ret); - return ret; + imports.wbg.__wbg_String_88810dfeb4021902 = function (arg0, arg1) { + const ret = String(getObject(arg1)); + const ptr1 = passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); + const len1 = WASM_VECTOR_LEN; + getInt32Memory0()[arg0 / 4 + 1] = len1; + getInt32Memory0()[arg0 / 4 + 0] = ptr1; }; imports.wbg.__wbindgen_number_new = function (arg0) { const ret = arg0; @@ -420,80 +385,32 @@ function __wbg_get_imports() { const ret = getStringFromWasm0(arg0, arg1); return addHeapObject(ret); }; - imports.wbg.__wbindgen_jsval_loose_eq = function (arg0, arg1) { - const ret = getObject(arg0) == getObject(arg1); - _assertBoolean(ret); - return ret; + imports.wbg.__wbg_getwithrefkey_5e6d9547403deab8 = function (arg0, arg1) { + const ret = getObject(arg0)[getObject(arg1)]; + return addHeapObject(ret); }; - imports.wbg.__wbg_String_88810dfeb4021902 = function () { - return logError(function (arg0, arg1) { - const ret = String(getObject(arg1)); - const ptr1 = passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); - const len1 = WASM_VECTOR_LEN; - getInt32Memory0()[arg0 / 4 + 1] = len1; - getInt32Memory0()[arg0 / 4 + 0] = ptr1; - }, arguments); + imports.wbg.__wbg_set_841ac57cff3d672b = function (arg0, arg1, arg2) { + getObject(arg0)[takeObject(arg1)] = takeObject(arg2); }; - imports.wbg.__wbg_getwithrefkey_5e6d9547403deab8 = function () { - return logError(function (arg0, arg1) { - const ret = getObject(arg0)[getObject(arg1)]; - return addHeapObject(ret); - }, arguments); + imports.wbg.__wbg_get_4a9aa5157afeb382 = function (arg0, arg1) { + const ret = getObject(arg0)[arg1 >>> 0]; + return addHeapObject(ret); }; - imports.wbg.__wbg_set_841ac57cff3d672b = function () { - return logError(function (arg0, arg1, arg2) { - getObject(arg0)[takeObject(arg1)] = takeObject(arg2); - }, arguments); + imports.wbg.__wbg_length_cace2e0b3ddc0502 = function (arg0) { + const ret = getObject(arg0).length; + return ret; }; imports.wbg.__wbg_new_08236689f0afb357 = function () { - return logError(function () { - const ret = new Array(); - return addHeapObject(ret); - }, arguments); - }; - imports.wbg.__wbg_get_4a9aa5157afeb382 = function () { - return logError(function (arg0, arg1) { - const ret = getObject(arg0)[arg1 >>> 0]; - return addHeapObject(ret); - }, arguments); - }; - imports.wbg.__wbg_set_0ac78a2bc07da03c = function () { - return logError(function (arg0, arg1, arg2) { - getObject(arg0)[arg1 >>> 0] = takeObject(arg2); - }, arguments); - }; - imports.wbg.__wbg_isArray_38525be7442aa21e = function () { - return logError(function (arg0) { - const ret = Array.isArray(getObject(arg0)); - _assertBoolean(ret); - return ret; - }, arguments); - }; - imports.wbg.__wbg_length_cace2e0b3ddc0502 = function () { - return logError(function (arg0) { - const ret = getObject(arg0).length; - _assertNum(ret); - return ret; - }, arguments); + const ret = new Array(); + return addHeapObject(ret); }; - imports.wbg.__wbg_instanceof_ArrayBuffer_c7cc317e5c29cc0d = function () { - return logError(function (arg0) { - let result; - try { - result = getObject(arg0) instanceof ArrayBuffer; - } catch (_) { - result = false; - } - const ret = result; - _assertBoolean(ret); - return ret; - }, arguments); + imports.wbg.__wbindgen_is_function = function (arg0) { + const ret = typeof getObject(arg0) === "function"; + return ret; }; - imports.wbg.__wbg_call_669127b9d730c650 = function () { - return handleError(function (arg0, arg1) { - const ret = getObject(arg0).call(getObject(arg1)); - return addHeapObject(ret); - }, arguments); + imports.wbg.__wbg_next_15da6a3df9290720 = function (arg0) { + const ret = getObject(arg0).next; + return addHeapObject(ret); }; imports.wbg.__wbg_next_1989a20442400aaa = function () { return handleError(function (arg0) { @@ -501,110 +418,92 @@ function __wbg_get_imports() { return addHeapObject(ret); }, arguments); }; - imports.wbg.__wbg_next_15da6a3df9290720 = function () { - return logError(function (arg0) { - const ret = getObject(arg0).next; - return addHeapObject(ret); - }, arguments); - }; - imports.wbg.__wbg_done_bc26bf4ada718266 = function () { - return logError(function (arg0) { - const ret = getObject(arg0).done; - _assertBoolean(ret); - return ret; - }, arguments); + imports.wbg.__wbg_done_bc26bf4ada718266 = function (arg0) { + const ret = getObject(arg0).done; + return ret; }; - imports.wbg.__wbg_value_0570714ff7d75f35 = function () { - return logError(function (arg0) { - const ret = getObject(arg0).value; - return addHeapObject(ret); - }, arguments); + imports.wbg.__wbg_value_0570714ff7d75f35 = function (arg0) { + const ret = getObject(arg0).value; + return addHeapObject(ret); }; - imports.wbg.__wbg_isSafeInteger_c38b0a16d0c7cef7 = function () { - return logError(function (arg0) { - const ret = Number.isSafeInteger(getObject(arg0)); - _assertBoolean(ret); - return ret; - }, arguments); + imports.wbg.__wbg_iterator_7ee1a391d310f8e4 = function () { + const ret = Symbol.iterator; + return addHeapObject(ret); }; - imports.wbg.__wbg_new_c728d68b8b34487e = function () { - return logError(function () { - const ret = new Object(); + imports.wbg.__wbg_get_2aff440840bb6202 = function () { + return handleError(function (arg0, arg1) { + const ret = Reflect.get(getObject(arg0), getObject(arg1)); return addHeapObject(ret); }, arguments); }; - imports.wbg.__wbg_iterator_7ee1a391d310f8e4 = function () { - return logError(function () { - const ret = Symbol.iterator; + imports.wbg.__wbg_call_669127b9d730c650 = function () { + return handleError(function (arg0, arg1) { + const ret = getObject(arg0).call(getObject(arg1)); return addHeapObject(ret); }, arguments); }; - imports.wbg.__wbg_instanceof_Uint8Array_19e6f142a5e7e1e1 = function () { - return logError(function (arg0) { - let result; - try { - result = getObject(arg0) instanceof Uint8Array; - } catch (_) { - result = false; - } - const ret = result; - _assertBoolean(ret); - return ret; - }, arguments); + imports.wbg.__wbg_new_c728d68b8b34487e = function () { + const ret = new Object(); + return addHeapObject(ret); }; - imports.wbg.__wbg_new_d8a000788389a31e = function () { - return logError(function (arg0) { - const ret = new Uint8Array(getObject(arg0)); - return addHeapObject(ret); - }, arguments); + imports.wbg.__wbg_set_0ac78a2bc07da03c = function (arg0, arg1, arg2) { + getObject(arg0)[arg1 >>> 0] = takeObject(arg2); }; - imports.wbg.__wbg_length_a5587d6cd79ab197 = function () { - return logError(function (arg0) { - const ret = getObject(arg0).length; - _assertNum(ret); - return ret; - }, arguments); + imports.wbg.__wbg_isArray_38525be7442aa21e = function (arg0) { + const ret = Array.isArray(getObject(arg0)); + return ret; }; - imports.wbg.__wbg_set_dcfd613a3420f908 = function () { - return logError(function (arg0, arg1, arg2) { - getObject(arg0).set(getObject(arg1), arg2 >>> 0); - }, arguments); + imports.wbg.__wbg_instanceof_ArrayBuffer_c7cc317e5c29cc0d = function (arg0) { + let result; + try { + result = getObject(arg0) instanceof ArrayBuffer; + } catch (_) { + result = false; + } + const ret = result; + return ret; }; - imports.wbg.__wbindgen_is_function = function (arg0) { - const ret = typeof getObject(arg0) === "function"; - _assertBoolean(ret); + imports.wbg.__wbg_isSafeInteger_c38b0a16d0c7cef7 = function (arg0) { + const ret = Number.isSafeInteger(getObject(arg0)); return ret; }; - imports.wbg.__wbg_get_2aff440840bb6202 = function () { - return handleError(function (arg0, arg1) { - const ret = Reflect.get(getObject(arg0), getObject(arg1)); - return addHeapObject(ret); - }, arguments); + imports.wbg.__wbg_buffer_344d9b41efe96da7 = function (arg0) { + const ret = getObject(arg0).buffer; + return addHeapObject(ret); }; - imports.wbg.__wbg_buffer_344d9b41efe96da7 = function () { - return logError(function (arg0) { - const ret = getObject(arg0).buffer; - return addHeapObject(ret); - }, arguments); + imports.wbg.__wbg_new_d8a000788389a31e = function (arg0) { + const ret = new Uint8Array(getObject(arg0)); + return addHeapObject(ret); }; - imports.wbg.__wbindgen_debug_string = function (arg0, arg1) { - const ret = debugString(getObject(arg1)); - const ptr1 = passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); - const len1 = WASM_VECTOR_LEN; - getInt32Memory0()[arg0 / 4 + 1] = len1; - getInt32Memory0()[arg0 / 4 + 0] = ptr1; + imports.wbg.__wbg_set_dcfd613a3420f908 = function (arg0, arg1, arg2) { + getObject(arg0).set(getObject(arg1), arg2 >>> 0); + }; + imports.wbg.__wbg_length_a5587d6cd79ab197 = function (arg0) { + const ret = getObject(arg0).length; + return ret; + }; + imports.wbg.__wbg_instanceof_Uint8Array_19e6f142a5e7e1e1 = function (arg0) { + let result; + try { + result = getObject(arg0) instanceof Uint8Array; + } catch (_) { + result = false; + } + const ret = result; + return ret; }; imports.wbg.__wbindgen_bigint_get_as_i64 = function (arg0, arg1) { const v = getObject(arg1); const ret = typeof v === "bigint" ? v : undefined; - if (!isLikeNone(ret)) { - _assertBigInt(ret); - } getBigInt64Memory0()[arg0 / 8 + 1] = isLikeNone(ret) ? BigInt(0) : ret; getInt32Memory0()[arg0 / 4 + 0] = !isLikeNone(ret); }; - imports.wbg.__wbindgen_object_drop_ref = function (arg0) { - takeObject(arg0); + imports.wbg.__wbindgen_debug_string = function (arg0, arg1) { + const ret = debugString(getObject(arg1)); + const ptr1 = passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); + const len1 = WASM_VECTOR_LEN; + getInt32Memory0()[arg0 / 4 + 1] = len1; + getInt32Memory0()[arg0 / 4 + 0] = ptr1; }; imports.wbg.__wbindgen_throw = function (arg0, arg1) { throw new Error(getStringFromWasm0(arg0, arg1)); diff --git a/pkg/scheduler_bg.wasm b/pkg/scheduler_bg.wasm index 7a3668eb59d51e78b25399ce8d17328c4d840481..85f2f256ce4859bedc53baebafeed589ac28b7c8 100644 GIT binary patch literal 183324 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Ƴ_j}fqd&W^QRjV`0Uxgf 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 aI#>aw4|s?hYVo6;A1vlW3l<9QZvPL)Pm9t3 literal 1035320 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 TloRphU*B?b`NZ0JSW^6dr~bTn From cafbcd26e34c6dfada621686a60ff209ffac0294 Mon Sep 17 00:00:00 2001 From: shifra-fraiman Date: Mon, 4 Nov 2024 15:14:35 +0200 Subject: [PATCH 93/93] delete duplicate --- src/pages/GoalsPage/GoalsPage.scss | 322 ++--------------------------- 1 file changed, 12 insertions(+), 310 deletions(-) diff --git a/src/pages/GoalsPage/GoalsPage.scss b/src/pages/GoalsPage/GoalsPage.scss index 7240564f9..9686ac180 100644 --- a/src/pages/GoalsPage/GoalsPage.scss +++ b/src/pages/GoalsPage/GoalsPage.scss @@ -1,288 +1,3 @@ -.myGoals-container { - display: flex; - flex-direction: column; - align-items: center; -} -.sec-header { - display: flex; - justify-content: space-between; - margin-bottom: 21px; - .back { - width: unset; - margin-left: 7%; - } - button { - border: none; - } - .activeTab { - text-decoration: underline; - opacity: 1; - } -} - -.myGoals_title, -.myGoals_title-dark { - margin: 7px 18px 0 18px; - font-family: "Montserrat"; - font-weight: bolder; - font-size: 1.429em; - opacity: 0.6; -} - -#myGoals-list { - margin: 18px 18px 0% 18px; - height: 418px; - overflow-y: auto; - height: 50%; -} -#myGoals-list::-webkit-scrollbar { - display: none; -} - -.user-goal, -.user-goal-dark { - position: relative; - word-break: break-all; - text-align: left; - cursor: pointer; - width: 100%; - background: transparent; - .user-goal-main { - display: flex; - height: 100%; - gap: 16px; - align-items: center; - margin-left: 20px; - } - .contact-button { - position: absolute; - right: 28px; - top: 23px; - .contact-icon { - border: none; - border-radius: 50%; - width: 24px; - height: 24px; - - padding: 0; - display: flex; - align-items: center; - justify-content: center; - } - } -} - -.pps-icon > svg { - width: 16px; - height: 16px; -} - -.goal-dropdown, -.goal-dd-inner, -.goal-dd-outer { - display: flex; - align-items: center; - justify-content: center; -} - -.goal-dd-inner, -.goal-dd-outer { - border-radius: 22px; - width: 28px; - height: 28px; -} - -.goal-dd-inner { - width: 16px; - height: 16px; - border-radius: 22px; - border: 1px solid; -} - -.goal-menu-dots { - display: flex; - align-items: center; - justify-content: center; - gap: 5px; - padding-top: 5px; -} - -.goal-menu-dots span { - width: 3.5px; - height: 3.5px; - border-radius: 50%; - background-color: white; - display: inline-block; -} - -#addGoal-btn { - position: fixed; - bottom: 20px; - right: 20px; - cursor: pointer; -} - -.goal-tile { - border: none; - display: flex; - font-family: "Montserrat"; - font-weight: 400; - font-size: 18px; - width: 100%; - text-align: left !important; - max-width: unset; - overflow: hidden; - padding: 20px 0; - flex-direction: column; - justify-content: flex-start; - gap: 6px; -} - -.goal-title.completed { - white-space: nowrap; - overflow-x: scroll; - scrollbar-width: none; - line-height: 31px; - text-decoration: line-through; - text-decoration-thickness: 2px; -} -.goal-title::-webkit-scrollbar { - display: none; -} - -.goal-item-summary-wrapper { - white-space: pre-line; - font-size: 0.875em !important; - font-weight: 300 !important; -} - -.goal-glow { - animation: glowAnimation 0.5s infinite ease-in-out; -} - -@keyframes glowAnimation { - 0%, - 100% { - background-color: rgba(255, 215, 0, 0.2); - box-shadow: - 0 0 2px rgba(255, 215, 0, 0.7), - 0 0 5px rgba(255, 215, 0, 0.7), - 0 0 2px rgba(255, 215, 0, 0.7); - } - 15%, - 85% { - background-color: rgba(255, 215, 0, 0.4); - box-shadow: - 0 0 2px rgba(255, 215, 0, 0.9), - 0 0 5px rgba(255, 215, 0, 0.9), - 0 0 2px rgba(255, 215, 0, 0.9); - } - 30%, - 70% { - background-color: rgba(255, 215, 0, 0.6); - box-shadow: - 0 0 2px rgba(255, 215, 0, 0.7), - 0 0 5px rgba(255, 215, 0, 0.7), - 0 0 2px rgba(255, 215, 0, 0.7); - } - 50% { - background-color: rgba(255, 215, 0, 0.8); - box-shadow: - 0 0 2px rgba(255, 215, 0, 0.7), - 0 0 5px rgba(255, 215, 0); - } -} - -.goal-link { - // width: 100%; - border: none; - - font-weight: bold; - font-size: 1em; -} - -.my-goals-content { - display: flex; - flex-direction: column; - justify-content: center; - width: 100%; -} - -#addGoalForm { - .mygoalsbutton-dark, - .mygoalsbutton-light { - display: none; - } - - .todo-form { - margin-bottom: 24px !important; - } - - .addtask-light, - .addtask-dark { - margin: 0 !important; - padding: 3% 4% !important; - width: 100% !important; - outline: none; - } -} - -#updateGoalForm { - .mygoalsbutton-dark, - .mygoalsbutton-light { - display: none; - } - - .todo-form { - margin-bottom: 24px !important; - } - - .addtask-light, - .addtask-dark { - margin: 10px 0px 0px 0px !important; - padding: 3% 4% !important; - width: 100% !important; - outline: none; - } -} - -#Notifications-accordion { - margin-top: 0 !important; -} -.notification-item { - flex-direction: row; - justify-content: space-between; - align-items: center; - min-height: unset; - p { - margin: 0; - } - button { - margin: 0; - place-self: initial; - padding: 8px 12px; - font-size: 0.875em; - } -} - -.archived-drawer { - margin-top: 32px; - .ant-collapse-header, - .ant-collapse-item, - .ant-collapse-content { - border: none !important; - } - .ant-collapse-content { - background: transparent; - } - .ant-collapse-content-box { - padding: 0 !important; - } - .ant-collapse-header { - padding: 0 16 !important; - } -} - .myGoals-container { display: flex; flex-direction: column; @@ -431,6 +146,14 @@ gap: 6px; } +.goal-title.completed { + white-space: nowrap; + overflow-x: scroll; + scrollbar-width: none; + line-height: 31px; + text-decoration: line-through; + text-decoration-thickness: 2px; +} .goal-title::-webkit-scrollbar { display: none; } @@ -449,35 +172,21 @@ 0%, 100% { background-color: rgba(255, 215, 0, 0.2); - box-shadow: - 0 0 2px rgba(255, 215, 0, 0.7), - 0 0 5px rgba(255, 215, 0, 0.7), - 0 0 2px rgba(255, 215, 0, 0.7); + box-shadow: 0 0 2px rgba(255, 215, 0, 0.7), 0 0 5px rgba(255, 215, 0, 0.7), 0 0 2px rgba(255, 215, 0, 0.7); } - 15%, 85% { background-color: rgba(255, 215, 0, 0.4); - box-shadow: - 0 0 2px rgba(255, 215, 0, 0.9), - 0 0 5px rgba(255, 215, 0, 0.9), - 0 0 2px rgba(255, 215, 0, 0.9); + box-shadow: 0 0 2px rgba(255, 215, 0, 0.9), 0 0 5px rgba(255, 215, 0, 0.9), 0 0 2px rgba(255, 215, 0, 0.9); } - 30%, 70% { background-color: rgba(255, 215, 0, 0.6); - box-shadow: - 0 0 2px rgba(255, 215, 0, 0.7), - 0 0 5px rgba(255, 215, 0, 0.7), - 0 0 2px rgba(255, 215, 0, 0.7); + box-shadow: 0 0 2px rgba(255, 215, 0, 0.7), 0 0 5px rgba(255, 215, 0, 0.7), 0 0 2px rgba(255, 215, 0, 0.7); } - 50% { background-color: rgba(255, 215, 0, 0.8); - box-shadow: - 0 0 2px rgba(255, 215, 0, 0.7), - 0 0 5px rgba(255, 215, 0); + box-shadow: 0 0 2px rgba(255, 215, 0, 0.7), 0 0 5px rgba(255, 215, 0); } } @@ -537,17 +246,14 @@ #Notifications-accordion { margin-top: 0 !important; } - .notification-item { flex-direction: row; justify-content: space-between; align-items: center; min-height: unset; - p { margin: 0; } - button { margin: 0; place-self: initial; @@ -558,21 +264,17 @@ .archived-drawer { margin-top: 32px; - .ant-collapse-header, .ant-collapse-item, .ant-collapse-content { border: none !important; } - .ant-collapse-content { background: transparent; } - .ant-collapse-content-box { padding: 0 !important; } - .ant-collapse-header { padding: 0 16 !important; }