From 3b240d1fbbf614073a0db9d2183925a610fddb73 Mon Sep 17 00:00:00 2001 From: jnkeniaem Date: Fri, 6 Sep 2024 16:52:55 +0900 Subject: [PATCH 01/49] =?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/49] =?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/49] =?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/49] =?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/49] =?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/49] =?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/49] =?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/49] =?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/49] =?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/49] =?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/49] =?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 94fe6fd43a9e67a92597474995b01de5c6a595ab Mon Sep 17 00:00:00 2001 From: jnkeniaem Date: Wed, 25 Sep 2024 14:59:58 +0900 Subject: [PATCH 12/49] =?UTF-8?q?[FE]=20FEAT:=20=EC=9C=A0=EC=A0=80=20?= =?UTF-8?q?=EB=A1=9C=EA=B7=B8=EC=9D=B8,=20post=20login,=20=ED=99=88?= =?UTF-8?q?=ED=8E=98=EC=9D=B4=EC=A7=80=20=EC=A0=9C=EC=99=B8=20=ED=8E=98?= =?UTF-8?q?=EC=9D=B4=EC=A7=80=20lazy=20import=20=EC=A0=81=EC=9A=A9=20#1687?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- frontend/src/App.tsx | 50 +++++++++++++++++++++++++++----------------- 1 file changed, 31 insertions(+), 19 deletions(-) diff --git a/frontend/src/App.tsx b/frontend/src/App.tsx index 4dc792545..66a967004 100644 --- a/frontend/src/App.tsx +++ b/frontend/src/App.tsx @@ -2,32 +2,34 @@ import PageTracker from "@/api/analytics/PageTracker"; import * as Sentry from "@sentry/react"; import React, { Suspense, lazy } from "react"; import { BrowserRouter, Route, Routes } from "react-router-dom"; -import AvailablePage from "@/Cabinet/pages/AvailablePage"; -import ClubPage from "@/Cabinet/pages/ClubPage"; -import CoinLogPage from "@/Cabinet/pages/CoinLogPage"; import HomePage from "@/Cabinet/pages/HomePage"; -import InventoryPage from "@/Cabinet/pages/InventoryPage"; -import ItemUsageLogPage from "@/Cabinet/pages/ItemUsageLogPage"; import Layout from "@/Cabinet/pages/Layout"; -import LogPage from "@/Cabinet/pages/LogPage"; import LoginPage from "@/Cabinet/pages/LoginPage"; -import MainPage from "@/Cabinet/pages/MainPage"; 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 AdminStorePage from "@/Cabinet/pages/admin/AdminStorePage"; import LoadingAnimation from "@/Cabinet/components/Common/LoadingAnimation"; -import DetailPage from "@/Presentation/pages/DetailPage"; -import PresentationHomePage from "@/Presentation/pages/HomePage"; -import PresentationLayout from "@/Presentation/pages/Layout"; -import PresentationLogPage from "@/Presentation/pages/LogPage"; -import RegisterPage from "@/Presentation/pages/RegisterPage"; -import AdminPresentationLayout from "@/Presentation/pages/admin/AdminLayout"; -const NotFoundPage = lazy(() => import("@/Cabinet/pages/NotFoundPage")); const LoginFailurePage = lazy(() => import("@/Cabinet/pages/LoginFailurePage")); +const NotFoundPage = lazy(() => import("@/Cabinet/pages/NotFoundPage")); +const AvailablePage = lazy(() => import("@/Cabinet/pages/AvailablePage")); +const ClubPage = lazy(() => import("@/Cabinet/pages/ClubPage")); +const CoinLogPage = lazy(() => import("@/Cabinet/pages/CoinLogPage")); +const InventoryPage = lazy(() => import("@/Cabinet/pages/InventoryPage")); +const ItemUsageLogPage = lazy(() => import("@/Cabinet/pages/ItemUsageLogPage")); +const LogPage = lazy(() => import("@/Cabinet/pages/LogPage")); +const MainPage = lazy(() => import("@/Cabinet/pages/MainPage")); +const ProfilePage = lazy(() => import("@/Cabinet/pages/ProfilePage")); +const StoreMainPage = lazy(() => import("@/Cabinet/pages/StoreMainPage")); + +// NOTE : 수요지식회 +const PresentationHomePage = lazy( + () => import("@/Presentation/pages/HomePage") +); +const PresentationLayout = lazy(() => import("@/Presentation/pages/Layout")); +const DetailPage = lazy(() => import("@/Presentation/pages/DetailPage")); +const PresentationLogPage = lazy(() => import("@/Presentation/pages/LogPage")); +const RegisterPage = lazy(() => import("@/Presentation/pages/RegisterPage")); + +// NOTE : admin const AdminLayout = lazy(() => import("@/Cabinet/pages/admin/AdminLayout")); const AdminLoginPage = lazy( () => import("@/Cabinet/pages/admin/AdminLoginPage") @@ -38,6 +40,16 @@ const AdminLoginFailurePage = lazy( () => import("@/Cabinet/pages/admin/AdminLoginFailurePage") ); const AdminHomePage = lazy(() => import("@/Cabinet/pages/admin/AdminHomePage")); +const AdminMainPage = lazy(() => import("@/Cabinet/pages/admin/AdminMainPage")); +const AdminSlackNotiPage = lazy( + () => import("@/Cabinet/pages/admin/AdminSlackNotiPage") +); +const AdminStorePage = lazy( + () => import("@/Cabinet/pages/admin/AdminStorePage") +); +const AdminPresentationLayout = lazy( + () => import("@/Presentation/pages/admin/AdminLayout") +); function App(): React.ReactElement { const SentryRoutes = Sentry.withSentryReactRouterV6Routing(Routes); From ebe87da99306d37a41162cbb81e2fec832334eda Mon Sep 17 00:00:00 2001 From: jnkeniaem Date: Wed, 25 Sep 2024 16:36:43 +0900 Subject: [PATCH 13/49] =?UTF-8?q?[FE]=20REFACT:=20=EB=B9=8C=EB=94=A9=20?= =?UTF-8?q?=EB=B0=8F=20=EB=82=98=EC=9D=98=20=EB=8C=80=EC=97=AC=20=EC=A0=95?= =?UTF-8?q?=EB=B3=B4=20=EB=B6=88=EB=9F=AC=EC=98=A4=EA=B8=B0=EB=A5=BC=20?= =?UTF-8?q?=EC=83=81=EC=9C=84=EC=BB=B4=ED=8F=AC=EB=84=8C=ED=8A=B8(Layout)?= =?UTF-8?q?=EC=97=90=EC=84=9C=20=EC=B2=98=EB=A6=AC=20#1687?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../components/TopNav/TopNav.container.tsx | 54 +++---------------- 1 file changed, 6 insertions(+), 48 deletions(-) diff --git a/frontend/src/Cabinet/components/TopNav/TopNav.container.tsx b/frontend/src/Cabinet/components/TopNav/TopNav.container.tsx index 8ec3690cf..ed95a9758 100644 --- a/frontend/src/Cabinet/components/TopNav/TopNav.container.tsx +++ b/frontend/src/Cabinet/components/TopNav/TopNav.container.tsx @@ -1,32 +1,18 @@ -import React, { SetStateAction, useEffect, useState } from "react"; +import React, { useEffect, useState } from "react"; import { useLocation, useNavigate } from "react-router-dom"; -import { useRecoilState, useRecoilValue, useSetRecoilState } from "recoil"; -import { - buildingsFloorState, - currentBuildingNameState, - myCabinetInfoState, -} from "@/Cabinet/recoil/atoms"; +import { useRecoilState, useRecoilValue } from "recoil"; +import { currentBuildingNameState } from "@/Cabinet/recoil/atoms"; import { buildingsState } from "@/Cabinet/recoil/selectors"; import TopNav from "@/Cabinet/components/TopNav/TopNav"; -import { MyCabinetInfoResponseDto } from "@/Cabinet/types/dto/cabinet.dto"; -import { - axiosBuildingFloor, - axiosMyLentInfo, -} from "@/Cabinet/api/axios/axios.custom"; +import { staticColNumData } from "@/Cabinet/assets/data/sectionColNumData"; import useMenu from "@/Cabinet/hooks/useMenu"; -const TopNavContainer: React.FC<{ - setIsLoading: React.Dispatch>; -}> = (props) => { +const TopNavContainer: React.FC = () => { const [buildingClicked, setBuildingClicked] = useState(false); const [currentBuildingName, setCurrentBuildingName] = useRecoilState( currentBuildingNameState ); - const setMyLentInfo = - useSetRecoilState(myCabinetInfoState); - const setBuildingsFloor = useSetRecoilState(buildingsFloorState); const buildingsList = useRecoilValue>(buildingsState); - const { setIsLoading } = props; const { toggleLeftNav } = useMenu(); const navigator = useNavigate(); const isLocation = useLocation(); @@ -35,34 +21,6 @@ const TopNavContainer: React.FC<{ toggleLeftNav(); }; - useEffect(() => { - function setTimeoutPromise(delay: number) { - return new Promise((resolve) => setTimeout(resolve, delay)); - } - const getBuildingsData = async () => { - try { - await setTimeoutPromise(500); - const buildingsFloorData = await axiosBuildingFloor(); - setBuildingsFloor([...buildingsFloorData.data]); - } catch (error) { - console.log(error); - } - }; - async function getMyLentInfo() { - try { - const { data: myLentInfo } = await axiosMyLentInfo(); - - setMyLentInfo(myLentInfo); - } catch (error) { - console.error(error); - } - } - - Promise.all([getBuildingsData(), getMyLentInfo()]).then(() => - setIsLoading(false) - ); - }, []); - useEffect(() => { if (buildingsList.length === 0) return; setCurrentBuildingName(buildingsList[0]); @@ -70,7 +28,7 @@ const TopNavContainer: React.FC<{ useEffect(() => { if (currentBuildingName === undefined) return; - else if (currentBuildingName === "새롬관") { + else if (currentBuildingName === staticColNumData[0].building) { navigator(isLocation); } }, [currentBuildingName]); From ce5b241f629889a810f3b292d8dfbc0e1a677255 Mon Sep 17 00:00:00 2001 From: jnkeniaem Date: Wed, 25 Sep 2024 16:39:26 +0900 Subject: [PATCH 14/49] =?UTF-8?q?[FE]=20FIX:=20=EB=A1=9C=EB=94=A9=EC=9D=B4?= =?UTF-8?q?=20=EB=81=9D=EB=82=98=EB=A9=B4=20top=20nav=20=EB=9D=84=EC=9B=8C?= =?UTF-8?q?=20loading=20animation=20=EC=9B=80=EC=A7=81=EC=9D=B4=EC=A7=80?= =?UTF-8?q?=20=EC=95=8A=EA=B2=8C=20=EA=B3=A0=EC=A0=95=20#1687?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- frontend/src/Cabinet/pages/Layout.tsx | 94 +++++++++++++++++++-------- 1 file changed, 66 insertions(+), 28 deletions(-) diff --git a/frontend/src/Cabinet/pages/Layout.tsx b/frontend/src/Cabinet/pages/Layout.tsx index 6062bc29a..3ec979485 100644 --- a/frontend/src/Cabinet/pages/Layout.tsx +++ b/frontend/src/Cabinet/pages/Layout.tsx @@ -4,6 +4,8 @@ import { useLocation, useNavigate } from "react-router-dom"; import { useSetRecoilState } from "recoil"; import styled, { css } from "styled-components"; import { + buildingsFloorState, + myCabinetInfoState, myClubListState, serverTimeState, targetClubInfoState, @@ -18,15 +20,18 @@ import OverduePenaltyModal from "@/Cabinet/components/Modals/OverduePenaltyModal import StoreInfo from "@/Cabinet/components/Store/StoreInfo"; import TopNavContainer from "@/Cabinet/components/TopNav/TopNav.container"; import { additionalModalType } from "@/Cabinet/assets/data/maps"; +import { MyCabinetInfoResponseDto } from "@/Cabinet/types/dto/cabinet.dto"; import { ClubPaginationResponseDto, ClubResponseDto, } from "@/Cabinet/types/dto/club.dto"; import { UserDto, UserInfo } from "@/Cabinet/types/dto/user.dto"; import { + axiosBuildingFloor, axiosMyClubList, axiosMyInfo, axiosMyItems, + axiosMyLentInfo, } from "@/Cabinet/api/axios/axios.custom"; import { getCookie } from "@/Cabinet/api/react_cookie/cookies"; import useMenu from "@/Cabinet/hooks/useMenu"; @@ -38,7 +43,6 @@ const token = getCookie("access_token"); const Layout = (): JSX.Element => { const [hasPenaltyItem, setHasPenaltyItem] = useState(true); const [isLoading, setIsLoading] = useState(true); - const [isValidToken, setIsValidToken] = useState(false); const [isModalOpen, setIsModalOpen] = useState(false); const [myInfoData, setMyInfoData] = useState(null); const setServerTime = useSetRecoilState(serverTimeState); @@ -47,6 +51,9 @@ const Layout = (): JSX.Element => { useSetRecoilState(myClubListState); const setTargetClubInfo = useSetRecoilState(targetClubInfoState); + const setBuildingsFloor = useSetRecoilState(buildingsFloorState); + const setMyLentInfo = + useSetRecoilState(myCabinetInfoState); const navigate = useNavigate(); const location = useLocation(); const { closeAll } = useMenu(); @@ -79,7 +86,6 @@ const Layout = (): JSX.Element => { setServerTime(new Date(formattedServerTime)); // 접속 후 최초 서버 시간을 가져옴 setMyInfoData(myInfo); setUser(myInfo); - setIsValidToken(true); if (data.penaltyItems.length == 0) { setHasPenaltyItem(false); } @@ -108,11 +114,33 @@ const Layout = (): JSX.Element => { } }; + const getBuildingsData = async () => { + try { + const buildingsFloorData = await axiosBuildingFloor(); + setBuildingsFloor([...buildingsFloorData.data]); + } catch (error) { + console.log(error); + } + }; + + async function getMyLentInfo() { + try { + const { data: myLentInfo } = await axiosMyLentInfo(); + + setMyLentInfo(myLentInfo); + } catch (error) { + console.error(error); + } + } + useEffect(() => { deleteOldPointColors(); if (!token && !isLoginPage) navigate("/login"); else if (token) { getMyInfo(); + Promise.all([getBuildingsData(), getMyLentInfo()]).then(() => + setIsLoading(false) + ); getMyClubList(); // 서버 시간 const serverTimer = setInterval(() => { @@ -152,34 +180,40 @@ const Layout = (): JSX.Element => { ) : ( - {isValidToken && } {isLoading ? ( - + + + ) : ( - - - - - - - - - - - - - {isModalOpen && myInfoData && myInfoData.unbannedAt !== undefined && ( - - )} - + <> + + + + + + + + + + + + + + {isModalOpen && + myInfoData && + myInfoData.unbannedAt !== undefined && ( + + )} + + )} ); @@ -227,4 +261,8 @@ const MenuBgStyled = styled.div` position: none; `; +const LoadingAnimationWrapper = styled.div` + height: 100vh; +`; + export default Layout; From 680b0ad4e21def1c336e92dbe24d020a68f292d7 Mon Sep 17 00:00:00 2001 From: jusohn Eddie Sohn Date: Wed, 2 Oct 2024 15:08:59 +0900 Subject: [PATCH 15/49] =?UTF-8?q?[FE]=20FEAT:=20meta=20description=20?= =?UTF-8?q?=EA=B3=BC=20keywords=20=EC=B6=94=EA=B0=80=20#1687?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- frontend/index.html | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/frontend/index.html b/frontend/index.html index 768d40f31..c72f9aa7d 100644 --- a/frontend/index.html +++ b/frontend/index.html @@ -6,6 +6,14 @@ src="/src/Cabinet/components/Card/DisplayStyleCard/displayStyleInitializer.ts" > + + Date: Wed, 2 Oct 2024 15:09:32 +0900 Subject: [PATCH 16/49] =?UTF-8?q?[FE]=20FEAT:=20robots.txt=20=EC=83=9D?= =?UTF-8?q?=EC=84=B1=20#1687?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- frontend/public/robots.txt | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 frontend/public/robots.txt diff --git a/frontend/public/robots.txt b/frontend/public/robots.txt new file mode 100644 index 000000000..ab3947092 --- /dev/null +++ b/frontend/public/robots.txt @@ -0,0 +1,2 @@ +User-agent: * +Allow : / From 2dc1a4b96a231ccf2b0dd435e96dcbf334b7e5d0 Mon Sep 17 00:00:00 2001 From: jusohn Eddie Sohn Date: Wed, 2 Oct 2024 15:47:21 +0900 Subject: [PATCH 17/49] =?UTF-8?q?[FE]=20FIX:=20Do=20Hyeon=20=ED=8F=B0?= =?UTF-8?q?=ED=8A=B8=20import=20=EC=B5=9C=EC=A0=81=ED=99=94=20#1687?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- frontend/src/index.css | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/frontend/src/index.css b/frontend/src/index.css index 41efe0498..bcbe50337 100644 --- a/frontend/src/index.css +++ b/frontend/src/index.css @@ -1,4 +1,5 @@ -@import url("https://fonts.googleapis.com/css2?family=Do+Hyeon&family=Noto+Sans+KR:wght@300;400;700&display=swap"); +@import url("https://fonts.googleapis.com/css2?family=Do+Hyeon&display=swap&text=새롬관"); +@import url("https://fonts.googleapis.com/css2?family=Noto+Sans+KR:wght@300;400;700&display=swap"); :root { /* white, gray, black */ @@ -95,7 +96,6 @@ --custom-green-100: var(--ref-green-300); --custom-green-200: var(--ref-green-400); - /* component variable */ --color-picker-hash-color: var(--ref-gray-450); --sys-sub-color: var(--ref-purple-300); From 6993d764e4b4587ecb9f89e90a4b58f29f991169 Mon Sep 17 00:00:00 2001 From: jusohn Eddie Sohn Date: Wed, 2 Oct 2024 15:50:37 +0900 Subject: [PATCH 18/49] =?UTF-8?q?[FE]=20FIX:=20Do=20Hyeon=20=ED=8F=B0?= =?UTF-8?q?=ED=8A=B8=20import=20=EC=B5=9C=EC=A0=81=ED=99=94=20#1687?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- frontend/src/index.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/index.css b/frontend/src/index.css index bcbe50337..cccb6ed28 100644 --- a/frontend/src/index.css +++ b/frontend/src/index.css @@ -1,4 +1,4 @@ -@import url("https://fonts.googleapis.com/css2?family=Do+Hyeon&display=swap&text=새롬관"); +@import url("https://fonts.googleapis.com/css2?family=Do+Hyeon&display=swap&text=새롬관로그인중"); @import url("https://fonts.googleapis.com/css2?family=Noto+Sans+KR:wght@300;400;700&display=swap"); :root { From 479032975ad88279e0bf00e3d38ff3b98e87b4a8 Mon Sep 17 00:00:00 2001 From: Minkyu01 Date: Tue, 8 Oct 2024 07:52:05 +0900 Subject: [PATCH 19/49] =?UTF-8?q?[FE]=20FEAT:=20lighthouse=20=20Webp=20?= =?UTF-8?q?=EC=A0=81=EC=9A=A9=20#1687?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- config | 2 +- dev/configure.conf | 15 +++ frontend/index.html | 92 ++++++++++++++++-- frontend/public/icons/icon-192x192.webp | Bin 0 -> 3264 bytes frontend/public/icons/icon-256x256.webp | Bin 0 -> 4452 bytes frontend/public/icons/icon-384x384.webp | Bin 0 -> 7572 bytes frontend/public/icons/icon-512x512.webp | Bin 0 -> 10602 bytes frontend/public/manifest.json | 27 +++++ .../src/Cabinet/assets/images/storeCoin.svg | 10 +- .../assets/images/webp/desktopLogo.webp | Bin 0 -> 12278 bytes .../assets/images/webp/happyCcabi.webp | Bin 0 -> 16524 bytes .../assets/images/webp/happyCcabiWhite.webp | Bin 0 -> 17102 bytes .../src/Cabinet/assets/images/webp/logo.webp | Bin 0 -> 1238 bytes .../Cabinet/assets/images/webp/storeCoin.webp | Bin 0 -> 3352 bytes .../components/Announce/AnnounceTemplate.tsx | 22 ++++- .../CabinetList/EmptySection/EmptySection.tsx | 14 ++- .../Cabinet/components/Store/StoreInfo.tsx | 4 + frontend/src/index.css | 4 +- frontend/src/main.tsx | 24 ++--- frontend/vite.config.ts | 21 ++++ package-lock.json | 13 +-- package.json | 2 +- 22 files changed, 211 insertions(+), 39 deletions(-) create mode 100644 frontend/public/icons/icon-192x192.webp create mode 100644 frontend/public/icons/icon-256x256.webp create mode 100644 frontend/public/icons/icon-384x384.webp create mode 100644 frontend/public/icons/icon-512x512.webp create mode 100644 frontend/src/Cabinet/assets/images/webp/desktopLogo.webp create mode 100644 frontend/src/Cabinet/assets/images/webp/happyCcabi.webp create mode 100644 frontend/src/Cabinet/assets/images/webp/happyCcabiWhite.webp create mode 100644 frontend/src/Cabinet/assets/images/webp/logo.webp create mode 100644 frontend/src/Cabinet/assets/images/webp/storeCoin.webp diff --git a/config b/config index dd72d80cc..4d4bcded9 160000 --- a/config +++ b/config @@ -1 +1 @@ -Subproject commit dd72d80cce8800e34f3938f3da0dfeb4ef9eb8eb +Subproject commit 4d4bcded9cac734f4dac74a7bdc02cb4da0e2e03 diff --git a/dev/configure.conf b/dev/configure.conf index 40ece1c4b..42d647247 100644 --- a/dev/configure.conf +++ b/dev/configure.conf @@ -3,6 +3,11 @@ default upgrade; '' close; } +# map $http_accept $webp_suffix { +# "~*image/webp" ".webp"; +# default ""; +# } + map $remote_addr $proxy_forwarded_elem { # IPv4 addresses can be sent as-is ~^[0-9.]+$ "for=$remote_addr"; @@ -50,6 +55,16 @@ server { proxy_read_timeout 3600s; } + # location ~* \.(png|jpg)$ { + # proxy_pass http://host.docker.internal:2424; + # proxy_set_header Host $host; + # add_header Vary Accept; + + # # WebP 파일이 있으면 WebP 파일을 제공, 없으면 원본 PNG/JPG 제공 + # try_files $uri$webp_suffix $uri =404; + # } + + location / { proxy_pass http://host.docker.internal:4242; proxy_http_version 1.1; diff --git a/frontend/index.html b/frontend/index.html index 768d40f31..e3f3905d2 100644 --- a/frontend/index.html +++ b/frontend/index.html @@ -1,19 +1,69 @@ - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
- + + diff --git a/frontend/public/icons/icon-192x192.webp b/frontend/public/icons/icon-192x192.webp new file mode 100644 index 0000000000000000000000000000000000000000..ce1d91f22e0bc2cf489019e8cf6cc047b467d0ef GIT binary patch literal 3264 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 literal 0 HcmV?d00001 diff --git a/frontend/public/icons/icon-384x384.webp b/frontend/public/icons/icon-384x384.webp new file mode 100644 index 0000000000000000000000000000000000000000..38e007182b6b1f359b4fab1e252eda8af5b06613 GIT binary patch literal 7572 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 U-brJt*Fzt$U*`Y$c>Ra}1M9`uo&W#< literal 0 HcmV?d00001 diff --git a/frontend/public/icons/icon-512x512.webp b/frontend/public/icons/icon-512x512.webp new file mode 100644 index 0000000000000000000000000000000000000000..08af58b6a249b3e7764805c651149ab968c2e5b1 GIT binary patch literal 10602 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

DKVV-1Y*rBD|DWtSf7p1J9R{9`qtG0_J{oDiT zo_LycdvA*u=J}n_a3&}fov6n3gA zK43dvK(fQZlZBL<`9&;#a%fE?AOJ$+DYXKh`MW z?P5eNFE{tpVa&i4;@6jg6c=NfV+mvN4TYG2Vsm+wqLb!)vz?$;cX-V0uWj2cJJa=dLKA!{qip04^M^ zA5zp#e2@~fz8EepJrpIScSM%Gfoaru9>1Vt`yunPc1m=xMFkVA*gD}EnR z%OX*(^!$S6RId46-Yq0&nWWCwIw_AJBDBvP6ZM)|WXQxQeO2{)4u@THu*gmX_?(NA z&UI=(v=HZbr6pkS=U%A$LyXA12Jrxb>Dy_E4!jJ0xewpS2-NxeQ9V*W`h;Aspbhl6M+&XCe(v`Z#A_J_~>1i5Y47(yGJJ(<{Y&C5)Jh4-#Fja?umEOQ^i*it{kI z&I9gW@gDIgh^~%m3vyM$6tb^GJ9kpXfle$o;MrtmQt3=*vR#VKCm38 z>M)I(zF|MizxLF&$KfamLn~#f&&=%Dt22!|n1YB^;hwwD4+G42{jXV$&c2%-*bfG> zKH>J5!a^WexTOq2Yy#MTvnWppm)nfk;&y_$15ZC?$+ETEr@Ixg%UoghxSh82G`$t( zu!mObWbq_kB>G{b)S7#k6%h8-LGNwuI(rn&&DU-k90pf1;xD{8oA_b0II#q@86mCwbP_lIjiIGS9dlPkEwZ_^vJ zrJ`F4!f{jG%$o?!d>Zzm(dAWFZW3UmzKC(rK$+fYHRhPP?Lq^`2lm)Le9$l41@j7M z;%@p;R7M@^N(Rl{2#!dzQbqu0fDl_ijD_Xf&o_@ePH@r!7Yg}seQ}L#vVn^@mlad+ zN16A-0<-Kqz8{(?xhI%Ihv*sn66zdPzH0fVCaq%M%14cD6Yg z-=Z!GB)O*#;vK#Stw{G$Wsh81EJ>+rb=Mgz2O`byI1Hc{?E0GL$?0fXxBT3(+yE6i zuqr`UZd*~bp98+f2lZywe0E}m$ff$7e?y9M`V_80qT%t2Z6990!jbZJD0H`fG=rp5 zW;trvts-6qC3A!6Wvfw5W)G(@nGDTY=jGm__G%HC=rYr0)O|(V~Hc- zlHXxK7ozh%vbk@~|J1CPw~DXOe_-iY4NE9>7YJgIxGx_&Vf}g&G-JtvpiH{BAaRz# za7G^6XeyvVKl`X|5o{vPcXYXTmEmwzXp!gDq;=^R;4&e1*$AR;8`|Z@B4L?w{ZCjL G0Qg^vU39?! literal 0 HcmV?d00001 diff --git a/frontend/public/manifest.json b/frontend/public/manifest.json index f8dfdbb41..36ade68be 100644 --- a/frontend/public/manifest.json +++ b/frontend/public/manifest.json @@ -7,28 +7,55 @@ "name": "42Cabi", "short_name": "Cabi", "icons": [ + { + "src": "icons/icon-192x192.webp", + "sizes": "192x192", + "type": "image/webp", + "purpose": "any" + }, { "src": "icons/icon-192x192.png", "sizes": "192x192", "type": "image/png", "purpose": "any" }, + { + "src": "icons/icon-192x192.webp", + "sizes": "192x192", + "type": "image/webp", + "purpose": "maskable" + }, { "src": "icons/icon-192x192.png", "sizes": "192x192", "type": "image/png", "purpose": "maskable" }, + { + "src": "icons/icon-256x256.webp", + "sizes": "256x256", + "type": "image/webp" + }, { "src": "icons/icon-256x256.png", "sizes": "256x256", "type": "image/png" }, + { + "src": "icons/icon-384x384.webp", + "sizes": "384x384", + "type": "image/webp" + }, { "src": "icons/icon-384x384.png", "sizes": "384x384", "type": "image/png" }, + { + "src": "icons/icon-512x512.webp", + "sizes": "512x512", + "type": "image/webp" + }, { "src": "icons/icon-512x512.png", "sizes": "512x512", diff --git a/frontend/src/Cabinet/assets/images/storeCoin.svg b/frontend/src/Cabinet/assets/images/storeCoin.svg index 2fe40696a..5b7ac217c 100644 --- a/frontend/src/Cabinet/assets/images/storeCoin.svg +++ b/frontend/src/Cabinet/assets/images/storeCoin.svg @@ -1,9 +1,9 @@ - - + + - - + + - + diff --git a/frontend/src/Cabinet/assets/images/webp/desktopLogo.webp b/frontend/src/Cabinet/assets/images/webp/desktopLogo.webp new file mode 100644 index 0000000000000000000000000000000000000000..4f0ae1c0369bd73159e1564b821f38bacf730156 GIT binary patch literal 12278 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 KT;Tum^*;bX`*OGd literal 0 HcmV?d00001 diff --git a/frontend/src/Cabinet/assets/images/webp/happyCcabiWhite.webp b/frontend/src/Cabinet/assets/images/webp/happyCcabiWhite.webp new file mode 100644 index 0000000000000000000000000000000000000000..32c8397f8bd707e3a77b38147da89365266bd3d7 GIT binary patch literal 17102 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%0AP_)=)3Z4E2Xm;|-RS8BVXxR8KWcQEe;ZCsa>Wx< zA^zPxu@0k%vLaumwq_;7WUkPS+Ij>Ge1TlE~-MYI$XX9gPvGozv*Lth1a+?AzgI562T$ zm`GnBwMmPXt~VwXpVD5Gs?$Rg9P74q-4TOjMCeM_=#<66SNsA)mv!ikK~Yjgcdbo~ z12`J>2XP>4AL)7>M!kFB1mEaPbp7I!+9|Da>rZQ}uyE3^jnnM~x-uBM>iGnChRWOX zo9R-sruN%9L@R^+y(v%Ofrb!9C&aevLVm3cor@D!J-hH_HgjILMP1FsQ(rCtBYUYKI7l0@jJ$CcU5DS>h#;FUqwAFnR0%Jf`$$ z$@|6sDXslyuHiyNDzGH^D<6mhGjgUSiD1Y{Jt+Cj63-y+Cd_6v-cvrt z@Dx_7~B$uo)(IF)+@*q_Y6)TS*)=7z!a>$ZEuFUSeU>bTWFS z930#t&Z66!nIaQNH&!x$Qr!GTa5dAA|8v1Tmn?QMT(}7}f7na5#ZcKHyb@)F?C<=c zLX4D<_>9L1{xjn>wYbg3V7wGVncGD^M6^gZm#|{R;BzF^8_t$Ll5YknzG}*{<88i> zb1K4!?EYE3O$eigZhab6!S7o2O8qj*e8<{m)UWn9zI=f~<=iIROVNg4vY|qTRn{`0 z`QqSaWU8TsGw(C}z%7a!VxvHU@>9h}u~Z@hQ(i}MvP7oJoW|ehS|#PAED#5q2dNQi z5-!eMRsMYJ?Vqd^H}vR`9d3V;A)OMOLMbGSk}4l^+TB$l#!#WURd5V4=(g&vMpuRt zdY4J2A*$U<^T|)&gV!qakj_lr-#wLQQqvZ4W)ci0Mc#Q>s6nyiHKZEmnohb5(G>Fg zV{=}`xCFEkMR1pGbwil)fD+P!6u&61kzQmby%3yvpG$baYED$Ym%(uXmttrkIs?Wu zScU!}R@0JXJT{~ctnDK&OrbF!VWG=Bkst=9E!{yY`JkUaf!*{n?mP<|Z|^eW3B?so zG>dd)6xEaB7JpjI`OY7R&fovO;+T2D8wnEKL(A%+q2PKc_QC2sx!=ir!V_G0S2m<{t8?@pHCL5-(i|Vlj}-RcZDw zj3;0#P(O3N&N_I**SFF-=}tXeO<66TS6P>ibC6I+FEE>4us-}REads?&3oN=`Mmqs zMif_r5c_aQo(jg+p@F@DZdIuEf`d}^@NID+~x35+#RU^ zouX?t{8>P$aL${lkbx42 z4dGV@czQ&61?6XwtatO;Jz!tg8$gqc*X>xM!XV~wtm+FV^-8Jf8X}&gk7-cmK~6t* z6-p?UW6-_CR+ZM+Qd;DTgN{QqoUBP(m^_4&e*g1aAl#QRbFh#*3oce)W*>|?t!;|G zQciBXHGf@>1Px8yAEZy~hgI|gJC@dQ5`^q}!v8{;Q^wqW^*tylT69nAE3H~G6~<4`Z}()jwL zL0gunD0y=k(n%U23^=%x-fmAWoE@PAfzmp|d9?%Mgr);*&MnEgK>{jiDe-{{9FsiQ zKga(jjPo7;88}+-n$Jmkb+Euxs;ynykMIV75otxJ`olzL*NeH5yYV1A>{vfH)pWK0 z)~vIP#2%eN{cyJs!M~vS)0A*-^UY41k~dxdg~r4r_F^lj7W#ulsj*Z zGzS&G6Gn0Cc_L1ptnP_6Jit%qXl4bg8oLYEmk&OtmsSK%)=OO&D|pXTNiRHB&==CP zm0~Zy$L0=SSV#AXF}1wx8AO9wEGlWkGMnXRKiEWiJf`EDJ6B07>d~XGl3@zfrdXLH zT*D^$8dRcxSm04qDFBgnGcXF06In7gEg)!uz?889-~N;~UODqn_8R2|HK|!Aw2{cq z4=aW52}IWm5||logilB;+?u@r8>vrpu0Nx`!a%X~8+fMEueJDpSw z&w&8fSi-_mo_EuWD+p}`C3cfPTnUOw?~cfiSD3{|ddTzb_gqyr`2JXiHx>8p97Dc! zXnL<}|3=>ZYA4%s>;lqOvSR(47yl)BYym`zl`u=ElJK&HH#RNly^_k6IE zUbKw9>OZFTYNcGASkO2lUurAGN)bp$W|O?})ZR3;0gO;e{2^zP6ZGgWN1sf-CGH(` z3J(cl22O7|b`q2Zd2BrDWVg>xyhL%!&4BgFG{hTxP^honl!lFfDb$GVh1ZLJ@m?s5 zlJfjdnc$2H((LtZ-jMUi9$xx&{sLFh&+lw9n?c=T(ZuoY%#|wKyEp@P#>JbV`+&6+ zLN$sV%=br~mgrb4(8dcuT9-MCN{ehUq6(Q2p>t@;Epg@>gsM$C4TwvSbz&WGeDtA3 zXstyM!s|uepxbq1>p*y3Dy~)5ub08a!}z&Gbv^4O$K0Vn?*cJDKTgOzc{d@ z*H2(QQVXBC-UjpozLBGsv;w?c^;mb08CZ*l6gldo+ZcNkB&Ly9pei1&9RZ1S&Cvx0a?_q#lT^=3*PFNX{%w8sXn|0THYUJ5RmmZtYP5V$>Bxhvd$POH8WoYwP#@j-~ z+(y(UN0J~Si7S*_Cs19v|4h_lahpfDw{(7o3}v1d`S+)9#;t%-8#An5&hzYbyaUPO zsWY{Ns>L$bK0IXJ*+))0mM!%)g=*xJTg7DIzz9tbM;+V%vfq6q>g|jxy{BxRWF#5Y zvI9iiE1dSoS0SzL=|QW|ex67T1~R`eDbs-q;V;s1l}ngX-~briKvd8d5_6+WuBzid zswNR#?+xo&fbC^O&VKi997;_K4}n&m9Omz46}@C?!-M?5sco#IeD`8Fq0fPuIk_>s zG@n>R+nyZ(s-evpx)CrQK&M39!G5)F!Pu1z4xd-Job$-;aG=7ks6@L^XpFk*dVX+? zsIoTy(uf_>(?*QVjC;2ly&nA)eodfyx9R@8r4{sBwP4pC_^kU-X2_53UE7BWbP2^v z#d-fCxwZ2>QebjnzbBjP(iriFNtrK`u8z9j^*Y_cMx)20=~M@1(oIOM1GkP+qJce@ zcgFK}!J;R==FUdwfi0uOBm;(~i8JfB0a`Xg$xO7eQQ2=>7YcR+sL+EQ!5dk^9U!{nnPNj%Rwh~{B&I>I{ka_u%!5s*N3LiqC8|D8BiU@< zu(ogzf!d^Z4lYk}bGI{G31xiQ3Pj0;g+E+jm1ND4!WSM3pEGwzv%&}O4BMLNgi{>* z_5%-S7sHuZWVPxJ&bT|e{j9}TA)uj0`M`$%do4R6^|H?^Jz~L*ecH#eHcuciuDOU> zi(L&&$!5M{^krq+75{n@Naf#?(bLreFRrx_&O0&dZ`dS_KFw*- zVhCrPbMcOSk*{67#_TN!0(y%A4qV+M;8Yr$?q{CRuLUiV3?i}`iABH69omG_Na5QG zo2_(Xw=n3h)wPYbx7yw^;;u+Cx}eR|k()1-`TBp8y+#B={u^9zy^*gWf1qhlqMpCR zq|q0y6z!WcsKAo?3zK+a?DHZ^J95RE>(VI9$@B&X(gFb*D<@zUT%OV1XRXUKV=Z`b z*IXnwmI-JrFjTJ9+~1^ciWS4ewgF&Fk*QQV?*8jU0Q5JR4~z^4`7b8`U3=FP>{6&F zkd%bIBu#YH@a8nr0mhuzruWgxsU}rq@u7AbJVtLx+>r?Uk3Z-(o~#}5Mg5}3Nw^7% z;HvU3pkV*Dwa!%KE;f;f7}F5J)bp$kTlyy~DuG8JFfg<&qtfTm9XwA0Q}*e1QLa=Y zc3OL}uG;y?%@0rvlOq+V*h1z<0avK+Ox*4~dwdX70>*xn%uQce)Cna%ZG^&_PDQJ- zJ**mjee@CgycrWY<+Q{F8TFp#{oMfd^6G6|(_)z;>1da%5|{Wx|wfAfeQqInCS zKdj!rm24<}8-E7m8~rw)0z-{qHDu$>fFYKGkn4*tx^TNh6Ve` zl^_(*cv68czM{Toz=-I1#Jd&N(Ii%(Wh$rxw33l^mEGIPGev5vy3?YQD9ceR&C`<%NL<`&gTKvx){iP8AUs3b# zIk08InP2d+lSGPBci7}<~$sfx`*ZcW(k=Y}wwZHco(1iA>_Wu#=z(Y^-IEP`l$5$O9BYPnBO_m49z?ukq5R@e20WzZwTIYt*x<0flrzSz>;xwxi*$RJJT zZEg!^2!6>2{O(vRoH88?=Pka zGsBDDk6XP*jX@|9SLf47k)a5pOOD5e;E0&a3(oV>r*1+-`|YO`)FSRt=osv+4L-65 z@WHRo#b5&Ik2Itum`VZ}hzBz<`X(w}(B-Lc18x(3L}WJ z&$EW3qpXOt%*WI}E+QXXMbRaszL!8V-7Ym5`;=3))&hj?dtLnd@Y`J5pC+ZKke9q& z;5d!GQO!DdVWS0`HV0I-!M4L~$*9Ba!niAc)vc~AQa#`*rn_V43lp!yu6X3Zf@ztclZ`Mp}Govb{>O@#yDc@>0&h*~NgG=&Wc3L>gvZO^sa3qVD zqvQ4ub5ZQv{ueKG@M0q@)3O;!EWkq`!mZ!(y7bc&jc5(d#MW)5WrOD3CQFBtkYxn`tn7D z-+xDdwgMmYq-VrrYIJBX&z6Zae?fuVymLvK=x3p8QT{0wvAbVZIE#dWmToV`MRK<8 zFhXGoFLs^P0DD|l{5}SD^UeYffKVRk9OI4w@*wz<*Ge4k!2MDWTT!q(mOUT0U`G*|Dz=nhs**-hUvz<+>8Sx)7~?#aRA}Xq4^zbb`&IAD{f~a z<)Y;Z!IjvI{h^Cm3m?WhX)#Jkud;Nniq7Ht){V{O82lt0+_Vqy`^0zPTg6nm(H22;&}1 zg1_;U4^oKkd6kwW4Oj>covEmr8qSP_d0bATvQ*_b3TgOrcl+^^?u)|b`5x%L5u5Vk z0|NZZqU{4`X075*fJzF8NYQ3daqM(Wh@s>GNiko1NxEB{-p$Yz9i_P9bcu<4c$3oR zGn-kjVpvP;%~0n1CwhQXh!m4n%Pyhk#2s)s8GLfJzoe!$=v^|}-Sbxx(T+c%Sm)

8|rTfOwlJJfQ)UjQ41?vt0CyLJuNGzQ2uMx>xXcTpCe zxjr4fu+M+I-6m66C7Ttf#Gz%@jcSCoaZifRRMCn|b?^0s6x_7cTVSN2B$>}K6#jL` zfrv|<&4`0hc16Nwk(?4@v4vj!zbQaX^&U(s3(rAX!Z?VU-r&AiT>+nqN{Pi^-5KJ9 zP7}*?E+-od1fHz?JkDpLIx(ZG)m ztH5o@IOM123jJ8q8p?-|L*O@ZT`~&d12C*`@~YPlRBD^#Ik8&7&~H@w%Dt3}d|b9)mtinHi-671$M%k6w|)rfyJdedbb^f%2-Z@V}IsT|Jee zA%9mv;A(xT_Wl4o?roRbC_SVzCpMn6!SOFQ{lts+>VR9|LM?D=Iym~B`^hHA0JrV= zvitZi-rs)HpW+5t$=A$*=N{&Z*w>LK z29MlTm}8cEZh)3M5AfT^+i-P9RV5}T$LTtFw8Df6^DdNcV(w=4&5w5d9<6t88m~*C z*6sl66j&rLda`k11+wso={bN?vjM8vDC!4~p@PjcncFn>N#b7zjAyA=Y=G-6XVwW@ z`E65zFhS3$aNR1DFbT)NsInLO4J=AWA~4&w&@G+rlc^q_dognIwEK0K#m>yLOwD!# z0k3&{%Ok<9pu_zyNtw<)#G@?T=1Yb#jP;RBG*Molnah3m9`vP!*NY&=)koqQkKnY~ z2fCNl%{do>bO9C?{T({2ojPNc`n>!2i@G)mG3qoM#$sd)Ff8S??9!Q}l@f+Sc;}AC z0y{hTG6!@K;KQ)AI3WvB+oBGXyx}>O5DlP@m}=Da5#rR~(K!EdbjoY6j9gH~`WSsN zKbQa0w+hw`X&=Qd{GUgz%3WlLXZGeb}_221dt*ml_dj>G8UxiWMg&;y=jg>r< zci>4=F@syPf;9X<7)1~v_xWVJ^!~wLV@l>r*|Ji0ulbgbJ+2?Ks4PiS@&AxuT%LaF z%Bv?&n4mR9K*lWk$#uS^sV7D!E1r<>ozY}p&G?Pjo~*%h91A_H;*WYI`#BMcDk}c zA+LGmpk3?UN}`hfkb@i(ed>w^_68l2SBh+)jtl>_-~J#uthnCiRqK_6gg zBx|Uuqqoj)JWoVVx(UZ2?3^OVYW#HQ|EgInDgeNX?M!;6JV(bobtOqK8EB?o>T~^D zoAw*23zuFsc7q?p97vQ(>knCj`Hol9Eu)6k^`cJ3p4ftMzm*g8MsMokWk4&qH=s7< zLI-i?nEK$LJ>BRP>-h?J@RihF#_w2ZPsaKT~PxJE}t%sV($v)8SSUqJ5Ssfu)m zK;LbKi6j3cww_+9Ia!|XK-9oM<2HCukIu^@o}6s%iaL(+M`!?M6> z(Yb6ci0naB^W?O8OR;>H**m|yrR=VE+DzwUCo-6sDyNi$E?}AinqSJ1YAsbHw*lrQ z-$tsHb^{hJ$(h!cX7A_jC_-*hMt0v+hUtd?= zD#R!-d>71@kZS12L2D^1>b*Y=8M&cu zV^wPP2^9NsbNMcDcBJwhX^Z?y9QNfE#BazM`@7J(qC>`)7|s)!Wfc z__0K^xNYBYR0R8W#dw4Uw#ZB_BQY$Kl+K&uqU65zf@{AvkBEx;sdF%j@9-XrFCSMY zmI=rn(T#;=bXv;ZbGG^9cET?pD?H2xBWY%+JT#Iz2|ly!dO`nO9oM~v#NX$za+%R5rK|c1`(^1^ffo6?=Sk>YF5xyi@rAdHQ+NiT>$lvE zH%S#E-V9Xs^)aUw2B|U+s@UH1YEwKLRVbd@(^Ez&bp2N)yEhU!ZT-0GNY-{2E~KY- z+wbq8CZ-38xFM{x1&uf?(kDNw|%-20Fv;(7ed`ZBv^s}Ubo`rawSg01am_}_6 zfh(+m)FLg=>$%`AM|#vmfvqrTTonjSPn{jQ%ZxtWDii-)<7}Xq$((_EEAO|yh>!P{ zulYZKbvf1xbTtR4gkbKY?fsp-wpdGI47DvzvUM7!dpwAhdd%tx9=WazaYDXj@*ks4aVz; zGCY7+sg$}Tl&30;l@6dJvBqs%Wiw6>dL@qm2v*%FW2#~Y!Ga5drzDC$QZiG!`d*2B zECa{faOv0r=++XCp$MfW(*Z#QKFP^0l8xcV9YY*=!@!47*UD4Bo6vbyX_%kIeDdm0 zKeQT&EWu$0fc9v|$)6w*6+nNA_v`_o{nL6^2*8ewBTNSK_O%|0hF z41z|lxn9ht&%pFC=;J^4rWGY+Ye!1dEz7zGsW!1&Q@zEOoJsIewx0G+eGq;8Xv61u zwaOefE2$X`5T*PL;{%nuSEyTCq`R4&!|TddEt3!mo^^Ul?b7h z2Q^X}_mDX=all5@S1aY`&cqkX#HkX;^0hYtBu0u)wWGuJhn6wN0wZ{hZ6k)Zw;(@h z*1MjjYNbW&cdLM#1m6Vt}6gbjqA&fN3(mv9{F#yMqDzFV1>Gw zFVL-vGHRJI0o-1t0ICraGW?4xthw{()cqoG{$l%z;yW{HWxU^sXFs?)v;du{&g%s@ z=YiLa&B`8Q3cP25_FFakWhn3*7Z=FgF^DkjNC+w9_VY8oY7%JY8vyQ)=$02u`}8Rg zu4efeiH2x8Z!r2W0%?P)FNKaD-WXhZq>^@J+);l2f&t;$53XTD3d*<7JiSrl31T5h zYH)WqUTrA`kV62Wu^&`2*Wqd;>E`9k;NqEvSTwrxliv3##7Lj?7!b=)-)w!ln;H)4 z(`HxF9DdRobw}q66ek9Ky)MZ2 ztuKfEy>@b1&H2sq$c+z#Q-#Gd3f%+N5U9X9$;dbUWicC2?R58H80)KPzhpLqA%2Ds zBQHS2=AbACu%@8YrfL;FKm(KrS7jcfO8C6U%hAJ}S;VO^Nj6heA-r_!Oy-9Si&mlE zx-)DOicN?DX)<=ZM~rCrPe=J3K?6cZi%exW(~b)yF@(x5rb=%V1VQ$F)d^flFyLGY z5{L#MgR4Fq=tYuIJzM;ERr+X+hY-U1#gCz+3Vt5HUg2KGHf24(NrvJDoT*{kdu6}% zaqNHe2K8(E^G~_9AM%BW8W4CQFIGltH99?>VjkZ5>-y&NsMCM@JtHpv0h4`G1N3XYQ_(o*)I$SokR*I&`O1i!Vtj(4w*(6s6Xncld>4%oXw_BCy*5P+Idg;eN`ICT>}Vy761^ z+ZNMA9_x;~e12~8rvm4GI=hiYz#boznLbk9j}-P8w!MM)eURsiO{n-+Tn#@HNC0}8 z4x6pQ_$4)tfaiI=J?`SaRhZhJ11J^&s*+aalUA*A`mr@0XE-RMfvLDkZC5aVDW*{* zo@JDlp?dPmZ;yZeIsll zzPTpV-ukI?4vh%0WPN3sw&Jd*kku&(}!Mqh%23aZl#U z2f80M7<6j?=_VC777|?@8A;P=Y7*qUrIpLR%JYJw)==HaM!5-1dE*B1XuKu z4P)0oLzlUJX9U<;wbz^1@l_uf*pE`uoZU@jm_$Eo?QN2{&oen2@o<6>a>}M z72Si?nv9^h*Jlnidt4i=;N3?%YKxk3uro}$%Um9w^hl}5SidW;}7Uy$tKgCqd{Dz z;@KlnHQw%0{!dM0kewB>sj?L~+?siD_L2`y&c5@6I?m%>cns?OC52mx-t~S=@c8*Q zeD*t9e!$b1@P5;W__Qk=70QMrbnoV2{rTl%3|yq;Vpqie8^L~^_UiW3QSwhb6IBAI z{VG)l^XW8@ME_wKduAT%Wm}4-edN|f<7O7VsI($>W?el|zb%F`*T+C)>QRUlyS&1m ztQNfS3JIOL+qv1BN?YX(W(@A@PY0j7)9wbPuaIK^Z_yFOiDJ%8pyT;rJ&d{{kNU@WauS83~M*(`^jG??*rVFrCT4g<53?f08P5x^s!?-55f80FfI1 zd-y>~#A#TzE^zZM6JrIo!4S5XQ z7<$I4hqyEIm%pqRUE|L8--Gc6=a@mQ^8%M>Rg~^Q{h?dfPG{GeD%@+t!O#aS^lvj4 zTKS+09$-G2FjA#efmQeHJpg~P!iG~7!$rf9)aTzV)`M6`onl&)DQcL?Z6=Jr4zoDwu9vb zeS;*U>xH|?;!A%@$Xq1`(z~ur`2a@@@H%fI}DpqJ~9CJ zhrj9ZB0ER#A-q8CJGOKEnWg08MI=CO)ukh)2Ft*FZ%i3OPqW~Ul}jxFlRW#MN`$;+ z3FUiZ!AMi_5;4hMjO9x#zms~yqh@F@Ha!7t`-0x${Bidg`oLmlOcJ0Q^g#@E@gzfBtIu`4eI{os{0?`1C{uZcUMKdK5L>Ey$jyXUD_Jp6=!-C2Gc8PyoUbH9$jGQ zD@<$0j83?IR*jv!GGvQ=Qgi2?_|`=huODpqL-$Hck=#pLe}03n_;Lhss6noOo}>23 z3!_pIgQY!{B|JHQK1EU?4t}l;($RvZtI`>XY6VSl#P`ja;$ars^E!@T%w0!n@o}G^ zo2g7^`TWWuK%x9&Sx|HBC zJj(m!i72l5qS%uDT-=TJh|@~rgYiJUJD&Q=z7s6U2i>Qc_U=9|Y^E{Wb2i|{B_nT; zeZYvwT~zE%(12@Ru1)VuqS#S}woqjspP-=;T z*8q2tIpm&~Py7B%YnY1qv*h0X$x5|6{^hTLd?AAHYd!-g}fxAG^1t)YkU* zDu~*F-l-3F1EWV@JI4OeQlH*kJxnIA$8P;;cRp$QVJE;0q99VgeWE0H#s$RNsDInX z&kbm=V^U+ozGcMTJ1LZo@oM)UcaD;0dMm;7CifM0Fw?@TM{k(kJWv03tNV;P{*eZ7 z<8<$T?|R4nzg++yxZo{Q-+fIve5pc1g`Hh3GXn{~CsRO;E&ikeas2!EFKPQYyF zH0T7p2R;BF(f|2#RQsNN1{4cA0v&@+PY(}gsA=lE(7wGKBG}=W{6<$w8D!fYv^tn< z4&rT?(o+421Tp&le-5zTdY8MKb5(F^E9P>#IX6~1dygjrni>jX^cj8Dccz&)NACXL zsY?$An4R{oPJMjZ@O0?25YLOg??`avq5i9w*>7bWD?9r{db6cjXU8MKX%A|K=vp}{;u&=!O4~G z+ATv?@e!3MQ#1(Jr|R?<4VEpD*-+p~BB-ZCd+T!QS=HC2glS$SP)Z1o zCv@$nK^DKqVn$z7R#HL~`&Mjhwu#L65z|eLhKs3`MhDAeVoO0{*6>VfVe@_Mbn@K^ zjjqYFPsN`(|7{ZSPQLX(@0(=W6#ihkoZIA?Rv4o#i`n#<$0qGPJ*E$E{dgH`@cU%5!+cgG2wEqeAhPTG~@lRvMZ)*LY*72tstU;qH!_i!u# literal 0 HcmV?d00001 diff --git a/frontend/src/Cabinet/assets/images/webp/logo.webp b/frontend/src/Cabinet/assets/images/webp/logo.webp new file mode 100644 index 0000000000000000000000000000000000000000..0cacefac0d8f952813ae4dfb28f2b80ccc281877 GIT binary patch literal 1238 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 { {title} {type === "ERROR" ? ( - + + + sad cabi + ) : ( - + + + happy cabi + )} {subTitle} diff --git a/frontend/src/Cabinet/components/CabinetList/EmptySection/EmptySection.tsx b/frontend/src/Cabinet/components/CabinetList/EmptySection/EmptySection.tsx index 5f570a72a..b0417bf70 100644 --- a/frontend/src/Cabinet/components/CabinetList/EmptySection/EmptySection.tsx +++ b/frontend/src/Cabinet/components/CabinetList/EmptySection/EmptySection.tsx @@ -3,10 +3,20 @@ import styled from "styled-components"; const EmptySection = ({ message }: { message: string }): JSX.Element => { return ( - + /> */} + + + + {message} ); diff --git a/frontend/src/Cabinet/components/Store/StoreInfo.tsx b/frontend/src/Cabinet/components/Store/StoreInfo.tsx index 28871c665..96a6bca08 100644 --- a/frontend/src/Cabinet/components/Store/StoreInfo.tsx +++ b/frontend/src/Cabinet/components/Store/StoreInfo.tsx @@ -87,6 +87,10 @@ const StoreInfo = () => { /> + {/* storeIcon */} diff --git a/frontend/src/index.css b/frontend/src/index.css index 41efe0498..ea02b2217 100644 --- a/frontend/src/index.css +++ b/frontend/src/index.css @@ -1,5 +1,3 @@ -@import url("https://fonts.googleapis.com/css2?family=Do+Hyeon&family=Noto+Sans+KR:wght@300;400;700&display=swap"); - :root { /* white, gray, black */ --ref-white: #ffffff; @@ -95,7 +93,6 @@ --custom-green-100: var(--ref-green-300); --custom-green-200: var(--ref-green-400); - /* component variable */ --color-picker-hash-color: var(--ref-gray-450); --sys-sub-color: var(--ref-purple-300); @@ -120,6 +117,7 @@ font-size: 16px; line-height: 24px; font-weight: 400; + display: swap; } a { diff --git a/frontend/src/main.tsx b/frontend/src/main.tsx index 1f4fddbe7..7af8401b9 100644 --- a/frontend/src/main.tsx +++ b/frontend/src/main.tsx @@ -34,29 +34,29 @@ Sentry.init({ // Set tracesSampleRate to 1.0 to capture 100% // of transactions for tracing. - tracesSampleRate: 1.0, + tracesSampleRate: 0.05, // Set `tracePropagationTargets` to control for which URLs trace propagation should be enabled // tracePropagationTargets: [/^\//, /^https:\/\/yourserver\.io\/api/], tracePropagationTargets: [ "localhost", /^https:\/\/cabi\.42seoul\.io/, - /^https:\/\/dev\.cabi\.42seoul\.io/, - /^https:\/\/api\.cabi\.42seoul\.io/, - /^https:\/\/api-dev\.cabi\.42seoul\.io/, + // /^https:\/\/dev\.cabi\.42seoul\.io/, + // /^https:\/\/api\.cabi\.42seoul\.io/, + // /^https:\/\/api-dev\.cabi\.42seoul\.io/, ], // Capture Replay for 100% of all sessions, // plus for 100% of sessions with an error - replaysSessionSampleRate: 1.0, - replaysOnErrorSampleRate: 1.0, + replaysSessionSampleRate: 0.2, + replaysOnErrorSampleRate: 0.2, }); ReactDOM.createRoot(document.getElementById("root") as HTMLElement).render( - - - - - - + // + + + + + // ); diff --git a/frontend/vite.config.ts b/frontend/vite.config.ts index 7a1007709..7fb26aae3 100644 --- a/frontend/vite.config.ts +++ b/frontend/vite.config.ts @@ -7,6 +7,26 @@ import { defineConfig } from "vite"; // https://vitejs.dev/config/ export default defineConfig({ + build: { + rollupOptions: { + output: { + manualChunks(id) { + if (id.includes("node_modules")) { + if (id.includes("recoil")) { + return "recoil"; // Recoil 라이브러리를 recoil 청크로 분리 + } + if (id.includes("@sentry")) { + return "sentry"; // Sentry 라이브러리를 sentry 청크로 분리 + } + return "vendor"; // 나머지 외부 라이브러리를 vendor 청크로 분리 + } + if (id.includes("Admin")) { + return "admin"; // Admin 관련 모듈을 분리 + } + }, + }, + }, + }, plugins: [ react({ babel: { @@ -38,6 +58,7 @@ export default defineConfig({ path: "/hmr/", }, }, + test: { include: [ "**/*.{test,spec}.{js,mjs,cjs,ts,mts,cts,jsx,tsx}", diff --git a/package-lock.json b/package-lock.json index c40d5e346..1d7dd2220 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,11 +1,11 @@ { - "name": "Cabi", + "name": "cabi", "lockfileVersion": 3, "requires": true, "packages": { "": { "devDependencies": { - "rollup-plugin-visualizer": "^5.9.0", + "rollup-plugin-visualizer": "^5.12.0", "webpack-bundle-analyzer": "^4.8.0" } }, @@ -288,10 +288,11 @@ } }, "node_modules/rollup-plugin-visualizer": { - "version": "5.9.0", - "resolved": "https://registry.npmjs.org/rollup-plugin-visualizer/-/rollup-plugin-visualizer-5.9.0.tgz", - "integrity": "sha512-bbDOv47+Bw4C/cgs0czZqfm8L82xOZssk4ayZjG40y9zbXclNk7YikrZTDao6p7+HDiGxrN0b65SgZiVm9k1Cg==", + "version": "5.12.0", + "resolved": "https://registry.npmjs.org/rollup-plugin-visualizer/-/rollup-plugin-visualizer-5.12.0.tgz", + "integrity": "sha512-8/NU9jXcHRs7Nnj07PF2o4gjxmm9lXIrZ8r175bT9dK8qoLlvKTwRMArRCMgpMGlq8CTLugRvEmyMeMXIU2pNQ==", "dev": true, + "license": "MIT", "dependencies": { "open": "^8.4.0", "picomatch": "^2.3.1", @@ -305,7 +306,7 @@ "node": ">=14" }, "peerDependencies": { - "rollup": "2.x || 3.x" + "rollup": "2.x || 3.x || 4.x" }, "peerDependenciesMeta": { "rollup": { diff --git a/package.json b/package.json index 28e506cfd..c06c46c10 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "devDependencies": { - "rollup-plugin-visualizer": "^5.9.0", + "rollup-plugin-visualizer": "^5.12.0", "webpack-bundle-analyzer": "^4.8.0" } } From 09f0c96d1d0eb7e3d653bac61443826ab17f4eba Mon Sep 17 00:00:00 2001 From: Minkyu01 Date: Tue, 8 Oct 2024 13:44:20 +0900 Subject: [PATCH 20/49] =?UTF-8?q?[FE]=20FIX:=20coin=20size=20=EC=A1=B0?= =?UTF-8?q?=EC=A0=88=20#1687?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- config | 2 +- frontend/src/Cabinet/assets/images/storeCoin.svg | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/config b/config index 4d4bcded9..93674bce3 160000 --- a/config +++ b/config @@ -1 +1 @@ -Subproject commit 4d4bcded9cac734f4dac74a7bdc02cb4da0e2e03 +Subproject commit 93674bce354efe9ad8fb3a7a934bdbf5acd1d162 diff --git a/frontend/src/Cabinet/assets/images/storeCoin.svg b/frontend/src/Cabinet/assets/images/storeCoin.svg index 7b2960cb1..ccf55c26a 100644 --- a/frontend/src/Cabinet/assets/images/storeCoin.svg +++ b/frontend/src/Cabinet/assets/images/storeCoin.svg @@ -1,4 +1,4 @@ - + From d3c2ae98321207b97a62c3de8e8975743b1cad60 Mon Sep 17 00:00:00 2001 From: saewoo1 Date: Tue, 8 Oct 2024 14:54:47 +0900 Subject: [PATCH 21/49] =?UTF-8?q?FIX:=20=EC=BA=90=EC=8B=9C=20=EC=84=A4?= =?UTF-8?q?=EC=A0=95=EC=9D=84=20=EC=9C=84=ED=95=9C=20Nginx=20conf=20?= =?UTF-8?q?=EC=84=A4=EC=A0=95=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 만료기한 1년 --- dev/configure.conf | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/dev/configure.conf b/dev/configure.conf index 42d647247..f9d57a72c 100644 --- a/dev/configure.conf +++ b/dev/configure.conf @@ -102,4 +102,9 @@ server { proxy_pass http://host.docker.internal:2424; proxy_set_header Host $host; } + + location ~* \.(js|css|jpg|jpeg|png|gif|ico|svg)$ { + expires 1y; + add_header Cache-Control "max-age=31536000"; + } } From 2e37a0111344fe9221b1cf03d46056a33442e9b8 Mon Sep 17 00:00:00 2001 From: jnkeniaem Date: Mon, 14 Oct 2024 12:28:06 +0900 Subject: [PATCH 22/49] =?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 23/49] =?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 24/49] =?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 25/49] =?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 26/49] =?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 8d521f553b9f3baf2b88fad28665c44d7b2dea55 Mon Sep 17 00:00:00 2001 From: jusohn Eddie Sohn Date: Mon, 28 Oct 2024 12:28:05 +0900 Subject: [PATCH 27/49] =?UTF-8?q?[FE]=20HOTFIX:=20=EC=B8=B5=20=EC=A0=95?= =?UTF-8?q?=EB=B3=B4=EA=B0=80=20localStorage=20recoil-persist=20=EC=97=90?= =?UTF-8?q?=20=EC=A1=B4=EC=9E=AC=ED=95=98=EC=A7=80=20=EC=95=8A=EC=9D=84=20?= =?UTF-8?q?=EA=B2=BD=EC=9A=B0=20TypeError=20=EB=B0=9C=EC=83=9D=ED=95=98?= =?UTF-8?q?=EB=8A=94=20=EB=AC=B8=EC=A0=9C=20=ED=95=B4=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- frontend/src/Cabinet/pages/MainPage.tsx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/frontend/src/Cabinet/pages/MainPage.tsx b/frontend/src/Cabinet/pages/MainPage.tsx index c98123f84..3550822bd 100644 --- a/frontend/src/Cabinet/pages/MainPage.tsx +++ b/frontend/src/Cabinet/pages/MainPage.tsx @@ -220,9 +220,9 @@ const IconWrapperStyled = styled.div<{ disabled: boolean }>` } `; -const AlertStyled = styled.div<{ currentFloor: number }>` - visibility: ${(props) => - DISABLED_FLOOR.includes(props.currentFloor.toString()) +const AlertStyled = styled.div<{ currentFloor: number | undefined }>` + visibility: ${({ currentFloor }) => + currentFloor && DISABLED_FLOOR.includes(currentFloor.toString()) ? "hidden" : "visible"}; height: 30px; From 9e2f56caebbab707562346fb4f502f04f9c51eb0 Mon Sep 17 00:00:00 2001 From: jusohn Eddie Sohn Date: Mon, 28 Oct 2024 15:45:32 +0900 Subject: [PATCH 28/49] =?UTF-8?q?[BE]=20FIX:=20nginx=20cache=20=EC=84=A4?= =?UTF-8?q?=EC=A0=95=20=EC=9B=90=EC=83=81=EB=B3=B5=EA=B5=AC=20#1687?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dev/configure.conf | 20 -------------------- 1 file changed, 20 deletions(-) diff --git a/dev/configure.conf b/dev/configure.conf index f9d57a72c..40ece1c4b 100644 --- a/dev/configure.conf +++ b/dev/configure.conf @@ -3,11 +3,6 @@ default upgrade; '' close; } -# map $http_accept $webp_suffix { -# "~*image/webp" ".webp"; -# default ""; -# } - map $remote_addr $proxy_forwarded_elem { # IPv4 addresses can be sent as-is ~^[0-9.]+$ "for=$remote_addr"; @@ -55,16 +50,6 @@ server { proxy_read_timeout 3600s; } - # location ~* \.(png|jpg)$ { - # proxy_pass http://host.docker.internal:2424; - # proxy_set_header Host $host; - # add_header Vary Accept; - - # # WebP 파일이 있으면 WebP 파일을 제공, 없으면 원본 PNG/JPG 제공 - # try_files $uri$webp_suffix $uri =404; - # } - - location / { proxy_pass http://host.docker.internal:4242; proxy_http_version 1.1; @@ -102,9 +87,4 @@ server { proxy_pass http://host.docker.internal:2424; proxy_set_header Host $host; } - - location ~* \.(js|css|jpg|jpeg|png|gif|ico|svg)$ { - expires 1y; - add_header Cache-Control "max-age=31536000"; - } } From 572b2f7fdde359d354c6cd4837d6f7713f63587c Mon Sep 17 00:00:00 2001 From: JunSeong Date: Mon, 28 Oct 2024 16:30:17 +0900 Subject: [PATCH 29/49] =?UTF-8?q?[BE]=20FIX:=20cabinet=20share=20=EC=9D=B8?= =?UTF-8?q?=EC=9B=90=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/database/cabi_local.sql | 232 ++++++++++++++++---------------- 1 file changed, 116 insertions(+), 116 deletions(-) diff --git a/backend/database/cabi_local.sql b/backend/database/cabi_local.sql index cf1645be0..e0861ae15 100644 --- a/backend/database/cabi_local.sql +++ b/backend/database/cabi_local.sql @@ -121,22 +121,22 @@ LOCK TABLES `cabinet` WRITE; /*!40000 ALTER TABLE `cabinet` DISABLE KEYS */; INSERT INTO `cabinet` -VALUES (1, 0, 0, 'SHARE', 3, 'AVAILABLE', '', 89, 5, '', '', 1), - (2, 1, 0, 'SHARE', 3, 'AVAILABLE', '', 90, 5, '', '', 1), - (3, 2, 0, 'SHARE', 3, 'AVAILABLE', '', 91, 5, '', '', 1), - (4, 3, 0, 'SHARE', 3, 'AVAILABLE', '', 92, 5, '', '', 1), - (5, 4, 0, 'SHARE', 3, 'AVAILABLE', '', 93, 5, '', '', 1), - (6, 5, 0, 'SHARE', 3, 'AVAILABLE', '', 94, 5, '', '', 1), - (7, 6, 0, 'SHARE', 3, 'AVAILABLE', '', 95, 5, '', '', 1), - (8, 7, 0, 'SHARE', 3, 'AVAILABLE', '', 96, 5, '', '', 1), - (9, 8, 0, 'SHARE', 3, 'AVAILABLE', '', 97, 5, '', '', 1), - (10, 9, 0, 'SHARE', 3, 'AVAILABLE', '', 98, 5, '', '', 1), - (11, 10, 0, 'SHARE', 3, 'AVAILABLE', '', 99, 5, '', '', 1), - (12, 11, 0, 'SHARE', 3, 'AVAILABLE', '', 100, 5, '', '', 1), - (13, 12, 0, 'SHARE', 3, 'AVAILABLE', '', 101, 5, '', '', 1), - (14, 0, 1, 'SHARE', 3, 'AVAILABLE', '', 102, 5, '', '', 1), - (15, 1, 1, 'SHARE', 3, 'AVAILABLE', '', 103, 5, '', '', 1), - (16, 2, 1, 'SHARE', 3, 'AVAILABLE', '', 104, 5, '', '', 1), +VALUES (1, 0, 0, 'SHARE', 4, 'AVAILABLE', '', 89, 5, '', '', 1), + (2, 1, 0, 'SHARE', 4, 'AVAILABLE', '', 90, 5, '', '', 1), + (3, 2, 0, 'SHARE', 4, 'AVAILABLE', '', 91, 5, '', '', 1), + (4, 3, 0, 'SHARE', 4, 'AVAILABLE', '', 92, 5, '', '', 1), + (5, 4, 0, 'SHARE', 4, 'AVAILABLE', '', 93, 5, '', '', 1), + (6, 5, 0, 'SHARE', 4, 'AVAILABLE', '', 94, 5, '', '', 1), + (7, 6, 0, 'SHARE', 4, 'AVAILABLE', '', 95, 5, '', '', 1), + (8, 7, 0, 'SHARE', 4, 'AVAILABLE', '', 96, 5, '', '', 1), + (9, 8, 0, 'SHARE', 4, 'AVAILABLE', '', 97, 5, '', '', 1), + (10, 9, 0, 'SHARE', 4, 'AVAILABLE', '', 98, 5, '', '', 1), + (11, 10, 0, 'SHARE', 4, 'AVAILABLE', '', 99, 5, '', '', 1), + (12, 11, 0, 'SHARE', 4, 'AVAILABLE', '', 100, 5, '', '', 1), + (13, 12, 0, 'SHARE', 4, 'AVAILABLE', '', 101, 5, '', '', 1), + (14, 0, 1, 'SHARE', 4, 'AVAILABLE', '', 102, 5, '', '', 1), + (15, 1, 1, 'SHARE', 4, 'AVAILABLE', '', 103, 5, '', '', 1), + (16, 2, 1, 'SHARE', 4, 'AVAILABLE', '', 104, 5, '', '', 1), (17, 3, 1, 'PRIVATE', 1, 'AVAILABLE', '', 105, 5, '', '', 1), (18, 4, 1, 'PRIVATE', 1, 'AVAILABLE', '', 106, 5, '', '', 1), (19, 5, 1, 'PRIVATE', 1, 'AVAILABLE', '', 107, 5, '', '', 1), @@ -173,9 +173,9 @@ VALUES (1, 0, 0, 'SHARE', 3, 'AVAILABLE', '', 89, 5, '', '', 1), (50, 10, 3, 'PRIVATE', 1, 'AVAILABLE', '', 138, 5, '', '', 1), (51, 11, 3, 'PRIVATE', 1, 'AVAILABLE', '', 139, 5, '', '', 1), (52, 12, 3, 'PRIVATE', 1, 'AVAILABLE', '', 140, 5, '', '', 1), - (53, 0, 0, 'SHARE', 3, 'AVAILABLE', '', 141, 6, '', '', 1), - (54, 1, 0, 'SHARE', 3, 'AVAILABLE', '', 142, 6, '', '', 1), - (55, 0, 1, 'SHARE', 3, 'AVAILABLE', '', 143, 6, '', '', 1), + (53, 0, 0, 'SHARE', 4, 'AVAILABLE', '', 141, 6, '', '', 1), + (54, 1, 0, 'SHARE', 4, 'AVAILABLE', '', 142, 6, '', '', 1), + (55, 0, 1, 'SHARE', 4, 'AVAILABLE', '', 143, 6, '', '', 1), (56, 1, 1, 'PRIVATE', 1, 'AVAILABLE', '', 144, 6, '', '', 1), (57, 0, 2, 'PRIVATE', 1, 'AVAILABLE', '', 145, 6, '', '', 1), (58, 1, 2, 'PRIVATE', 1, 'AVAILABLE', '', 146, 6, '', '', 1), @@ -201,11 +201,11 @@ VALUES (1, 0, 0, 'SHARE', 3, 'AVAILABLE', '', 89, 5, '', '', 1), (78, 2, 3, 'PRIVATE', 1, 'AVAILABLE', '', 34, 2, '', '', 1), (79, 3, 3, 'PRIVATE', 1, 'AVAILABLE', '', 35, 2, '', '', 1), (80, 4, 3, 'PRIVATE', 1, 'AVAILABLE', '', 36, 2, '', '', 1), - (81, 0, 0, 'SHARE', 3, 'AVAILABLE', '', 1, 1, '', '', 1), - (82, 1, 0, 'SHARE', 3, 'AVAILABLE', '', 2, 1, '', '', 1), - (83, 2, 0, 'SHARE', 3, 'AVAILABLE', '', 3, 1, '', '', 1), - (84, 3, 0, 'SHARE', 3, 'AVAILABLE', '', 4, 1, '', '', 1), - (85, 0, 1, 'SHARE', 3, 'AVAILABLE', '', 5, 1, '', '', 1), + (81, 0, 0, 'SHARE', 4, 'AVAILABLE', '', 1, 1, '', '', 1), + (82, 1, 0, 'SHARE', 4, 'AVAILABLE', '', 2, 1, '', '', 1), + (83, 2, 0, 'SHARE', 4, 'AVAILABLE', '', 3, 1, '', '', 1), + (84, 3, 0, 'SHARE', 4, 'AVAILABLE', '', 4, 1, '', '', 1), + (85, 0, 1, 'SHARE', 4, 'AVAILABLE', '', 5, 1, '', '', 1), (86, 1, 1, 'PRIVATE', 1, 'AVAILABLE', '', 6, 1, '', '', 1), (87, 2, 1, 'PRIVATE', 1, 'AVAILABLE', '', 7, 1, '', '', 1), (88, 3, 1, 'PRIVATE', 1, 'AVAILABLE', '', 8, 1, '', '', 1), @@ -217,22 +217,22 @@ VALUES (1, 0, 0, 'SHARE', 3, 'AVAILABLE', '', 89, 5, '', '', 1), (94, 1, 3, 'PRIVATE', 1, 'AVAILABLE', '', 14, 1, '', '', 1), (95, 2, 3, 'PRIVATE', 1, 'AVAILABLE', '', 15, 1, '', '', 1), (96, 3, 3, 'PRIVATE', 1, 'AVAILABLE', '', 16, 1, '', '', 1), - (97, 0, 0, 'SHARE', 3, 'AVAILABLE', '', 37, 3, '', '', 1), - (98, 1, 0, 'SHARE', 3, 'AVAILABLE', '', 38, 3, '', '', 1), - (99, 2, 0, 'SHARE', 3, 'AVAILABLE', '', 39, 3, '', '', 1), - (100, 3, 0, 'SHARE', 3, 'AVAILABLE', '', 40, 3, '', '', 1), - (101, 4, 0, 'SHARE', 3, 'AVAILABLE', '', 41, 3, '', '', 1), - (102, 5, 0, 'SHARE', 3, 'AVAILABLE', '', 42, 3, '', '', 1), - (103, 6, 0, 'SHARE', 3, 'AVAILABLE', '', 43, 3, '', '', 1), - (104, 7, 0, 'SHARE', 3, 'AVAILABLE', '', 44, 3, '', '', 1), - (105, 0, 1, 'SHARE', 3, 'AVAILABLE', '', 45, 3, '', '', 1), - (106, 1, 1, 'SHARE', 3, 'AVAILABLE', '', 46, 3, '', '', 1), - (107, 2, 1, 'SHARE', 3, 'AVAILABLE', '', 47, 3, '', '', 1), - (108, 3, 1, 'SHARE', 3, 'AVAILABLE', '', 48, 3, '', '', 1), - (109, 4, 1, 'SHARE', 3, 'AVAILABLE', '', 49, 3, '', '', 1), - (110, 5, 1, 'SHARE', 3, 'AVAILABLE', '', 50, 3, '', '', 1), - (111, 6, 1, 'SHARE', 3, 'AVAILABLE', '', 51, 3, '', '', 1), - (112, 7, 1, 'SHARE', 3, 'AVAILABLE', '', 52, 3, '', '', 1), + (97, 0, 0, 'SHARE', 4, 'AVAILABLE', '', 37, 3, '', '', 1), + (98, 1, 0, 'SHARE', 4, 'AVAILABLE', '', 38, 3, '', '', 1), + (99, 2, 0, 'SHARE', 4, 'AVAILABLE', '', 39, 3, '', '', 1), + (100, 3, 0, 'SHARE', 4, 'AVAILABLE', '', 40, 3, '', '', 1), + (101, 4, 0, 'SHARE', 4, 'AVAILABLE', '', 41, 3, '', '', 1), + (102, 5, 0, 'SHARE', 4, 'AVAILABLE', '', 42, 3, '', '', 1), + (103, 6, 0, 'SHARE', 4, 'AVAILABLE', '', 43, 3, '', '', 1), + (104, 7, 0, 'SHARE', 4, 'AVAILABLE', '', 44, 3, '', '', 1), + (105, 0, 1, 'SHARE', 4, 'AVAILABLE', '', 45, 3, '', '', 1), + (106, 1, 1, 'SHARE', 4, 'AVAILABLE', '', 46, 3, '', '', 1), + (107, 2, 1, 'SHARE', 4, 'AVAILABLE', '', 47, 3, '', '', 1), + (108, 3, 1, 'SHARE', 4, 'AVAILABLE', '', 48, 3, '', '', 1), + (109, 4, 1, 'SHARE', 4, 'AVAILABLE', '', 49, 3, '', '', 1), + (110, 5, 1, 'SHARE', 4, 'AVAILABLE', '', 50, 3, '', '', 1), + (111, 6, 1, 'SHARE', 4, 'AVAILABLE', '', 51, 3, '', '', 1), + (112, 7, 1, 'SHARE', 4, 'AVAILABLE', '', 52, 3, '', '', 1), (113, 0, 2, 'PRIVATE', 1, 'AVAILABLE', '', 53, 3, '', '', 1), (114, 1, 2, 'PRIVATE', 1, 'AVAILABLE', '', 54, 3, '', '', 1), (115, 2, 2, 'PRIVATE', 1, 'AVAILABLE', '', 55, 3, '', '', 1), @@ -269,22 +269,22 @@ VALUES (1, 0, 0, 'SHARE', 3, 'AVAILABLE', '', 89, 5, '', '', 1), (146, 2, 3, 'PRIVATE', 1, 'AVAILABLE', '', 86, 4, '', '', 1), (147, 3, 3, 'PRIVATE', 1, 'AVAILABLE', '', 87, 4, '', '', 1), (148, 4, 3, 'PRIVATE', 1, 'AVAILABLE', '', 88, 4, '', '', 1), - (149, 0, 0, 'SHARE', 3, 'AVAILABLE', '', 37, 16, '', '', 1), - (150, 1, 0, 'SHARE', 3, 'AVAILABLE', '', 38, 16, '', '', 1), - (151, 2, 0, 'SHARE', 3, 'AVAILABLE', '', 39, 16, '', '', 1), - (152, 3, 0, 'SHARE', 3, 'AVAILABLE', '', 40, 16, '', '', 1), - (153, 4, 0, 'SHARE', 3, 'AVAILABLE', '', 41, 16, '', '', 1), - (154, 5, 0, 'SHARE', 3, 'AVAILABLE', '', 42, 16, '', '', 1), - (155, 6, 0, 'SHARE', 3, 'AVAILABLE', '', 43, 16, '', '', 1), - (156, 7, 0, 'SHARE', 3, 'AVAILABLE', '', 44, 16, '', '', 1), - (157, 8, 0, 'SHARE', 3, 'AVAILABLE', '', 45, 16, '', '', 1), - (158, 9, 0, 'SHARE', 3, 'AVAILABLE', '', 46, 16, '', '', 1), - (159, 10, 0, 'SHARE', 3, 'AVAILABLE', '', 47, 16, '', '', 1), - (160, 11, 0, 'SHARE', 3, 'AVAILABLE', '', 48, 16, '', '', 1), - (161, 12, 0, 'SHARE', 3, 'AVAILABLE', '', 49, 16, '', '', 1), - (162, 0, 1, 'SHARE', 3, 'AVAILABLE', '', 50, 16, '', '', 1), - (163, 1, 1, 'SHARE', 3, 'AVAILABLE', '', 51, 16, '', '', 1), - (164, 2, 1, 'SHARE', 3, 'AVAILABLE', '', 52, 16, '', '', 1), + (149, 0, 0, 'SHARE', 4, 'AVAILABLE', '', 37, 16, '', '', 1), + (150, 1, 0, 'SHARE', 4, 'AVAILABLE', '', 38, 16, '', '', 1), + (151, 2, 0, 'SHARE', 4, 'AVAILABLE', '', 39, 16, '', '', 1), + (152, 3, 0, 'SHARE', 4, 'AVAILABLE', '', 40, 16, '', '', 1), + (153, 4, 0, 'SHARE', 4, 'AVAILABLE', '', 41, 16, '', '', 1), + (154, 5, 0, 'SHARE', 4, 'AVAILABLE', '', 42, 16, '', '', 1), + (155, 6, 0, 'SHARE', 4, 'AVAILABLE', '', 43, 16, '', '', 1), + (156, 7, 0, 'SHARE', 4, 'AVAILABLE', '', 44, 16, '', '', 1), + (157, 8, 0, 'SHARE', 4, 'AVAILABLE', '', 45, 16, '', '', 1), + (158, 9, 0, 'SHARE', 4, 'AVAILABLE', '', 46, 16, '', '', 1), + (159, 10, 0, 'SHARE', 4, 'AVAILABLE', '', 47, 16, '', '', 1), + (160, 11, 0, 'SHARE', 4, 'AVAILABLE', '', 48, 16, '', '', 1), + (161, 12, 0, 'SHARE', 4, 'AVAILABLE', '', 49, 16, '', '', 1), + (162, 0, 1, 'SHARE', 4, 'AVAILABLE', '', 50, 16, '', '', 1), + (163, 1, 1, 'SHARE', 4, 'AVAILABLE', '', 51, 16, '', '', 1), + (164, 2, 1, 'SHARE', 4, 'AVAILABLE', '', 52, 16, '', '', 1), (165, 3, 1, 'PRIVATE', 1, 'AVAILABLE', '', 53, 16, '', '', 1), (166, 4, 1, 'PRIVATE', 1, 'AVAILABLE', '', 54, 16, '', '', 1), (167, 5, 1, 'PRIVATE', 1, 'AVAILABLE', '', 55, 16, '', '', 1), @@ -321,10 +321,10 @@ VALUES (1, 0, 0, 'SHARE', 3, 'AVAILABLE', '', 89, 5, '', '', 1), (198, 10, 3, 'PRIVATE', 1, 'AVAILABLE', '', 86, 16, '', '', 1), (199, 11, 3, 'PRIVATE', 1, 'AVAILABLE', '', 87, 16, '', '', 1), (200, 12, 3, 'PRIVATE', 1, 'AVAILABLE', '', 88, 16, '', '', 1), - (201, 0, 0, 'SHARE', 3, 'AVAILABLE', '', 89, 17, '', '', 1), - (202, 1, 0, 'SHARE', 3, 'AVAILABLE', '', 90, 17, '', '', 1), - (203, 2, 0, 'SHARE', 3, 'AVAILABLE', '', 91, 17, '', '', 1), - (204, 0, 1, 'SHARE', 3, 'AVAILABLE', '', 92, 17, '', '', 1), + (201, 0, 0, 'SHARE', 4, 'AVAILABLE', '', 89, 17, '', '', 1), + (202, 1, 0, 'SHARE', 4, 'AVAILABLE', '', 90, 17, '', '', 1), + (203, 2, 0, 'SHARE', 4, 'AVAILABLE', '', 91, 17, '', '', 1), + (204, 0, 1, 'SHARE', 4, 'AVAILABLE', '', 92, 17, '', '', 1), (205, 1, 1, 'PRIVATE', 1, 'AVAILABLE', '', 93, 17, '', '', 1), (206, 2, 1, 'PRIVATE', 1, 'AVAILABLE', '', 94, 17, '', '', 1), (207, 0, 2, 'PRIVATE', 1, 'AVAILABLE', '', 95, 17, '', '', 1), @@ -333,12 +333,12 @@ VALUES (1, 0, 0, 'SHARE', 3, 'AVAILABLE', '', 89, 5, '', '', 1), (210, 0, 3, 'PRIVATE', 1, 'AVAILABLE', '', 98, 17, '', '', 1), (211, 1, 3, 'PRIVATE', 1, 'AVAILABLE', '', 99, 17, '', '', 1), (212, 2, 3, 'PRIVATE', 1, 'AVAILABLE', '', 100, 17, '', '', 1), - (213, 0, 0, 'SHARE', 3, 'AVAILABLE', '', 17, 15, '', '', 1), - (214, 1, 0, 'SHARE', 3, 'AVAILABLE', '', 18, 15, '', '', 1), - (215, 2, 0, 'SHARE', 3, 'AVAILABLE', '', 19, 15, '', '', 1), - (216, 3, 0, 'SHARE', 3, 'AVAILABLE', '', 20, 15, '', '', 1), - (217, 4, 0, 'SHARE', 3, 'AVAILABLE', '', 21, 15, '', '', 1), - (218, 0, 1, 'SHARE', 3, 'AVAILABLE', '', 22, 15, '', '', 1), + (213, 0, 0, 'SHARE', 4, 'AVAILABLE', '', 17, 15, '', '', 1), + (214, 1, 0, 'SHARE', 4, 'AVAILABLE', '', 18, 15, '', '', 1), + (215, 2, 0, 'SHARE', 4, 'AVAILABLE', '', 19, 15, '', '', 1), + (216, 3, 0, 'SHARE', 4, 'AVAILABLE', '', 20, 15, '', '', 1), + (217, 4, 0, 'SHARE', 4, 'AVAILABLE', '', 21, 15, '', '', 1), + (218, 0, 1, 'SHARE', 4, 'AVAILABLE', '', 22, 15, '', '', 1), (219, 1, 1, 'PRIVATE', 1, 'AVAILABLE', '', 23, 15, '', '', 1), (220, 2, 1, 'PRIVATE', 1, 'AVAILABLE', '', 24, 15, '', '', 1), (221, 3, 1, 'PRIVATE', 1, 'AVAILABLE', '', 25, 15, '', '', 1), @@ -353,11 +353,11 @@ VALUES (1, 0, 0, 'SHARE', 3, 'AVAILABLE', '', 89, 5, '', '', 1), (230, 2, 3, 'PRIVATE', 1, 'AVAILABLE', '', 34, 15, '', '', 1), (231, 3, 3, 'PRIVATE', 1, 'AVAILABLE', '', 35, 15, '', '', 1), (232, 4, 3, 'PRIVATE', 1, 'AVAILABLE', '', 36, 15, '', '', 1), - (233, 0, 0, 'SHARE', 3, 'AVAILABLE', '', 1, 14, '', '', 1), - (234, 1, 0, 'SHARE', 3, 'AVAILABLE', '', 2, 14, '', '', 1), - (235, 2, 0, 'SHARE', 3, 'AVAILABLE', '', 3, 14, '', '', 1), - (236, 3, 0, 'SHARE', 3, 'AVAILABLE', '', 4, 14, '', '', 1), - (237, 0, 1, 'SHARE', 3, 'AVAILABLE', '', 5, 14, '', '', 1), + (233, 0, 0, 'SHARE', 4, 'AVAILABLE', '', 1, 14, '', '', 1), + (234, 1, 0, 'SHARE', 4, 'AVAILABLE', '', 2, 14, '', '', 1), + (235, 2, 0, 'SHARE', 4, 'AVAILABLE', '', 3, 14, '', '', 1), + (236, 3, 0, 'SHARE', 4, 'AVAILABLE', '', 4, 14, '', '', 1), + (237, 0, 1, 'SHARE', 4, 'AVAILABLE', '', 5, 14, '', '', 1), (238, 1, 1, 'PRIVATE', 1, 'AVAILABLE', '', 6, 14, '', '', 1), (239, 2, 1, 'PRIVATE', 1, 'AVAILABLE', '', 7, 14, '', '', 1), (240, 3, 1, 'PRIVATE', 1, 'AVAILABLE', '', 8, 14, '', '', 1), @@ -369,22 +369,22 @@ VALUES (1, 0, 0, 'SHARE', 3, 'AVAILABLE', '', 89, 5, '', '', 1), (246, 1, 3, 'PRIVATE', 1, 'AVAILABLE', '', 14, 14, '', '', 1), (247, 2, 3, 'PRIVATE', 1, 'AVAILABLE', '', 15, 14, '', '', 1), (248, 3, 3, 'PRIVATE', 1, 'AVAILABLE', '', 16, 14, '', '', 1), - (249, 0, 0, 'SHARE', 3, 'AVAILABLE', '', 37, 20, '', '', 1), - (250, 1, 0, 'SHARE', 3, 'AVAILABLE', '', 38, 20, '', '', 1), - (251, 2, 0, 'SHARE', 3, 'AVAILABLE', '', 39, 20, '', '', 1), - (252, 3, 0, 'SHARE', 3, 'AVAILABLE', '', 40, 20, '', '', 1), - (253, 4, 0, 'SHARE', 3, 'AVAILABLE', '', 41, 20, '', '', 1), - (254, 5, 0, 'SHARE', 3, 'AVAILABLE', '', 42, 20, '', '', 1), - (255, 6, 0, 'SHARE', 3, 'AVAILABLE', '', 43, 20, '', '', 1), - (256, 7, 0, 'SHARE', 3, 'AVAILABLE', '', 44, 20, '', '', 1), - (257, 8, 0, 'SHARE', 3, 'AVAILABLE', '', 45, 20, '', '', 1), - (258, 9, 0, 'SHARE', 3, 'AVAILABLE', '', 46, 20, '', '', 1), - (259, 10, 0, 'SHARE', 3, 'AVAILABLE', '', 47, 20, '', '', 1), - (260, 11, 0, 'SHARE', 3, 'AVAILABLE', '', 48, 20, '', '', 1), - (261, 12, 0, 'SHARE', 3, 'AVAILABLE', '', 49, 20, '', '', 1), - (262, 0, 1, 'SHARE', 3, 'AVAILABLE', '', 50, 20, '', '', 1), - (263, 1, 1, 'SHARE', 3, 'AVAILABLE', '', 51, 20, '', '', 1), - (264, 2, 1, 'SHARE', 3, 'AVAILABLE', '', 52, 20, '', '', 1), + (249, 0, 0, 'SHARE', 4, 'AVAILABLE', '', 37, 20, '', '', 1), + (250, 1, 0, 'SHARE', 4, 'AVAILABLE', '', 38, 20, '', '', 1), + (251, 2, 0, 'SHARE', 4, 'AVAILABLE', '', 39, 20, '', '', 1), + (252, 3, 0, 'SHARE', 4, 'AVAILABLE', '', 40, 20, '', '', 1), + (253, 4, 0, 'SHARE', 4, 'AVAILABLE', '', 41, 20, '', '', 1), + (254, 5, 0, 'SHARE', 4, 'AVAILABLE', '', 42, 20, '', '', 1), + (255, 6, 0, 'SHARE', 4, 'AVAILABLE', '', 43, 20, '', '', 1), + (256, 7, 0, 'SHARE', 4, 'AVAILABLE', '', 44, 20, '', '', 1), + (257, 8, 0, 'SHARE', 4, 'AVAILABLE', '', 45, 20, '', '', 1), + (258, 9, 0, 'SHARE', 4, 'AVAILABLE', '', 46, 20, '', '', 1), + (259, 10, 0, 'SHARE', 4, 'AVAILABLE', '', 47, 20, '', '', 1), + (260, 11, 0, 'SHARE', 4, 'AVAILABLE', '', 48, 20, '', '', 1), + (261, 12, 0, 'SHARE', 4, 'AVAILABLE', '', 49, 20, '', '', 1), + (262, 0, 1, 'SHARE', 4, 'AVAILABLE', '', 50, 20, '', '', 1), + (263, 1, 1, 'SHARE', 4, 'AVAILABLE', '', 51, 20, '', '', 1), + (264, 2, 1, 'SHARE', 4, 'AVAILABLE', '', 52, 20, '', '', 1), (265, 3, 1, 'PRIVATE', 1, 'AVAILABLE', '', 53, 20, '', '', 1), (266, 4, 1, 'PRIVATE', 1, 'AVAILABLE', '', 54, 20, '', '', 1), (267, 5, 1, 'PRIVATE', 1, 'AVAILABLE', '', 55, 20, '', '', 1), @@ -421,12 +421,12 @@ VALUES (1, 0, 0, 'SHARE', 3, 'AVAILABLE', '', 89, 5, '', '', 1), (298, 10, 3, 'PRIVATE', 1, 'AVAILABLE', '', 86, 20, '', '', 1), (299, 11, 3, 'PRIVATE', 1, 'AVAILABLE', '', 87, 20, '', '', 1), (300, 12, 3, 'PRIVATE', 1, 'AVAILABLE', '', 88, 20, '', '', 1), - (301, 0, 0, 'SHARE', 3, 'AVAILABLE', '', 17, 19, '', '', 1), - (302, 1, 0, 'SHARE', 3, 'AVAILABLE', '', 18, 19, '', '', 1), - (303, 2, 0, 'SHARE', 3, 'AVAILABLE', '', 19, 19, '', '', 1), - (304, 3, 0, 'SHARE', 3, 'AVAILABLE', '', 20, 19, '', '', 1), - (305, 4, 0, 'SHARE', 3, 'AVAILABLE', '', 21, 19, '', '', 1), - (306, 0, 1, 'SHARE', 3, 'AVAILABLE', '', 22, 19, '', '', 1), + (301, 0, 0, 'SHARE', 4, 'AVAILABLE', '', 17, 19, '', '', 1), + (302, 1, 0, 'SHARE', 4, 'AVAILABLE', '', 18, 19, '', '', 1), + (303, 2, 0, 'SHARE', 4, 'AVAILABLE', '', 19, 19, '', '', 1), + (304, 3, 0, 'SHARE', 4, 'AVAILABLE', '', 20, 19, '', '', 1), + (305, 4, 0, 'SHARE', 4, 'AVAILABLE', '', 21, 19, '', '', 1), + (306, 0, 1, 'SHARE', 4, 'AVAILABLE', '', 22, 19, '', '', 1), (307, 1, 1, 'PRIVATE', 1, 'AVAILABLE', '', 23, 19, '', '', 1), (308, 2, 1, 'PRIVATE', 1, 'AVAILABLE', '', 24, 19, '', '', 1), (309, 3, 1, 'PRIVATE', 1, 'AVAILABLE', '', 25, 19, '', '', 1), @@ -441,11 +441,11 @@ VALUES (1, 0, 0, 'SHARE', 3, 'AVAILABLE', '', 89, 5, '', '', 1), (318, 2, 3, 'PRIVATE', 1, 'AVAILABLE', '', 34, 19, '', '', 1), (319, 3, 3, 'PRIVATE', 1, 'AVAILABLE', '', 35, 19, '', '', 1), (320, 4, 3, 'PRIVATE', 1, 'AVAILABLE', '', 36, 19, '', '', 1), - (321, 0, 0, 'SHARE', 3, 'AVAILABLE', '', 1, 18, '', '', 1), - (322, 1, 0, 'SHARE', 3, 'AVAILABLE', '', 2, 18, '', '', 1), - (323, 2, 0, 'SHARE', 3, 'AVAILABLE', '', 3, 18, '', '', 1), - (324, 3, 0, 'SHARE', 3, 'AVAILABLE', '', 4, 18, '', '', 1), - (325, 0, 1, 'SHARE', 3, 'AVAILABLE', '', 5, 18, '', '', 1), + (321, 0, 0, 'SHARE', 4, 'AVAILABLE', '', 1, 18, '', '', 1), + (322, 1, 0, 'SHARE', 4, 'AVAILABLE', '', 2, 18, '', '', 1), + (323, 2, 0, 'SHARE', 4, 'AVAILABLE', '', 3, 18, '', '', 1), + (324, 3, 0, 'SHARE', 4, 'AVAILABLE', '', 4, 18, '', '', 1), + (325, 0, 1, 'SHARE', 4, 'AVAILABLE', '', 5, 18, '', '', 1), (326, 1, 1, 'PRIVATE', 1, 'AVAILABLE', '', 6, 18, '', '', 1), (327, 2, 1, 'PRIVATE', 1, 'AVAILABLE', '', 7, 18, '', '', 1), (328, 3, 1, 'PRIVATE', 1, 'AVAILABLE', '', 8, 18, '', '', 1), @@ -457,10 +457,10 @@ VALUES (1, 0, 0, 'SHARE', 3, 'AVAILABLE', '', 89, 5, '', '', 1), (334, 1, 3, 'PRIVATE', 1, 'AVAILABLE', '', 14, 18, '', '', 1), (335, 2, 3, 'PRIVATE', 1, 'AVAILABLE', '', 15, 18, '', '', 1), (336, 3, 3, 'PRIVATE', 1, 'AVAILABLE', '', 16, 18, '', '', 1), - (337, 0, 0, 'SHARE', 3, 'AVAILABLE', '', 89, 21, '', '', 1), - (338, 1, 0, 'SHARE', 3, 'AVAILABLE', '', 90, 21, '', '', 1), - (339, 0, 1, 'SHARE', 3, 'AVAILABLE', '', 91, 21, '', '', 1), - (340, 1, 1, 'SHARE', 3, 'AVAILABLE', '', 92, 21, '', '', 1), + (337, 0, 0, 'SHARE', 4, 'AVAILABLE', '', 89, 21, '', '', 1), + (338, 1, 0, 'SHARE', 4, 'AVAILABLE', '', 90, 21, '', '', 1), + (339, 0, 1, 'SHARE', 4, 'AVAILABLE', '', 91, 21, '', '', 1), + (340, 1, 1, 'SHARE', 4, 'AVAILABLE', '', 92, 21, '', '', 1), (341, 0, 2, 'PRIVATE', 1, 'AVAILABLE', '', 93, 21, '', '', 1), (342, 1, 2, 'PRIVATE', 1, 'AVAILABLE', '', 94, 21, '', '', 1), (343, 0, 3, 'PRIVATE', 1, 'AVAILABLE', '', 95, 21, '', '', 1), @@ -490,32 +490,32 @@ VALUES (1, 0, 0, 'SHARE', 3, 'AVAILABLE', '', 89, 5, '', '', 1), (367, 2, 1, 'CLUB', 1, 'AVAILABLE', '', 23, 9, '', '', 1), (368, 3, 1, 'CLUB', 1, 'AVAILABLE', '', 24, 9, '', '', 1), (369, 0, 0, 'CLUB', 1, 'AVAILABLE', '', 25, 10, '', '', 1), - (370, 1, 0, 'SHARE', 3, 'AVAILABLE', '', 26, 10, '', '', 1), - (371, 2, 0, 'SHARE', 3, 'AVAILABLE', '', 27, 10, '', '', 1), - (372, 3, 0, 'SHARE', 3, 'AVAILABLE', '', 28, 10, '', '', 1), + (370, 1, 0, 'SHARE', 4, 'AVAILABLE', '', 26, 10, '', '', 1), + (371, 2, 0, 'SHARE', 4, 'AVAILABLE', '', 27, 10, '', '', 1), + (372, 3, 0, 'SHARE', 4, 'AVAILABLE', '', 28, 10, '', '', 1), (373, 0, 1, 'CLUB', 1, 'AVAILABLE', '', 29, 10, '', '', 1), (374, 1, 1, 'PRIVATE', 1, 'AVAILABLE', '', 30, 10, '', '', 1), (375, 2, 1, 'PRIVATE', 1, 'AVAILABLE', '', 31, 10, '', '', 1), (376, 3, 1, 'PRIVATE', 1, 'AVAILABLE', '', 32, 10, '', '', 1), - (377, 0, 0, 'SHARE', 3, 'AVAILABLE', '', 33, 11, '', '', 1), - (378, 1, 0, 'SHARE', 3, 'AVAILABLE', '', 34, 11, '', '', 1), - (379, 2, 0, 'SHARE', 3, 'AVAILABLE', '', 35, 11, '', '', 1), - (380, 3, 0, 'SHARE', 3, 'AVAILABLE', '', 36, 11, '', '', 1), + (377, 0, 0, 'SHARE', 4, 'AVAILABLE', '', 33, 11, '', '', 1), + (378, 1, 0, 'SHARE', 4, 'AVAILABLE', '', 34, 11, '', '', 1), + (379, 2, 0, 'SHARE', 4, 'AVAILABLE', '', 35, 11, '', '', 1), + (380, 3, 0, 'SHARE', 4, 'AVAILABLE', '', 36, 11, '', '', 1), (381, 0, 1, 'PRIVATE', 1, 'AVAILABLE', '', 37, 11, '', '', 1), (382, 1, 1, 'PRIVATE', 1, 'AVAILABLE', '', 38, 11, '', '', 1), (383, 2, 1, 'PRIVATE', 1, 'AVAILABLE', '', 39, 11, '', '', 1), (384, 3, 1, 'PRIVATE', 1, 'AVAILABLE', '', 40, 11, '', '', 1), - (385, 0, 0, 'SHARE', 3, 'AVAILABLE', '', 41, 12, '', '', 1), - (386, 1, 0, 'SHARE', 3, 'AVAILABLE', '', 42, 12, '', '', 1), - (387, 2, 0, 'SHARE', 3, 'AVAILABLE', '', 43, 12, '', '', 1), - (388, 3, 0, 'SHARE', 3, 'AVAILABLE', '', 44, 12, '', '', 1), + (385, 0, 0, 'SHARE', 4, 'AVAILABLE', '', 41, 12, '', '', 1), + (386, 1, 0, 'SHARE', 4, 'AVAILABLE', '', 42, 12, '', '', 1), + (387, 2, 0, 'SHARE', 4, 'AVAILABLE', '', 43, 12, '', '', 1), + (388, 3, 0, 'SHARE', 4, 'AVAILABLE', '', 44, 12, '', '', 1), (389, 0, 1, 'PRIVATE', 1, 'AVAILABLE', '', 45, 12, '', '', 1), (390, 1, 1, 'PRIVATE', 1, 'AVAILABLE', '', 46, 12, '', '', 1), (391, 2, 1, 'PRIVATE', 1, 'AVAILABLE', '', 47, 12, '', '', 1), (392, 3, 1, 'PRIVATE', 1, 'AVAILABLE', '', 48, 12, '', '', 1), - (393, 0, 0, 'SHARE', 3, 'AVAILABLE', '', 49, 13, '', '', 1), - (394, 1, 0, 'SHARE', 3, 'AVAILABLE', '', 50, 13, '', '', 1), - (395, 2, 0, 'SHARE', 3, 'AVAILABLE', '', 51, 13, '', '', 1), + (393, 0, 0, 'SHARE', 4, 'AVAILABLE', '', 49, 13, '', '', 1), + (394, 1, 0, 'SHARE', 4, 'AVAILABLE', '', 50, 13, '', '', 1), + (395, 2, 0, 'SHARE', 4, 'AVAILABLE', '', 51, 13, '', '', 1), (396, 0, 1, 'PRIVATE', 1, 'AVAILABLE', '', 52, 13, '', '', 1), (397, 1, 1, 'PRIVATE', 1, 'AVAILABLE', '', 53, 13, '', '', 1), (398, 2, 1, 'PRIVATE', 1, 'AVAILABLE', '', 54, 13, '', '', 1); From 37fa31ada36ce17243c37b2bd9fe3ffadb19196d Mon Sep 17 00:00:00 2001 From: jiminChoi Date: Mon, 28 Oct 2024 16:36:37 +0900 Subject: [PATCH 30/49] =?UTF-8?q?[FE]=20HOTFIX:=20=EA=B3=B5=EC=9C=A0?= =?UTF-8?q?=EC=82=AC=EB=AC=BC=ED=95=A8=20=EB=8C=80=EA=B8=B0=EC=A4=91=20?= =?UTF-8?q?=EC=97=B0=EC=9E=A5=EA=B6=8C=EC=9D=B4=20=EC=82=AC=EC=9A=A9?= =?UTF-8?q?=EB=90=98=EB=8A=94=20=EB=B2=84=EA=B7=B8=20=ED=95=B4=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/Cabinet/components/CabinetInfoArea/CabinetInfoArea.tsx | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/frontend/src/Cabinet/components/CabinetInfoArea/CabinetInfoArea.tsx b/frontend/src/Cabinet/components/CabinetInfoArea/CabinetInfoArea.tsx index 9159f504c..6830f6e62 100644 --- a/frontend/src/Cabinet/components/CabinetInfoArea/CabinetInfoArea.tsx +++ b/frontend/src/Cabinet/components/CabinetInfoArea/CabinetInfoArea.tsx @@ -51,8 +51,7 @@ const CabinetInfoArea: React.FC<{ closeModal, isSwappable, }) => { - const isExtensionVisible = isMine && selectedCabinetInfo; - // selectedCabinetInfo.status !== "IN_SESSION"; + const isExtensionVisible = isMine && selectedCabinetInfo && selectedCabinetInfo.status !== "IN_SESSION"; const isHoverBoxVisible = selectedCabinetInfo && selectedCabinetInfo.lentsLength <= 1 && From 9a23e0a381fb656755f099c97c1efaefca8be2be Mon Sep 17 00:00:00 2001 From: jnkeniaem Date: Tue, 29 Oct 2024 19:19:53 +0900 Subject: [PATCH 31/49] =?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 32/49] =?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 33/49] =?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 34/49] =?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 35/49] =?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 36/49] =?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 37/49] =?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} /> ); From 27de2d65d6d3f1985d96d6ba0e9abd99a54e990f Mon Sep 17 00:00:00 2001 From: Minkyu01 Date: Tue, 5 Nov 2024 15:37:51 +0900 Subject: [PATCH 38/49] =?UTF-8?q?[FE]=20FEAT:=20font=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- config | 2 +- frontend/src/index.css | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/config b/config index 93674bce3..f05053fff 160000 --- a/config +++ b/config @@ -1 +1 @@ -Subproject commit 93674bce354efe9ad8fb3a7a934bdbf5acd1d162 +Subproject commit f05053fff8f24d8fc3b535c6fcf9c7c98341e691 diff --git a/frontend/src/index.css b/frontend/src/index.css index c71095d78..2b3f71b00 100644 --- a/frontend/src/index.css +++ b/frontend/src/index.css @@ -1,4 +1,4 @@ -@import url("https://fonts.googleapis.com/css2?family=Do+Hyeon&display=swap&text=새롬관로그인중"); +@import url("https://fonts.googleapis.com/css2?family=Do+Hyeon&display=swap&text=새롬관로그인중수요지식회"); @import url("https://fonts.googleapis.com/css2?family=Noto+Sans+KR:wght@300;400;700&display=swap"); :root { From 56796c947e651cd962d841c90e5df68a23734c1d Mon Sep 17 00:00:00 2001 From: jnkeniaem Date: Thu, 7 Nov 2024 18:53:03 +0900 Subject: [PATCH 39/49] =?UTF-8?q?[FE]=20CHORE:=20strict=20mode=20=EC=A0=81?= =?UTF-8?q?=EC=9A=A9=EB=90=98=EA=B2=8C=20=EC=9B=90=EC=83=81=20=EB=B3=B5?= =?UTF-8?q?=EA=B5=AC=20=20#1680?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- frontend/src/main.tsx | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/frontend/src/main.tsx b/frontend/src/main.tsx index 7af8401b9..2d963d344 100644 --- a/frontend/src/main.tsx +++ b/frontend/src/main.tsx @@ -41,9 +41,9 @@ Sentry.init({ tracePropagationTargets: [ "localhost", /^https:\/\/cabi\.42seoul\.io/, - // /^https:\/\/dev\.cabi\.42seoul\.io/, - // /^https:\/\/api\.cabi\.42seoul\.io/, - // /^https:\/\/api-dev\.cabi\.42seoul\.io/, + /^https:\/\/dev\.cabi\.42seoul\.io/, + /^https:\/\/api\.cabi\.42seoul\.io/, + /^https:\/\/api-dev\.cabi\.42seoul\.io/, ], // Capture Replay for 100% of all sessions, @@ -53,10 +53,10 @@ Sentry.init({ }); ReactDOM.createRoot(document.getElementById("root") as HTMLElement).render( - // - - - - - // + + + + + + ); From ef48f3ad26fe7c47b4f2edfaa4081c98dc881911 Mon Sep 17 00:00:00 2001 From: Minkyu01 Date: Tue, 12 Nov 2024 13:01:30 +0900 Subject: [PATCH 40/49] =?UTF-8?q?[FE]=20FIX:=20=EB=A1=9C=EB=94=A9=EC=8B=9C?= =?UTF-8?q?=20Init=20style=20=EB=B3=B4=EC=97=AC=EC=A3=BC=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- frontend/index.html | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/frontend/index.html b/frontend/index.html index ff78d2289..c396ca30e 100644 --- a/frontend/index.html +++ b/frontend/index.html @@ -1,6 +1,10 @@ +

- - + From 205bc44f27c972699db51bb56735da13e2d04592 Mon Sep 17 00:00:00 2001 From: jnkeniaem Date: Wed, 13 Nov 2024 17:32:11 +0900 Subject: [PATCH 41/49] =?UTF-8?q?[FE]=20ETC:=20config=20=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config b/config index f05053fff..ead0566bb 160000 --- a/config +++ b/config @@ -1 +1 @@ -Subproject commit f05053fff8f24d8fc3b535c6fcf9c7c98341e691 +Subproject commit ead0566bbf879c00795f1f9504f2791bb295908b From a0f62daadcc8fd37187335432cd9c5731283ed5f Mon Sep 17 00:00:00 2001 From: jnkeniaem Date: Wed, 13 Nov 2024 17:45:25 +0900 Subject: [PATCH 42/49] =?UTF-8?q?[FE]=20ETC:=20VITE=5FBE=5FHOST=EB=A1=9C?= =?UTF-8?q?=20dev=20=EB=B8=8C=EB=9E=9C=EC=B9=98=20=EC=8B=9D=EB=B3=84?= =?UTF-8?q?=EB=90=98=EB=82=98=20=ED=85=8C=EC=8A=A4=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- frontend/src/main.tsx | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/frontend/src/main.tsx b/frontend/src/main.tsx index 2d963d344..ccf28ecc8 100644 --- a/frontend/src/main.tsx +++ b/frontend/src/main.tsx @@ -14,10 +14,15 @@ import "@/index.css"; import App from "@/App"; import { GlobalStyle } from "@/Cabinet/assets/data/ColorTheme"; +console.log(import.meta.env.VITE_BE_HOST.includes("dev")); Sentry.init({ dsn: import.meta.env.VITE_SENTRY_DSN, environment: - import.meta.env.VITE_IS_LOCAL === "true" ? "local" : "production", + import.meta.env.VITE_IS_LOCAL === "true" + ? "local" + : import.meta.env.VITE_BE_HOST.includes("dev") + ? "development" + : "production", release: "^8.18.0", integrations: [ // See docs for support of different versions of variation of react router From 6575a715a1e36dce957fafb29d921009bf6b8757 Mon Sep 17 00:00:00 2001 From: jnkeniaem Date: Wed, 13 Nov 2024 17:59:03 +0900 Subject: [PATCH 43/49] =?UTF-8?q?[FE]=20ETC:=20=EC=A1=B0=EA=B1=B4=20?= =?UTF-8?q?=EC=97=86=EC=9D=B4=20firebase=20getMessaging=20=ED=98=B8?= =?UTF-8?q?=EC=B6=9C=20=ED=85=8C=EC=8A=A4=ED=8A=B8?= 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 insertion(+) diff --git a/frontend/src/Cabinet/firebase/firebase-messaging-sw.ts b/frontend/src/Cabinet/firebase/firebase-messaging-sw.ts index 7dff4c00b..aff2b0a71 100644 --- a/frontend/src/Cabinet/firebase/firebase-messaging-sw.ts +++ b/frontend/src/Cabinet/firebase/firebase-messaging-sw.ts @@ -34,6 +34,7 @@ isSupported().then((result) => { } }); // NOTE : 사용자 브라우저가 푸시 알림 기능을 지원하는지 확인 +messaging = getMessaging(app); const unsupportedMsg = `사용 중인 환경에서는 푸시 알림 기능이 지원되지 않습니다. From 20af0ec1354b5be90e3474c9ad8c0f4e536c3ce8 Mon Sep 17 00:00:00 2001 From: jnkeniaem Date: Wed, 13 Nov 2024 18:03:18 +0900 Subject: [PATCH 44/49] =?UTF-8?q?[FE]=20ETC:=20=EB=B8=8C=EB=9D=BC=EC=9A=B0?= =?UTF-8?q?=EC=A0=80=20=ED=99=98=EA=B2=BD=EC=9D=B4=20=EC=95=84=EB=8B=8C=20?= =?UTF-8?q?=ED=99=98=EA=B2=BD=EC=97=90=EC=84=9C=20firebase=20getMessaging?= =?UTF-8?q?=20=ED=98=B8=EC=B6=9C=20=ED=85=8C=EC=8A=A4=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- frontend/src/Cabinet/firebase/firebase-messaging-sw.ts | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/frontend/src/Cabinet/firebase/firebase-messaging-sw.ts b/frontend/src/Cabinet/firebase/firebase-messaging-sw.ts index aff2b0a71..74da6fc4b 100644 --- a/frontend/src/Cabinet/firebase/firebase-messaging-sw.ts +++ b/frontend/src/Cabinet/firebase/firebase-messaging-sw.ts @@ -34,7 +34,14 @@ isSupported().then((result) => { } }); // NOTE : 사용자 브라우저가 푸시 알림 기능을 지원하는지 확인 -messaging = getMessaging(app); +if ( + typeof window !== "undefined" && + typeof window.navigator !== "undefined" + // && + // isApiSupported +) { + messaging = getMessaging(app); +} const unsupportedMsg = `사용 중인 환경에서는 푸시 알림 기능이 지원되지 않습니다. From 9d442f1c92398f4514ffb56fbdad128bf1a25fef Mon Sep 17 00:00:00 2001 From: jnkeniaem Date: Wed, 13 Nov 2024 18:23:45 +0900 Subject: [PATCH 45/49] =?UTF-8?q?[FE]=20ETC:=20getMessaging=20=ED=98=B8?= =?UTF-8?q?=EC=B6=9C=20=EC=A1=B0=EA=B1=B4=20=EC=9B=90=EC=83=81=EB=B3=B5?= =?UTF-8?q?=EA=B5=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- frontend/src/Cabinet/firebase/firebase-messaging-sw.ts | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/frontend/src/Cabinet/firebase/firebase-messaging-sw.ts b/frontend/src/Cabinet/firebase/firebase-messaging-sw.ts index 74da6fc4b..fdab56028 100644 --- a/frontend/src/Cabinet/firebase/firebase-messaging-sw.ts +++ b/frontend/src/Cabinet/firebase/firebase-messaging-sw.ts @@ -23,6 +23,7 @@ const app = initializeApp(firebaseConfig); let messaging: null | Messaging = null; let isApiSupported = false; +// NOTE : 사용자 브라우저가 푸시 알림 기능을 지원하는지 확인 isSupported().then((result) => { isApiSupported = result; if ( @@ -33,15 +34,6 @@ isSupported().then((result) => { messaging = getMessaging(app); } }); -// NOTE : 사용자 브라우저가 푸시 알림 기능을 지원하는지 확인 -if ( - typeof window !== "undefined" && - typeof window.navigator !== "undefined" - // && - // isApiSupported -) { - messaging = getMessaging(app); -} const unsupportedMsg = `사용 중인 환경에서는 푸시 알림 기능이 지원되지 않습니다. From f2c6a03da8118bad06fba4b459f63c1c13575e55 Mon Sep 17 00:00:00 2001 From: jnkeniaem Date: Wed, 13 Nov 2024 18:24:37 +0900 Subject: [PATCH 46/49] =?UTF-8?q?[FE]=20ETC:=20=ED=85=8C=EC=8A=A4=ED=8A=B8?= =?UTF-8?q?=20=ED=9B=84=20main.tsx=20=EC=9B=90=EC=83=81=EB=B3=B5=EA=B5=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- frontend/src/main.tsx | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/frontend/src/main.tsx b/frontend/src/main.tsx index ccf28ecc8..2d963d344 100644 --- a/frontend/src/main.tsx +++ b/frontend/src/main.tsx @@ -14,15 +14,10 @@ import "@/index.css"; import App from "@/App"; import { GlobalStyle } from "@/Cabinet/assets/data/ColorTheme"; -console.log(import.meta.env.VITE_BE_HOST.includes("dev")); Sentry.init({ dsn: import.meta.env.VITE_SENTRY_DSN, environment: - import.meta.env.VITE_IS_LOCAL === "true" - ? "local" - : import.meta.env.VITE_BE_HOST.includes("dev") - ? "development" - : "production", + import.meta.env.VITE_IS_LOCAL === "true" ? "local" : "production", release: "^8.18.0", integrations: [ // See docs for support of different versions of variation of react router From cd5588cd587ccf35904229eed40db346dcaf1515 Mon Sep 17 00:00:00 2001 From: jnkeniaem Date: Wed, 13 Nov 2024 19:04:51 +0900 Subject: [PATCH 47/49] =?UTF-8?q?[FE]=20ETC:=20.env=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config b/config index ead0566bb..36f81ff28 160000 --- a/config +++ b/config @@ -1 +1 @@ -Subproject commit ead0566bbf879c00795f1f9504f2791bb295908b +Subproject commit 36f81ff2864e6c3a7ef5af1fd752fab31e9b4edc From ae24253c3f863c9d7dfe312c2fc2bea05028a581 Mon Sep 17 00:00:00 2001 From: Minkyu01 Date: Fri, 15 Nov 2024 22:36:01 +0900 Subject: [PATCH 48/49] =?UTF-8?q?[FE]=20FIX:=20=ED=8F=B0=ED=8A=B8=20?= =?UTF-8?q?=EA=BA=A0=EC=A7=90=20=EC=88=98=EC=A0=95=20#1687?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../components/Announce/AnnounceTemplate.tsx | 9 +++++- .../CabinetList/EmptySection/EmptySection.tsx | 30 +++++++++++++++---- frontend/src/index.css | 2 +- 3 files changed, 33 insertions(+), 8 deletions(-) diff --git a/frontend/src/Cabinet/components/Announce/AnnounceTemplate.tsx b/frontend/src/Cabinet/components/Announce/AnnounceTemplate.tsx index 8ccb3eb95..c9659c136 100644 --- a/frontend/src/Cabinet/components/Announce/AnnounceTemplate.tsx +++ b/frontend/src/Cabinet/components/Announce/AnnounceTemplate.tsx @@ -35,6 +35,13 @@ const AnnounceTemplate = (props: Itext) => { {title} + {type === "ERROR" ? ( + + ) : ( + + )} + + {/* {type === "ERROR" ? ( { /> )} - + */} {subTitle} {content} diff --git a/frontend/src/Cabinet/components/CabinetList/EmptySection/EmptySection.tsx b/frontend/src/Cabinet/components/CabinetList/EmptySection/EmptySection.tsx index b0417bf70..912fa7c80 100644 --- a/frontend/src/Cabinet/components/CabinetList/EmptySection/EmptySection.tsx +++ b/frontend/src/Cabinet/components/CabinetList/EmptySection/EmptySection.tsx @@ -1,13 +1,16 @@ import styled from "styled-components"; +import { ReactComponent as CabiImage } from "@/Cabinet/assets/images/happyCcabi.svg"; const EmptySection = ({ message }: { message: string }): JSX.Element => { return ( - {/* */} - + + + {/* */} + {/* { src="/src/Cabinet/assets/images/happyCcabi.png" alt="happy cabi" /> - + */} + {message} ); }; +const CabinetTypeIconStyled = styled.div` + width: 200px; + height: 200px; + + & path { + stroke: var(--normal-text-color); + } + + & > svg { + width: 200px; + height: 200px; + } +`; + const EmptySectionStyled = styled.div` display: flex; justify-content: center; diff --git a/frontend/src/index.css b/frontend/src/index.css index 2b3f71b00..1c5a648fc 100644 --- a/frontend/src/index.css +++ b/frontend/src/index.css @@ -1,4 +1,4 @@ -@import url("https://fonts.googleapis.com/css2?family=Do+Hyeon&display=swap&text=새롬관로그인중수요지식회"); +@import url("https://fonts.googleapis.com/css2?family=Do+Hyeon&display=swap&text=새롬관로그인중수요지식회여기엔사물함이없어"); @import url("https://fonts.googleapis.com/css2?family=Noto+Sans+KR:wght@300;400;700&display=swap"); :root { From 994115484b83d000e318e0bc57d77976edc5f7e0 Mon Sep 17 00:00:00 2001 From: Minkyu01 Date: Fri, 15 Nov 2024 22:48:30 +0900 Subject: [PATCH 49/49] [FE] FIX: image loading error #1687 --- .../assets/images/webp/sadCcabiWhite.webp | Bin 0 -> 15748 bytes .../components/Announce/AnnounceTemplate.tsx | 9 +-------- .../CabinetList/EmptySection/EmptySection.tsx | 18 ++---------------- 3 files changed, 3 insertions(+), 24 deletions(-) create mode 100644 frontend/src/Cabinet/assets/images/webp/sadCcabiWhite.webp diff --git a/frontend/src/Cabinet/assets/images/webp/sadCcabiWhite.webp b/frontend/src/Cabinet/assets/images/webp/sadCcabiWhite.webp new file mode 100644 index 0000000000000000000000000000000000000000..b8eea0769a8a76a0ca7dffe67362b037ff1a6a52 GIT binary patch literal 15748 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
tcp*@ z%GmOdz9VXOLE4wA6{U9t0g)-cXOut?5-8Erced;hqv5c&5+y66xqTucJP;eKf@bbZ z%7{WALSU}OoR6U^oc(&6PS)g-Sw-$UdSu%+H=krc$taMBgd3&kaLVpJVWk!GI#Blb z8#QDC_}OCJ6KHqKl)cRUm6Sh94I--vGej4vne4|!2^2*6W9NLI$dr2-OLi+jJV#{4 zZA(i_de+1cO{eiIU(eN_{0(nlrjN*QZt{C!v?Ew!TyUO|51X{skNSsngT69@egRt` z1bIPnE8g};ED4|2NgXdv6$BJOU!ZfAqKNfC@ga><@i4hbvX~le`z6d{vW(!^Y*fx^ z75+*{$YWB|hcDZUU-fPjo~5QednfQ}lx}o81qTVvdcSMh2XPsI3ZvwI!x}A+o7VyI z9DD|UbzUbQQzmN7c8FdnO# zr7w@&6tTu+bNBRnJj8d^fx0bRw(9CjqK+2qBJqaxV7qq@OJYr<+^YgHFojeADO8o)(w2PJ(KA*l+p% z2wdkoX4nH>fBKGXzAPCix!XqP2{{7q7)F*?T?s&gACc3?&_Xg9RY{y6~uv{I2 zX66Yfp;T`Ce_oa-t%6!T$J)t0UatFp8p9XjJv9eI6^(BR*4W*>r4r-2F01zW1f_yA zxbnZBm6hB+YL2pQQH_!4vFR-0O7^fH6vuT=KTIvTcbx%!-tAphZw%PONO~8V`DAL5 z`ra^be*E>d8e(?i{t*k8_bGTd%wLl<1XUJrh$?NlbqjYsr}I0HKziVS zWWh+RcjejrfXSB`XB7Ua{TO44K`9&5eRUXqD|y~RFV=~E_vm?_Mk=e& z_Js-D=-~yV)B&;uCN9 z4Be{N^2S%K09<|dg@2pRAs=(y&WTy;2^*)U)V%!7H_`+)$veB8^IfUo*UGgIi4hjb zN-*3=8ev%ZhumyEzXuAN9#kRPdVrR>kiTzUKFrDEJq35IIBbVx1N|@=a7=!Qe8}xx zmA0ls{Ni2ZL(GPO_eN&THZ|^P#32RiojN0meoC#d zskpLqfotX5_18`-Lt@7j74e3-5Ay0nY7Jl1#d8|oFmXO8WqEUxb}BF;Q7C-mNxx)Y z&HVHzuG(w%f1B*Z4f0QVyA06mOW12mtwn*&|JSZ(J7Pt0JaEp42;+pni2wg4F7*xs zI*yRq*9C!u8d$r$ZMA;JRPGg#1_)v^E~%xrPfveiXwB^%X4_goP#MNfHYCw!<1J~KfUynq4SQ|pcJZIv-@QRcmB#yO?y S0OHz@ZrJyTbf`1 literal 0 HcmV?d00001 diff --git a/frontend/src/Cabinet/components/Announce/AnnounceTemplate.tsx b/frontend/src/Cabinet/components/Announce/AnnounceTemplate.tsx index c9659c136..8ccb3eb95 100644 --- a/frontend/src/Cabinet/components/Announce/AnnounceTemplate.tsx +++ b/frontend/src/Cabinet/components/Announce/AnnounceTemplate.tsx @@ -35,13 +35,6 @@ const AnnounceTemplate = (props: Itext) => { {title} - {type === "ERROR" ? ( - - ) : ( - - )} - - {/* {type === "ERROR" ? ( { /> )} - */} + {subTitle} {content} diff --git a/frontend/src/Cabinet/components/CabinetList/EmptySection/EmptySection.tsx b/frontend/src/Cabinet/components/CabinetList/EmptySection/EmptySection.tsx index 912fa7c80..543327d13 100644 --- a/frontend/src/Cabinet/components/CabinetList/EmptySection/EmptySection.tsx +++ b/frontend/src/Cabinet/components/CabinetList/EmptySection/EmptySection.tsx @@ -6,20 +6,6 @@ const EmptySection = ({ message }: { message: string }): JSX.Element => { - {/* */} - {/* - - - */} {message} @@ -30,8 +16,8 @@ const CabinetTypeIconStyled = styled.div` width: 200px; height: 200px; - & path { - stroke: var(--normal-text-color); + & g { + fill: var(--normal-text-color); } & > svg {