From 6a96cb90dfa224c24255f3db3f1706c613400bad Mon Sep 17 00:00:00 2001 From: Beatrice Mkumbo Date: Thu, 7 Nov 2024 17:33:46 -0800 Subject: [PATCH] fix(web): time disappear on cancel timeline popup (#1220) Co-authored-by: lby --- web/package.json | 1 - .../Visualizer/Crust/StoryPanel/utils.ts | 8 +- .../shared/hooks/useTimelineBlock.ts | 6 +- .../reearth-ui/components/ClickAway/index.tsx | 37 ++++++ .../components/PopupPanel/index.tsx | 32 ++--- .../components/TimePicker/index.tsx | 2 + .../beta/lib/reearth-ui/components/index.ts | 1 + .../fields/TimePeriodField/EditPanel/hooks.ts | 107 ++++++++++++++++ .../{EditModal.tsx => EditPanel/index.tsx} | 62 +++------ .../beta/ui/fields/TimePeriodField/hooks.ts | 119 ------------------ .../beta/ui/fields/TimePeriodField/index.tsx | 16 ++- .../fields/TimePointField/EditPanel/hooks.ts | 77 ++++++++++++ .../{EditPanel.tsx => EditPanel/index.tsx} | 19 +-- .../beta/ui/fields/TimePointField/hooks.ts | 108 ---------------- .../beta/ui/fields/TimePointField/index.tsx | 61 +++++---- web/src/beta/utils/moment-timezone.ts | 35 ------ web/src/beta/utils/time.ts | 61 +++++++++ .../theme/reearthTheme/common/index.ts | 7 +- web/yarn.lock | 17 --- 19 files changed, 372 insertions(+), 404 deletions(-) create mode 100644 web/src/beta/lib/reearth-ui/components/ClickAway/index.tsx create mode 100644 web/src/beta/ui/fields/TimePeriodField/EditPanel/hooks.ts rename web/src/beta/ui/fields/TimePeriodField/{EditModal.tsx => EditPanel/index.tsx} (56%) delete mode 100644 web/src/beta/ui/fields/TimePeriodField/hooks.ts create mode 100644 web/src/beta/ui/fields/TimePointField/EditPanel/hooks.ts rename web/src/beta/ui/fields/TimePointField/{EditPanel.tsx => EditPanel/index.tsx} (85%) delete mode 100644 web/src/beta/ui/fields/TimePointField/hooks.ts delete mode 100644 web/src/beta/utils/moment-timezone.ts diff --git a/web/package.json b/web/package.json index 6ee97ffbf1..5688decf3a 100644 --- a/web/package.json +++ b/web/package.json @@ -149,7 +149,6 @@ "lexical": "0.12.2", "localforage": "1.10.0", "lodash-es": "4.17.21", - "moment-timezone": "0.5.45", "quickjs-emscripten": "0.24.0", "quickjs-emscripten-sync": "1.5.2", "rc-slider": "9.7.5", diff --git a/web/src/beta/features/Visualizer/Crust/StoryPanel/utils.ts b/web/src/beta/features/Visualizer/Crust/StoryPanel/utils.ts index d4c7b16f4b..49f36d3b2c 100644 --- a/web/src/beta/features/Visualizer/Crust/StoryPanel/utils.ts +++ b/web/src/beta/features/Visualizer/Crust/StoryPanel/utils.ts @@ -1,4 +1,5 @@ import { IconName } from "@reearth/beta/lib/reearth-ui"; +import { getTimeZone } from "@reearth/beta/utils/time"; import { ValueTypes, ValueType } from "@reearth/beta/utils/value"; import type { Spacing } from "@reearth/core"; import type { Item } from "@reearth/services/api/propertyApi/utils"; @@ -190,18 +191,13 @@ export const convertPositionToTime = ( return Math.min(Math.max(start, start + sec), end); }; -export const getTimeZone = (time: string) => { - const zone = time.match(/([-+]\d{1,2}:\d{2})$/); - const timezoneOffset = zone?.[1]; - return timezoneOffset || ""; -}; - export const formatISO8601 = (time: string) => { // For backforad compatibility // from: 2021-08-31T00:00:00 +9:00 // from: 2021-08-31T00:00:00+9:00 // to: 2021-08-31T00:00:00+09:00 const timezone = getTimeZone(time); + if (!timezone) return time; const splitZone = timezone.split(":"); if (splitZone[0].length === 2) { return time diff --git a/web/src/beta/features/Visualizer/shared/hooks/useTimelineBlock.ts b/web/src/beta/features/Visualizer/shared/hooks/useTimelineBlock.ts index ed4fe4ede5..1b01ecc9d7 100644 --- a/web/src/beta/features/Visualizer/shared/hooks/useTimelineBlock.ts +++ b/web/src/beta/features/Visualizer/shared/hooks/useTimelineBlock.ts @@ -1,3 +1,4 @@ +import { getTimeZone } from "@reearth/beta/utils/time"; import { useVisualizer, TickEventCallback, @@ -10,8 +11,7 @@ import { convertOptionToSeconds, formatDateToSting, formatISO8601, - formatTimezone, - getTimeZone + formatTimezone } from "../../Crust/StoryPanel/utils"; export const getNewDate = (d?: Date) => d ?? new Date(); @@ -165,7 +165,7 @@ export default (timelineValues?: TimelineValues) => { const iso8601Time = formatISO8601(timelineValues?.currentTime); const t = getNewDate(new Date(iso8601Time)).getTime(); const timezoneOffset = getTimeZone(iso8601Time); - setTimezone(timezoneOffset); + setTimezone(timezoneOffset ?? ""); return setCurrentTime(t); } else { return setCurrentTime( diff --git a/web/src/beta/lib/reearth-ui/components/ClickAway/index.tsx b/web/src/beta/lib/reearth-ui/components/ClickAway/index.tsx new file mode 100644 index 0000000000..8912676cca --- /dev/null +++ b/web/src/beta/lib/reearth-ui/components/ClickAway/index.tsx @@ -0,0 +1,37 @@ +import { FC, ReactNode, useEffect, useRef } from "react"; + +type ClickAwayProps = { + children: ReactNode; + onClickAway?: () => void; +}; + +export const ClickAway: FC = ({ children, onClickAway }) => { + const containerRef = useRef(null); + + useEffect(() => { + if (!onClickAway) return; + + const handleClickOutside = (event: MouseEvent | TouchEvent) => { + if ( + containerRef.current && + !containerRef.current.contains(event.target as Node) + ) { + onClickAway?.(); + } + }; + + document.addEventListener("mousedown", handleClickOutside, { + passive: true + }); + document.addEventListener("touchstart", handleClickOutside, { + passive: true + }); + + return () => { + document.removeEventListener("mousedown", handleClickOutside); + document.removeEventListener("touchstart", handleClickOutside); + }; + }, [onClickAway]); + + return
{children}
; +}; diff --git a/web/src/beta/lib/reearth-ui/components/PopupPanel/index.tsx b/web/src/beta/lib/reearth-ui/components/PopupPanel/index.tsx index 14b4980037..7995d80989 100644 --- a/web/src/beta/lib/reearth-ui/components/PopupPanel/index.tsx +++ b/web/src/beta/lib/reearth-ui/components/PopupPanel/index.tsx @@ -1,4 +1,4 @@ -import { Button } from "@reearth/beta/lib/reearth-ui"; +import { Button, ClickAway } from "@reearth/beta/lib/reearth-ui"; import { fonts, styled } from "@reearth/services/theme"; import { FC, ReactNode } from "react"; @@ -20,20 +20,22 @@ export const PopupPanel: FC = ({ onCancel }) => { return ( - - - {title} -