From 3b240d1fbbf614073a0db9d2183925a610fddb73 Mon Sep 17 00:00:00 2001 From: jnkeniaem Date: Fri, 6 Sep 2024 16:52:55 +0900 Subject: [PATCH 01/23] =?UTF-8?q?[FE]=20REFACT:=20=ED=95=84=EC=9A=94?= =?UTF-8?q?=EC=97=86=EB=8A=94=20=EC=BD=94=EB=93=9C=20=EC=82=AD=EC=A0=9C=20?= =?UTF-8?q?=EB=B0=8F=20=EC=A0=95=EB=A6=AC=20#1680?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- frontend/src/Cabinet/pages/PostLogin.tsx | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/frontend/src/Cabinet/pages/PostLogin.tsx b/frontend/src/Cabinet/pages/PostLogin.tsx index ef31dbbd8..8e352ed19 100644 --- a/frontend/src/Cabinet/pages/PostLogin.tsx +++ b/frontend/src/Cabinet/pages/PostLogin.tsx @@ -2,9 +2,9 @@ import { deleteFcmToken, requestFcmAndGetDeviceToken, } from "@/Cabinet/firebase/firebase-messaging-sw"; -import { useEffect, useState } from "react"; -import { useLocation, useNavigate } from "react-router-dom"; -import { useRecoilState, useSetRecoilState } from "recoil"; +import { useEffect } from "react"; +import { useNavigate } from "react-router-dom"; +import { useSetRecoilState } from "recoil"; import { userState } from "@/Cabinet/recoil/atoms"; import AnnounceTemplate from "@/Cabinet/components/Announce/AnnounceTemplate"; import { UserDto } from "@/Cabinet/types/dto/user.dto"; @@ -15,10 +15,7 @@ import { import { getCookie } from "@/Cabinet/api/react_cookie/cookies"; const PostLogin = (): JSX.Element => { - const [isLoading, setIsLoading] = useState(true); - const [isValidToken, setIsValidToken] = useState(false); - const [myInfo, setMyInfo] = useRecoilState(userState); - + const setMyInfo = useSetRecoilState(userState); const setUser = useSetRecoilState(userState); const navigate = useNavigate(); const token = getCookie("access_token"); @@ -27,7 +24,6 @@ const PostLogin = (): JSX.Element => { try { const { data: myInfo } = await axiosMyInfo(); setUser(myInfo); - setIsValidToken(true); if (myInfo.alarmTypes?.push && myInfo.isDeviceTokenExpired) { await deleteFcmToken(); const deviceToken = await requestFcmAndGetDeviceToken(); From 478da02b20466b9bd35edc7c4b8fcd7179170607 Mon Sep 17 00:00:00 2001 From: jnkeniaem Date: Fri, 6 Sep 2024 16:55:22 +0900 Subject: [PATCH 02/23] =?UTF-8?q?[FE]=20FEAT:=20IButtonProps=EC=97=90=20is?= =?UTF-8?q?Loading=20=EC=B6=94=EA=B0=80#1680?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Card/NotificationCard/NotificationCard.container.tsx | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/frontend/src/Cabinet/components/Card/NotificationCard/NotificationCard.container.tsx b/frontend/src/Cabinet/components/Card/NotificationCard/NotificationCard.container.tsx index 94b2048cd..de55a0a95 100644 --- a/frontend/src/Cabinet/components/Card/NotificationCard/NotificationCard.container.tsx +++ b/frontend/src/Cabinet/components/Card/NotificationCard/NotificationCard.container.tsx @@ -20,6 +20,7 @@ const NotificationCardContainer = ({ alarm }: { alarm: AlarmInfo | null }) => { const [hasErrorOnResponse, setHasErrorOnResponse] = useState(false); const [modalTitle, setModalTitle] = useState(""); const [alarms, setAlarms] = useState({ current: alarm, original: alarm }); + const [isLoading, setIsLoading] = useState(false); const isModified = useMemo( () => JSON.stringify(alarms.current) !== JSON.stringify(alarms.original), [alarms] @@ -42,6 +43,7 @@ const NotificationCardContainer = ({ alarm }: { alarm: AlarmInfo | null }) => { }; const handleSave = async () => { + setIsLoading(true); if (!alarms.current) return; try { await axiosUpdateAlarm(alarms.current); @@ -60,6 +62,7 @@ const NotificationCardContainer = ({ alarm }: { alarm: AlarmInfo | null }) => { setHasErrorOnResponse(true); setModalTitle(error.response.data.message); } finally { + setIsLoading(false); setShowResponseModal(true); } }; @@ -85,12 +88,14 @@ const NotificationCardContainer = ({ alarm }: { alarm: AlarmInfo | null }) => { onClick: handleSave, fontColor: "var(--white-text-with-bg-color)", backgroundColor: "var(--sys-main-color)", - isClickable: true, + isClickable: !isLoading, + isLoading: isLoading, }, { label: "취소", onClick: handleCancel, - isClickable: true, + isClickable: !isLoading, + isLoading: isLoading, }, ] : [ From 5cbbd106595c88325971124ee8a8641ffcf35a99 Mon Sep 17 00:00:00 2001 From: jnkeniaem Date: Fri, 6 Sep 2024 17:04:23 +0900 Subject: [PATCH 03/23] =?UTF-8?q?[FE]=20FIX:=20=EC=B9=B4=EB=93=9C=20?= =?UTF-8?q?=EB=B2=84=ED=8A=BC=20=EA=B0=9C=EB=B3=84=EB=A1=9C=20=EA=B0=90?= =?UTF-8?q?=EC=8B=B8=EB=8A=94=20CardButtonWrapper(cardButtonsWrapper=20X)?= =?UTF-8?q?=EC=B6=94=EA=B0=80=ED=95=B4=20=EB=A1=9C=EB=94=A9=EC=A4=91?= =?UTF-8?q?=EC=9D=BC=EB=95=8C=20cursor=20wait=20=EC=A0=81=EC=9A=A9=20#1680?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- frontend/src/Cabinet/components/Card/Card.tsx | 52 +++++++++++++------ 1 file changed, 35 insertions(+), 17 deletions(-) diff --git a/frontend/src/Cabinet/components/Card/Card.tsx b/frontend/src/Cabinet/components/Card/Card.tsx index e7d4496ba..03ebbf4c8 100644 --- a/frontend/src/Cabinet/components/Card/Card.tsx +++ b/frontend/src/Cabinet/components/Card/Card.tsx @@ -9,6 +9,7 @@ export interface IButtonProps { icon?: React.FunctionComponent> | null; // NOTE: icon 이 있을 경우, icon 을 표시 isClickable: boolean; isExtensible?: boolean; + isLoading?: boolean; } interface CardProps { @@ -41,21 +42,29 @@ const Card = ({ {onClickToolTip && } {buttons.length > 0 && ( - - {buttons?.map((button, index) => ( - - {!button.icon ? button.label : } - - ))} - + + {buttons?.map((button, index) => { + return ( + + + {!button.icon ? button.label : } + + + ); + })} + )} )} @@ -113,17 +122,26 @@ const ToolTipIcon = styled.div` } `; -export const CardButtonWrapper = styled.div` +export const CardButtonsWrapper = styled.div` display: flex; font-size: var(--size-base); `; +const CardButtonWrapper = styled.div<{ + icon?: React.FunctionComponent> | null; + isLoading?: boolean; +}>` + cursor: ${(props) => props.isLoading && "wait"}; + margin-left: ${(props) => !props.icon && "10px"}; +`; + export const CardButtonStyled = styled.div<{ backgroundColor?: string; fontColor?: string; icon?: React.FunctionComponent> | null; isClickable?: boolean; isExtensible?: boolean; + isLoading?: boolean; }>` ${(props) => props.icon @@ -146,12 +164,12 @@ export const CardButtonStyled = styled.div<{ border: none; border-radius: 5px; font-weight: 350; - margin-left: 10px; &:hover { font-weight: ${props.isClickable && 400}; } `} cursor: ${(props) => (props.isClickable ? "pointer" : "default")}; + pointer-events: ${(props) => props.isLoading && "none"}; & > svg { height: 20px; From 30e450c075beeb439567be3d6a3f38efd1c942a4 Mon Sep 17 00:00:00 2001 From: jnkeniaem Date: Mon, 9 Sep 2024 15:29:41 +0900 Subject: [PATCH 04/23] =?UTF-8?q?[FE]=20REFACT:=20=ED=94=84=EB=A1=9C?= =?UTF-8?q?=ED=95=84=20=EC=95=8C=EB=A6=BC=20=EC=B9=B4=EB=93=9C=20=EC=84=A4?= =?UTF-8?q?=EC=A0=95=20=EB=B3=80=EA=B2=BD=20=EA=B4=80=EB=A0=A8=20custom=20?= =?UTF-8?q?axios=20=EC=9D=B4=EB=A6=84=20=EA=B5=AC=EC=B2=B4=EC=A0=81?= =?UTF-8?q?=EC=9C=BC=EB=A1=9C=20=EB=B3=80=EA=B2=BD=20#1680?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- frontend/src/Cabinet/api/axios/axios.custom.ts | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/frontend/src/Cabinet/api/axios/axios.custom.ts b/frontend/src/Cabinet/api/axios/axios.custom.ts index 514135b75..87d5ae4bc 100644 --- a/frontend/src/Cabinet/api/axios/axios.custom.ts +++ b/frontend/src/Cabinet/api/axios/axios.custom.ts @@ -28,10 +28,15 @@ export const axiosMyInfo = async (): Promise => { } }; -const axiosUpdateAlarmURL = "/v4/users/me/alarms"; -export const axiosUpdateAlarm = async (alarm: AlarmInfo): Promise => { +const axiosUpdateAlarmReceptionPathURL = "/v4/users/me/alarms"; +export const axiosUpdateAlarmReceptionPath = async ( + alarm: AlarmInfo +): Promise => { try { - const response = await instance.put(axiosUpdateAlarmURL, alarm); + const response = await instance.put( + axiosUpdateAlarmReceptionPathURL, + alarm + ); return response; } catch (error) { throw error; From f5d699babe77663a75fd22092e40f4a1057144ee Mon Sep 17 00:00:00 2001 From: jnkeniaem Date: Mon, 9 Sep 2024 15:31:56 +0900 Subject: [PATCH 05/23] =?UTF-8?q?[FE]=20REFACT:=20=ED=86=B5=EC=9D=BC?= =?UTF-8?q?=EC=84=B1=20=EB=86=92=EC=9D=B4=EA=B8=B0=20=EC=9C=84=ED=95=B4=20?= =?UTF-8?q?=EC=A0=80=EC=9E=A5=EB=B2=84=ED=8A=BC=20=ED=81=B4=EB=A6=AD?= =?UTF-8?q?=EC=8B=9C=20pointer=20events=20=EB=B3=80=EA=B2=BD=EB=8C=80?= =?UTF-8?q?=EC=8B=A0=20debounce=20=EC=A0=81=EC=9A=A9=20#1680?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../NotificationCard.container.tsx | 42 +++++++++++-------- 1 file changed, 24 insertions(+), 18 deletions(-) diff --git a/frontend/src/Cabinet/components/Card/NotificationCard/NotificationCard.container.tsx b/frontend/src/Cabinet/components/Card/NotificationCard/NotificationCard.container.tsx index de55a0a95..8d5035c07 100644 --- a/frontend/src/Cabinet/components/Card/NotificationCard/NotificationCard.container.tsx +++ b/frontend/src/Cabinet/components/Card/NotificationCard/NotificationCard.container.tsx @@ -11,9 +11,10 @@ import { } from "@/Cabinet/components/Modals/ResponseModal/ResponseModal"; import { AlarmInfo } from "@/Cabinet/types/dto/alarm.dto"; import { - axiosUpdateAlarm, + axiosUpdateAlarmReceptionPath, axiosUpdateDeviceToken, } from "@/Cabinet/api/axios/axios.custom"; +import useDebounce from "@/Cabinet/hooks/useDebounce"; const NotificationCardContainer = ({ alarm }: { alarm: AlarmInfo | null }) => { const [showResponseModal, setShowResponseModal] = useState(false); @@ -25,30 +26,17 @@ const NotificationCardContainer = ({ alarm }: { alarm: AlarmInfo | null }) => { () => JSON.stringify(alarms.current) !== JSON.stringify(alarms.original), [alarms] ); + const { debounce } = useDebounce(); useEffect(() => { setAlarms({ current: alarm, original: alarm }); }, [alarm]); - const handleToggleChange = (type: keyof AlarmInfo, checked: boolean) => { - setAlarms((prev) => { - const current = prev.current - ? { ...prev.current, [type]: checked } - : null; - return { - ...prev, - current, - }; - }); - }; - - const handleSave = async () => { - setIsLoading(true); - if (!alarms.current) return; + const updateAlarmReceptionPath = async () => { try { - await axiosUpdateAlarm(alarms.current); + await axiosUpdateAlarmReceptionPath(alarms.current!); // 푸쉬 알림 설정이 변경되었을 경우, 토큰을 요청하거나 삭제합니다. - if (alarms.current.push) { + if (alarms.current!.push) { const deviceToken = await requestFcmAndGetDeviceToken(); await axiosUpdateDeviceToken(deviceToken); } else { @@ -67,6 +55,24 @@ const NotificationCardContainer = ({ alarm }: { alarm: AlarmInfo | null }) => { } }; + const handleToggleChange = (type: keyof AlarmInfo, checked: boolean) => { + setAlarms((prev) => { + const current = prev.current + ? { ...prev.current, [type]: checked } + : null; + return { + ...prev, + current, + }; + }); + }; + + const handleSave = async () => { + setIsLoading(true); + if (!alarms.current) return; + debounce("alarmReceptionPath", updateAlarmReceptionPath, 300); + }; + const handleCancel = () => { setAlarms((prev) => ({ ...prev, current: prev.original })); }; From fedbd60d882d599543cd31af31bdb5a7fe318c59 Mon Sep 17 00:00:00 2001 From: jnkeniaem Date: Mon, 9 Sep 2024 15:33:04 +0900 Subject: [PATCH 06/23] =?UTF-8?q?[FE]=20REFACT:=20CardButtonWrapper=20?= =?UTF-8?q?=EC=82=AD=EC=A0=9C(=EA=B8=B0=EC=A1=B4=20=EA=B5=AC=EC=A1=B0=20?= =?UTF-8?q?=EB=B3=B5=EA=B5=AC)=20#1680?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- frontend/src/Cabinet/components/Card/Card.tsx | 48 +++++++------------ 1 file changed, 17 insertions(+), 31 deletions(-) diff --git a/frontend/src/Cabinet/components/Card/Card.tsx b/frontend/src/Cabinet/components/Card/Card.tsx index 03ebbf4c8..646e9ac4a 100644 --- a/frontend/src/Cabinet/components/Card/Card.tsx +++ b/frontend/src/Cabinet/components/Card/Card.tsx @@ -43,27 +43,20 @@ const Card = ({ {buttons.length > 0 && ( - {buttons?.map((button, index) => { - return ( - - - {!button.icon ? button.label : } - - - ); - })} + {buttons?.map((button, index) => ( + + {!button.icon ? button.label : } + + ))} )} @@ -127,14 +120,6 @@ export const CardButtonsWrapper = styled.div` font-size: var(--size-base); `; -const CardButtonWrapper = styled.div<{ - icon?: React.FunctionComponent> | null; - isLoading?: boolean; -}>` - cursor: ${(props) => props.isLoading && "wait"}; - margin-left: ${(props) => !props.icon && "10px"}; -`; - export const CardButtonStyled = styled.div<{ backgroundColor?: string; fontColor?: string; @@ -167,9 +152,10 @@ export const CardButtonStyled = styled.div<{ &:hover { font-weight: ${props.isClickable && 400}; } + margin-left: 10px; `} - cursor: ${(props) => (props.isClickable ? "pointer" : "default")}; - pointer-events: ${(props) => props.isLoading && "none"}; + cursor: ${(props) => + props.isClickable ? "pointer" : props.isLoading ? "wait" : "default"}; & > svg { height: 20px; From 34a4f4f8649768190b61f30e3d81e84ad93c0020 Mon Sep 17 00:00:00 2001 From: jnkeniaem Date: Mon, 9 Sep 2024 16:03:39 +0900 Subject: [PATCH 07/23] =?UTF-8?q?[FE]=20REFACT:=20api=20=EC=9A=94=EC=B2=AD?= =?UTF-8?q?=EC=97=90=20=EB=8C=80=ED=95=9C=20=EC=9D=91=EB=8B=B5=20=EC=98=A4?= =?UTF-8?q?=EA=B8=B0=20=EC=A0=84=EA=B9=8C=EC=A7=80=20=EC=B7=A8=EC=86=8C?= =?UTF-8?q?=EB=B2=84=ED=8A=BC=20=EB=88=8C=EB=9F=AC=EB=8F=84=20=EC=95=84?= =?UTF-8?q?=EB=AC=B4=EB=9F=B0=20=EB=8F=99=EC=9E=91=20=EC=95=88=ED=95=98?= =?UTF-8?q?=EA=B2=8C=20=EB=B3=80=EA=B2=BD=20#1680?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Card/NotificationCard/NotificationCard.container.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/frontend/src/Cabinet/components/Card/NotificationCard/NotificationCard.container.tsx b/frontend/src/Cabinet/components/Card/NotificationCard/NotificationCard.container.tsx index 8d5035c07..74e764ac7 100644 --- a/frontend/src/Cabinet/components/Card/NotificationCard/NotificationCard.container.tsx +++ b/frontend/src/Cabinet/components/Card/NotificationCard/NotificationCard.container.tsx @@ -74,7 +74,7 @@ const NotificationCardContainer = ({ alarm }: { alarm: AlarmInfo | null }) => { }; const handleCancel = () => { - setAlarms((prev) => ({ ...prev, current: prev.original })); + !isLoading && setAlarms((prev) => ({ ...prev, current: prev.original })); }; const handleCloseModal = () => { @@ -94,7 +94,7 @@ const NotificationCardContainer = ({ alarm }: { alarm: AlarmInfo | null }) => { onClick: handleSave, fontColor: "var(--white-text-with-bg-color)", backgroundColor: "var(--sys-main-color)", - isClickable: !isLoading, + isClickable: true, isLoading: isLoading, }, { From 1950c37d31e801d8c538c6197099ab4f247fbb5c Mon Sep 17 00:00:00 2001 From: jnkeniaem Date: Mon, 9 Sep 2024 16:07:59 +0900 Subject: [PATCH 08/23] =?UTF-8?q?[FE]=20FIX:=20api=20=EC=9A=94=EC=B2=AD=20?= =?UTF-8?q?=ED=9B=84=20=EC=9D=91=EB=8B=B5=20=EC=88=98=EC=8B=A0=20=EC=A0=84?= =?UTF-8?q?=EA=B9=8C=EC=A7=80=20=EC=B7=A8=EC=86=8C=EB=B2=84=ED=8A=BC=20hov?= =?UTF-8?q?er=EC=8B=9C=20cursor=20=EC=86=8D=EC=84=B1=EA=B0=92=20not-allowe?= =?UTF-8?q?d=EB=A1=9C=20=EC=84=A4=EC=A0=95#1680?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- frontend/src/Cabinet/components/Card/Card.tsx | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/frontend/src/Cabinet/components/Card/Card.tsx b/frontend/src/Cabinet/components/Card/Card.tsx index 646e9ac4a..4df38d07f 100644 --- a/frontend/src/Cabinet/components/Card/Card.tsx +++ b/frontend/src/Cabinet/components/Card/Card.tsx @@ -154,8 +154,14 @@ export const CardButtonStyled = styled.div<{ } margin-left: 10px; `} - cursor: ${(props) => - props.isClickable ? "pointer" : props.isLoading ? "wait" : "default"}; + cursor: ${(props) => { + if (props.isClickable) { + if (props.isLoading) return "wait"; // ex) 프로필 - 알림 요청 후 응답 전까지 저장 버튼 hover시 + return "pointer"; + } + if (props.isLoading) return "not-allowed"; // ex) 프로필 - 알림 요청 후 응답 전까지 취소 버튼 hover시 + return "default"; + }}; & > svg { height: 20px; From 455f8a5d488b2cfc27f5fd96322e3b9a5a4a9cde Mon Sep 17 00:00:00 2001 From: jnkeniaem Date: Mon, 9 Sep 2024 16:42:40 +0900 Subject: [PATCH 09/23] =?UTF-8?q?[FE]=20FIX:=20grid=20template=20areas?= =?UTF-8?q?=EC=9D=98=20ALERT->ALARM=EC=9C=BC=EB=A1=9C=20=EC=88=98=EC=A0=95?= =?UTF-8?q?=20#1680?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- frontend/src/Cabinet/components/Card/Card.tsx | 3 ++- frontend/src/Cabinet/pages/StoreMainPage.tsx | 6 +++--- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/frontend/src/Cabinet/components/Card/Card.tsx b/frontend/src/Cabinet/components/Card/Card.tsx index 4df38d07f..dd4ae3219 100644 --- a/frontend/src/Cabinet/components/Card/Card.tsx +++ b/frontend/src/Cabinet/components/Card/Card.tsx @@ -149,11 +149,12 @@ export const CardButtonStyled = styled.div<{ border: none; border-radius: 5px; font-weight: 350; + margin-left: 10px; &:hover { font-weight: ${props.isClickable && 400}; } - margin-left: 10px; `} + cursor: ${(props) => { if (props.isClickable) { if (props.isLoading) return "wait"; // ex) 프로필 - 알림 요청 후 응답 전까지 저장 버튼 hover시 diff --git a/frontend/src/Cabinet/pages/StoreMainPage.tsx b/frontend/src/Cabinet/pages/StoreMainPage.tsx index 626935f36..908044530 100644 --- a/frontend/src/Cabinet/pages/StoreMainPage.tsx +++ b/frontend/src/Cabinet/pages/StoreMainPage.tsx @@ -117,7 +117,7 @@ const StoreCoinGridWrapper = styled.div` grid-template-rows: 150px 150px; grid-template-areas: "coinPick EXTENSION SWAP" - "coinPick ALERT PENALTY"; + "coinPick ALARM PENALTY"; padding-bottom: 30px; @@ -127,7 +127,7 @@ const StoreCoinGridWrapper = styled.div` grid-template-areas: "coinPick EXTENSION " "coinPick SWAP" - "ALERT PENALTY"; + "ALARM PENALTY"; } // 나중에 고치기 @@ -139,7 +139,7 @@ const StoreCoinGridWrapper = styled.div` "coinPick" "EXTENSION" "SWAP" - "ALERT" + "ALARM" "PENALTY"; } `; From 3207554d557f546f451f032c49ac1b8b09aaa912 Mon Sep 17 00:00:00 2001 From: jusohn Eddie Sohn Date: Tue, 10 Sep 2024 15:11:47 +0900 Subject: [PATCH 10/23] =?UTF-8?q?[FE]=20FIX:=20=ED=94=84=EB=A1=9C=ED=95=84?= =?UTF-8?q?=EA=B3=BC=20Admin=20Slack=20=EC=97=90=20Notification=20?= =?UTF-8?q?=EC=9D=84=20Alarm=20=EC=9C=BC=EB=A1=9C=20=EB=B3=80=EA=B2=BD?= =?UTF-8?q?=ED=95=B4=20=EB=B0=B1=EC=95=A4=EB=93=9C=EC=99=80=20=ED=86=B5?= =?UTF-8?q?=EC=9D=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- frontend/src/App.tsx | 4 +- .../src/Cabinet/api/axios/axios.custom.ts | 10 +- ...slack-notification.svg => slack-alarm.svg} | 0 .../AlarmCard.container.tsx} | 8 +- .../AlarmCard.tsx} | 10 +- .../LeftMainNav/LeftMainNav.container.tsx | 6 +- .../LeftNav/LeftMainNav/LeftMainNav.tsx | 14 +- .../AlarmModal.tsx} | 2 +- .../src/Cabinet/components/Modals/Modal.tsx | 6 +- .../SlackAlarmSearchBar.tsx} | 10 +- .../SlackAlarmSearchBarList.tsx} | 10 +- .../SlackAlarmSearchListItem.tsx} | 4 +- .../Store/Inventory/InventoryItem.tsx | 121 +++++++++--------- frontend/src/Cabinet/pages/ProfilePage.tsx | 4 +- ...ckNotiPage.tsx => AdminSlackAlarmPage.tsx} | 16 +-- 15 files changed, 107 insertions(+), 118 deletions(-) rename frontend/src/Cabinet/assets/images/{slack-notification.svg => slack-alarm.svg} (100%) rename frontend/src/Cabinet/components/Card/{NotificationCard/NotificationCard.container.tsx => AlarmCard/AlarmCard.container.tsx} (94%) rename frontend/src/Cabinet/components/Card/{NotificationCard/NotificationCard.tsx => AlarmCard/AlarmCard.tsx} (88%) rename frontend/src/Cabinet/components/Modals/{NotificationModal/NotificationModal.tsx => AlarmModal/AlarmModal.tsx} (94%) rename frontend/src/Cabinet/components/{SlackNoti/SlackNotiSearchBar.tsx => SlackAlarm/SlackAlarmSearchBar.tsx} (94%) rename frontend/src/Cabinet/components/{SlackNoti/SlackNotiSearchBarList.tsx => SlackAlarm/SlackAlarmSearchBarList.tsx} (86%) rename frontend/src/Cabinet/components/{SlackNoti/SlackNotiSearchListItem.tsx => SlackAlarm/SlackAlarmSearchListItem.tsx} (93%) rename frontend/src/Cabinet/pages/admin/{AdminSlackNotiPage.tsx => AdminSlackAlarmPage.tsx} (96%) diff --git a/frontend/src/App.tsx b/frontend/src/App.tsx index 4dc792545..82c29e18c 100644 --- a/frontend/src/App.tsx +++ b/frontend/src/App.tsx @@ -16,7 +16,7 @@ import PostLogin from "@/Cabinet/pages/PostLogin"; import ProfilePage from "@/Cabinet/pages/ProfilePage"; import StoreMainPage from "@/Cabinet/pages/StoreMainPage"; import AdminMainPage from "@/Cabinet/pages/admin/AdminMainPage"; -import AdminSlackNotiPage from "@/Cabinet/pages/admin/AdminSlackNotiPage"; +import AdminSlackAlarmPage from "@/Cabinet/pages/admin/AdminSlackAlarmPage"; import AdminStorePage from "@/Cabinet/pages/admin/AdminStorePage"; import LoadingAnimation from "@/Cabinet/components/Common/LoadingAnimation"; import DetailPage from "@/Presentation/pages/DetailPage"; @@ -74,7 +74,7 @@ function App(): React.ReactElement { } /> } /> } /> - } /> + } /> } /> } /> diff --git a/frontend/src/Cabinet/api/axios/axios.custom.ts b/frontend/src/Cabinet/api/axios/axios.custom.ts index 87d5ae4bc..17a4761dd 100644 --- a/frontend/src/Cabinet/api/axios/axios.custom.ts +++ b/frontend/src/Cabinet/api/axios/axios.custom.ts @@ -879,13 +879,13 @@ export const axiosGetAvailableCabinets = async (): Promise => { } }; -const axiosSendSlackNotificationToUserURL = "/slack/send"; -export const axiosSendSlackNotificationToUser = async ( +const axiosSendSlackAlarmToUserURL = "/slack/send"; +export const axiosSendSlackAlarmToUser = async ( receiverName: string, message: string ): Promise => { try { - const response = await instance.post(axiosSendSlackNotificationToUserURL, { + const response = await instance.post(axiosSendSlackAlarmToUserURL, { receiverName: receiverName, message: message, }); @@ -895,13 +895,13 @@ export const axiosSendSlackNotificationToUser = async ( } }; -export const axiosSendSlackNotificationToChannel = async ( +export const axiosSendSlackAlarmToChannel = async ( receiverName: string, message: string, channel: string | undefined ): Promise => { try { - await instance.post(axiosSendSlackNotificationToUserURL + `/${channel}`, { + await instance.post(axiosSendSlackAlarmToUserURL + `/${channel}`, { receiverName: receiverName, message: message, }); diff --git a/frontend/src/Cabinet/assets/images/slack-notification.svg b/frontend/src/Cabinet/assets/images/slack-alarm.svg similarity index 100% rename from frontend/src/Cabinet/assets/images/slack-notification.svg rename to frontend/src/Cabinet/assets/images/slack-alarm.svg diff --git a/frontend/src/Cabinet/components/Card/NotificationCard/NotificationCard.container.tsx b/frontend/src/Cabinet/components/Card/AlarmCard/AlarmCard.container.tsx similarity index 94% rename from frontend/src/Cabinet/components/Card/NotificationCard/NotificationCard.container.tsx rename to frontend/src/Cabinet/components/Card/AlarmCard/AlarmCard.container.tsx index 74e764ac7..28437807a 100644 --- a/frontend/src/Cabinet/components/Card/NotificationCard/NotificationCard.container.tsx +++ b/frontend/src/Cabinet/components/Card/AlarmCard/AlarmCard.container.tsx @@ -3,7 +3,7 @@ import { requestFcmAndGetDeviceToken, } from "@/Cabinet/firebase/firebase-messaging-sw"; import { useEffect, useMemo, useState } from "react"; -import NotificationCard from "@/Cabinet/components/Card/NotificationCard/NotificationCard"; +import AlarmCard from "@/Cabinet/components/Card/AlarmCard/AlarmCard"; import ModalPortal from "@/Cabinet/components/Modals/ModalPortal"; import { FailResponseModal, @@ -16,7 +16,7 @@ import { } from "@/Cabinet/api/axios/axios.custom"; import useDebounce from "@/Cabinet/hooks/useDebounce"; -const NotificationCardContainer = ({ alarm }: { alarm: AlarmInfo | null }) => { +const AlarmCardContainer = ({ alarm }: { alarm: AlarmInfo | null }) => { const [showResponseModal, setShowResponseModal] = useState(false); const [hasErrorOnResponse, setHasErrorOnResponse] = useState(false); const [modalTitle, setModalTitle] = useState(""); @@ -83,7 +83,7 @@ const NotificationCardContainer = ({ alarm }: { alarm: AlarmInfo | null }) => { return ( <> - { ); }; -export default NotificationCardContainer; +export default AlarmCardContainer; diff --git a/frontend/src/Cabinet/components/Card/NotificationCard/NotificationCard.tsx b/frontend/src/Cabinet/components/Card/AlarmCard/AlarmCard.tsx similarity index 88% rename from frontend/src/Cabinet/components/Card/NotificationCard/NotificationCard.tsx rename to frontend/src/Cabinet/components/Card/AlarmCard/AlarmCard.tsx index c07812669..8d909a9ce 100644 --- a/frontend/src/Cabinet/components/Card/NotificationCard/NotificationCard.tsx +++ b/frontend/src/Cabinet/components/Card/AlarmCard/AlarmCard.tsx @@ -7,17 +7,13 @@ import { import ToggleSwitch from "@/Cabinet/components/Common/ToggleSwitch"; import { AlarmInfo } from "@/Cabinet/types/dto/alarm.dto"; -interface NotificationCardProps { +interface AlarmCardProps { alarm: AlarmInfo; buttons: IButtonProps[]; onToggleChange: (type: keyof AlarmInfo, checked: boolean) => void; } -const NotificationCard = ({ - alarm, - buttons, - onToggleChange, -}: NotificationCardProps) => { +const AlarmCard = ({ alarm, buttons, onToggleChange }: AlarmCardProps) => { const handleToggle = (type: keyof AlarmInfo) => (checked: boolean) => { onToggleChange(type, checked); }; @@ -50,4 +46,4 @@ const NotificationCard = ({ ); }; -export default NotificationCard; +export default AlarmCard; diff --git a/frontend/src/Cabinet/components/LeftNav/LeftMainNav/LeftMainNav.container.tsx b/frontend/src/Cabinet/components/LeftNav/LeftMainNav/LeftMainNav.container.tsx index 0f99c12f3..81993b45e 100644 --- a/frontend/src/Cabinet/components/LeftNav/LeftMainNav/LeftMainNav.container.tsx +++ b/frontend/src/Cabinet/components/LeftNav/LeftMainNav/LeftMainNav.container.tsx @@ -128,8 +128,8 @@ const LeftMainNavContainer = ({ isAdmin }: { isAdmin?: boolean }) => { closeAll(); }; - const onClickSlackNotiButton = () => { - navigator("slack-notification"); + const onClickSlackAlarmButton = () => { + navigator("slack-alarm"); closeAll(); }; @@ -182,7 +182,7 @@ const LeftMainNavContainer = ({ isAdmin }: { isAdmin?: boolean }) => { onClickFloorButton={onClickFloorButton} onClickSearchButton={onClickSearchButton} onClickLogoutButton={onClickLogoutButton} - onClickSlackNotiButton={onClickSlackNotiButton} + onClickSlackAlarmButton={onClickSlackAlarmButton} onClickAdminClubButton={onClickAdminClubButton} onClickMainClubButton={onClickMainClubButton} onClickProfileButton={onClickProfileButton} diff --git a/frontend/src/Cabinet/components/LeftNav/LeftMainNav/LeftMainNav.tsx b/frontend/src/Cabinet/components/LeftNav/LeftMainNav/LeftMainNav.tsx index 2251e3ca4..c4119c0d4 100644 --- a/frontend/src/Cabinet/components/LeftNav/LeftMainNav/LeftMainNav.tsx +++ b/frontend/src/Cabinet/components/LeftNav/LeftMainNav/LeftMainNav.tsx @@ -2,7 +2,7 @@ import styled from "styled-components"; import { ReactComponent as LogoutImg } from "@/Cabinet/assets/images/close-square.svg"; import { ReactComponent as ClubImg } from "@/Cabinet/assets/images/clubIconGray.svg"; import { ReactComponent as ProfileImg } from "@/Cabinet/assets/images/profile-circle.svg"; -import { ReactComponent as SlackNotiImg } from "@/Cabinet/assets/images/slack-notification.svg"; +import { ReactComponent as SlackAlarmImg } from "@/Cabinet/assets/images/slack-alarm.svg"; import { ReactComponent as SlackImg } from "@/Cabinet/assets/images/slack.svg"; import { ReactComponent as StoreImg } from "@/Cabinet/assets/images/storeIconGray.svg"; @@ -14,7 +14,7 @@ interface ILeftMainNav { currentFloor: number; onClickFloorButton: Function; onClickLogoutButton: React.MouseEventHandler; - onClickSlackNotiButton: React.MouseEventHandler; + onClickSlackAlarmButton: React.MouseEventHandler; onClickSearchButton: React.MouseEventHandler; onClickAdminClubButton: React.MouseEventHandler; onClickMainClubButton: React.MouseEventHandler; @@ -32,7 +32,7 @@ const LeftMainNav = ({ onClickHomeButton, onClickFloorButton, onClickLogoutButton, - onClickSlackNotiButton, + onClickSlackAlarmButton, onClickAdminClubButton, onClickMainClubButton, onClickProfileButton, @@ -101,14 +101,14 @@ const LeftMainNav = ({ - - Noti + + Alarm = (props) => { )} {iconType === "NOTIFICATION" && ( - + )} {title} @@ -95,7 +95,7 @@ const Modal: React.FC<{ modalContents: IModalContents }> = (props) => { {detail && ( )} - {renderAdditionalComponent && renderAdditionalComponent()} + {renderAdditionalComponent?.()} {type === "hasProceedBtn" && ( - - - {sortedItems.length ? ( - <> - {sortedItems.map((item, idx) => { - const hasTypes = - item.itemDetails !== convertToItemTypeLabel(itemsType); - return ( - - - - - - - {convertToItemTypeLabel(itemsType)} - - {hasTypes && {item.itemDetails}} - - - ); - })} - - ) : ( - !isToggled && ( - - ) - )} - - - + + + +

{convertToItemTypeLabel(itemsType)}

+ + + {showTooltip && ( + handleMouseEnter()} + onMouseLeave={() => handleMouseLeave()} + > + {itemTooltip} + + )} + +
+ +
+ + {sortedItems.length ? ( + <> + {sortedItems.map((item, idx) => { + const hasTypes = + item.itemDetails !== convertToItemTypeLabel(itemsType); + return ( + + + + + + {convertToItemTypeLabel(itemsType)} + {hasTypes && {item.itemDetails}} + + + ); + })} + + ) : ( + !isToggled && ( + + ) + )} + +
); }; diff --git a/frontend/src/Cabinet/pages/ProfilePage.tsx b/frontend/src/Cabinet/pages/ProfilePage.tsx index a91eb6daf..86255bf8c 100644 --- a/frontend/src/Cabinet/pages/ProfilePage.tsx +++ b/frontend/src/Cabinet/pages/ProfilePage.tsx @@ -7,9 +7,9 @@ import { useEffect, useState } from "react"; import { useRecoilState } from "recoil"; import styled from "styled-components"; import { userState } from "@/Cabinet/recoil/atoms"; +import AlarmCardContainer from "@/Cabinet/components/Card/AlarmCard/AlarmCard.container"; import DisplayStyleCardContainer from "@/Cabinet/components/Card/DisplayStyleCard/DisplayStyleCard.container"; import LentInfoCardContainer from "@/Cabinet/components/Card/LentInfoCard/LentInfoCard.container"; -import NotificationCardContainer from "@/Cabinet/components/Card/NotificationCard/NotificationCard.container"; import PointColorCardContainer from "@/Cabinet/components/Card/PointColorCard/PointColorCard.container"; import ProfileCardContainer from "@/Cabinet/components/Card/ProfileCard/ProfileCard.container"; import LoadingAnimation from "@/Cabinet/components/Common/LoadingAnimation"; @@ -56,7 +56,7 @@ const ProfilePage = () => { name={myInfo.name} unbannedAt={myInfo.unbannedAt} /> - + diff --git a/frontend/src/Cabinet/pages/admin/AdminSlackNotiPage.tsx b/frontend/src/Cabinet/pages/admin/AdminSlackAlarmPage.tsx similarity index 96% rename from frontend/src/Cabinet/pages/admin/AdminSlackNotiPage.tsx rename to frontend/src/Cabinet/pages/admin/AdminSlackAlarmPage.tsx index cecc32a9b..94a2df9f0 100644 --- a/frontend/src/Cabinet/pages/admin/AdminSlackNotiPage.tsx +++ b/frontend/src/Cabinet/pages/admin/AdminSlackAlarmPage.tsx @@ -4,7 +4,7 @@ import { FailResponseModal, SuccessResponseModal, } from "@/Cabinet/components/Modals/ResponseModal/ResponseModal"; -import SlackNotiSearchBar from "@/Cabinet/components/SlackNoti/SlackNotiSearchBar"; +import SlackAlarmSearchBar from "@/Cabinet/components/SlackAlarm/SlackAlarmSearchBar"; import { ISlackAlarmTemplate, ISlackChannel, @@ -12,8 +12,8 @@ import { SlackChannels, } from "@/Cabinet/assets/data/SlackAlarm"; import { - axiosSendSlackNotificationToChannel, - axiosSendSlackNotificationToUser, + axiosSendSlackAlarmToChannel, + axiosSendSlackAlarmToUser, } from "@/Cabinet/api/axios/axios.custom"; const hoverAndClickedBtnStyles = css` @@ -22,7 +22,7 @@ const hoverAndClickedBtnStyles = css` border: 1px solid var(--sys-main-color); `; -const AdminSlackNotiPage = () => { +const AdminSlackAlarmPage = () => { const receiverInputRef = useRef(null); const msgTextAreaRef = useRef(null); const [showResponseModal, setShowResponseModal] = useState(false); @@ -65,13 +65,13 @@ const AdminSlackNotiPage = () => { let channelId = SlackChannels.find((channel) => { return receiverInputRef.current!.value === channel.title; })?.channelId; - await axiosSendSlackNotificationToChannel( + await axiosSendSlackAlarmToChannel( receiverInputRef.current.value, msgTextAreaRef.current!.value, channelId ); } else { - await axiosSendSlackNotificationToUser( + await axiosSendSlackAlarmToUser( receiverInputRef.current.value, msgTextAreaRef.current!.value ); @@ -138,7 +138,7 @@ const AdminSlackNotiPage = () => { 받는이(Intra ID/ Channel)* - @@ -319,4 +319,4 @@ const FormButtonStyled = styled.button<{ primary?: boolean }>` } `; -export default AdminSlackNotiPage; +export default AdminSlackAlarmPage; From 01277667b5dfdbdda86073a2a682b7270f25ced5 Mon Sep 17 00:00:00 2001 From: jnkeniaem Date: Tue, 10 Sep 2024 15:58:33 +0900 Subject: [PATCH 11/23] =?UTF-8?q?[FE]=20FIX:=20=EC=95=8C=EB=9E=8C=20?= =?UTF-8?q?=EA=B4=80=EB=A0=A8=EB=90=9C=20=EB=B6=80=EB=B6=84=EC=9D=80=20not?= =?UTF-8?q?ification->alarm,=20=EA=B7=B8=20=EC=99=B8=EC=9D=98=20=EB=B6=80?= =?UTF-8?q?=EB=B6=84=EC=9D=80=20=EC=9B=90=EB=9E=98=EB=8C=80=20=EB=A1=9C=20?= =?UTF-8?q?=EB=B3=B5=EA=B5=AC=20#1680?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- config | 2 +- frontend/src/Cabinet/components/Card/AlarmCard/AlarmCard.tsx | 4 ++-- frontend/src/Cabinet/components/Modals/Modal.tsx | 4 ++-- .../NotificationModal.tsx} | 2 +- frontend/src/Cabinet/pages/ProfilePage.tsx | 4 ++-- 5 files changed, 8 insertions(+), 8 deletions(-) rename frontend/src/Cabinet/components/Modals/{AlarmModal/AlarmModal.tsx => NotificationModal/NotificationModal.tsx} (94%) diff --git a/config b/config index dd72d80cc..bf3813533 160000 --- a/config +++ b/config @@ -1 +1 @@ -Subproject commit dd72d80cce8800e34f3938f3da0dfeb4ef9eb8eb +Subproject commit bf3813533627807962efaee76f9b912f6cbb6f42 diff --git a/frontend/src/Cabinet/components/Card/AlarmCard/AlarmCard.tsx b/frontend/src/Cabinet/components/Card/AlarmCard/AlarmCard.tsx index 8d909a9ce..f8af279f9 100644 --- a/frontend/src/Cabinet/components/Card/AlarmCard/AlarmCard.tsx +++ b/frontend/src/Cabinet/components/Card/AlarmCard/AlarmCard.tsx @@ -22,7 +22,7 @@ const AlarmCard = ({ alarm, buttons, onToggleChange }: AlarmCardProps) => { {label} @@ -32,7 +32,7 @@ const AlarmCard = ({ alarm, buttons, onToggleChange }: AlarmCardProps) => { return ( = (props) => { )} {iconType === "NOTIFICATION" && ( - + )} {title} diff --git a/frontend/src/Cabinet/components/Modals/AlarmModal/AlarmModal.tsx b/frontend/src/Cabinet/components/Modals/NotificationModal/NotificationModal.tsx similarity index 94% rename from frontend/src/Cabinet/components/Modals/AlarmModal/AlarmModal.tsx rename to frontend/src/Cabinet/components/Modals/NotificationModal/NotificationModal.tsx index 534c91a52..297cad861 100644 --- a/frontend/src/Cabinet/components/Modals/AlarmModal/AlarmModal.tsx +++ b/frontend/src/Cabinet/components/Modals/NotificationModal/NotificationModal.tsx @@ -2,7 +2,7 @@ import Modal, { IModalContents } from "@/Cabinet/components/Modals/Modal"; import ModalPortal from "@/Cabinet/components/Modals/ModalPortal"; import IconType from "@/Cabinet/types/enum/icon.type.enum"; -export const AlarmModal = ({ +export const NotificationModal = ({ title, detail, closeModal, diff --git a/frontend/src/Cabinet/pages/ProfilePage.tsx b/frontend/src/Cabinet/pages/ProfilePage.tsx index 86255bf8c..087cccc32 100644 --- a/frontend/src/Cabinet/pages/ProfilePage.tsx +++ b/frontend/src/Cabinet/pages/ProfilePage.tsx @@ -76,7 +76,7 @@ const CardGridWrapper = styled.div` grid-template-rows: 163px 183px 230px; grid-template-areas: "profile lentInfo" // h: 163px h: 366px "displayStyle lentInfo" // h: 183px - "pointColor notification"; // h: 230px h: 230px + "pointColor alarm"; // h: 230px h: 230px @media (max-width: 768px) { grid-template-columns: 350px; @@ -86,7 +86,7 @@ const CardGridWrapper = styled.div` "lentInfo" "displayStyle" "pointColor" - "notification"; + "alarm"; } `; From 2e37a0111344fe9221b1cf03d46056a33442e9b8 Mon Sep 17 00:00:00 2001 From: jnkeniaem Date: Mon, 14 Oct 2024 12:28:06 +0900 Subject: [PATCH 12/23] =?UTF-8?q?[FE]=20REFACT:=20400=20=EC=83=81=ED=83=9C?= =?UTF-8?q?=EC=BD=94=EB=93=9C=20=EB=8C=80=EC=8B=A0=20axios=20HttpStatusCod?= =?UTF-8?q?e=20enum=EC=9D=98=20HttpStatusCode.BadRequest=20=EC=82=AC?= =?UTF-8?q?=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- config | 2 +- .../components/Modals/StoreModal/AdminItemProvisionModal.tsx | 3 ++- .../src/Cabinet/components/Modals/StoreModal/ExtendModal.tsx | 3 ++- .../Cabinet/components/Modals/StoreModal/SectionAlertModal.tsx | 3 ++- .../src/Cabinet/components/Modals/StoreModal/SwapModal.tsx | 3 ++- frontend/src/Cabinet/components/Store/StoreInfo.tsx | 3 ++- 6 files changed, 11 insertions(+), 6 deletions(-) diff --git a/config b/config index bf3813533..93674bce3 160000 --- a/config +++ b/config @@ -1 +1 @@ -Subproject commit bf3813533627807962efaee76f9b912f6cbb6f42 +Subproject commit 93674bce354efe9ad8fb3a7a934bdbf5acd1d162 diff --git a/frontend/src/Cabinet/components/Modals/StoreModal/AdminItemProvisionModal.tsx b/frontend/src/Cabinet/components/Modals/StoreModal/AdminItemProvisionModal.tsx index 6b102b82e..667f0836d 100644 --- a/frontend/src/Cabinet/components/Modals/StoreModal/AdminItemProvisionModal.tsx +++ b/frontend/src/Cabinet/components/Modals/StoreModal/AdminItemProvisionModal.tsx @@ -15,6 +15,7 @@ import { import { IItemDetail } from "@/Cabinet/types/dto/store.dto"; import { StoreItemType } from "@/Cabinet/types/enum/store.enum"; import { axiosItemAssign, axiosItems } from "@/Cabinet/api/axios/axios.custom"; +import { HttpStatusCode } from "axios"; interface IPenaltyModalProps { onClose: () => void; @@ -43,7 +44,7 @@ const AdminItemProvisionModal: React.FC = ({ onClose }) => { setModalTitle("아이템 지급완료"); } catch (error: any) { setHasErrorOnResponse(true); - if (error.response.ststus === 400) setModalTitle("아이템 지급실패"); + if (error.response.status === HttpStatusCode.BadRequest) setModalTitle("아이템 지급실패"); else error.response ? setModalTitle(error.response.data.message) diff --git a/frontend/src/Cabinet/components/Modals/StoreModal/ExtendModal.tsx b/frontend/src/Cabinet/components/Modals/StoreModal/ExtendModal.tsx index 74a2241c7..c2b6d82e8 100644 --- a/frontend/src/Cabinet/components/Modals/StoreModal/ExtendModal.tsx +++ b/frontend/src/Cabinet/components/Modals/StoreModal/ExtendModal.tsx @@ -32,6 +32,7 @@ import { axiosUseItem, } from "@/Cabinet/api/axios/axios.custom"; import { getExtendedDateString } from "@/Cabinet/utils/dateUtils"; +import { HttpStatusCode } from "axios"; const ExtendModal: React.FC<{ onClose: () => void; @@ -225,7 +226,7 @@ const ExtendModal: React.FC<{ setMyLentInfo(myLentInfoData.data); } catch (error: any) { setHasErrorOnResponse(true); - if (error.response.status === 400) { + if (error.response.status === HttpStatusCode.BadRequest) { setModalTitle(defaultFailureModalTitle); setModalContents(noItemMsg); setUrl("/store"); diff --git a/frontend/src/Cabinet/components/Modals/StoreModal/SectionAlertModal.tsx b/frontend/src/Cabinet/components/Modals/StoreModal/SectionAlertModal.tsx index b725b8121..686bcc0b9 100644 --- a/frontend/src/Cabinet/components/Modals/StoreModal/SectionAlertModal.tsx +++ b/frontend/src/Cabinet/components/Modals/StoreModal/SectionAlertModal.tsx @@ -10,6 +10,7 @@ import { import { modalPropsMap } from "@/Cabinet/assets/data/maps"; import IconType from "@/Cabinet/types/enum/icon.type.enum"; import { axiosUseItem } from "@/Cabinet/api/axios/axios.custom"; +import { HttpStatusCode } from "axios"; const SectionAlertModal = ({ currentSectionName, @@ -52,7 +53,7 @@ const SectionAlertModal = ({ setModalTitle("알림 등록권 사용완료"); } catch (error: any) { setHasErrorOnResponse(true); - if (error.response.status === 400) { + if (error.response.status === HttpStatusCode.BadRequest) { setModalTitle("알림 등록권 사용실패"); setModalContent(`현재 알림 등록권을 보유하고 있지 않습니다. 알림 등록권은 까비 상점에서 구매하실 수 있습니다.`); diff --git a/frontend/src/Cabinet/components/Modals/StoreModal/SwapModal.tsx b/frontend/src/Cabinet/components/Modals/StoreModal/SwapModal.tsx index 3d6afba32..58238d5ec 100644 --- a/frontend/src/Cabinet/components/Modals/StoreModal/SwapModal.tsx +++ b/frontend/src/Cabinet/components/Modals/StoreModal/SwapModal.tsx @@ -21,6 +21,7 @@ import { axiosMyLentInfo, axiosUseItem, } from "@/Cabinet/api/axios/axios.custom"; +import { HttpStatusCode } from "axios"; const SwapModal: React.FC<{ lentType: string; // 현재 클릭한 사물함 종류 @@ -74,7 +75,7 @@ const SwapModal: React.FC<{ } } catch (error: any) { setModalTitle("이사권 사용실패"); - if (error.response.status === 400) { + if (error.response.status === HttpStatusCode.BadRequest) { setModalContent( "현재 이사권을 보유하고 있지 않습니다.\n이사권은 까비상점에서 구매하실 수 있습니다." ); diff --git a/frontend/src/Cabinet/components/Store/StoreInfo.tsx b/frontend/src/Cabinet/components/Store/StoreInfo.tsx index 28871c665..12aaa853f 100644 --- a/frontend/src/Cabinet/components/Store/StoreInfo.tsx +++ b/frontend/src/Cabinet/components/Store/StoreInfo.tsx @@ -17,6 +17,7 @@ import { axiosMyInfo, } from "@/Cabinet/api/axios/axios.custom"; import useMenu from "@/Cabinet/hooks/useMenu"; +import { HttpStatusCode } from "axios"; const StoreInfo = () => { // 처음 날개 열었을 때 get요청 로딩 함수 @@ -58,7 +59,7 @@ const StoreInfo = () => { setTodayCoinCollection(true); } } catch (error: any) { - if (error.response && error.response.status === 400) { + if (error.response && error.response.status === HttpStatusCode.BadRequest) { setModalTitle("동전 줍기 실패"); } else { setModalTitle(error.data.message || error.response.data.message); From c8630ec27bca86423daec8df55ea846dff0d164f Mon Sep 17 00:00:00 2001 From: jnkeniaem Date: Mon, 14 Oct 2024 22:22:30 +0900 Subject: [PATCH 13/23] =?UTF-8?q?[FE]=20FIX:=20=EB=B8=8C=EB=9D=BC=EC=9A=B0?= =?UTF-8?q?=EC=A0=80=20=ED=99=98=EA=B2=BD=EC=97=90=EC=84=9C=20getMessaging?= =?UTF-8?q?=20=ED=98=B8=EC=B6=9C=20#1680?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../components/Modals/StoreModal/ExtendModal.tsx | 4 ++-- .../Cabinet/firebase/firebase-messaging-sw.ts | 16 +++++++++++++++- 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/frontend/src/Cabinet/components/Modals/StoreModal/ExtendModal.tsx b/frontend/src/Cabinet/components/Modals/StoreModal/ExtendModal.tsx index c2b6d82e8..9086ea9d8 100644 --- a/frontend/src/Cabinet/components/Modals/StoreModal/ExtendModal.tsx +++ b/frontend/src/Cabinet/components/Modals/StoreModal/ExtendModal.tsx @@ -1,3 +1,4 @@ +import { HttpStatusCode } from "axios"; import React, { useEffect, useState } from "react"; import { useRecoilState, useSetRecoilState } from "recoil"; import styled from "styled-components"; @@ -32,7 +33,6 @@ import { axiosUseItem, } from "@/Cabinet/api/axios/axios.custom"; import { getExtendedDateString } from "@/Cabinet/utils/dateUtils"; -import { HttpStatusCode } from "axios"; const ExtendModal: React.FC<{ onClose: () => void; @@ -230,7 +230,7 @@ const ExtendModal: React.FC<{ setModalTitle(defaultFailureModalTitle); setModalContents(noItemMsg); setUrl("/store"); - } else if (error.response.status === 403) { + } else if (error.response.status === HttpStatusCode.Forbidden) { setModalTitle(defaultFailureModalTitle); setModalContents(overdueMsg); } else { diff --git a/frontend/src/Cabinet/firebase/firebase-messaging-sw.ts b/frontend/src/Cabinet/firebase/firebase-messaging-sw.ts index d99709869..7023a3226 100644 --- a/frontend/src/Cabinet/firebase/firebase-messaging-sw.ts +++ b/frontend/src/Cabinet/firebase/firebase-messaging-sw.ts @@ -1,6 +1,7 @@ // Import the functions you need from the SDKs you need import { initializeApp } from "firebase/app"; import { + Messaging, deleteToken, getMessaging, getToken, @@ -18,7 +19,11 @@ export const firebaseConfig = { }; const app = initializeApp(firebaseConfig); -const messaging = getMessaging(app); +// const messaging = getMessaging(app); +let messaging: null | Messaging = null; +if (typeof window !== "undefined" && typeof window.navigator !== "undefined") { + messaging = getMessaging(app); +} // FCM APP을 등록 후 브라우저 알림 권한을 요청하고, 토큰을 반환 export const requestFcmAndGetDeviceToken = async (): Promise => { @@ -32,6 +37,10 @@ export const requestFcmAndGetDeviceToken = async (): Promise => { console.log("알림 권한이 허용됨"); + if (!messaging) { + console.log("브라우저 환경이 아닙니다."); // TODO : + return null; + } const token = await getToken(messaging, { vapidKey: import.meta.env.VITE_FIREBASE_APP_VAPID_KEY, }); @@ -49,6 +58,11 @@ export const requestFcmAndGetDeviceToken = async (): Promise => { // FCM 토큰 제거 및 브라우저 알람 권한 해제 export const deleteFcmToken = async (): Promise => { + if (!messaging) { + console.log("브라우저 환경이 아닙니다."); // TODO : + return; + } + await deleteToken(messaging); console.log("Token deleted."); }; From c2f27061271851c8ddf85ee9f78d0e776b2a8338 Mon Sep 17 00:00:00 2001 From: jnkeniaem Date: Tue, 15 Oct 2024 12:46:43 +0900 Subject: [PATCH 14/23] =?UTF-8?q?[FE]=20FIX:=20=EC=83=81=ED=83=9C=EC=BD=94?= =?UTF-8?q?=EB=93=9C=20401=EC=9D=84=20=EC=88=98=EC=8B=A0=ED=96=88=EC=9D=84?= =?UTF-8?q?=EB=95=90=20=EC=84=BC=ED=8A=B8=EB=A6=AC=20=EB=A1=9C=EA=B9=85?= =?UTF-8?q?=EC=97=90=20=EC=A0=9C=EC=99=B8=20#1680?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- frontend/src/Cabinet/api/axios/axios.log.ts | 2 ++ frontend/src/Cabinet/firebase/firebase-messaging-sw.ts | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/frontend/src/Cabinet/api/axios/axios.log.ts b/frontend/src/Cabinet/api/axios/axios.log.ts index 19d81ed13..9db940f29 100644 --- a/frontend/src/Cabinet/api/axios/axios.log.ts +++ b/frontend/src/Cabinet/api/axios/axios.log.ts @@ -1,4 +1,5 @@ import { captureException } from "@sentry/react"; +import { HttpStatusCode } from "axios"; import ErrorType from "@/Cabinet/types/enum/error.type.enum"; import { getCookie } from "@/Cabinet/api/react_cookie/cookies"; @@ -12,6 +13,7 @@ export const logAxiosError = ( errorMsg: string, isAdmin = false ) => { + if (error.response?.status === HttpStatusCode.BadRequest) return; error.message = (isAdmin ? "[Admin] " : "") + errorMsg; captureException(error, { tags: { diff --git a/frontend/src/Cabinet/firebase/firebase-messaging-sw.ts b/frontend/src/Cabinet/firebase/firebase-messaging-sw.ts index 7023a3226..d771989d6 100644 --- a/frontend/src/Cabinet/firebase/firebase-messaging-sw.ts +++ b/frontend/src/Cabinet/firebase/firebase-messaging-sw.ts @@ -62,7 +62,7 @@ export const deleteFcmToken = async (): Promise => { console.log("브라우저 환경이 아닙니다."); // TODO : return; } - + await deleteToken(messaging); console.log("Token deleted."); }; From e41edd9abbdbf694794e89d9f4a3d003f6c74a09 Mon Sep 17 00:00:00 2001 From: jnkeniaem Date: Tue, 15 Oct 2024 13:15:28 +0900 Subject: [PATCH 15/23] =?UTF-8?q?[FE]=20ETC:=20=ED=95=84=EC=9A=94=EC=97=86?= =?UTF-8?q?=EB=8A=94=20=EC=BD=94=EB=93=9C=20=EC=82=AD=EC=A0=9C=20#1680?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- frontend/src/Cabinet/firebase/firebase-messaging-sw.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/frontend/src/Cabinet/firebase/firebase-messaging-sw.ts b/frontend/src/Cabinet/firebase/firebase-messaging-sw.ts index d771989d6..f46621e8c 100644 --- a/frontend/src/Cabinet/firebase/firebase-messaging-sw.ts +++ b/frontend/src/Cabinet/firebase/firebase-messaging-sw.ts @@ -19,7 +19,6 @@ export const firebaseConfig = { }; const app = initializeApp(firebaseConfig); -// const messaging = getMessaging(app); let messaging: null | Messaging = null; if (typeof window !== "undefined" && typeof window.navigator !== "undefined") { messaging = getMessaging(app); From e5daee35fdca82d85a19d131d60e3a48fcf59894 Mon Sep 17 00:00:00 2001 From: jnkeniaem Date: Tue, 15 Oct 2024 20:17:47 +0900 Subject: [PATCH 16/23] =?UTF-8?q?[FE]=20CHORE:=20=EA=B0=81=20=ED=94=84?= =?UTF-8?q?=EB=A1=9C=EC=84=B8=EC=8A=A4=EC=97=90=20=EB=A7=9E=EA=B2=8C=20con?= =?UTF-8?q?sole=20=EC=B6=9C=EB=A0=A5=20=EB=A9=94=EC=8B=9C=EC=A7=80=20?= =?UTF-8?q?=EC=88=98=EC=A0=95=20=20#1680?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- frontend/src/Cabinet/firebase/firebase-messaging-sw.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/frontend/src/Cabinet/firebase/firebase-messaging-sw.ts b/frontend/src/Cabinet/firebase/firebase-messaging-sw.ts index f46621e8c..9fc1a78c3 100644 --- a/frontend/src/Cabinet/firebase/firebase-messaging-sw.ts +++ b/frontend/src/Cabinet/firebase/firebase-messaging-sw.ts @@ -37,7 +37,7 @@ export const requestFcmAndGetDeviceToken = async (): Promise => { console.log("알림 권한이 허용됨"); if (!messaging) { - console.log("브라우저 환경이 아닙니다."); // TODO : + console.log("토큰 생성 또는 갱신 실패"); return null; } const token = await getToken(messaging, { @@ -58,7 +58,7 @@ export const requestFcmAndGetDeviceToken = async (): Promise => { // FCM 토큰 제거 및 브라우저 알람 권한 해제 export const deleteFcmToken = async (): Promise => { if (!messaging) { - console.log("브라우저 환경이 아닙니다."); // TODO : + console.log("토큰 제거 실패"); return; } From 9a23e0a381fb656755f099c97c1efaefca8be2be Mon Sep 17 00:00:00 2001 From: jnkeniaem Date: Tue, 29 Oct 2024 19:19:53 +0900 Subject: [PATCH 17/23] =?UTF-8?q?[FE]=20ETC:=20firebase=20=EC=B5=9C?= =?UTF-8?q?=EC=8B=A0=20=EB=B2=84=EC=A0=84=EC=9C=BC=EB=A1=9C=20=EC=97=85?= =?UTF-8?q?=EA=B7=B8=EB=A0=88=EC=9D=B4=EB=93=9C=20#1680?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- frontend/package-lock.json | 983 ++++++++++++++++++++----------------- frontend/package.json | 2 +- 2 files changed, 544 insertions(+), 441 deletions(-) diff --git a/frontend/package-lock.json b/frontend/package-lock.json index f8f391019..333a75fd3 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -15,7 +15,7 @@ "@sentry/react": "^8.18.0", "@types/react-color": "^3.0.7", "axios": "^1.7.2", - "firebase": "^10.4.0", + "firebase": "^10.14.1", "react": "^18.2.0", "react-color": "^2.19.3", "react-cookie": "^4.1.1", @@ -2003,14 +2003,15 @@ } }, "node_modules/@firebase/analytics": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/@firebase/analytics/-/analytics-0.10.0.tgz", - "integrity": "sha512-Locv8gAqx0e+GX/0SI3dzmBY5e9kjVDtD+3zCFLJ0tH2hJwuCAiL+5WkHuxKj92rqQj/rvkBUCfA1ewlX2hehg==", - "dependencies": { - "@firebase/component": "0.6.4", - "@firebase/installations": "0.6.4", - "@firebase/logger": "0.4.0", - "@firebase/util": "1.9.3", + "version": "0.10.8", + "resolved": "https://registry.npmjs.org/@firebase/analytics/-/analytics-0.10.8.tgz", + "integrity": "sha512-CVnHcS4iRJPqtIDc411+UmFldk0ShSK3OB+D0bKD8Ck5Vro6dbK5+APZpkuWpbfdL359DIQUnAaMLE+zs/PVyA==", + "license": "Apache-2.0", + "dependencies": { + "@firebase/component": "0.6.9", + "@firebase/installations": "0.6.9", + "@firebase/logger": "0.4.2", + "@firebase/util": "1.10.0", "tslib": "^2.1.0" }, "peerDependencies": { @@ -2018,14 +2019,15 @@ } }, "node_modules/@firebase/analytics-compat": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/@firebase/analytics-compat/-/analytics-compat-0.2.6.tgz", - "integrity": "sha512-4MqpVLFkGK7NJf/5wPEEP7ePBJatwYpyjgJ+wQHQGHfzaCDgntOnl9rL2vbVGGKCnRqWtZDIWhctB86UWXaX2Q==", - "dependencies": { - "@firebase/analytics": "0.10.0", - "@firebase/analytics-types": "0.8.0", - "@firebase/component": "0.6.4", - "@firebase/util": "1.9.3", + "version": "0.2.14", + "resolved": "https://registry.npmjs.org/@firebase/analytics-compat/-/analytics-compat-0.2.14.tgz", + "integrity": "sha512-unRVY6SvRqfNFIAA/kwl4vK+lvQAL2HVcgu9zTrUtTyYDmtIt/lOuHJynBMYEgLnKm39YKBDhtqdapP2e++ASw==", + "license": "Apache-2.0", + "dependencies": { + "@firebase/analytics": "0.10.8", + "@firebase/analytics-types": "0.8.2", + "@firebase/component": "0.6.9", + "@firebase/util": "1.10.0", "tslib": "^2.1.0" }, "peerDependencies": { @@ -2033,40 +2035,45 @@ } }, "node_modules/@firebase/analytics-compat/node_modules/tslib": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.0.tgz", + "integrity": "sha512-jWVzBLplnCmoaTr13V9dYbiQ99wvZRd0vNWaDRg+aVYRcjDF3nDksxFDE/+fkXnKhpnUUkmx5pK/v8mCtLVqZA==", + "license": "0BSD" }, "node_modules/@firebase/analytics-types": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@firebase/analytics-types/-/analytics-types-0.8.0.tgz", - "integrity": "sha512-iRP+QKI2+oz3UAh4nPEq14CsEjrjD6a5+fuypjScisAh9kXKFvdJOZJDwk7kikLvWVLGEs9+kIUS4LPQV7VZVw==" + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/@firebase/analytics-types/-/analytics-types-0.8.2.tgz", + "integrity": "sha512-EnzNNLh+9/sJsimsA/FGqzakmrAUKLeJvjRHlg8df1f97NLUlFidk9600y0ZgWOp3CAxn6Hjtk+08tixlUOWyw==", + "license": "Apache-2.0" }, "node_modules/@firebase/analytics/node_modules/tslib": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.0.tgz", + "integrity": "sha512-jWVzBLplnCmoaTr13V9dYbiQ99wvZRd0vNWaDRg+aVYRcjDF3nDksxFDE/+fkXnKhpnUUkmx5pK/v8mCtLVqZA==", + "license": "0BSD" }, "node_modules/@firebase/app": { - "version": "0.9.19", - "resolved": "https://registry.npmjs.org/@firebase/app/-/app-0.9.19.tgz", - "integrity": "sha512-t/SHyZ3xWkR77ZU9VMoobDNFLdDKQ5xqoCAn4o16gTsA1C8sJ6ZOMZ02neMOPxNHuQXVE4tA8ukilnDbnK7uJA==", - "dependencies": { - "@firebase/component": "0.6.4", - "@firebase/logger": "0.4.0", - "@firebase/util": "1.9.3", + "version": "0.10.13", + "resolved": "https://registry.npmjs.org/@firebase/app/-/app-0.10.13.tgz", + "integrity": "sha512-OZiDAEK/lDB6xy/XzYAyJJkaDqmQ+BCtOEPLqFvxWKUz5JbBmej7IiiRHdtiIOD/twW7O5AxVsfaaGA/V1bNsA==", + "license": "Apache-2.0", + "dependencies": { + "@firebase/component": "0.6.9", + "@firebase/logger": "0.4.2", + "@firebase/util": "1.10.0", "idb": "7.1.1", "tslib": "^2.1.0" } }, "node_modules/@firebase/app-check": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@firebase/app-check/-/app-check-0.8.0.tgz", - "integrity": "sha512-dRDnhkcaC2FspMiRK/Vbp+PfsOAEP6ZElGm9iGFJ9fDqHoPs0HOPn7dwpJ51lCFi1+2/7n5pRPGhqF/F03I97g==", - "dependencies": { - "@firebase/component": "0.6.4", - "@firebase/logger": "0.4.0", - "@firebase/util": "1.9.3", + "version": "0.8.8", + "resolved": "https://registry.npmjs.org/@firebase/app-check/-/app-check-0.8.8.tgz", + "integrity": "sha512-O49RGF1xj7k6BuhxGpHmqOW5hqBIAEbt2q6POW0lIywx7emYtzPDeQI+ryQpC4zbKX646SoVZ711TN1DBLNSOQ==", + "license": "Apache-2.0", + "dependencies": { + "@firebase/component": "0.6.9", + "@firebase/logger": "0.4.2", + "@firebase/util": "1.10.0", "tslib": "^2.1.0" }, "peerDependencies": { @@ -2074,15 +2081,16 @@ } }, "node_modules/@firebase/app-check-compat": { - "version": "0.3.7", - "resolved": "https://registry.npmjs.org/@firebase/app-check-compat/-/app-check-compat-0.3.7.tgz", - "integrity": "sha512-cW682AxsyP1G+Z0/P7pO/WT2CzYlNxoNe5QejVarW2o5ZxeWSSPAiVEwpEpQR/bUlUmdeWThYTMvBWaopdBsqw==", - "dependencies": { - "@firebase/app-check": "0.8.0", - "@firebase/app-check-types": "0.5.0", - "@firebase/component": "0.6.4", - "@firebase/logger": "0.4.0", - "@firebase/util": "1.9.3", + "version": "0.3.15", + "resolved": "https://registry.npmjs.org/@firebase/app-check-compat/-/app-check-compat-0.3.15.tgz", + "integrity": "sha512-zFIvIFFNqDXpOT2huorz9cwf56VT3oJYRFjSFYdSbGYEJYEaXjLJbfC79lx/zjx4Fh+yuN8pry3TtvwaevrGbg==", + "license": "Apache-2.0", + "dependencies": { + "@firebase/app-check": "0.8.8", + "@firebase/app-check-types": "0.5.2", + "@firebase/component": "0.6.9", + "@firebase/logger": "0.4.2", + "@firebase/util": "1.10.0", "tslib": "^2.1.0" }, "peerDependencies": { @@ -2090,62 +2098,71 @@ } }, "node_modules/@firebase/app-check-compat/node_modules/tslib": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.0.tgz", + "integrity": "sha512-jWVzBLplnCmoaTr13V9dYbiQ99wvZRd0vNWaDRg+aVYRcjDF3nDksxFDE/+fkXnKhpnUUkmx5pK/v8mCtLVqZA==", + "license": "0BSD" }, "node_modules/@firebase/app-check-interop-types": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@firebase/app-check-interop-types/-/app-check-interop-types-0.3.0.tgz", - "integrity": "sha512-xAxHPZPIgFXnI+vb4sbBjZcde7ZluzPPaSK7Lx3/nmuVk4TjZvnL8ONnkd4ERQKL8WePQySU+pRcWkh8rDf5Sg==" + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@firebase/app-check-interop-types/-/app-check-interop-types-0.3.2.tgz", + "integrity": "sha512-LMs47Vinv2HBMZi49C09dJxp0QT5LwDzFaVGf/+ITHe3BlIhUiLNttkATSXplc89A2lAaeTqjgqVkiRfUGyQiQ==", + "license": "Apache-2.0" }, "node_modules/@firebase/app-check-types": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/@firebase/app-check-types/-/app-check-types-0.5.0.tgz", - "integrity": "sha512-uwSUj32Mlubybw7tedRzR24RP8M8JUVR3NPiMk3/Z4bCmgEKTlQBwMXrehDAZ2wF+TsBq0SN1c6ema71U/JPyQ==" + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/@firebase/app-check-types/-/app-check-types-0.5.2.tgz", + "integrity": "sha512-FSOEzTzL5bLUbD2co3Zut46iyPWML6xc4x+78TeaXMSuJap5QObfb+rVvZJtla3asN4RwU7elaQaduP+HFizDA==", + "license": "Apache-2.0" }, "node_modules/@firebase/app-check/node_modules/tslib": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.0.tgz", + "integrity": "sha512-jWVzBLplnCmoaTr13V9dYbiQ99wvZRd0vNWaDRg+aVYRcjDF3nDksxFDE/+fkXnKhpnUUkmx5pK/v8mCtLVqZA==", + "license": "0BSD" }, "node_modules/@firebase/app-compat": { - "version": "0.2.19", - "resolved": "https://registry.npmjs.org/@firebase/app-compat/-/app-compat-0.2.19.tgz", - "integrity": "sha512-QkJDqYqjhvs4fTMcRVXQkP9hbo5yfoJXDWkhU4VA5Vzs8Qsp76VPzYbqx5SD5OmBy+bz/Ot1UV8qySPGI4aKuw==", - "dependencies": { - "@firebase/app": "0.9.19", - "@firebase/component": "0.6.4", - "@firebase/logger": "0.4.0", - "@firebase/util": "1.9.3", + "version": "0.2.43", + "resolved": "https://registry.npmjs.org/@firebase/app-compat/-/app-compat-0.2.43.tgz", + "integrity": "sha512-HM96ZyIblXjAC7TzE8wIk2QhHlSvksYkQ4Ukh1GmEenzkucSNUmUX4QvoKrqeWsLEQ8hdcojABeCV8ybVyZmeg==", + "license": "Apache-2.0", + "dependencies": { + "@firebase/app": "0.10.13", + "@firebase/component": "0.6.9", + "@firebase/logger": "0.4.2", + "@firebase/util": "1.10.0", "tslib": "^2.1.0" } }, "node_modules/@firebase/app-compat/node_modules/tslib": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.0.tgz", + "integrity": "sha512-jWVzBLplnCmoaTr13V9dYbiQ99wvZRd0vNWaDRg+aVYRcjDF3nDksxFDE/+fkXnKhpnUUkmx5pK/v8mCtLVqZA==", + "license": "0BSD" }, "node_modules/@firebase/app-types": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/@firebase/app-types/-/app-types-0.9.0.tgz", - "integrity": "sha512-AeweANOIo0Mb8GiYm3xhTEBVCmPwTYAu9Hcd2qSkLuga/6+j9b1Jskl5bpiSQWy9eJ/j5pavxj6eYogmnuzm+Q==" + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/@firebase/app-types/-/app-types-0.9.2.tgz", + "integrity": "sha512-oMEZ1TDlBz479lmABwWsWjzHwheQKiAgnuKxE0pz0IXCVx7/rtlkx1fQ6GfgK24WCrxDKMplZrT50Kh04iMbXQ==", + "license": "Apache-2.0" }, "node_modules/@firebase/app/node_modules/tslib": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.0.tgz", + "integrity": "sha512-jWVzBLplnCmoaTr13V9dYbiQ99wvZRd0vNWaDRg+aVYRcjDF3nDksxFDE/+fkXnKhpnUUkmx5pK/v8mCtLVqZA==", + "license": "0BSD" }, "node_modules/@firebase/auth": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@firebase/auth/-/auth-1.3.0.tgz", - "integrity": "sha512-vjK4CHbY9aWdiVOrKi6mpa8z6uxeaf7LB/MZTHuZOiGHMcUoTGB6TeMbRShyqk1uaMrxhhZ5Ar/dR0965E1qyA==", - "dependencies": { - "@firebase/component": "0.6.4", - "@firebase/logger": "0.4.0", - "@firebase/util": "1.9.3", - "node-fetch": "2.6.7", - "tslib": "^2.1.0" + "version": "1.7.9", + "resolved": "https://registry.npmjs.org/@firebase/auth/-/auth-1.7.9.tgz", + "integrity": "sha512-yLD5095kVgDw965jepMyUrIgDklD6qH/BZNHeKOgvu7pchOKNjVM+zQoOVYJIKWMWOWBq8IRNVU6NXzBbozaJg==", + "license": "Apache-2.0", + "dependencies": { + "@firebase/component": "0.6.9", + "@firebase/logger": "0.4.2", + "@firebase/util": "1.10.0", + "tslib": "^2.1.0", + "undici": "6.19.7" }, "peerDependencies": { "@firebase/app": "0.x", @@ -2158,117 +2175,153 @@ } }, "node_modules/@firebase/auth-compat": { - "version": "0.4.6", - "resolved": "https://registry.npmjs.org/@firebase/auth-compat/-/auth-compat-0.4.6.tgz", - "integrity": "sha512-pKp1d4fSf+yoy1EBjTx9ISxlunqhW0vTICk0ByZ3e+Lp6ZIXThfUy4F1hAJlEafD/arM0oepRiAh7LXS1xn/BA==", - "dependencies": { - "@firebase/auth": "1.3.0", - "@firebase/auth-types": "0.12.0", - "@firebase/component": "0.6.4", - "@firebase/util": "1.9.3", - "node-fetch": "2.6.7", - "tslib": "^2.1.0" + "version": "0.5.14", + "resolved": "https://registry.npmjs.org/@firebase/auth-compat/-/auth-compat-0.5.14.tgz", + "integrity": "sha512-2eczCSqBl1KUPJacZlFpQayvpilg3dxXLy9cSMTKtQMTQSmondUtPI47P3ikH3bQAXhzKLOE+qVxJ3/IRtu9pw==", + "license": "Apache-2.0", + "dependencies": { + "@firebase/auth": "1.7.9", + "@firebase/auth-types": "0.12.2", + "@firebase/component": "0.6.9", + "@firebase/util": "1.10.0", + "tslib": "^2.1.0", + "undici": "6.19.7" }, "peerDependencies": { "@firebase/app-compat": "0.x" } }, "node_modules/@firebase/auth-compat/node_modules/tslib": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.0.tgz", + "integrity": "sha512-jWVzBLplnCmoaTr13V9dYbiQ99wvZRd0vNWaDRg+aVYRcjDF3nDksxFDE/+fkXnKhpnUUkmx5pK/v8mCtLVqZA==", + "license": "0BSD" }, "node_modules/@firebase/auth-interop-types": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/@firebase/auth-interop-types/-/auth-interop-types-0.2.1.tgz", - "integrity": "sha512-VOaGzKp65MY6P5FI84TfYKBXEPi6LmOCSMMzys6o2BN2LOsqy7pCuZCup7NYnfbk5OkkQKzvIfHOzTm0UDpkyg==" + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@firebase/auth-interop-types/-/auth-interop-types-0.2.3.tgz", + "integrity": "sha512-Fc9wuJGgxoxQeavybiuwgyi+0rssr76b+nHpj+eGhXFYAdudMWyfBHvFL/I5fEHniUM/UQdFzi9VXJK2iZF7FQ==", + "license": "Apache-2.0" }, "node_modules/@firebase/auth-types": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/@firebase/auth-types/-/auth-types-0.12.0.tgz", - "integrity": "sha512-pPwaZt+SPOshK8xNoiQlK5XIrS97kFYc3Rc7xmy373QsOJ9MmqXxLaYssP5Kcds4wd2qK//amx/c+A8O2fVeZA==", + "version": "0.12.2", + "resolved": "https://registry.npmjs.org/@firebase/auth-types/-/auth-types-0.12.2.tgz", + "integrity": "sha512-qsEBaRMoGvHO10unlDJhaKSuPn4pyoTtlQuP1ghZfzB6rNQPuhp/N/DcFZxm9i4v0SogjCbf9reWupwIvfmH6w==", + "license": "Apache-2.0", "peerDependencies": { "@firebase/app-types": "0.x", "@firebase/util": "1.x" } }, "node_modules/@firebase/auth/node_modules/tslib": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.0.tgz", + "integrity": "sha512-jWVzBLplnCmoaTr13V9dYbiQ99wvZRd0vNWaDRg+aVYRcjDF3nDksxFDE/+fkXnKhpnUUkmx5pK/v8mCtLVqZA==", + "license": "0BSD" }, "node_modules/@firebase/component": { - "version": "0.6.4", - "resolved": "https://registry.npmjs.org/@firebase/component/-/component-0.6.4.tgz", - "integrity": "sha512-rLMyrXuO9jcAUCaQXCMjCMUsWrba5fzHlNK24xz5j2W6A/SRmK8mZJ/hn7V0fViLbxC0lPMtrK1eYzk6Fg03jA==", + "version": "0.6.9", + "resolved": "https://registry.npmjs.org/@firebase/component/-/component-0.6.9.tgz", + "integrity": "sha512-gm8EUEJE/fEac86AvHn8Z/QW8BvR56TBw3hMW0O838J/1mThYQXAIQBgUv75EqlCZfdawpWLrKt1uXvp9ciK3Q==", + "license": "Apache-2.0", "dependencies": { - "@firebase/util": "1.9.3", + "@firebase/util": "1.10.0", "tslib": "^2.1.0" } }, "node_modules/@firebase/component/node_modules/tslib": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.0.tgz", + "integrity": "sha512-jWVzBLplnCmoaTr13V9dYbiQ99wvZRd0vNWaDRg+aVYRcjDF3nDksxFDE/+fkXnKhpnUUkmx5pK/v8mCtLVqZA==", + "license": "0BSD" + }, + "node_modules/@firebase/data-connect": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/@firebase/data-connect/-/data-connect-0.1.0.tgz", + "integrity": "sha512-vSe5s8dY13ilhLnfY0eYRmQsdTbH7PUFZtBbqU6JVX/j8Qp9A6G5gG6//ulbX9/1JFOF1IWNOne9c8S/DOCJaQ==", + "license": "Apache-2.0", + "dependencies": { + "@firebase/auth-interop-types": "0.2.3", + "@firebase/component": "0.6.9", + "@firebase/logger": "0.4.2", + "@firebase/util": "1.10.0", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@firebase/app": "0.x" + } + }, + "node_modules/@firebase/data-connect/node_modules/tslib": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.0.tgz", + "integrity": "sha512-jWVzBLplnCmoaTr13V9dYbiQ99wvZRd0vNWaDRg+aVYRcjDF3nDksxFDE/+fkXnKhpnUUkmx5pK/v8mCtLVqZA==", + "license": "0BSD" }, "node_modules/@firebase/database": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@firebase/database/-/database-1.0.1.tgz", - "integrity": "sha512-VAhF7gYwunW4Lw/+RQZvW8dlsf2r0YYqV9W0Gi2Mz8+0TGg1mBJWoUtsHfOr8kPJXhcLsC4eP/z3x6L/Fvjk/A==", - "dependencies": { - "@firebase/auth-interop-types": "0.2.1", - "@firebase/component": "0.6.4", - "@firebase/logger": "0.4.0", - "@firebase/util": "1.9.3", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@firebase/database/-/database-1.0.8.tgz", + "integrity": "sha512-dzXALZeBI1U5TXt6619cv0+tgEhJiwlUtQ55WNZY7vGAjv7Q1QioV969iYwt1AQQ0ovHnEW0YW9TiBfefLvErg==", + "license": "Apache-2.0", + "dependencies": { + "@firebase/app-check-interop-types": "0.3.2", + "@firebase/auth-interop-types": "0.2.3", + "@firebase/component": "0.6.9", + "@firebase/logger": "0.4.2", + "@firebase/util": "1.10.0", "faye-websocket": "0.11.4", "tslib": "^2.1.0" } }, "node_modules/@firebase/database-compat": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@firebase/database-compat/-/database-compat-1.0.1.tgz", - "integrity": "sha512-ky82yLIboLxtAIWyW/52a6HLMVTzD2kpZlEilVDok73pNPLjkJYowj8iaIWK5nTy7+6Gxt7d00zfjL6zckGdXQ==", - "dependencies": { - "@firebase/component": "0.6.4", - "@firebase/database": "1.0.1", - "@firebase/database-types": "1.0.0", - "@firebase/logger": "0.4.0", - "@firebase/util": "1.9.3", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@firebase/database-compat/-/database-compat-1.0.8.tgz", + "integrity": "sha512-OpeWZoPE3sGIRPBKYnW9wLad25RaWbGyk7fFQe4xnJQKRzlynWeFBSRRAoLE2Old01WXwskUiucNqUUVlFsceg==", + "license": "Apache-2.0", + "dependencies": { + "@firebase/component": "0.6.9", + "@firebase/database": "1.0.8", + "@firebase/database-types": "1.0.5", + "@firebase/logger": "0.4.2", + "@firebase/util": "1.10.0", "tslib": "^2.1.0" } }, "node_modules/@firebase/database-compat/node_modules/tslib": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.0.tgz", + "integrity": "sha512-jWVzBLplnCmoaTr13V9dYbiQ99wvZRd0vNWaDRg+aVYRcjDF3nDksxFDE/+fkXnKhpnUUkmx5pK/v8mCtLVqZA==", + "license": "0BSD" }, "node_modules/@firebase/database-types": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@firebase/database-types/-/database-types-1.0.0.tgz", - "integrity": "sha512-SjnXStoE0Q56HcFgNQ+9SsmJc0c8TqGARdI/T44KXy+Ets3r6x/ivhQozT66bMnCEjJRywYoxNurRTMlZF8VNg==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@firebase/database-types/-/database-types-1.0.5.tgz", + "integrity": "sha512-fTlqCNwFYyq/C6W7AJ5OCuq5CeZuBEsEwptnVxlNPkWCo5cTTyukzAHRSO/jaQcItz33FfYrrFk1SJofcu2AaQ==", + "license": "Apache-2.0", "dependencies": { - "@firebase/app-types": "0.9.0", - "@firebase/util": "1.9.3" + "@firebase/app-types": "0.9.2", + "@firebase/util": "1.10.0" } }, "node_modules/@firebase/database/node_modules/tslib": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.0.tgz", + "integrity": "sha512-jWVzBLplnCmoaTr13V9dYbiQ99wvZRd0vNWaDRg+aVYRcjDF3nDksxFDE/+fkXnKhpnUUkmx5pK/v8mCtLVqZA==", + "license": "0BSD" }, "node_modules/@firebase/firestore": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@firebase/firestore/-/firestore-4.2.0.tgz", - "integrity": "sha512-iKZqIdOBJpJUcwY5airLX0W04TLrQSJuActOP1HG5WoIY5oyGTQE4Ml7hl5GW7mBqFieT4ojtUuDXj6MLrn1lA==", - "dependencies": { - "@firebase/component": "0.6.4", - "@firebase/logger": "0.4.0", - "@firebase/util": "1.9.3", - "@firebase/webchannel-wrapper": "0.10.3", + "version": "4.7.3", + "resolved": "https://registry.npmjs.org/@firebase/firestore/-/firestore-4.7.3.tgz", + "integrity": "sha512-NwVU+JPZ/3bhvNSJMCSzfcBZZg8SUGyzZ2T0EW3/bkUeefCyzMISSt/TTIfEHc8cdyXGlMqfGe3/62u9s74UEg==", + "license": "Apache-2.0", + "dependencies": { + "@firebase/component": "0.6.9", + "@firebase/logger": "0.4.2", + "@firebase/util": "1.10.0", + "@firebase/webchannel-wrapper": "1.0.1", "@grpc/grpc-js": "~1.9.0", "@grpc/proto-loader": "^0.7.8", - "node-fetch": "2.6.7", - "tslib": "^2.1.0" + "tslib": "^2.1.0", + "undici": "6.19.7" }, "engines": { "node": ">=10.10.0" @@ -2278,14 +2331,15 @@ } }, "node_modules/@firebase/firestore-compat": { - "version": "0.3.18", - "resolved": "https://registry.npmjs.org/@firebase/firestore-compat/-/firestore-compat-0.3.18.tgz", - "integrity": "sha512-hkqv4mb1oScKbEtzfcK8Go8c0VpDWmbAvbD6B6XnphLqi27pkXgo9Rp+aSKlD7cBL29VMEekP5bEm9lSVfZpNw==", - "dependencies": { - "@firebase/component": "0.6.4", - "@firebase/firestore": "4.2.0", - "@firebase/firestore-types": "3.0.0", - "@firebase/util": "1.9.3", + "version": "0.3.38", + "resolved": "https://registry.npmjs.org/@firebase/firestore-compat/-/firestore-compat-0.3.38.tgz", + "integrity": "sha512-GoS0bIMMkjpLni6StSwRJarpu2+S5m346Na7gr9YZ/BZ/W3/8iHGNr9PxC+f0rNZXqS4fGRn88pICjrZEgbkqQ==", + "license": "Apache-2.0", + "dependencies": { + "@firebase/component": "0.6.9", + "@firebase/firestore": "4.7.3", + "@firebase/firestore-types": "3.0.2", + "@firebase/util": "1.10.0", "tslib": "^2.1.0" }, "peerDependencies": { @@ -2293,50 +2347,55 @@ } }, "node_modules/@firebase/firestore-compat/node_modules/tslib": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.0.tgz", + "integrity": "sha512-jWVzBLplnCmoaTr13V9dYbiQ99wvZRd0vNWaDRg+aVYRcjDF3nDksxFDE/+fkXnKhpnUUkmx5pK/v8mCtLVqZA==", + "license": "0BSD" }, "node_modules/@firebase/firestore-types": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@firebase/firestore-types/-/firestore-types-3.0.0.tgz", - "integrity": "sha512-Meg4cIezHo9zLamw0ymFYBD4SMjLb+ZXIbuN7T7ddXN6MGoICmOTq3/ltdCGoDCS2u+H1XJs2u/cYp75jsX9Qw==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@firebase/firestore-types/-/firestore-types-3.0.2.tgz", + "integrity": "sha512-wp1A+t5rI2Qc/2q7r2ZpjUXkRVPtGMd6zCLsiWurjsQpqPgFin3AhNibKcIzoF2rnToNa/XYtyWXuifjOOwDgg==", + "license": "Apache-2.0", "peerDependencies": { "@firebase/app-types": "0.x", "@firebase/util": "1.x" } }, "node_modules/@firebase/firestore/node_modules/tslib": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.0.tgz", + "integrity": "sha512-jWVzBLplnCmoaTr13V9dYbiQ99wvZRd0vNWaDRg+aVYRcjDF3nDksxFDE/+fkXnKhpnUUkmx5pK/v8mCtLVqZA==", + "license": "0BSD" }, "node_modules/@firebase/functions": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/@firebase/functions/-/functions-0.10.0.tgz", - "integrity": "sha512-2U+fMNxTYhtwSpkkR6WbBcuNMOVaI7MaH3cZ6UAeNfj7AgEwHwMIFLPpC13YNZhno219F0lfxzTAA0N62ndWzA==", - "dependencies": { - "@firebase/app-check-interop-types": "0.3.0", - "@firebase/auth-interop-types": "0.2.1", - "@firebase/component": "0.6.4", - "@firebase/messaging-interop-types": "0.2.0", - "@firebase/util": "1.9.3", - "node-fetch": "2.6.7", - "tslib": "^2.1.0" + "version": "0.11.8", + "resolved": "https://registry.npmjs.org/@firebase/functions/-/functions-0.11.8.tgz", + "integrity": "sha512-Lo2rTPDn96naFIlSZKVd1yvRRqqqwiJk7cf9TZhUerwnPKgBzXy+aHE22ry+6EjCaQusUoNai6mU6p+G8QZT1g==", + "license": "Apache-2.0", + "dependencies": { + "@firebase/app-check-interop-types": "0.3.2", + "@firebase/auth-interop-types": "0.2.3", + "@firebase/component": "0.6.9", + "@firebase/messaging-interop-types": "0.2.2", + "@firebase/util": "1.10.0", + "tslib": "^2.1.0", + "undici": "6.19.7" }, "peerDependencies": { "@firebase/app": "0.x" } }, "node_modules/@firebase/functions-compat": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/@firebase/functions-compat/-/functions-compat-0.3.5.tgz", - "integrity": "sha512-uD4jwgwVqdWf6uc3NRKF8cSZ0JwGqSlyhPgackyUPe+GAtnERpS4+Vr66g0b3Gge0ezG4iyHo/EXW/Hjx7QhHw==", - "dependencies": { - "@firebase/component": "0.6.4", - "@firebase/functions": "0.10.0", - "@firebase/functions-types": "0.6.0", - "@firebase/util": "1.9.3", + "version": "0.3.14", + "resolved": "https://registry.npmjs.org/@firebase/functions-compat/-/functions-compat-0.3.14.tgz", + "integrity": "sha512-dZ0PKOKQFnOlMfcim39XzaXonSuPPAVuzpqA4ONTIdyaJK/OnBaIEVs/+BH4faa1a2tLeR+Jy15PKqDRQoNIJw==", + "license": "Apache-2.0", + "dependencies": { + "@firebase/component": "0.6.9", + "@firebase/functions": "0.11.8", + "@firebase/functions-types": "0.6.2", + "@firebase/util": "1.10.0", "tslib": "^2.1.0" }, "peerDependencies": { @@ -2344,28 +2403,32 @@ } }, "node_modules/@firebase/functions-compat/node_modules/tslib": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.0.tgz", + "integrity": "sha512-jWVzBLplnCmoaTr13V9dYbiQ99wvZRd0vNWaDRg+aVYRcjDF3nDksxFDE/+fkXnKhpnUUkmx5pK/v8mCtLVqZA==", + "license": "0BSD" }, "node_modules/@firebase/functions-types": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/@firebase/functions-types/-/functions-types-0.6.0.tgz", - "integrity": "sha512-hfEw5VJtgWXIRf92ImLkgENqpL6IWpYaXVYiRkFY1jJ9+6tIhWM7IzzwbevwIIud/jaxKVdRzD7QBWfPmkwCYw==" + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/@firebase/functions-types/-/functions-types-0.6.2.tgz", + "integrity": "sha512-0KiJ9lZ28nS2iJJvimpY4nNccV21rkQyor5Iheu/nq8aKXJqtJdeSlZDspjPSBBiHRzo7/GMUttegnsEITqR+w==", + "license": "Apache-2.0" }, "node_modules/@firebase/functions/node_modules/tslib": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.0.tgz", + "integrity": "sha512-jWVzBLplnCmoaTr13V9dYbiQ99wvZRd0vNWaDRg+aVYRcjDF3nDksxFDE/+fkXnKhpnUUkmx5pK/v8mCtLVqZA==", + "license": "0BSD" }, "node_modules/@firebase/installations": { - "version": "0.6.4", - "resolved": "https://registry.npmjs.org/@firebase/installations/-/installations-0.6.4.tgz", - "integrity": "sha512-u5y88rtsp7NYkCHC3ElbFBrPtieUybZluXyzl7+4BsIz4sqb4vSAuwHEUgCgCeaQhvsnxDEU6icly8U9zsJigA==", + "version": "0.6.9", + "resolved": "https://registry.npmjs.org/@firebase/installations/-/installations-0.6.9.tgz", + "integrity": "sha512-hlT7AwCiKghOX3XizLxXOsTFiFCQnp/oj86zp1UxwDGmyzsyoxtX+UIZyVyH/oBF5+XtblFG9KZzZQ/h+dpy+Q==", + "license": "Apache-2.0", "dependencies": { - "@firebase/component": "0.6.4", - "@firebase/util": "1.9.3", - "idb": "7.0.1", + "@firebase/component": "0.6.9", + "@firebase/util": "1.10.0", + "idb": "7.1.1", "tslib": "^2.1.0" }, "peerDependencies": { @@ -2373,14 +2436,15 @@ } }, "node_modules/@firebase/installations-compat": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/@firebase/installations-compat/-/installations-compat-0.2.4.tgz", - "integrity": "sha512-LI9dYjp0aT9Njkn9U4JRrDqQ6KXeAmFbRC0E7jI7+hxl5YmRWysq5qgQl22hcWpTk+cm3es66d/apoDU/A9n6Q==", - "dependencies": { - "@firebase/component": "0.6.4", - "@firebase/installations": "0.6.4", - "@firebase/installations-types": "0.5.0", - "@firebase/util": "1.9.3", + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/@firebase/installations-compat/-/installations-compat-0.2.9.tgz", + "integrity": "sha512-2lfdc6kPXR7WaL4FCQSQUhXcPbI7ol3wF+vkgtU25r77OxPf8F/VmswQ7sgIkBBWtymn5ZF20TIKtnOj9rjb6w==", + "license": "Apache-2.0", + "dependencies": { + "@firebase/component": "0.6.9", + "@firebase/installations": "0.6.9", + "@firebase/installations-types": "0.5.2", + "@firebase/util": "1.10.0", "tslib": "^2.1.0" }, "peerDependencies": { @@ -2388,51 +2452,52 @@ } }, "node_modules/@firebase/installations-compat/node_modules/tslib": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.0.tgz", + "integrity": "sha512-jWVzBLplnCmoaTr13V9dYbiQ99wvZRd0vNWaDRg+aVYRcjDF3nDksxFDE/+fkXnKhpnUUkmx5pK/v8mCtLVqZA==", + "license": "0BSD" }, "node_modules/@firebase/installations-types": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/@firebase/installations-types/-/installations-types-0.5.0.tgz", - "integrity": "sha512-9DP+RGfzoI2jH7gY4SlzqvZ+hr7gYzPODrbzVD82Y12kScZ6ZpRg/i3j6rleto8vTFC8n6Len4560FnV1w2IRg==", + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/@firebase/installations-types/-/installations-types-0.5.2.tgz", + "integrity": "sha512-que84TqGRZJpJKHBlF2pkvc1YcXrtEDOVGiDjovP/a3s6W4nlbohGXEsBJo0JCeeg/UG9A+DEZVDUV9GpklUzA==", + "license": "Apache-2.0", "peerDependencies": { "@firebase/app-types": "0.x" } }, - "node_modules/@firebase/installations/node_modules/idb": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/idb/-/idb-7.0.1.tgz", - "integrity": "sha512-UUxlE7vGWK5RfB/fDwEGgRf84DY/ieqNha6msMV99UsEMQhJ1RwbCd8AYBj3QMgnE3VZnfQvm4oKVCJTYlqIgg==" - }, "node_modules/@firebase/installations/node_modules/tslib": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.0.tgz", + "integrity": "sha512-jWVzBLplnCmoaTr13V9dYbiQ99wvZRd0vNWaDRg+aVYRcjDF3nDksxFDE/+fkXnKhpnUUkmx5pK/v8mCtLVqZA==", + "license": "0BSD" }, "node_modules/@firebase/logger": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/@firebase/logger/-/logger-0.4.0.tgz", - "integrity": "sha512-eRKSeykumZ5+cJPdxxJRgAC3G5NknY2GwEbKfymdnXtnT0Ucm4pspfR6GT4MUQEDuJwRVbVcSx85kgJulMoFFA==", + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/@firebase/logger/-/logger-0.4.2.tgz", + "integrity": "sha512-Q1VuA5M1Gjqrwom6I6NUU4lQXdo9IAQieXlujeHZWvRt1b7qQ0KwBaNAjgxG27jgF9/mUwsNmO8ptBCGVYhB0A==", + "license": "Apache-2.0", "dependencies": { "tslib": "^2.1.0" } }, "node_modules/@firebase/logger/node_modules/tslib": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.0.tgz", + "integrity": "sha512-jWVzBLplnCmoaTr13V9dYbiQ99wvZRd0vNWaDRg+aVYRcjDF3nDksxFDE/+fkXnKhpnUUkmx5pK/v8mCtLVqZA==", + "license": "0BSD" }, "node_modules/@firebase/messaging": { - "version": "0.12.4", - "resolved": "https://registry.npmjs.org/@firebase/messaging/-/messaging-0.12.4.tgz", - "integrity": "sha512-6JLZct6zUaex4g7HI3QbzeUrg9xcnmDAPTWpkoMpd/GoSVWH98zDoWXMGrcvHeCAIsLpFMe4MPoZkJbrPhaASw==", - "dependencies": { - "@firebase/component": "0.6.4", - "@firebase/installations": "0.6.4", - "@firebase/messaging-interop-types": "0.2.0", - "@firebase/util": "1.9.3", - "idb": "7.0.1", + "version": "0.12.12", + "resolved": "https://registry.npmjs.org/@firebase/messaging/-/messaging-0.12.12.tgz", + "integrity": "sha512-6q0pbzYBJhZEtUoQx7hnPhZvAbuMNuBXKQXOx2YlWhSrlv9N1m0ZzlNpBbu/ItTzrwNKTibdYzUyaaxdWLg+4w==", + "license": "Apache-2.0", + "dependencies": { + "@firebase/component": "0.6.9", + "@firebase/installations": "0.6.9", + "@firebase/messaging-interop-types": "0.2.2", + "@firebase/util": "1.10.0", + "idb": "7.1.1", "tslib": "^2.1.0" }, "peerDependencies": { @@ -2440,13 +2505,14 @@ } }, "node_modules/@firebase/messaging-compat": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/@firebase/messaging-compat/-/messaging-compat-0.2.4.tgz", - "integrity": "sha512-lyFjeUhIsPRYDPNIkYX1LcZMpoVbBWXX4rPl7c/rqc7G+EUea7IEtSt4MxTvh6fDfPuzLn7+FZADfscC+tNMfg==", - "dependencies": { - "@firebase/component": "0.6.4", - "@firebase/messaging": "0.12.4", - "@firebase/util": "1.9.3", + "version": "0.2.12", + "resolved": "https://registry.npmjs.org/@firebase/messaging-compat/-/messaging-compat-0.2.12.tgz", + "integrity": "sha512-pKsiUVZrbmRgdImYqhBNZlkKJbqjlPkVdQRZGRbkTyX4OSGKR0F/oJeCt1a8jEg5UnBp4fdVwSWSp4DuCovvEQ==", + "license": "Apache-2.0", + "dependencies": { + "@firebase/component": "0.6.9", + "@firebase/messaging": "0.12.12", + "@firebase/util": "1.10.0", "tslib": "^2.1.0" }, "peerDependencies": { @@ -2454,34 +2520,33 @@ } }, "node_modules/@firebase/messaging-compat/node_modules/tslib": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.0.tgz", + "integrity": "sha512-jWVzBLplnCmoaTr13V9dYbiQ99wvZRd0vNWaDRg+aVYRcjDF3nDksxFDE/+fkXnKhpnUUkmx5pK/v8mCtLVqZA==", + "license": "0BSD" }, "node_modules/@firebase/messaging-interop-types": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/@firebase/messaging-interop-types/-/messaging-interop-types-0.2.0.tgz", - "integrity": "sha512-ujA8dcRuVeBixGR9CtegfpU4YmZf3Lt7QYkcj693FFannwNuZgfAYaTmbJ40dtjB81SAu6tbFPL9YLNT15KmOQ==" - }, - "node_modules/@firebase/messaging/node_modules/idb": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/idb/-/idb-7.0.1.tgz", - "integrity": "sha512-UUxlE7vGWK5RfB/fDwEGgRf84DY/ieqNha6msMV99UsEMQhJ1RwbCd8AYBj3QMgnE3VZnfQvm4oKVCJTYlqIgg==" + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/@firebase/messaging-interop-types/-/messaging-interop-types-0.2.2.tgz", + "integrity": "sha512-l68HXbuD2PPzDUOFb3aG+nZj5KA3INcPwlocwLZOzPp9rFM9yeuI9YLl6DQfguTX5eAGxO0doTR+rDLDvQb5tA==", + "license": "Apache-2.0" }, "node_modules/@firebase/messaging/node_modules/tslib": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.0.tgz", + "integrity": "sha512-jWVzBLplnCmoaTr13V9dYbiQ99wvZRd0vNWaDRg+aVYRcjDF3nDksxFDE/+fkXnKhpnUUkmx5pK/v8mCtLVqZA==", + "license": "0BSD" }, "node_modules/@firebase/performance": { - "version": "0.6.4", - "resolved": "https://registry.npmjs.org/@firebase/performance/-/performance-0.6.4.tgz", - "integrity": "sha512-HfTn/bd8mfy/61vEqaBelNiNnvAbUtME2S25A67Nb34zVuCSCRIX4SseXY6zBnOFj3oLisaEqhVcJmVPAej67g==", - "dependencies": { - "@firebase/component": "0.6.4", - "@firebase/installations": "0.6.4", - "@firebase/logger": "0.4.0", - "@firebase/util": "1.9.3", + "version": "0.6.9", + "resolved": "https://registry.npmjs.org/@firebase/performance/-/performance-0.6.9.tgz", + "integrity": "sha512-PnVaak5sqfz5ivhua+HserxTJHtCar/7zM0flCX6NkzBNzJzyzlH4Hs94h2Il0LQB99roBqoE5QT1JqWqcLJHQ==", + "license": "Apache-2.0", + "dependencies": { + "@firebase/component": "0.6.9", + "@firebase/installations": "0.6.9", + "@firebase/logger": "0.4.2", + "@firebase/util": "1.10.0", "tslib": "^2.1.0" }, "peerDependencies": { @@ -2489,15 +2554,16 @@ } }, "node_modules/@firebase/performance-compat": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/@firebase/performance-compat/-/performance-compat-0.2.4.tgz", - "integrity": "sha512-nnHUb8uP9G8islzcld/k6Bg5RhX62VpbAb/Anj7IXs/hp32Eb2LqFPZK4sy3pKkBUO5wcrlRWQa6wKOxqlUqsg==", - "dependencies": { - "@firebase/component": "0.6.4", - "@firebase/logger": "0.4.0", - "@firebase/performance": "0.6.4", - "@firebase/performance-types": "0.2.0", - "@firebase/util": "1.9.3", + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/@firebase/performance-compat/-/performance-compat-0.2.9.tgz", + "integrity": "sha512-dNl95IUnpsu3fAfYBZDCVhXNkASE0uo4HYaEPd2/PKscfTvsgqFAOxfAXzBEDOnynDWiaGUnb5M1O00JQ+3FXA==", + "license": "Apache-2.0", + "dependencies": { + "@firebase/component": "0.6.9", + "@firebase/logger": "0.4.2", + "@firebase/performance": "0.6.9", + "@firebase/performance-types": "0.2.2", + "@firebase/util": "1.10.0", "tslib": "^2.1.0" }, "peerDependencies": { @@ -2505,29 +2571,33 @@ } }, "node_modules/@firebase/performance-compat/node_modules/tslib": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.0.tgz", + "integrity": "sha512-jWVzBLplnCmoaTr13V9dYbiQ99wvZRd0vNWaDRg+aVYRcjDF3nDksxFDE/+fkXnKhpnUUkmx5pK/v8mCtLVqZA==", + "license": "0BSD" }, "node_modules/@firebase/performance-types": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/@firebase/performance-types/-/performance-types-0.2.0.tgz", - "integrity": "sha512-kYrbr8e/CYr1KLrLYZZt2noNnf+pRwDq2KK9Au9jHrBMnb0/C9X9yWSXmZkFt4UIdsQknBq8uBB7fsybZdOBTA==" + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/@firebase/performance-types/-/performance-types-0.2.2.tgz", + "integrity": "sha512-gVq0/lAClVH5STrIdKnHnCo2UcPLjJlDUoEB/tB4KM+hAeHUxWKnpT0nemUPvxZ5nbdY/pybeyMe8Cs29gEcHA==", + "license": "Apache-2.0" }, "node_modules/@firebase/performance/node_modules/tslib": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.0.tgz", + "integrity": "sha512-jWVzBLplnCmoaTr13V9dYbiQ99wvZRd0vNWaDRg+aVYRcjDF3nDksxFDE/+fkXnKhpnUUkmx5pK/v8mCtLVqZA==", + "license": "0BSD" }, "node_modules/@firebase/remote-config": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/@firebase/remote-config/-/remote-config-0.4.4.tgz", - "integrity": "sha512-x1ioTHGX8ZwDSTOVp8PBLv2/wfwKzb4pxi0gFezS5GCJwbLlloUH4YYZHHS83IPxnua8b6l0IXUaWd0RgbWwzQ==", - "dependencies": { - "@firebase/component": "0.6.4", - "@firebase/installations": "0.6.4", - "@firebase/logger": "0.4.0", - "@firebase/util": "1.9.3", + "version": "0.4.9", + "resolved": "https://registry.npmjs.org/@firebase/remote-config/-/remote-config-0.4.9.tgz", + "integrity": "sha512-EO1NLCWSPMHdDSRGwZ73kxEEcTopAxX1naqLJFNApp4hO8WfKfmEpmjxmP5TrrnypjIf2tUkYaKsfbEA7+AMmA==", + "license": "Apache-2.0", + "dependencies": { + "@firebase/component": "0.6.9", + "@firebase/installations": "0.6.9", + "@firebase/logger": "0.4.2", + "@firebase/util": "1.10.0", "tslib": "^2.1.0" }, "peerDependencies": { @@ -2535,15 +2605,16 @@ } }, "node_modules/@firebase/remote-config-compat": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/@firebase/remote-config-compat/-/remote-config-compat-0.2.4.tgz", - "integrity": "sha512-FKiki53jZirrDFkBHglB3C07j5wBpitAaj8kLME6g8Mx+aq7u9P7qfmuSRytiOItADhWUj7O1JIv7n9q87SuwA==", - "dependencies": { - "@firebase/component": "0.6.4", - "@firebase/logger": "0.4.0", - "@firebase/remote-config": "0.4.4", - "@firebase/remote-config-types": "0.3.0", - "@firebase/util": "1.9.3", + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/@firebase/remote-config-compat/-/remote-config-compat-0.2.9.tgz", + "integrity": "sha512-AxzGpWfWFYejH2twxfdOJt5Cfh/ATHONegTd/a0p5flEzsD5JsxXgfkFToop+mypEL3gNwawxrxlZddmDoNxyA==", + "license": "Apache-2.0", + "dependencies": { + "@firebase/component": "0.6.9", + "@firebase/logger": "0.4.2", + "@firebase/remote-config": "0.4.9", + "@firebase/remote-config-types": "0.3.2", + "@firebase/util": "1.10.0", "tslib": "^2.1.0" }, "peerDependencies": { @@ -2551,43 +2622,48 @@ } }, "node_modules/@firebase/remote-config-compat/node_modules/tslib": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.0.tgz", + "integrity": "sha512-jWVzBLplnCmoaTr13V9dYbiQ99wvZRd0vNWaDRg+aVYRcjDF3nDksxFDE/+fkXnKhpnUUkmx5pK/v8mCtLVqZA==", + "license": "0BSD" }, "node_modules/@firebase/remote-config-types": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@firebase/remote-config-types/-/remote-config-types-0.3.0.tgz", - "integrity": "sha512-RtEH4vdcbXZuZWRZbIRmQVBNsE7VDQpet2qFvq6vwKLBIQRQR5Kh58M4ok3A3US8Sr3rubYnaGqZSurCwI8uMA==" + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@firebase/remote-config-types/-/remote-config-types-0.3.2.tgz", + "integrity": "sha512-0BC4+Ud7y2aPTyhXJTMTFfrGGLqdYXrUB9sJVAB8NiqJswDTc4/2qrE/yfUbnQJhbSi6ZaTTBKyG3n1nplssaA==", + "license": "Apache-2.0" }, "node_modules/@firebase/remote-config/node_modules/tslib": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.0.tgz", + "integrity": "sha512-jWVzBLplnCmoaTr13V9dYbiQ99wvZRd0vNWaDRg+aVYRcjDF3nDksxFDE/+fkXnKhpnUUkmx5pK/v8mCtLVqZA==", + "license": "0BSD" }, "node_modules/@firebase/storage": { - "version": "0.11.2", - "resolved": "https://registry.npmjs.org/@firebase/storage/-/storage-0.11.2.tgz", - "integrity": "sha512-CtvoFaBI4hGXlXbaCHf8humajkbXhs39Nbh6MbNxtwJiCqxPy9iH3D3CCfXAvP0QvAAwmJUTK3+z9a++Kc4nkA==", + "version": "0.13.2", + "resolved": "https://registry.npmjs.org/@firebase/storage/-/storage-0.13.2.tgz", + "integrity": "sha512-fxuJnHshbhVwuJ4FuISLu+/76Aby2sh+44ztjF2ppoe0TELIDxPW6/r1KGlWYt//AD0IodDYYA8ZTN89q8YqUw==", + "license": "Apache-2.0", "dependencies": { - "@firebase/component": "0.6.4", - "@firebase/util": "1.9.3", - "node-fetch": "2.6.7", - "tslib": "^2.1.0" + "@firebase/component": "0.6.9", + "@firebase/util": "1.10.0", + "tslib": "^2.1.0", + "undici": "6.19.7" }, "peerDependencies": { "@firebase/app": "0.x" } }, "node_modules/@firebase/storage-compat": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@firebase/storage-compat/-/storage-compat-0.3.2.tgz", - "integrity": "sha512-wvsXlLa9DVOMQJckbDNhXKKxRNNewyUhhbXev3t8kSgoCotd1v3MmqhKKz93ePhDnhHnDs7bYHy+Qa8dRY6BXw==", - "dependencies": { - "@firebase/component": "0.6.4", - "@firebase/storage": "0.11.2", - "@firebase/storage-types": "0.8.0", - "@firebase/util": "1.9.3", + "version": "0.3.12", + "resolved": "https://registry.npmjs.org/@firebase/storage-compat/-/storage-compat-0.3.12.tgz", + "integrity": "sha512-hA4VWKyGU5bWOll+uwzzhEMMYGu9PlKQc1w4DWxB3aIErWYzonrZjF0icqNQZbwKNIdh8SHjZlFeB2w6OSsjfg==", + "license": "Apache-2.0", + "dependencies": { + "@firebase/component": "0.6.9", + "@firebase/storage": "0.13.2", + "@firebase/storage-types": "0.8.2", + "@firebase/util": "1.10.0", "tslib": "^2.1.0" }, "peerDependencies": { @@ -2595,46 +2671,79 @@ } }, "node_modules/@firebase/storage-compat/node_modules/tslib": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.0.tgz", + "integrity": "sha512-jWVzBLplnCmoaTr13V9dYbiQ99wvZRd0vNWaDRg+aVYRcjDF3nDksxFDE/+fkXnKhpnUUkmx5pK/v8mCtLVqZA==", + "license": "0BSD" }, "node_modules/@firebase/storage-types": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@firebase/storage-types/-/storage-types-0.8.0.tgz", - "integrity": "sha512-isRHcGrTs9kITJC0AVehHfpraWFui39MPaU7Eo8QfWlqW7YPymBmRgjDrlOgFdURh6Cdeg07zmkLP5tzTKRSpg==", + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/@firebase/storage-types/-/storage-types-0.8.2.tgz", + "integrity": "sha512-0vWu99rdey0g53lA7IShoA2Lol1jfnPovzLDUBuon65K7uKG9G+L5uO05brD9pMw+l4HRFw23ah3GwTGpEav6g==", + "license": "Apache-2.0", "peerDependencies": { "@firebase/app-types": "0.x", "@firebase/util": "1.x" } }, "node_modules/@firebase/storage/node_modules/tslib": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.0.tgz", + "integrity": "sha512-jWVzBLplnCmoaTr13V9dYbiQ99wvZRd0vNWaDRg+aVYRcjDF3nDksxFDE/+fkXnKhpnUUkmx5pK/v8mCtLVqZA==", + "license": "0BSD" }, "node_modules/@firebase/util": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/@firebase/util/-/util-1.9.3.tgz", - "integrity": "sha512-DY02CRhOZwpzO36fHpuVysz6JZrscPiBXD0fXp6qSrL9oNOx5KWICKdR95C0lSITzxp0TZosVyHqzatE8JbcjA==", + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/@firebase/util/-/util-1.10.0.tgz", + "integrity": "sha512-xKtx4A668icQqoANRxyDLBLz51TAbDP9KRfpbKGxiCAW346d0BeJe5vN6/hKxxmWwnZ0mautyv39JxviwwQMOQ==", + "license": "Apache-2.0", "dependencies": { "tslib": "^2.1.0" } }, "node_modules/@firebase/util/node_modules/tslib": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.0.tgz", + "integrity": "sha512-jWVzBLplnCmoaTr13V9dYbiQ99wvZRd0vNWaDRg+aVYRcjDF3nDksxFDE/+fkXnKhpnUUkmx5pK/v8mCtLVqZA==", + "license": "0BSD" + }, + "node_modules/@firebase/vertexai-preview": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/@firebase/vertexai-preview/-/vertexai-preview-0.0.4.tgz", + "integrity": "sha512-EBSqyu9eg8frQlVU9/HjKtHN7odqbh9MtAcVz3WwHj4gLCLOoN9F/o+oxlq3CxvFrd3CNTZwu6d2mZtVlEInng==", + "license": "Apache-2.0", + "dependencies": { + "@firebase/app-check-interop-types": "0.3.2", + "@firebase/component": "0.6.9", + "@firebase/logger": "0.4.2", + "@firebase/util": "1.10.0", + "tslib": "^2.1.0" + }, + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "@firebase/app": "0.x", + "@firebase/app-types": "0.x" + } + }, + "node_modules/@firebase/vertexai-preview/node_modules/tslib": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.0.tgz", + "integrity": "sha512-jWVzBLplnCmoaTr13V9dYbiQ99wvZRd0vNWaDRg+aVYRcjDF3nDksxFDE/+fkXnKhpnUUkmx5pK/v8mCtLVqZA==", + "license": "0BSD" }, "node_modules/@firebase/webchannel-wrapper": { - "version": "0.10.3", - "resolved": "https://registry.npmjs.org/@firebase/webchannel-wrapper/-/webchannel-wrapper-0.10.3.tgz", - "integrity": "sha512-+ZplYUN3HOpgCfgInqgdDAbkGGVzES1cs32JJpeqoh87SkRobGXElJx+1GZSaDqzFL+bYiX18qEcBK76mYs8uA==" + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@firebase/webchannel-wrapper/-/webchannel-wrapper-1.0.1.tgz", + "integrity": "sha512-jmEnr/pk0yVkA7mIlHNnxCi+wWzOFUg0WyIotgkKAb2u1J7fAeDBcVNSTjTihbAYNusCLQdW5s9IJ5qwnEufcQ==", + "license": "Apache-2.0" }, "node_modules/@grpc/grpc-js": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.9.3.tgz", - "integrity": "sha512-b8iWtdrYIeT5fdZdS4Br/6h/kuk0PW5EVBUGk1amSbrpL8DlktJD43CdcCWwRdd6+jgwHhADSbL9CsNnm6EUPA==", + "version": "1.9.15", + "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.9.15.tgz", + "integrity": "sha512-nqE7Hc0AzI+euzUwDAy0aY5hCp10r734gMGRdU+qOPX0XSceI2ULrcXB5U2xSc5VkWwalCj4M7GzCAygZl2KoQ==", + "license": "Apache-2.0", "dependencies": { "@grpc/proto-loader": "^0.7.8", "@types/node": ">=12.12.47" @@ -2644,13 +2753,14 @@ } }, "node_modules/@grpc/proto-loader": { - "version": "0.7.10", - "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.7.10.tgz", - "integrity": "sha512-CAqDfoaQ8ykFd9zqBDn4k6iWT9loLAlc2ETmDFS9JCD70gDcnA4L3AFEo2iV7KyAtAAHFW9ftq1Fz+Vsgq80RQ==", + "version": "0.7.13", + "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.7.13.tgz", + "integrity": "sha512-AiXO/bfe9bmxBjxxtYxFAXGZvMaN5s8kO+jBHAJCON8rJoB5YS/D6X7ZNc6XQkuHNmyl4CYaMI1fJ/Gn27RGGw==", + "license": "Apache-2.0", "dependencies": { "lodash.camelcase": "^4.3.0", "long": "^5.0.0", - "protobufjs": "^7.2.4", + "protobufjs": "^7.2.5", "yargs": "^17.7.2" }, "bin": { @@ -3093,27 +3203,32 @@ "node_modules/@protobufjs/aspromise": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", - "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==" + "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==", + "license": "BSD-3-Clause" }, "node_modules/@protobufjs/base64": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", - "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==" + "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==", + "license": "BSD-3-Clause" }, "node_modules/@protobufjs/codegen": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", - "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==" + "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==", + "license": "BSD-3-Clause" }, "node_modules/@protobufjs/eventemitter": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", - "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==" + "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==", + "license": "BSD-3-Clause" }, "node_modules/@protobufjs/fetch": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", "integrity": "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==", + "license": "BSD-3-Clause", "dependencies": { "@protobufjs/aspromise": "^1.1.1", "@protobufjs/inquire": "^1.1.0" @@ -3122,27 +3237,32 @@ "node_modules/@protobufjs/float": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", - "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==" + "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==", + "license": "BSD-3-Clause" }, "node_modules/@protobufjs/inquire": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", - "integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==" + "integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==", + "license": "BSD-3-Clause" }, "node_modules/@protobufjs/path": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", - "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==" + "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==", + "license": "BSD-3-Clause" }, "node_modules/@protobufjs/pool": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", - "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==" + "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==", + "license": "BSD-3-Clause" }, "node_modules/@protobufjs/utf8": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", - "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==" + "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==", + "license": "BSD-3-Clause" }, "node_modules/@react-spring/animated": { "version": "9.4.5", @@ -6598,6 +6718,7 @@ "version": "0.11.4", "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", + "license": "Apache-2.0", "dependencies": { "websocket-driver": ">=0.5.1" }, @@ -6646,36 +6767,39 @@ } }, "node_modules/firebase": { - "version": "10.4.0", - "resolved": "https://registry.npmjs.org/firebase/-/firebase-10.4.0.tgz", - "integrity": "sha512-3Z8WsNwA7kbcKGZ+nrTZ/ES518pk0K440ZJYD8nUNKN5hV6ll+unhUw30t1msedN6yIFjhsC/9OwT4Z0ohwO2w==", - "dependencies": { - "@firebase/analytics": "0.10.0", - "@firebase/analytics-compat": "0.2.6", - "@firebase/app": "0.9.19", - "@firebase/app-check": "0.8.0", - "@firebase/app-check-compat": "0.3.7", - "@firebase/app-compat": "0.2.19", - "@firebase/app-types": "0.9.0", - "@firebase/auth": "1.3.0", - "@firebase/auth-compat": "0.4.6", - "@firebase/database": "1.0.1", - "@firebase/database-compat": "1.0.1", - "@firebase/firestore": "4.2.0", - "@firebase/firestore-compat": "0.3.18", - "@firebase/functions": "0.10.0", - "@firebase/functions-compat": "0.3.5", - "@firebase/installations": "0.6.4", - "@firebase/installations-compat": "0.2.4", - "@firebase/messaging": "0.12.4", - "@firebase/messaging-compat": "0.2.4", - "@firebase/performance": "0.6.4", - "@firebase/performance-compat": "0.2.4", - "@firebase/remote-config": "0.4.4", - "@firebase/remote-config-compat": "0.2.4", - "@firebase/storage": "0.11.2", - "@firebase/storage-compat": "0.3.2", - "@firebase/util": "1.9.3" + "version": "10.14.1", + "resolved": "https://registry.npmjs.org/firebase/-/firebase-10.14.1.tgz", + "integrity": "sha512-0KZxU+Ela9rUCULqFsUUOYYkjh7OM1EWdIfG6///MtXd0t2/uUIf0iNV5i0KariMhRQ5jve/OY985nrAXFaZeQ==", + "license": "Apache-2.0", + "dependencies": { + "@firebase/analytics": "0.10.8", + "@firebase/analytics-compat": "0.2.14", + "@firebase/app": "0.10.13", + "@firebase/app-check": "0.8.8", + "@firebase/app-check-compat": "0.3.15", + "@firebase/app-compat": "0.2.43", + "@firebase/app-types": "0.9.2", + "@firebase/auth": "1.7.9", + "@firebase/auth-compat": "0.5.14", + "@firebase/data-connect": "0.1.0", + "@firebase/database": "1.0.8", + "@firebase/database-compat": "1.0.8", + "@firebase/firestore": "4.7.3", + "@firebase/firestore-compat": "0.3.38", + "@firebase/functions": "0.11.8", + "@firebase/functions-compat": "0.3.14", + "@firebase/installations": "0.6.9", + "@firebase/installations-compat": "0.2.9", + "@firebase/messaging": "0.12.12", + "@firebase/messaging-compat": "0.2.12", + "@firebase/performance": "0.6.9", + "@firebase/performance-compat": "0.2.9", + "@firebase/remote-config": "0.4.9", + "@firebase/remote-config-compat": "0.2.9", + "@firebase/storage": "0.13.2", + "@firebase/storage-compat": "0.3.12", + "@firebase/util": "1.10.0", + "@firebase/vertexai-preview": "0.0.4" } }, "node_modules/flat-cache": { @@ -7031,7 +7155,8 @@ "node_modules/http-parser-js": { "version": "0.5.8", "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.8.tgz", - "integrity": "sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==" + "integrity": "sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==", + "license": "MIT" }, "node_modules/http-proxy-agent": { "version": "5.0.0", @@ -7075,7 +7200,8 @@ "node_modules/idb": { "version": "7.1.1", "resolved": "https://registry.npmjs.org/idb/-/idb-7.1.1.tgz", - "integrity": "sha512-gchesWBzyvGHRO9W8tzUWFDycow5gwjvFKfyV9FF32Y7F50yZMp7mP+T2mJIWFx49zicqyC4uefHM17o6xKIVQ==" + "integrity": "sha512-gchesWBzyvGHRO9W8tzUWFDycow5gwjvFKfyV9FF32Y7F50yZMp7mP+T2mJIWFx49zicqyC4uefHM17o6xKIVQ==", + "license": "ISC" }, "node_modules/ignore": { "version": "5.2.1", @@ -8153,7 +8279,8 @@ "node_modules/lodash.camelcase": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", - "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==" + "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==", + "license": "MIT" }, "node_modules/lodash.debounce": { "version": "4.0.8", @@ -8170,7 +8297,8 @@ "node_modules/long": { "version": "5.2.3", "resolved": "https://registry.npmjs.org/long/-/long-5.2.3.tgz", - "integrity": "sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==" + "integrity": "sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==", + "license": "Apache-2.0" }, "node_modules/loose-envify": { "version": "1.4.0", @@ -8379,44 +8507,6 @@ "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", "dev": true }, - "node_modules/node-fetch": { - "version": "2.6.7", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", - "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", - "dependencies": { - "whatwg-url": "^5.0.0" - }, - "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } - } - }, - "node_modules/node-fetch/node_modules/tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" - }, - "node_modules/node-fetch/node_modules/webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" - }, - "node_modules/node-fetch/node_modules/whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "dependencies": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, "node_modules/node-releases": { "version": "2.0.13", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz", @@ -8873,10 +8963,11 @@ "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" }, "node_modules/protobufjs": { - "version": "7.2.5", - "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.2.5.tgz", - "integrity": "sha512-gGXRSXvxQ7UiPgfw8gevrfRWcTlSbOFg+p/N+JVJEK5VhueL2miT6qTymqAmjr1Q5WbOCyJbyrk6JfWKwlFn6A==", + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.4.0.tgz", + "integrity": "sha512-mRUWCc3KUU4w1jU8sGxICXH/gNS94DvI1gxqDvBzhj1JpcsimQkYiOJfwsPUykUI5ZaspFbSgmBLER8IrQ3tqw==", "hasInstallScript": true, + "license": "BSD-3-Clause", "dependencies": { "@protobufjs/aspromise": "^1.1.2", "@protobufjs/base64": "^1.1.2", @@ -9350,7 +9441,8 @@ "type": "consulting", "url": "https://feross.org/support" } - ] + ], + "license": "MIT" }, "node_modules/safe-regex-test": { "version": "1.0.0", @@ -10002,6 +10094,15 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/undici": { + "version": "6.19.7", + "resolved": "https://registry.npmjs.org/undici/-/undici-6.19.7.tgz", + "integrity": "sha512-HR3W/bMGPSr90i8AAp2C4DM3wChFdJPLrWYpIS++LxS8K+W535qftjt+4MyjNYHeWabMj1nvtmLIi7l++iq91A==", + "license": "MIT", + "engines": { + "node": ">=18.17" + } + }, "node_modules/unicode-canonical-property-names-ecmascript": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", @@ -10286,6 +10387,7 @@ "version": "0.7.4", "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", + "license": "Apache-2.0", "dependencies": { "http-parser-js": ">=0.5.1", "safe-buffer": ">=5.1.0", @@ -10299,6 +10401,7 @@ "version": "0.1.4", "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", + "license": "Apache-2.0", "engines": { "node": ">=0.8.0" } diff --git a/frontend/package.json b/frontend/package.json index 6940a7a7b..cfc592445 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -21,7 +21,7 @@ "@sentry/react": "^8.18.0", "@types/react-color": "^3.0.7", "axios": "^1.7.2", - "firebase": "^10.4.0", + "firebase": "^10.14.1", "react": "^18.2.0", "react-color": "^2.19.3", "react-cookie": "^4.1.1", From 92762c3523d4291553f0a2099b81a57d3c1ab6e6 Mon Sep 17 00:00:00 2001 From: jnkeniaem Date: Thu, 31 Oct 2024 17:35:47 +0900 Subject: [PATCH 18/23] =?UTF-8?q?[FE]=20FEAT:=20isSupported=20=EB=A9=94?= =?UTF-8?q?=EC=84=9C=EB=93=9C=20=EC=82=AC=EC=9A=A9=ED=95=B4=20=EB=B8=8C?= =?UTF-8?q?=EB=9D=BC=EC=9A=B0=EC=A0=80=EC=97=90=EC=84=9C=20=ED=91=B8?= =?UTF-8?q?=EC=8B=9C=20=EC=95=8C=EB=A6=BC=20api=20=EC=82=AC=EC=9A=A9?= =?UTF-8?q?=EA=B0=80=EB=8A=A5=20=EC=97=AC=EB=B6=80=20=ED=99=95=EC=9D=B8=20?= =?UTF-8?q?=ED=9B=84=20=EC=B2=98=EB=A6=AC=20#1680?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- config | 2 +- .../Cabinet/firebase/firebase-messaging-sw.ts | 18 +++++++++++++++++- 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/config b/config index 93674bce3..11ffd5c04 160000 --- a/config +++ b/config @@ -1 +1 @@ -Subproject commit 93674bce354efe9ad8fb3a7a934bdbf5acd1d162 +Subproject commit 11ffd5c04017b67d1e65f100df63c2e6392edc8f diff --git a/frontend/src/Cabinet/firebase/firebase-messaging-sw.ts b/frontend/src/Cabinet/firebase/firebase-messaging-sw.ts index 9fc1a78c3..bde7aa91c 100644 --- a/frontend/src/Cabinet/firebase/firebase-messaging-sw.ts +++ b/frontend/src/Cabinet/firebase/firebase-messaging-sw.ts @@ -5,6 +5,7 @@ import { deleteToken, getMessaging, getToken, + isSupported, onMessage, } from "firebase/messaging"; @@ -23,11 +24,24 @@ let messaging: null | Messaging = null; if (typeof window !== "undefined" && typeof window.navigator !== "undefined") { messaging = getMessaging(app); } +const isApiSupported = await isSupported(); +const unsupportedMsg = `사용 중인 환경에서는 푸시 알림 기능이 +지원되지 않습니다. +데스크탑 이용을 권장드립니다.`; + +const checkBrowserSupport = () => { + if (isApiSupported) { + let error = new Error(unsupportedMsg); + error.name = "브라우저 알림 지원 제한"; + throw error; + } +}; // FCM APP을 등록 후 브라우저 알림 권한을 요청하고, 토큰을 반환 export const requestFcmAndGetDeviceToken = async (): Promise => { - console.log("권한 요청 중..."); + checkBrowserSupport(); + console.log("권한 요청 중..."); const permission = await Notification.requestPermission(); if (permission === "denied") { console.log("알림 권한 허용 안됨"); @@ -57,6 +71,8 @@ export const requestFcmAndGetDeviceToken = async (): Promise => { // FCM 토큰 제거 및 브라우저 알람 권한 해제 export const deleteFcmToken = async (): Promise => { + checkBrowserSupport(); + if (!messaging) { console.log("토큰 제거 실패"); return; From d0cd6d9422647b72793bd6bdb225a02979b35098 Mon Sep 17 00:00:00 2001 From: jnkeniaem Date: Thu, 31 Oct 2024 17:49:10 +0900 Subject: [PATCH 19/23] =?UTF-8?q?[FE]=20FEAT:=20response=20modal=EC=97=90?= =?UTF-8?q?=20=EB=A9=94=EC=8B=9C=EC=A7=80=20=EB=9D=84=EC=9A=B0=EA=B8=B0=20?= =?UTF-8?q?=EC=9C=84=ED=95=B4=20modalContents=20useState=20=EC=84=A0?= =?UTF-8?q?=EC=96=B8=20=EB=B0=8F=20=EC=82=AC=EC=9A=A9=20#1680?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../components/Card/AlarmCard/AlarmCard.container.tsx | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/frontend/src/Cabinet/components/Card/AlarmCard/AlarmCard.container.tsx b/frontend/src/Cabinet/components/Card/AlarmCard/AlarmCard.container.tsx index 28437807a..fafde7570 100644 --- a/frontend/src/Cabinet/components/Card/AlarmCard/AlarmCard.container.tsx +++ b/frontend/src/Cabinet/components/Card/AlarmCard/AlarmCard.container.tsx @@ -20,6 +20,7 @@ const AlarmCardContainer = ({ alarm }: { alarm: AlarmInfo | null }) => { const [showResponseModal, setShowResponseModal] = useState(false); const [hasErrorOnResponse, setHasErrorOnResponse] = useState(false); const [modalTitle, setModalTitle] = useState(""); + const [modalContents, setModalContents] = useState(null); const [alarms, setAlarms] = useState({ current: alarm, original: alarm }); const [isLoading, setIsLoading] = useState(false); const isModified = useMemo( @@ -34,7 +35,6 @@ const AlarmCardContainer = ({ alarm }: { alarm: AlarmInfo | null }) => { const updateAlarmReceptionPath = async () => { try { - await axiosUpdateAlarmReceptionPath(alarms.current!); // 푸쉬 알림 설정이 변경되었을 경우, 토큰을 요청하거나 삭제합니다. if (alarms.current!.push) { const deviceToken = await requestFcmAndGetDeviceToken(); @@ -43,12 +43,17 @@ const AlarmCardContainer = ({ alarm }: { alarm: AlarmInfo | null }) => { await deleteFcmToken(); await axiosUpdateDeviceToken(null); } + await axiosUpdateAlarmReceptionPath(alarms.current!); setAlarms({ current: alarms.current, original: alarms.current }); setModalTitle("설정이 저장되었습니다"); } catch (error: any) { setAlarms((prev) => ({ ...prev, current: prev.original })); setHasErrorOnResponse(true); - setModalTitle(error.response.data.message); + if (error.response) setModalTitle(error.response.data.message); + else { + setModalTitle(error.name); + setModalContents(error.message); + } } finally { setIsLoading(false); setShowResponseModal(true); @@ -121,11 +126,13 @@ const AlarmCardContainer = ({ alarm }: { alarm: AlarmInfo | null }) => { (hasErrorOnResponse ? ( ) : ( ))} From d776e13c7154f18422126242e5ba8cad8ac34746 Mon Sep 17 00:00:00 2001 From: jnkeniaem Date: Thu, 31 Oct 2024 17:56:11 +0900 Subject: [PATCH 20/23] =?UTF-8?q?[FE]=20FEAT:=20=EB=B8=8C=EB=9D=BC?= =?UTF-8?q?=EC=9A=B0=EC=A0=80=EC=97=90=EC=84=9C=20=ED=91=B8=EC=8B=9C=20?= =?UTF-8?q?=EC=95=8C=EB=A6=BC=20=EA=B8=B0=EB=8A=A5=20=EC=A7=80=EC=9B=90?= =?UTF-8?q?=ED=95=98=EB=8A=94=20=EA=B2=BD=EC=9A=B0=EC=97=90=EB=A7=8C=20get?= =?UTF-8?q?Messaging=20=ED=98=B8=EC=B6=9C=20#1680?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Cabinet/firebase/firebase-messaging-sw.ts | 25 ++++++++----------- 1 file changed, 10 insertions(+), 15 deletions(-) diff --git a/frontend/src/Cabinet/firebase/firebase-messaging-sw.ts b/frontend/src/Cabinet/firebase/firebase-messaging-sw.ts index bde7aa91c..2c91a2dc5 100644 --- a/frontend/src/Cabinet/firebase/firebase-messaging-sw.ts +++ b/frontend/src/Cabinet/firebase/firebase-messaging-sw.ts @@ -20,17 +20,21 @@ export const firebaseConfig = { }; const app = initializeApp(firebaseConfig); +const isApiSupported = await isSupported(); // NOTE : 사용자 브라우저가 푸시 알림 기능을 지원하는지 확인 let messaging: null | Messaging = null; -if (typeof window !== "undefined" && typeof window.navigator !== "undefined") { +if ( + typeof window !== "undefined" && + typeof window.navigator !== "undefined" && + isApiSupported +) { messaging = getMessaging(app); } -const isApiSupported = await isSupported(); const unsupportedMsg = `사용 중인 환경에서는 푸시 알림 기능이 지원되지 않습니다. 데스크탑 이용을 권장드립니다.`; const checkBrowserSupport = () => { - if (isApiSupported) { + if (!isApiSupported) { let error = new Error(unsupportedMsg); error.name = "브라우저 알림 지원 제한"; throw error; @@ -50,18 +54,14 @@ export const requestFcmAndGetDeviceToken = async (): Promise => { console.log("알림 권한이 허용됨"); - if (!messaging) { - console.log("토큰 생성 또는 갱신 실패"); - return null; - } - const token = await getToken(messaging, { + const token = await getToken(messaging!, { vapidKey: import.meta.env.VITE_FIREBASE_APP_VAPID_KEY, }); if (token) console.log("token: ", token); else console.log("Can not get Token"); - onMessage(messaging, (payload) => { + onMessage(messaging!, (payload) => { console.log("메시지가 도착했습니다.", payload); // ... }); @@ -73,11 +73,6 @@ export const requestFcmAndGetDeviceToken = async (): Promise => { export const deleteFcmToken = async (): Promise => { checkBrowserSupport(); - if (!messaging) { - console.log("토큰 제거 실패"); - return; - } - - await deleteToken(messaging); + await deleteToken(messaging!); console.log("Token deleted."); }; From b69f1abd9f54c8071eb6b210199945c0ba56bcaa Mon Sep 17 00:00:00 2001 From: jnkeniaem Date: Thu, 31 Oct 2024 18:12:33 +0900 Subject: [PATCH 21/23] =?UTF-8?q?[FE]=20FIX:=20await=20=ED=82=A4=EC=9B=8C?= =?UTF-8?q?=EB=93=9C=20=EB=A7=90=EA=B3=A0=20then=20=EC=82=AC=EC=9A=A9?= =?UTF-8?q?=ED=95=B4=20=ED=94=84=EB=A1=9C=EB=AF=B8=EC=8A=A4=20=ED=9B=84?= =?UTF-8?q?=EC=86=8D=20=EC=B2=98=EB=A6=AC=20#1680?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Cabinet/firebase/firebase-messaging-sw.ts | 20 +++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/frontend/src/Cabinet/firebase/firebase-messaging-sw.ts b/frontend/src/Cabinet/firebase/firebase-messaging-sw.ts index 2c91a2dc5..2eb3473ea 100644 --- a/frontend/src/Cabinet/firebase/firebase-messaging-sw.ts +++ b/frontend/src/Cabinet/firebase/firebase-messaging-sw.ts @@ -20,15 +20,19 @@ export const firebaseConfig = { }; const app = initializeApp(firebaseConfig); -const isApiSupported = await isSupported(); // NOTE : 사용자 브라우저가 푸시 알림 기능을 지원하는지 확인 let messaging: null | Messaging = null; -if ( - typeof window !== "undefined" && - typeof window.navigator !== "undefined" && - isApiSupported -) { - messaging = getMessaging(app); -} +let isApiSupported = false; +isSupported().then((result) => { + isApiSupported = result; + if ( + typeof window !== "undefined" && + typeof window.navigator !== "undefined" && + isApiSupported + ) { + messaging = getMessaging(app); + } +}); // NOTE : 사용자 브라우저가 푸시 알림 기능을 지원하는지 확인 + const unsupportedMsg = `사용 중인 환경에서는 푸시 알림 기능이 지원되지 않습니다. 데스크탑 이용을 권장드립니다.`; From 37aa76cf81c3edda238e724ad2191f01e13bc7f0 Mon Sep 17 00:00:00 2001 From: jnkeniaem Date: Thu, 31 Oct 2024 18:16:58 +0900 Subject: [PATCH 22/23] =?UTF-8?q?[FE]=20CHORE:=20=EA=B0=80=EB=8F=85?= =?UTF-8?q?=EC=84=B1=20=EC=9C=84=ED=95=B4=20=EC=A4=84=EB=B0=94=EA=BF=88=20?= =?UTF-8?q?#1680?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- frontend/src/Cabinet/firebase/firebase-messaging-sw.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/frontend/src/Cabinet/firebase/firebase-messaging-sw.ts b/frontend/src/Cabinet/firebase/firebase-messaging-sw.ts index 2eb3473ea..7dff4c00b 100644 --- a/frontend/src/Cabinet/firebase/firebase-messaging-sw.ts +++ b/frontend/src/Cabinet/firebase/firebase-messaging-sw.ts @@ -22,6 +22,7 @@ export const firebaseConfig = { const app = initializeApp(firebaseConfig); let messaging: null | Messaging = null; let isApiSupported = false; + isSupported().then((result) => { isApiSupported = result; if ( @@ -31,7 +32,8 @@ isSupported().then((result) => { ) { messaging = getMessaging(app); } -}); // NOTE : 사용자 브라우저가 푸시 알림 기능을 지원하는지 확인 +}); +// NOTE : 사용자 브라우저가 푸시 알림 기능을 지원하는지 확인 const unsupportedMsg = `사용 중인 환경에서는 푸시 알림 기능이 지원되지 않습니다. From 38d6dda620876ad714ee6610bb33709dd0d3e5e9 Mon Sep 17 00:00:00 2001 From: jnkeniaem Date: Mon, 4 Nov 2024 21:27:21 +0900 Subject: [PATCH 23/23] =?UTF-8?q?[FE]=20FEAT:=20api=20=EC=9D=91=EB=8B=B5?= =?UTF-8?q?=20=EC=88=98=EC=8B=A0=EC=A0=84=EA=B9=8C=EC=A7=80=20=ED=86=A0?= =?UTF-8?q?=EA=B8=80=20=ED=81=B4=EB=A6=AD=20=EB=B0=A9=EC=A7=80=20#1680?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- config | 2 +- .../components/Card/AlarmCard/AlarmCard.container.tsx | 1 + .../src/Cabinet/components/Card/AlarmCard/AlarmCard.tsx | 9 ++++++++- 3 files changed, 10 insertions(+), 2 deletions(-) diff --git a/config b/config index 11ffd5c04..f05053fff 160000 --- a/config +++ b/config @@ -1 +1 @@ -Subproject commit 11ffd5c04017b67d1e65f100df63c2e6392edc8f +Subproject commit f05053fff8f24d8fc3b535c6fcf9c7c98341e691 diff --git a/frontend/src/Cabinet/components/Card/AlarmCard/AlarmCard.container.tsx b/frontend/src/Cabinet/components/Card/AlarmCard/AlarmCard.container.tsx index fafde7570..4f3ce8a65 100644 --- a/frontend/src/Cabinet/components/Card/AlarmCard/AlarmCard.container.tsx +++ b/frontend/src/Cabinet/components/Card/AlarmCard/AlarmCard.container.tsx @@ -120,6 +120,7 @@ const AlarmCardContainer = ({ alarm }: { alarm: AlarmInfo | null }) => { ] } onToggleChange={handleToggleChange} + isLoading={isLoading} /> {showResponseModal && diff --git a/frontend/src/Cabinet/components/Card/AlarmCard/AlarmCard.tsx b/frontend/src/Cabinet/components/Card/AlarmCard/AlarmCard.tsx index f8af279f9..3c2ed2013 100644 --- a/frontend/src/Cabinet/components/Card/AlarmCard/AlarmCard.tsx +++ b/frontend/src/Cabinet/components/Card/AlarmCard/AlarmCard.tsx @@ -11,9 +11,15 @@ interface AlarmCardProps { alarm: AlarmInfo; buttons: IButtonProps[]; onToggleChange: (type: keyof AlarmInfo, checked: boolean) => void; + isLoading: boolean; } -const AlarmCard = ({ alarm, buttons, onToggleChange }: AlarmCardProps) => { +const AlarmCard = ({ + alarm, + buttons, + onToggleChange, + isLoading, +}: AlarmCardProps) => { const handleToggle = (type: keyof AlarmInfo) => (checked: boolean) => { onToggleChange(type, checked); }; @@ -25,6 +31,7 @@ const AlarmCard = ({ alarm, buttons, onToggleChange }: AlarmCardProps) => { id={`${type}-alarm`} checked={alarm[type]} onChange={handleToggle(type)} + disabled={isLoading} /> );