From 3b240d1fbbf614073a0db9d2183925a610fddb73 Mon Sep 17 00:00:00 2001 From: jnkeniaem Date: Fri, 6 Sep 2024 16:52:55 +0900 Subject: [PATCH 01/89] =?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/89] =?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/89] =?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/89] =?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/89] =?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/89] =?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/89] =?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/89] =?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/89] =?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/89] =?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/89] =?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/89] =?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/89] =?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/89] =?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/89] =?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/89] =?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/89] =?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/89] =?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/89] =?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 zcmV;x3_tTyNk&Gv3;+OEMM6+kP&il$0000G0002L006%L06|PpNGSvW00E$fY@gcL z8h#8z2qA<{$JIJT$yshx`SXz4=S|Y_DsH_yec7)v?z-_0bR0tDCKM zr#pWTE?BDdD#HZ_-T6E1R&(|A@=u<*;goH>6ptwwJo2fPQYE0Aec`kkj~(#N_(mn_ z^d(guC%pDhTP1Gr+(ue#6dwsxBFh(sAQqhS0+rbEx=alCpQ%Lup#c$tJzFZ_yC*@U z_+?Th|9wV;%v%%*AFw0CZ&5^i$cPABqR99Fj|A)~>7Y)5DAZbtkijMqus>6zT;7ZC z0!7R_0Gk(5L)MXLk12A#Vc=>=ddRI%!6S;GZ)lhXI}{1)h~O+m(pvxz|A8iL6HiqU zbt}LECsE}pjzxQpDj%3w+-a(GvRKNJDyjiEUR!MAnOV9ti#W2Y>C!IaC^qTRsd5xvi!Q-1pzu3%3F{n1m3%{l zkqs1lG@y&xgnXO*J{l*DKv55=w~?gYX6i2<;;(I-eB%GmaPoKShVPYCSqb4|?zD zD^&QXo;3g;12b2Dg$5sORrob zbh5QhtL1IMq6=n!Wvi!Tg1xbepS3uPGU#rpcHl=cp}sqM*vlBeq7A~yR_Z5x6ef@S z;(`tQd`bfrd2YDH>g2(XwUVX#!qN3=DPwXLi`>iv@?!W(`v3cPB`|r8?ZaZwz7#|<5Rm-Jp#@0EoxCO2mcDkoO zS15Ud<#MIsqfVt9 z+cphd6C7Cl!*B95106vjGnnpx`rY+kO1YZ;%)(T1|FryO z_#Vz{*FM32%zBo3P$2q%bvOK42V`@ajSZ6)Yuk&L}lgn9htQ&;d ztguH7unDnnK7U${+yBM=BY@hH z|Ndn;yMO)6QXC-vMcZ;21et$pZ1`E{X~ZsSFCX$$|21V7UUS$}YGl_LWS(Dc77O9> zl$}Jy1ne=Iw?d)9k{_RucI0E>RN|WLbt<4nO~k^t1vNDgJig zRF;4HdO#b-`7fjz1%l;T>}{mN@a&AcEzNKE5qI#tw$++#F|1`>c+QxA%K{PI6>$RI+O~=1R^J+o;+fV!dPIR_UEVbWb2Bj%rEG4z5%x$6 zelG#$>a`$0IqYIwRa=9pID0X9sA|A63M^k?rUqm!?bfn7>O%F1`{ zlYZ_FExO6Ln8AV;7FUIVS1xI6xp2X``@{dq0ewqea8&Vo8j(kbc$&Ky&Zqa%L(e_R zJ9SLNcJ`EeSc3`@v8X8==LYCNWP(B53XnZ z<&C}7O{*prqjqL3jtNu^KY0vVo%ezr+!~yz8|V9+W`8;d_xB3`YNt%E z?}o})A|Oiuz_MD;C{V8pZtZ}}Ui98p8XZC(l>^7>o1;^r-1^6Mv?jWC*=tbIj;1>Q zGI3w2PBS4kZPd;7|I38_KE0BD)fHQuGm(#)=E0=0{(ZYWJCAM)JRZOaYBvgZ_YtPu zpWCT;55x~S7La86ydImnK@L$Q<+i&vuLPK|^3P5V{m4xG@vS&O3kK>EoVVp|Fj`4X z@kqMPXoJC&o!wTE%g%LziO>i~!I=yzf(Kh~)|hd~KKxOd&(oECTi#@-ss7W_AP56d3Kz^=&=o^+;NbxIz* zf|8ycQWvBw^|7M=?eF#Yns13rY?-({vDokOaJ!SX+%R(zvo6{Y*y_T&Y6R3zSAY z8l_q4m4+-$X*IbFD2C-|&b~TPdVAebj$$nzfg_j^&Fv{<-=5fc*RQD6X&9Y-hazl( zjis~l4S{qF8SQy#G(}GtVduMk>Y?KJHVLz^Sh9OP7g3fw@zD^44m#8lis}d>?#Pg| zM?TI|eyA6JMl8*ZmK0j#eF@{{VgqOta!Y#bx_RQatuJ-sGSTDvxK|>@IgL^t-Ltn; zHZAgE%8l;=nW(gI?9+B#^n@EkoMeUl9pVh5AxY%Ty_}KA?q`cKe&@7E1#!3|N5^~z z&*(v6@56TexKqsrGe=E)*KZusu|>GLgwBO>_u17snR&FV;vbpP)Ur;W#%2#Dh0mc5e}mVMb949 zQjDO}xVrH5^lA3%t#jNQ6tSow{rP}vw+3{YKXX!P8eW-aqb7-#QVg8rpUGrm48Lm+ y{K<}p`q6$0;F@Jx5iL1(XDb8)?A297nq2=(;&B&*bydIT>#yJ{&3~=h0001YN<!=8`_12PY+AQy-lRcq zKYi1AfkV0)uiiIo(}3vmoyNF_PBFR>$vw8JBh<0+dX;sT+{-@*O26JfUu2qo@3&mt-|O(^raWF%$25enU^ zN6;w)La96VM9wuGq1sPI%pF3(UyYP&gpxlQA@z=$i3cJhGawYbb4o;*-w0)IdC@RO zD11YUf}4cWzZwDVfZB8L{hEeccL@MKjb-9}5NH}QT_8aC zG?s^~fx%Bqo}2*Uc~} zb?gNjeAXd98+_J@X4&Ag4*A*OvyQ>g0UojX5Ajj(5%Z9rb*PVmkAROJ@+0PcrHJcXnnhZrDGkb$!Dz>bWwly3HShLcl zVd^!bl5sdj(TFuWU3$H(SR=}rgicUYV(z3%_w84y_N(PgLMJFXF}G8}CEL{Lr<+O{ zM<*ysv1auaPa4ryqlC91$4s}qOrcym?a6t&Rib~%>*v%e#jNkd7)B9~nQpnM zTu`aiuXuS%qrdyLw#|6+hI*|M7Gu5QRIk_TC)NM7R;$&j)k?V(6msca&oN^f#i*NN!g$QE6RzKz&SZ1>e4$V* z7K?%Wr67#OVzE#tlx^6O&aBRyo;xVozH5zlp`2!|Nqzm4#}jPO52_)pOZ{~uiv09H^qAesvR0I);=odGHU0RRC$kwl$JC8Q=H zr8OHkz!C{(ZoK;zBD)v)oVW4jhz~pqCme-;MSqp;)BP7POwC7a<;QqGBywH-bL|U^ zKR*9e=n?Ff(|t3hmHO5)9A@!t{=d}QIbU7-1%Eo~R#==|Kqol3fKG7w*~O+c(HpHO zXrufKpXJ^$T!96{`s=(U+G`={rYxs}rO$r}AM3+-oie+lgtkA;>4a$HDbL;T1z@wg z9Re(XOW*%)&j0)xZDw-yg3h8`fvTXLVYAM4-!hy1pTLM2sFB%H_No__>G@5(tz8k` zXQ~Cikof&8SQUEgM%fN6MSYZU;NQp^EhDWP;(Z58EZ^BTD77OR($UO^3WBe~xIZZ~ zCC98Z^>6#ob?mdH%b`B_9G?#-+<&d5vFOGFU@QZVu6_e9Wkp55LRrl?@BZX<>kHlt zP>k;Mig7Whrl)buPz}FXzfkE}D*_i{tOq&79-snUBd>MZ4L=M)3{N51*@p=lD5oD5 z!(Fa;5wkV~?VRRi3PVZB+VL#wf>T<4R-YzTSqxh1TsufDkA~;$NNu~nzu1EbWwQJ5 zfmuk$*9;wU8MPa{dA5_jqCu_Lxm5z_U+}RNJ5Mn;|MhX9KZc#I81}&MYYmO74YtJ# z;7ss7JzL{&N1QGeOu_w$_`-2xc(OZ{`#YmH3_~b%T_z+?snBcZtMaT;LzsJ=&ePJzk<5kG zZ%x@HwqTfrbb9M(P=}LciRB5IOGZ++()%3<#S>#-$uQ(VYiq58Ic`bahSQN4xMjB2 zhKDpD7DnwUVLeTq=E_|xOr*Jkb_U^H^aBA*O|-O+%i&A)hpaHHwD=wPmp33ZK7zz2 z)#QYYNSW{*f4h$2E|n=Nhc!X^e8?yJVID%froZx!!kBYoHO!y(Uo!|kdj1>ew=kz* z|LmOUv70W9kL$BB-tc72lJz=$bnX`K1bqWDL6xZTG;#3WQfiIy1?M385~fixQ1N|U z9$Tza?DfU;s}a2m1=tO?+7VkVPY)f}T>DNW*+If;SwC4Dv!yw{YV%2Ctx}1wf3B@W z4vPX|$bi<@TQ}^g!fazkoRNr>?Cgk=&IwOg;=CLdZ&21>q&XqX&2Me##Zf+gJ%6(w zH#Fax4?3UQvufM^oxf+^c$w@o+FF(Fw!^FI_-<<}A?%*- zSi3T30tkS$E!fH`Cg-D`;Cq;rNV5jA3!C~(e-$NvqgZ+p$_t_ZY2Ed=m-)RGO@qXU z!p)64#}h-=^teWx)key}=5wI?QBg&pf{>@kzrd3Wdpc4-hfBf+^gSUEOR>7{=h06i znJkF);JB3?ZQvSzmc(dOou%FaaNc`ytL(rhDREvg4eQRG&0wC$a>)J!|%H7*|WpHiP27bn3!I<6!M^i+h zYy=GkaCnjn@1kOcqE)`Xe!kkmZGh22Ed0U@FJLMlPkE~Ac-{9MPXsws=QU9}f zGKrtW8*4I`$(b>~3H~ z1wDZPm=WdReY`CLTw()pjse&PV*FLW&37Nk^}Cj>$SX$xq9PCUlyM?wzSJM|B?7Tl zxS1r35Tu~rZ}^5~fEhuka&3Rd#Dg{I1Y>&cf;i{?_8>XWAt4W-gr(oeI8GgS%Da3& z{W1_tD=%(?X}Fw-0AL5SUqcfE{)fR{*U2;Be~Wn=+FZSkX6gp#@xmBy#b@M*gE!-5 zFFndqm_pzkVh_@p;dF%d+6Bz5Qx1T zzKJzaw$h0c3oa+$AW~@iD^qlBXEPQ%0U#_Aid03?#>*hInHiF$B%d?7l8xBEJ@jLE zQ_`$PAB>;DJJ4|#%?2yVT6G5M?#4q@Ze)slCXKP2vb*Z;+;s{|@Ei|)$j*XKNsW`N zEWHz~G|Nq=b@Xn~->HvLZjtxR@Sawf9gvn1>lI>Ry|2xl@4K&kRYk$5dyhuq1N__6 zEX~JsG%5;qY8cad+A6Hn_POlM*NmX*>5aW>E+cy*;gJX>^ojTuw6m;xSJ>r5#Y4}f5hqFXE$WJi(mIc97%JK5^*ZB{L?w- zVqCzBB96N$`iw?%`Qr&4!n9aEfY*W*&s|pEt0JHgUEq#Sn@QgySMK3-mOhNth^fi}o-v>6v)> z(9eT;sR@j7M# zQ(F&GG}UF4cO0AxGYbm3z^XBo5y=mOk|=LTX*P~sIrflS)*#--DCM%=$g3b*_~U8; zq=Zafl;Ddgr3FVBd=0&S27CZ4qL`CnkA=}gB$EdnWxGq|u!9&_KG{J8kj-o-18Pn! z{d1xG6@_>*0Xz=>6_Kp6JW7teA#D@9xTF3W2fP?)o=g(yt?~HnA~noUZicK^1lWWz zsZDKQf*W?ZhG6udZ74!VWs{$v3j{m?jQ_Z|}6*WiCn%{vYOd#z~3`hzb4(DB+ho;eLvubvO{@XvKk zIke@RKLZ2;9ht8ywrcTL@#tS;Nju0Foxc4riP6rP&V5Zvq(o?izUlV%tufZ)H@2T$ z#QhS*|Fe#9TM7&A9X1WTvvkuFwJQzwh;Z;xq<@=2jp6BbXuyvM#Ja_$nPiUUoY7~I z6#`L8A0P075R=XTsvEb0fcfyk6i#unl1rt|cA{fk)@%>WwD#6EPFwn9zkA7)Nj>K-Nv9TE6IFEOP2WC qb3+CN+j+=hm^>H0SjU~_NB~-`*B!YnQ`{;+E)lp!I)(rM0002^f1b<$ 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< 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 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/89] =?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/89] =?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/89] =?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/89] =?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/89] =?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/89] =?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/89] =?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 36becdf9d2348055c7a30e6c25c6fe372ea1f792 Mon Sep 17 00:00:00 2001 From: saewoo1 Date: Tue, 22 Oct 2024 16:19:59 +0900 Subject: [PATCH 27/89] =?UTF-8?q?FEAT:=20item=5Fhistory=20=ED=85=8C?= =?UTF-8?q?=EC=9D=B4=EB=B8=94=EC=97=90=20amount=20=EC=BB=AC=EB=9F=BC=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/database/cabi_local.sql | 1 + .../main/java/org/ftclub/cabinet/item/domain/ItemHistory.java | 2 ++ 2 files changed, 3 insertions(+) diff --git a/backend/database/cabi_local.sql b/backend/database/cabi_local.sql index 668508da5..6ba36289f 100644 --- a/backend/database/cabi_local.sql +++ b/backend/database/cabi_local.sql @@ -758,6 +758,7 @@ CREATE TABLE `item_history` `user_id` bigint(20) NOT NULL, `purchase_at` datetime(6) NOT NULL, `used_at` datetime(6) DEFAULT NULL, + `amount` bigint(20) DEFAULT NULL, PRIMARY KEY (`id`), CONSTRAINT `item_history_item_id` FOREIGN KEY (`item_id`) REFERENCES `item` (`id`), CONSTRAINT `item_history_user_id` FOREIGN KEY (`user_id`) REFERENCES `user` (`id`) diff --git a/backend/src/main/java/org/ftclub/cabinet/item/domain/ItemHistory.java b/backend/src/main/java/org/ftclub/cabinet/item/domain/ItemHistory.java index 2784a5f72..4cfd2f5c5 100644 --- a/backend/src/main/java/org/ftclub/cabinet/item/domain/ItemHistory.java +++ b/backend/src/main/java/org/ftclub/cabinet/item/domain/ItemHistory.java @@ -75,6 +75,8 @@ public class ItemHistory { @Column(name = "USER_ID", nullable = false) private Long userId; + @Column(name = "AMOUNT", nullable = true) + private Long amount; protected ItemHistory(long userId, long itemId, LocalDateTime usedAt) { this.userId = userId; From 74fb8757dfa20a5b5240966c023f211b63a2a082 Mon Sep 17 00:00:00 2001 From: saewoo1 Date: Tue, 22 Oct 2024 16:21:04 +0900 Subject: [PATCH 28/89] =?UTF-8?q?FEAT:=20item=20=ED=85=8C=EC=9D=B4?= =?UTF-8?q?=EB=B8=94=EC=97=90=20=EA=B4=80=EB=A6=AC=EC=9E=90=EC=9A=A9=20?= =?UTF-8?q?=EC=BD=94=EC=9D=B8=20=EC=A7=80=EA=B8=89=20=EC=95=84=EC=9D=B4?= =?UTF-8?q?=ED=85=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/database/cabi_local.sql | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/backend/database/cabi_local.sql b/backend/database/cabi_local.sql index 6ba36289f..3e5fbea6f 100644 --- a/backend/database/cabi_local.sql +++ b/backend/database/cabi_local.sql @@ -742,7 +742,8 @@ VALUES (1, 0, 'EXTENSION_PREV', 'EXTENSION'), (17, 200, 'ADMIN_REWARD_200', 'ADMIN_REWARD'), (18, 500, 'ADMIN_REWARD_500', 'ADMIN_REWARD'), (19, 1000, 'ADMIN_REWARD_1000', 'ADMIN_REWARD'), - (20, 2000, 'ADMIN_REWARD_2000', 'ADMIN_REWARD'); + (20, 2000, 'ADMIN_REWARD_2000', 'ADMIN_REWARD'), + (21, 0, 'ADMIN_REWARD_COIN', 'ADMIN_REWARD'); /*!40000 ALTER TABLE `item` ENABLE KEYS */; UNLOCK TABLES; From 4c49f8d9d687350b5c69f2486ffff3207afe9faf Mon Sep 17 00:00:00 2001 From: saewoo1 Date: Tue, 22 Oct 2024 17:32:49 +0900 Subject: [PATCH 29/89] =?UTF-8?q?FEAT:=20ItemHistory=20=EC=97=94=ED=8B=B0?= =?UTF-8?q?=ED=8B=B0=EC=97=90=20=EC=9E=84=EC=8B=9C=EC=A0=81=EC=9C=BC?= =?UTF-8?q?=EB=A1=9C=20=EC=BD=94=EC=9D=B8=20=EA=B4=80=EB=A0=A8=20=EC=83=9D?= =?UTF-8?q?=EC=84=B1=EC=9E=90=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ftclub/cabinet/item/domain/ItemHistory.java | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/backend/src/main/java/org/ftclub/cabinet/item/domain/ItemHistory.java b/backend/src/main/java/org/ftclub/cabinet/item/domain/ItemHistory.java index 4cfd2f5c5..8b0c99da8 100644 --- a/backend/src/main/java/org/ftclub/cabinet/item/domain/ItemHistory.java +++ b/backend/src/main/java/org/ftclub/cabinet/item/domain/ItemHistory.java @@ -84,6 +84,13 @@ protected ItemHistory(long userId, long itemId, LocalDateTime usedAt) { this.usedAt = usedAt; } + protected ItemHistory(long userId, long itemId, LocalDateTime assignedAt, Long amount) { + this.userId = userId; + this.itemId = itemId; + this.usedAt = assignedAt; + this.amount = amount; + } + /** * @param userId 아이템을 사용한 유저 ID * @param itemId 사용된 아이템 ID @@ -98,6 +105,15 @@ public static ItemHistory of(long userId, long itemId, LocalDateTime usedAt) { return itemHistory; } + public static ItemHistory coin(Long userId, Long itemId, LocalDateTime assignedAt, + Long amount) { + ItemHistory itemHistory = new ItemHistory(userId, itemId, assignedAt, amount); + if (!itemHistory.isValid()) { + throw ExceptionStatus.INVALID_ARGUMENT.asControllerException(); + } + return itemHistory; + } + /** * 사용자 ID, 아이템 ID, 사용일자의 null 이 아닌지 확인합니다. * From 6955c8675825ed6086d55156adf9342bf5f2592a Mon Sep 17 00:00:00 2001 From: saewoo1 Date: Tue, 22 Oct 2024 17:33:52 +0900 Subject: [PATCH 30/89] =?UTF-8?q?FEAT:=20=EC=BD=94=EC=9D=B8=20=EC=A7=80?= =?UTF-8?q?=EA=B8=89=20=EC=BB=A8=ED=8A=B8=EB=A1=A4=EB=9F=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../admin/item/controller/AdminItemController.java | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/backend/src/main/java/org/ftclub/cabinet/admin/item/controller/AdminItemController.java b/backend/src/main/java/org/ftclub/cabinet/admin/item/controller/AdminItemController.java index f3932160e..330134298 100644 --- a/backend/src/main/java/org/ftclub/cabinet/admin/item/controller/AdminItemController.java +++ b/backend/src/main/java/org/ftclub/cabinet/admin/item/controller/AdminItemController.java @@ -1,9 +1,9 @@ package org.ftclub.cabinet.admin.item.controller; import lombok.RequiredArgsConstructor; +import org.ftclub.cabinet.admin.dto.AdminCoinAssignRequestDto; import org.ftclub.cabinet.admin.dto.AdminItemHistoryPaginationDto; import org.ftclub.cabinet.admin.item.service.AdminItemFacadeService; -import org.ftclub.cabinet.admin.statistics.service.AdminStatisticsFacadeService; import org.ftclub.cabinet.auth.domain.AuthGuard; import org.ftclub.cabinet.auth.domain.AuthLevel; import org.ftclub.cabinet.dto.ItemAssignRequestDto; @@ -24,8 +24,6 @@ public class AdminItemController { private final AdminItemFacadeService adminItemFacadeService; - private final AdminStatisticsFacadeService adminStatisticsFacadeService; - @PostMapping("") @AuthGuard(level = AuthLevel.ADMIN_ONLY) @@ -41,6 +39,13 @@ public void assignItem(@RequestBody ItemAssignRequestDto itemAssignRequestDto) { itemAssignRequestDto.getItemSku()); } + @PostMapping("/assign/coin") + @AuthGuard(level = AuthLevel.ADMIN_ONLY) + public void assignCoin(@RequestBody AdminCoinAssignRequestDto coinAssignRequestDto) { + adminItemFacadeService.assignCoin(coinAssignRequestDto.getUserIds(), + coinAssignRequestDto.getSku(), coinAssignRequestDto.getAmount()); + } + /** * 특정 유저의 아이템 history 조회 * From 76e942b23cbe63f9e9c0b89c515ac97d8cbdd53a Mon Sep 17 00:00:00 2001 From: saewoo1 Date: Tue, 22 Oct 2024 17:34:58 +0900 Subject: [PATCH 31/89] =?UTF-8?q?FEAT:=20=EC=96=B4=EB=93=9C=EB=AF=BC=20?= =?UTF-8?q?=EA=B3=84=EC=A0=95=EC=97=90=EC=84=9C=20=EC=97=AC=EB=9F=AC=20?= =?UTF-8?q?=EC=9C=A0=EC=A0=80=EC=97=90=EA=B2=8C=20=EC=9B=90=ED=95=98?= =?UTF-8?q?=EB=8A=94=20=EC=96=91=EB=A7=8C=ED=81=BC=20=EC=BD=94=EC=9D=B8=20?= =?UTF-8?q?=EC=A7=80=EA=B8=89=20=EA=B8=B0=EB=8A=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ItemHistory 테이블에 amount 컬럼 추가 --- .../admin/dto/AdminCoinAssignRequestDto.java | 15 +++++++++++++++ .../item/service/AdminItemFacadeService.java | 10 ++++++++++ .../item/service/ItemHistoryCommandService.java | 17 +++++++++++++++++ 3 files changed, 42 insertions(+) create mode 100644 backend/src/main/java/org/ftclub/cabinet/admin/dto/AdminCoinAssignRequestDto.java diff --git a/backend/src/main/java/org/ftclub/cabinet/admin/dto/AdminCoinAssignRequestDto.java b/backend/src/main/java/org/ftclub/cabinet/admin/dto/AdminCoinAssignRequestDto.java new file mode 100644 index 000000000..764d225c9 --- /dev/null +++ b/backend/src/main/java/org/ftclub/cabinet/admin/dto/AdminCoinAssignRequestDto.java @@ -0,0 +1,15 @@ +package org.ftclub.cabinet.admin.dto; + +import java.util.List; +import lombok.AllArgsConstructor; +import lombok.Getter; +import org.ftclub.cabinet.item.domain.Sku; + +@Getter +@AllArgsConstructor +public class AdminCoinAssignRequestDto { + + private List userIds; + private Sku sku; + private Long amount; +} diff --git a/backend/src/main/java/org/ftclub/cabinet/admin/item/service/AdminItemFacadeService.java b/backend/src/main/java/org/ftclub/cabinet/admin/item/service/AdminItemFacadeService.java index d8c456f03..be8d3960e 100644 --- a/backend/src/main/java/org/ftclub/cabinet/admin/item/service/AdminItemFacadeService.java +++ b/backend/src/main/java/org/ftclub/cabinet/admin/item/service/AdminItemFacadeService.java @@ -63,6 +63,16 @@ public void assignItem(List userIds, Sku sku) { itemHistoryCommandService.createItemHistories(userIds, item.getId(), now); } + @Transactional + public void assignCoin(List userIds, Sku sku, Long amount) { + Item item = itemQueryService.getBySku(sku); + LocalDateTime now = LocalDateTime.now(); + userIds.forEach(userId -> { + userCommandService.updateCoinAmount(userId, amount); + }); + itemHistoryCommandService.createCoinAssignHistory(userIds, item.getId(), now, amount); + } + @Transactional(readOnly = true) public AdminItemHistoryPaginationDto getUserItemHistories(Long userId, Pageable pageable) { Page itemHistoryWithItem = diff --git a/backend/src/main/java/org/ftclub/cabinet/item/service/ItemHistoryCommandService.java b/backend/src/main/java/org/ftclub/cabinet/item/service/ItemHistoryCommandService.java index 2863043c4..3319605d5 100644 --- a/backend/src/main/java/org/ftclub/cabinet/item/service/ItemHistoryCommandService.java +++ b/backend/src/main/java/org/ftclub/cabinet/item/service/ItemHistoryCommandService.java @@ -33,4 +33,21 @@ public void createCoinItemHistory(Long userId, Long itemId) { ItemHistory coinCollectItemHistory = ItemHistory.of(userId, itemId, LocalDateTime.now()); itemHistoryRepository.save(coinCollectItemHistory); } + + /** + * 관리자가 코인 지급 시 ItemHistory에 기록을 남깁니다 + * + * @param userIds + * @param itemId + * @param usedAt + * @param amount + */ + public void createCoinAssignHistory(List userIds, Long itemId, LocalDateTime usedAt, + Long amount) { + List itemHistories = userIds.stream() + .map(userId -> ItemHistory.coin(userId, itemId, usedAt, amount)) + .collect(Collectors.toList()); + + itemHistoryRepository.saveAll(itemHistories); + } } From b3c24635d3a4c6f292211286ad9b14045047b5ef Mon Sep 17 00:00:00 2001 From: saewoo1 Date: Fri, 25 Oct 2024 15:06:01 +0900 Subject: [PATCH 32/89] =?UTF-8?q?FIX:=20amount=EB=A5=BC=20=EB=B0=9B?= =?UTF-8?q?=EB=8A=94=20=ED=8C=A9=ED=86=A0=EB=A6=AC=20=EB=A9=94=EC=84=9C?= =?UTF-8?q?=EB=93=9C=20=EC=97=90=EB=9F=AC=20=EB=B0=9C=EC=83=9D=20=EC=8B=9C?= =?UTF-8?q?=20asDomainException=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/org/ftclub/cabinet/item/domain/ItemHistory.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/src/main/java/org/ftclub/cabinet/item/domain/ItemHistory.java b/backend/src/main/java/org/ftclub/cabinet/item/domain/ItemHistory.java index 8b0c99da8..2dc9195a1 100644 --- a/backend/src/main/java/org/ftclub/cabinet/item/domain/ItemHistory.java +++ b/backend/src/main/java/org/ftclub/cabinet/item/domain/ItemHistory.java @@ -109,7 +109,7 @@ public static ItemHistory coin(Long userId, Long itemId, LocalDateTime assignedA Long amount) { ItemHistory itemHistory = new ItemHistory(userId, itemId, assignedAt, amount); if (!itemHistory.isValid()) { - throw ExceptionStatus.INVALID_ARGUMENT.asControllerException(); + throw ExceptionStatus.INVALID_ARGUMENT.asDomainException(); } return itemHistory; } From af818cb33b584c1286510266a6b5a8bba1247e24 Mon Sep 17 00:00:00 2001 From: jnkeniaem Date: Fri, 25 Oct 2024 15:50:53 +0900 Subject: [PATCH 33/89] =?UTF-8?q?[FE]=20FEAT:=204=EC=B8=B5=20=EC=82=AC?= =?UTF-8?q?=EB=AC=BC=ED=95=A8=EC=97=90=EC=84=9C=20=EC=9D=B4=EB=8F=99?= =?UTF-8?q?=ED=95=98=EB=8A=94=20=EC=9C=A0=EC=A0=80=EB=93=A4=EC=97=90?= =?UTF-8?q?=EA=B2=8C=20=EC=BD=94=EC=9D=B8=20=EB=B0=8F=20=EC=95=84=EC=9D=B4?= =?UTF-8?q?=ED=85=9C=20=EC=A7=80=EA=B8=89=ED=95=98=EA=B8=B0=20=EC=9C=84?= =?UTF-8?q?=ED=95=B4=20api=20=ED=98=B8=EC=B6=9C=20=ED=95=A8=EC=88=98=20?= =?UTF-8?q?=EC=83=9D=EC=84=B1=20#1695?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- config | 2 +- .../src/Cabinet/api/axios/axios.custom.ts | 19 +++++++++++++++++++ 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/config b/config index 93674bce3..0d3244f5b 160000 --- a/config +++ b/config @@ -1 +1 @@ -Subproject commit 93674bce354efe9ad8fb3a7a934bdbf5acd1d162 +Subproject commit 0d3244f5b700c2b735c13a73ed4e8868139b144f diff --git a/frontend/src/Cabinet/api/axios/axios.custom.ts b/frontend/src/Cabinet/api/axios/axios.custom.ts index 514135b75..8ff595ce2 100644 --- a/frontend/src/Cabinet/api/axios/axios.custom.ts +++ b/frontend/src/Cabinet/api/axios/axios.custom.ts @@ -922,6 +922,25 @@ export const axiosItemAssign = async ( } }; +const axiosCoinAssignURL = "v5/admin/items/assign/coin"; +export const axiosCoinAssign = async ( + itemSku: string, + userIds: number[], + amount: number +): Promise => { + try { + const response = await instance.post(axiosCoinAssignURL, { + itemSku, + userIds, + amount, + }); + return response; + } catch (error) { + logAxiosError(error, ErrorType.STORE, "아이템 지급 중 오류 발생", true); + throw error; + } +}; + const axiosGetUserItemsURL = "/v5/admin/items/users/"; export const axiosGetUserItems = async ( userId: number, From 2df4fe563260daf72146a32ff32ebfba9a7a865e Mon Sep 17 00:00:00 2001 From: saewoo1 Date: Fri, 25 Oct 2024 15:54:20 +0900 Subject: [PATCH 34/89] =?UTF-8?q?FEAT:=20=EC=97=AC=EB=9F=AC=20=EC=9C=A0?= =?UTF-8?q?=EC=A0=80=EC=97=90=EA=B2=8C=20=EB=8F=99=EC=9D=BC=ED=95=9C=20?= =?UTF-8?q?=EC=BD=94=EC=9D=B8=EC=9D=84=20=EC=A7=80=EA=B8=89=ED=95=98?= =?UTF-8?q?=EB=8A=94=20Bulk=20add=20=EA=B8=B0=EB=8A=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cabinet/admin/item/service/AdminItemFacadeService.java | 4 +--- .../org/ftclub/cabinet/user/repository/UserRepository.java | 6 ++++++ .../org/ftclub/cabinet/user/service/UserCommandService.java | 5 +++++ 3 files changed, 12 insertions(+), 3 deletions(-) diff --git a/backend/src/main/java/org/ftclub/cabinet/admin/item/service/AdminItemFacadeService.java b/backend/src/main/java/org/ftclub/cabinet/admin/item/service/AdminItemFacadeService.java index be8d3960e..1726c01f5 100644 --- a/backend/src/main/java/org/ftclub/cabinet/admin/item/service/AdminItemFacadeService.java +++ b/backend/src/main/java/org/ftclub/cabinet/admin/item/service/AdminItemFacadeService.java @@ -67,9 +67,7 @@ public void assignItem(List userIds, Sku sku) { public void assignCoin(List userIds, Sku sku, Long amount) { Item item = itemQueryService.getBySku(sku); LocalDateTime now = LocalDateTime.now(); - userIds.forEach(userId -> { - userCommandService.updateCoinAmount(userId, amount); - }); + userCommandService.addBulkUserCoin(userIds, amount); itemHistoryCommandService.createCoinAssignHistory(userIds, item.getId(), now, amount); } diff --git a/backend/src/main/java/org/ftclub/cabinet/user/repository/UserRepository.java b/backend/src/main/java/org/ftclub/cabinet/user/repository/UserRepository.java index 0a384bb73..cd495bac0 100644 --- a/backend/src/main/java/org/ftclub/cabinet/user/repository/UserRepository.java +++ b/backend/src/main/java/org/ftclub/cabinet/user/repository/UserRepository.java @@ -140,4 +140,10 @@ public interface UserRepository extends JpaRepository { @Query("SELECT u FROM User u WHERE u.deletedAt IS NULL") List findAllDeletedAtIsNull(); + + @Modifying(clearAutomatically = true) + @Query("UPDATE User u " + + "SET u.coin = u.coin + :amount " + + "WHERE u.id IN :userIds") + void updateBulkUserCoin(@Param("userIds") List userIds, @Param("amount") Long amount); } diff --git a/backend/src/main/java/org/ftclub/cabinet/user/service/UserCommandService.java b/backend/src/main/java/org/ftclub/cabinet/user/service/UserCommandService.java index 994e9f7b8..54b1f545a 100644 --- a/backend/src/main/java/org/ftclub/cabinet/user/service/UserCommandService.java +++ b/backend/src/main/java/org/ftclub/cabinet/user/service/UserCommandService.java @@ -1,6 +1,7 @@ package org.ftclub.cabinet.user.service; import java.time.LocalDateTime; +import java.util.List; import javax.transaction.Transactional; import lombok.RequiredArgsConstructor; import org.ftclub.cabinet.auth.domain.FtProfile; @@ -115,4 +116,8 @@ public void updateCoinAmount(Long userId, Long reward) { .orElseThrow(ExceptionStatus.NOT_FOUND_USER::asServiceException); user.addCoin(reward); } + + public void addBulkUserCoin(List userIds, Long amount) { + userRepository.updateBulkUserCoin(userIds, amount); + } } From ab10e9715d37733ba326a11e49af2a3870f06191 Mon Sep 17 00:00:00 2001 From: saewoo1 Date: Fri, 25 Oct 2024 16:04:15 +0900 Subject: [PATCH 35/89] =?UTF-8?q?REFACTOR:=20=EC=9D=BC=EA=B4=84=20?= =?UTF-8?q?=EC=A7=80=EA=B8=89=20=EC=84=9C=EB=B9=84=EC=8A=A4=EB=AA=85=20add?= =?UTF-8?q?BulkCoin=EC=9C=BC=EB=A1=9C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cabinet/admin/item/service/AdminItemFacadeService.java | 2 +- .../org/ftclub/cabinet/user/service/UserCommandService.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/backend/src/main/java/org/ftclub/cabinet/admin/item/service/AdminItemFacadeService.java b/backend/src/main/java/org/ftclub/cabinet/admin/item/service/AdminItemFacadeService.java index 1726c01f5..09d7514fc 100644 --- a/backend/src/main/java/org/ftclub/cabinet/admin/item/service/AdminItemFacadeService.java +++ b/backend/src/main/java/org/ftclub/cabinet/admin/item/service/AdminItemFacadeService.java @@ -67,7 +67,7 @@ public void assignItem(List userIds, Sku sku) { public void assignCoin(List userIds, Sku sku, Long amount) { Item item = itemQueryService.getBySku(sku); LocalDateTime now = LocalDateTime.now(); - userCommandService.addBulkUserCoin(userIds, amount); + userCommandService.addBulkCoin(userIds, amount); itemHistoryCommandService.createCoinAssignHistory(userIds, item.getId(), now, amount); } diff --git a/backend/src/main/java/org/ftclub/cabinet/user/service/UserCommandService.java b/backend/src/main/java/org/ftclub/cabinet/user/service/UserCommandService.java index 54b1f545a..c94c56710 100644 --- a/backend/src/main/java/org/ftclub/cabinet/user/service/UserCommandService.java +++ b/backend/src/main/java/org/ftclub/cabinet/user/service/UserCommandService.java @@ -117,7 +117,7 @@ public void updateCoinAmount(Long userId, Long reward) { user.addCoin(reward); } - public void addBulkUserCoin(List userIds, Long amount) { + public void addBulkCoin(List userIds, Long amount) { userRepository.updateBulkUserCoin(userIds, amount); } } From 0c5b6f492d80e61ac1f19cf5195d1e7bfc0d1248 Mon Sep 17 00:00:00 2001 From: saewoo1 Date: Fri, 25 Oct 2024 16:42:38 +0900 Subject: [PATCH 36/89] =?UTF-8?q?REFACTOR:=20=EA=B4=80=EB=A6=AC=EC=9E=90?= =?UTF-8?q?=EA=B0=80=20=EC=9C=A0=EC=A0=80=EC=97=90=EA=B2=8C=20=EC=BD=94?= =?UTF-8?q?=EC=9D=B8=20=EC=95=84=EC=9D=B4=ED=85=9C=20=EC=A7=80=EA=B8=89=20?= =?UTF-8?q?=EC=8B=9C=20redis=20=EB=B6=80=EB=B6=84=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../item/service/AdminItemFacadeService.java | 15 ++------------- 1 file changed, 2 insertions(+), 13 deletions(-) diff --git a/backend/src/main/java/org/ftclub/cabinet/admin/item/service/AdminItemFacadeService.java b/backend/src/main/java/org/ftclub/cabinet/admin/item/service/AdminItemFacadeService.java index 09d7514fc..85dcabf86 100644 --- a/backend/src/main/java/org/ftclub/cabinet/admin/item/service/AdminItemFacadeService.java +++ b/backend/src/main/java/org/ftclub/cabinet/admin/item/service/AdminItemFacadeService.java @@ -16,10 +16,8 @@ import org.ftclub.cabinet.item.service.ItemHistoryCommandService; import org.ftclub.cabinet.item.service.ItemHistoryQueryService; import org.ftclub.cabinet.item.service.ItemQueryService; -import org.ftclub.cabinet.item.service.ItemRedisService; import org.ftclub.cabinet.mapper.ItemMapper; import org.ftclub.cabinet.user.service.UserCommandService; -import org.ftclub.cabinet.user.service.UserQueryService; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.stereotype.Service; @@ -35,9 +33,7 @@ public class AdminItemFacadeService { private final ItemHistoryCommandService itemHistoryCommandService; private final ItemMapper itemMapper; - private final ItemRedisService itemRedisService; private final UserCommandService userCommandService; - private final UserQueryService userQueryService; @Transactional public void createItem(Integer Price, Sku sku, ItemType type) { @@ -51,16 +47,9 @@ public void assignItem(List userIds, Sku sku) { LocalDateTime now = null; if (price > 0) { now = LocalDateTime.now(); - userIds.forEach(userId -> { - long coinAmount = userQueryService.getUser(userId).getCoin(); - itemRedisService.saveCoinCount(userId, coinAmount + item.getPrice()); - - long totalCoinSupply = itemRedisService.getTotalCoinSupply(); - itemRedisService.saveTotalCoinSupply(totalCoinSupply + item.getPrice()); - userCommandService.updateCoinAmount(userId, price); - }); + userCommandService.addBulkCoin(userIds, price); } - itemHistoryCommandService.createItemHistories(userIds, item.getId(), now); + itemHistoryCommandService.createItemHistories(userIds, item.getId(), now, price); } @Transactional From 8266c4bead30a60076b19a711b442772206b37ff Mon Sep 17 00:00:00 2001 From: saewoo1 Date: Fri, 25 Oct 2024 16:43:56 +0900 Subject: [PATCH 37/89] =?UTF-8?q?REFACTOR:=20=EB=8F=99=EC=A0=84=EC=A4=8D?= =?UTF-8?q?=EA=B8=B0=20=EC=8B=9C=20ItemHistory=EC=97=90=20=EC=BD=94?= =?UTF-8?q?=EC=9D=B8=20=EC=A3=BC=EC=9A=B4=20=EC=96=91=20=EC=A0=80=EC=9E=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ftclub/cabinet/item/service/ItemFacadeService.java | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/backend/src/main/java/org/ftclub/cabinet/item/service/ItemFacadeService.java b/backend/src/main/java/org/ftclub/cabinet/item/service/ItemFacadeService.java index b6f0e5546..384977313 100644 --- a/backend/src/main/java/org/ftclub/cabinet/item/service/ItemFacadeService.java +++ b/backend/src/main/java/org/ftclub/cabinet/item/service/ItemFacadeService.java @@ -195,7 +195,8 @@ public CoinCollectionRewardResponseDto collectCoinAndIssueReward(Long userId) { // DB에 코인 저장 Item coinCollect = itemQueryService.getBySku(Sku.COIN_COLLECT); int reward = (int) (coinCollect.getPrice().longValue()); - itemHistoryCommandService.createCoinItemHistory(userId, coinCollect.getId()); + itemHistoryCommandService.createCoinItemHistory(userId, coinCollect.getId(), + coinCollect.getPrice()); // 출석 일자에 따른 랜덤 리워드 지급 Long coinCollectionCountInMonth = @@ -206,7 +207,8 @@ public CoinCollectionRewardResponseDto collectCoinAndIssueReward(Long userId) { Sku coinSku = itemPolicyService.getRewardSku(randomPercentage); Item coinReward = itemQueryService.getBySku(coinSku); - itemHistoryCommandService.createCoinItemHistory(userId, coinReward.getId()); + itemHistoryCommandService.createCoinItemHistory(userId, coinReward.getId(), + coinReward.getPrice()); reward += coinReward.getPrice(); } @@ -310,7 +312,7 @@ public void purchaseItem(Long userId, Sku sku) { itemPolicyService.verifyIsAffordable(userCoin, price); // 아이템 구매 처리 - itemHistoryCommandService.createItemHistory(user.getId(), item.getId()); + itemHistoryCommandService.createItemHistory(user.getId(), item.getId(), price); LockUtil.lockRedisCoin(userId, () -> { // 코인 차감 From 023563716069e21616416a1540b175bb2db6b3ad Mon Sep 17 00:00:00 2001 From: saewoo1 Date: Fri, 25 Oct 2024 16:44:29 +0900 Subject: [PATCH 38/89] =?UTF-8?q?REFACTOR:=20=EB=8F=99=EC=A0=84=EC=A4=8D?= =?UTF-8?q?=EA=B8=B0=20=EC=8B=9C=20ItemHistory=EC=97=90=20=EC=BD=94?= =?UTF-8?q?=EC=9D=B8=20=EC=A3=BC=EC=9A=B4=20=EC=96=91=20=EC=A0=80=EC=9E=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cabinet/item/domain/ItemHistory.java | 21 +++---------------- .../user/service/LentExtensionManager.java | 3 ++- 2 files changed, 5 insertions(+), 19 deletions(-) diff --git a/backend/src/main/java/org/ftclub/cabinet/item/domain/ItemHistory.java b/backend/src/main/java/org/ftclub/cabinet/item/domain/ItemHistory.java index 2dc9195a1..8f85c32c4 100644 --- a/backend/src/main/java/org/ftclub/cabinet/item/domain/ItemHistory.java +++ b/backend/src/main/java/org/ftclub/cabinet/item/domain/ItemHistory.java @@ -78,13 +78,7 @@ public class ItemHistory { @Column(name = "AMOUNT", nullable = true) private Long amount; - protected ItemHistory(long userId, long itemId, LocalDateTime usedAt) { - this.userId = userId; - this.itemId = itemId; - this.usedAt = usedAt; - } - - protected ItemHistory(long userId, long itemId, LocalDateTime assignedAt, Long amount) { + protected ItemHistory(Long userId, Long itemId, LocalDateTime assignedAt, Long amount) { this.userId = userId; this.itemId = itemId; this.usedAt = assignedAt; @@ -97,17 +91,8 @@ protected ItemHistory(long userId, long itemId, LocalDateTime assignedAt, Long a * @param usedAt 아이템 사용일자 * @return 아이템 히스토리 객체 {@link ItemHistory} */ - public static ItemHistory of(long userId, long itemId, LocalDateTime usedAt) { - ItemHistory itemHistory = new ItemHistory(userId, itemId, usedAt); - if (!itemHistory.isValid()) { - throw ExceptionStatus.INVALID_ARGUMENT.asDomainException(); - } - return itemHistory; - } - - public static ItemHistory coin(Long userId, Long itemId, LocalDateTime assignedAt, - Long amount) { - ItemHistory itemHistory = new ItemHistory(userId, itemId, assignedAt, amount); + public static ItemHistory of(Long userId, Long itemId, LocalDateTime usedAt, Long amount) { + ItemHistory itemHistory = new ItemHistory(userId, itemId, usedAt, amount); if (!itemHistory.isValid()) { throw ExceptionStatus.INVALID_ARGUMENT.asDomainException(); } diff --git a/backend/src/main/java/org/ftclub/cabinet/user/service/LentExtensionManager.java b/backend/src/main/java/org/ftclub/cabinet/user/service/LentExtensionManager.java index cb569e574..380efefc8 100644 --- a/backend/src/main/java/org/ftclub/cabinet/user/service/LentExtensionManager.java +++ b/backend/src/main/java/org/ftclub/cabinet/user/service/LentExtensionManager.java @@ -46,7 +46,8 @@ public void issueLentExtension() { users.forEach(user -> { Long userId = user.getId(); user.addCoin(coinRewardItem.getPrice()); - itemHistoryCommandService.createCoinItemHistory(userId, coinRewardItem.getId()); + itemHistoryCommandService.createCoinItemHistory(userId, coinRewardItem.getId(), + coinRewardItem.getPrice()); }); } From 94b93179f4e7396df38e855095acf94550b1e59e Mon Sep 17 00:00:00 2001 From: jnkeniaem Date: Fri, 25 Oct 2024 16:45:08 +0900 Subject: [PATCH 39/89] =?UTF-8?q?[FE]=20FEAT:=20=EC=95=84=EC=9D=B4?= =?UTF-8?q?=ED=85=9C=20=EC=A7=80=EA=B8=89=20=EB=AA=A8=EB=8B=AC=EC=97=90=20?= =?UTF-8?q?=EC=BD=94=EC=9D=B8=EB=9E=80=20=EC=B6=94=EA=B0=80=20#1695?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../StoreModal/AdminItemProvisionModal.tsx | 45 +++++++++++++++++-- 1 file changed, 41 insertions(+), 4 deletions(-) diff --git a/frontend/src/Cabinet/components/Modals/StoreModal/AdminItemProvisionModal.tsx b/frontend/src/Cabinet/components/Modals/StoreModal/AdminItemProvisionModal.tsx index 6b102b82e..89c8f616b 100644 --- a/frontend/src/Cabinet/components/Modals/StoreModal/AdminItemProvisionModal.tsx +++ b/frontend/src/Cabinet/components/Modals/StoreModal/AdminItemProvisionModal.tsx @@ -1,4 +1,4 @@ -import { useEffect, useState } from "react"; +import { useEffect, useRef, useState } from "react"; import { useRecoilState } from "recoil"; import styled from "styled-components"; import { targetUserInfoState } from "@/Cabinet/recoil/atoms"; @@ -14,7 +14,10 @@ import { } from "@/Cabinet/components/Modals/ResponseModal/ResponseModal"; 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 { + axiosCoinAssign, // axiosItemAssign, + axiosItems, +} from "@/Cabinet/api/axios/axios.custom"; interface IPenaltyModalProps { onClose: () => void; @@ -35,11 +38,18 @@ const AdminItemProvisionModal: React.FC = ({ onClose }) => { const [isItemDropdownOpen, setIsItemDropdownOpen] = useState(false); const [isItemTypeDropdownOpen, setIsItemTypeDropdownOpen] = useState(false); const [targetUserInfo] = useRecoilState(targetUserInfoState); - + const coinRef = useRef(null); const HandleItemProvisionBtn = async () => { + let coinRefVal = coinRef.current!.value; + coinRefVal = coinRefVal == "" ? "0" : String(coinRefVal); setIsLoading(true); try { - await axiosItemAssign(selectedItemSku, [targetUserInfo.userId!]); + // await axiosItemAssign(selectedItemSku, [targetUserInfo.userId!]); + await axiosCoinAssign( + selectedItemSku, + [targetUserInfo.userId!], + Number(coinRefVal) + ); setModalTitle("아이템 지급완료"); } catch (error: any) { setHasErrorOnResponse(true); @@ -152,6 +162,18 @@ const AdminItemProvisionModal: React.FC = ({ onClose }) => { 아이템 타입 + + + 코인 + { + if (e.key === "Enter") HandleItemProvisionBtn(); + }} + ref={coinRef} + maxLength={10} + id="input" + > + ), }; @@ -179,4 +201,19 @@ const ModalDropdownNameStyled = styled.div` font-size: 18px; `; +const CoinInputStyled = styled.input` + border: 1px solid var(--light-gray-line-btn-color); + width: 100%; + height: 60px; + border-radius: 10px; + text-align: start; + text-indent: 20px; + font-size: 1.125rem; + cursor: "input"; + color: "var(--normal-text-color)"; + &::placeholder { + color: "var(--line-color)"; + } +`; + export default AdminItemProvisionModal; From 722aba42f965b5632408f15ff41b681613650e41 Mon Sep 17 00:00:00 2001 From: saewoo1 Date: Fri, 25 Oct 2024 16:46:05 +0900 Subject: [PATCH 40/89] =?UTF-8?q?REFACTOR:=20ItemHistory=20=EC=83=9D?= =?UTF-8?q?=EC=84=B1=20=EC=8B=9C=20amount=20=ED=95=84=EC=88=98=20=ED=8C=8C?= =?UTF-8?q?=EB=9D=BC=EB=AF=B8=ED=84=B0=EB=A1=9C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../item/service/ItemHistoryCommandService.java | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/backend/src/main/java/org/ftclub/cabinet/item/service/ItemHistoryCommandService.java b/backend/src/main/java/org/ftclub/cabinet/item/service/ItemHistoryCommandService.java index 3319605d5..f76562608 100644 --- a/backend/src/main/java/org/ftclub/cabinet/item/service/ItemHistoryCommandService.java +++ b/backend/src/main/java/org/ftclub/cabinet/item/service/ItemHistoryCommandService.java @@ -17,20 +17,22 @@ public class ItemHistoryCommandService { private final ItemHistoryRepository itemHistoryRepository; - public void createItemHistory(Long userId, Long itemId) { - ItemHistory itemHistory = ItemHistory.of(userId, itemId, null); + public void createItemHistory(Long userId, Long itemId, Long amount) { + ItemHistory itemHistory = ItemHistory.of(userId, itemId, null, amount); itemHistoryRepository.save(itemHistory); } - public void createItemHistories(List userIds, Long itemId, LocalDateTime usedAt) { + public void createItemHistories(List userIds, Long itemId, LocalDateTime usedAt, + Long amount) { List itemHistories = userIds.stream() - .map(userId -> ItemHistory.of(userId, itemId, usedAt)) + .map(userId -> ItemHistory.of(userId, itemId, usedAt, amount)) .collect(Collectors.toList()); itemHistoryRepository.saveAll(itemHistories); } - public void createCoinItemHistory(Long userId, Long itemId) { - ItemHistory coinCollectItemHistory = ItemHistory.of(userId, itemId, LocalDateTime.now()); + public void createCoinItemHistory(Long userId, Long itemId, Long amount) { + ItemHistory coinCollectItemHistory = ItemHistory.of(userId, itemId, LocalDateTime.now(), + amount); itemHistoryRepository.save(coinCollectItemHistory); } @@ -45,7 +47,7 @@ public void createCoinItemHistory(Long userId, Long itemId) { public void createCoinAssignHistory(List userIds, Long itemId, LocalDateTime usedAt, Long amount) { List itemHistories = userIds.stream() - .map(userId -> ItemHistory.coin(userId, itemId, usedAt, amount)) + .map(userId -> ItemHistory.of(userId, itemId, usedAt, amount)) .collect(Collectors.toList()); itemHistoryRepository.saveAll(itemHistories); From 059d11b28be844b1cbd3b58b8712196d07d62a33 Mon Sep 17 00:00:00 2001 From: saewoo1 Date: Fri, 25 Oct 2024 17:11:20 +0900 Subject: [PATCH 41/89] =?UTF-8?q?FEAT:=20sku=EC=97=90=20=EC=BD=94=EC=9D=B8?= =?UTF-8?q?=20=EB=B3=B4=EC=83=81=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/src/main/java/org/ftclub/cabinet/item/domain/Sku.java | 1 + 1 file changed, 1 insertion(+) diff --git a/backend/src/main/java/org/ftclub/cabinet/item/domain/Sku.java b/backend/src/main/java/org/ftclub/cabinet/item/domain/Sku.java index bda3b9beb..4e2d2b776 100644 --- a/backend/src/main/java/org/ftclub/cabinet/item/domain/Sku.java +++ b/backend/src/main/java/org/ftclub/cabinet/item/domain/Sku.java @@ -30,6 +30,7 @@ public enum Sku { ADMIN_REWARD_500("보상"), ADMIN_REWARD_1000("보상"), ADMIN_REWARD_2000("보상"), + ADMIN_REWARD_COIN("보상"), ; private final String details; From 307f533bd1d88a726992aec07b76a58d00246b5c Mon Sep 17 00:00:00 2001 From: saewoo1 Date: Fri, 25 Oct 2024 17:20:46 +0900 Subject: [PATCH 42/89] =?UTF-8?q?FEAT:=20admin=EC=97=90=EC=84=9C=20?= =?UTF-8?q?=EC=A7=80=EA=B8=89=ED=95=A0=20=EC=95=84=EC=9D=B4=ED=85=9C=20?= =?UTF-8?q?=EC=A1=B0=ED=9A=8C=20=EA=B8=B0=EB=8A=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../item/controller/AdminItemController.java | 33 +++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/backend/src/main/java/org/ftclub/cabinet/admin/item/controller/AdminItemController.java b/backend/src/main/java/org/ftclub/cabinet/admin/item/controller/AdminItemController.java index 330134298..34805325d 100644 --- a/backend/src/main/java/org/ftclub/cabinet/admin/item/controller/AdminItemController.java +++ b/backend/src/main/java/org/ftclub/cabinet/admin/item/controller/AdminItemController.java @@ -1,5 +1,11 @@ package org.ftclub.cabinet.admin.item.controller; +import static java.util.stream.Collectors.groupingBy; +import static java.util.stream.Collectors.mapping; + +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; import lombok.RequiredArgsConstructor; import org.ftclub.cabinet.admin.dto.AdminCoinAssignRequestDto; import org.ftclub.cabinet.admin.dto.AdminItemHistoryPaginationDto; @@ -8,7 +14,14 @@ import org.ftclub.cabinet.auth.domain.AuthLevel; import org.ftclub.cabinet.dto.ItemAssignRequestDto; import org.ftclub.cabinet.dto.ItemCreateDto; +import org.ftclub.cabinet.dto.ItemDetailsDto; +import org.ftclub.cabinet.dto.ItemStoreDto; +import org.ftclub.cabinet.dto.ItemStoreResponseDto; +import org.ftclub.cabinet.item.domain.Item; +import org.ftclub.cabinet.item.domain.ItemType; +import org.ftclub.cabinet.item.service.ItemQueryService; import org.ftclub.cabinet.log.Logging; +import org.ftclub.cabinet.mapper.ItemMapper; import org.springframework.data.domain.Pageable; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; @@ -24,6 +37,8 @@ public class AdminItemController { private final AdminItemFacadeService adminItemFacadeService; + private final ItemQueryService itemQueryService; + private final ItemMapper itemMapper; @PostMapping("") @AuthGuard(level = AuthLevel.ADMIN_ONLY) @@ -32,6 +47,24 @@ public void createItem(@RequestBody ItemCreateDto itemCreateDto) { itemCreateDto.getSku(), itemCreateDto.getType()); } + @GetMapping("") + @AuthGuard(level = AuthLevel.ADMIN_ONLY) + public ItemStoreResponseDto getAllItems() { + List allItems = itemQueryService.getAllItems(); + Map> itemMap = allItems.stream() + .collect(groupingBy(Item::getType, + mapping(itemMapper::toItemDetailsDto, Collectors.toList()))); + List result = itemMap.entrySet().stream() + .map(entry -> { + ItemStoreDto itemStoreDto = itemMapper.toItemStoreDto(entry.getKey(), + entry.getValue()); + itemStoreDto.sortBySkuASC(); + return itemStoreDto; + }) + .collect(Collectors.toList()); + return new ItemStoreResponseDto(result); + } + @PostMapping("/assign") @AuthGuard(level = AuthLevel.ADMIN_ONLY) public void assignItem(@RequestBody ItemAssignRequestDto itemAssignRequestDto) { From 100e18087b08749573747b57b826d9881231ada0 Mon Sep 17 00:00:00 2001 From: saewoo1 Date: Fri, 25 Oct 2024 18:02:44 +0900 Subject: [PATCH 43/89] =?UTF-8?q?FIX=20:=20dto=20sku=20=EB=B3=80=EC=88=98?= =?UTF-8?q?=EB=AA=85=20=ED=86=B5=EC=9D=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../admin/dto/AdminCoinAssignRequestDto.java | 2 +- .../admin/item/service/AdminItemFacadeService.java | 13 ++++++++++--- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/backend/src/main/java/org/ftclub/cabinet/admin/dto/AdminCoinAssignRequestDto.java b/backend/src/main/java/org/ftclub/cabinet/admin/dto/AdminCoinAssignRequestDto.java index 764d225c9..beb456125 100644 --- a/backend/src/main/java/org/ftclub/cabinet/admin/dto/AdminCoinAssignRequestDto.java +++ b/backend/src/main/java/org/ftclub/cabinet/admin/dto/AdminCoinAssignRequestDto.java @@ -10,6 +10,6 @@ public class AdminCoinAssignRequestDto { private List userIds; - private Sku sku; + private Sku itemSku; private Long amount; } diff --git a/backend/src/main/java/org/ftclub/cabinet/admin/item/service/AdminItemFacadeService.java b/backend/src/main/java/org/ftclub/cabinet/admin/item/service/AdminItemFacadeService.java index 85dcabf86..29f86a8f1 100644 --- a/backend/src/main/java/org/ftclub/cabinet/admin/item/service/AdminItemFacadeService.java +++ b/backend/src/main/java/org/ftclub/cabinet/admin/item/service/AdminItemFacadeService.java @@ -55,9 +55,16 @@ public void assignItem(List userIds, Sku sku) { @Transactional public void assignCoin(List userIds, Sku sku, Long amount) { Item item = itemQueryService.getBySku(sku); - LocalDateTime now = LocalDateTime.now(); - userCommandService.addBulkCoin(userIds, amount); - itemHistoryCommandService.createCoinAssignHistory(userIds, item.getId(), now, amount); + LocalDateTime now = null; + Long coinAmount = item.getPrice(); + if (sku.equals(Sku.ADMIN_REWARD_COIN)) { + coinAmount = amount; + } + if (coinAmount > 0) { + now = LocalDateTime.now(); + userCommandService.addBulkCoin(userIds, coinAmount); + } + itemHistoryCommandService.createItemHistories(userIds, item.getId(), now, coinAmount); } @Transactional(readOnly = true) From d3ec7825100f3953c606daf54e58ab3169531f9e Mon Sep 17 00:00:00 2001 From: saewoo1 Date: Fri, 25 Oct 2024 18:03:01 +0900 Subject: [PATCH 44/89] =?UTF-8?q?FIX=20:=20dto=20sku=20=EB=B3=80=EC=88=98?= =?UTF-8?q?=EB=AA=85=20=ED=86=B5=EC=9D=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cabinet/admin/item/controller/AdminItemController.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/src/main/java/org/ftclub/cabinet/admin/item/controller/AdminItemController.java b/backend/src/main/java/org/ftclub/cabinet/admin/item/controller/AdminItemController.java index 34805325d..95cbb1a30 100644 --- a/backend/src/main/java/org/ftclub/cabinet/admin/item/controller/AdminItemController.java +++ b/backend/src/main/java/org/ftclub/cabinet/admin/item/controller/AdminItemController.java @@ -76,7 +76,7 @@ public void assignItem(@RequestBody ItemAssignRequestDto itemAssignRequestDto) { @AuthGuard(level = AuthLevel.ADMIN_ONLY) public void assignCoin(@RequestBody AdminCoinAssignRequestDto coinAssignRequestDto) { adminItemFacadeService.assignCoin(coinAssignRequestDto.getUserIds(), - coinAssignRequestDto.getSku(), coinAssignRequestDto.getAmount()); + coinAssignRequestDto.getItemSku(), coinAssignRequestDto.getAmount()); } /** From 1615ff96415ae989acb26f7ffa0abb4712ae5182 Mon Sep 17 00:00:00 2001 From: saewoo1 Date: Fri, 25 Oct 2024 18:28:43 +0900 Subject: [PATCH 45/89] =?UTF-8?q?FEAT:=20=EA=B4=80=EB=A6=AC=EC=9E=90=20?= =?UTF-8?q?=EA=B3=84=EC=A0=95=EC=97=90=EC=84=9C=20=EC=BD=94=EC=9D=B8=20?= =?UTF-8?q?=EC=A7=80=EA=B8=89=20=EC=8B=9C=20=EC=BD=94=EC=9D=B8=EC=9D=B4=20?= =?UTF-8?q?=EB=B9=84=EC=96=B4=EC=9E=88=EC=9D=84=20=EA=B2=BD=EC=9A=B0=20?= =?UTF-8?q?=EC=98=88=EC=99=B8=20=EB=B0=98=ED=99=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/org/ftclub/cabinet/exception/ExceptionStatus.java | 3 ++- .../org/ftclub/cabinet/item/service/ItemPolicyService.java | 6 ++++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/backend/src/main/java/org/ftclub/cabinet/exception/ExceptionStatus.java b/backend/src/main/java/org/ftclub/cabinet/exception/ExceptionStatus.java index 39c570da2..f5047d2c3 100644 --- a/backend/src/main/java/org/ftclub/cabinet/exception/ExceptionStatus.java +++ b/backend/src/main/java/org/ftclub/cabinet/exception/ExceptionStatus.java @@ -84,7 +84,8 @@ public enum ExceptionStatus { INVALID_JWT_TOKEN(HttpStatus.BAD_REQUEST, "토큰이 없거나, 유효하지 않은 JWT 토큰입니다."), NOT_FOUND_SECTION(HttpStatus.BAD_REQUEST, "사물함 구역 정보를 찾을 수 없습니다."), ITEM_NOT_OWNED(HttpStatus.BAD_REQUEST, "해당 아이템을 보유하고 있지 않습니다"), - ITEM_USE_DUPLICATED(HttpStatus.FORBIDDEN, "아이템이 중복 사용되었습니다."); + ITEM_USE_DUPLICATED(HttpStatus.FORBIDDEN, "아이템이 중복 사용되었습니다."), + INVALID_AMOUNT(HttpStatus.BAD_REQUEST, "코인 지급양은 비어있을 수 없습니다."); final private int statusCode; final private String message; diff --git a/backend/src/main/java/org/ftclub/cabinet/item/service/ItemPolicyService.java b/backend/src/main/java/org/ftclub/cabinet/item/service/ItemPolicyService.java index f27d4bf75..49c7dd4e3 100644 --- a/backend/src/main/java/org/ftclub/cabinet/item/service/ItemPolicyService.java +++ b/backend/src/main/java/org/ftclub/cabinet/item/service/ItemPolicyService.java @@ -64,4 +64,10 @@ public Sku getRewardSku(int randomPercentage) { return Sku.COIN_REWARD_2000; } } + + public void verifyCoinAmount(Long amount) { + if (amount == null) { + throw ExceptionStatus.INVALID_AMOUNT.asServiceException(); + } + } } From 2fad20589ca0ef7bd1fb92bf15bc69ea4134f522 Mon Sep 17 00:00:00 2001 From: saewoo1 Date: Fri, 25 Oct 2024 18:29:39 +0900 Subject: [PATCH 46/89] =?UTF-8?q?REFACTOR:=20=EC=BD=94=EC=9D=B8=20?= =?UTF-8?q?=EB=82=B4=EC=97=AD=20=EC=A1=B0=ED=9A=8C=20=EC=8B=9C=20itemHisto?= =?UTF-8?q?ry=EC=9D=98=20amount=EB=A5=BC=20=EC=A1=B0=ED=9A=8C=ED=95=98?= =?UTF-8?q?=EC=97=AC=20=EB=B0=98=ED=99=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cabinet/admin/item/service/AdminItemFacadeService.java | 3 +++ .../src/main/java/org/ftclub/cabinet/dto/CoinHistoryDto.java | 2 +- .../src/main/java/org/ftclub/cabinet/mapper/ItemMapper.java | 1 + 3 files changed, 5 insertions(+), 1 deletion(-) diff --git a/backend/src/main/java/org/ftclub/cabinet/admin/item/service/AdminItemFacadeService.java b/backend/src/main/java/org/ftclub/cabinet/admin/item/service/AdminItemFacadeService.java index 29f86a8f1..601bdafe4 100644 --- a/backend/src/main/java/org/ftclub/cabinet/admin/item/service/AdminItemFacadeService.java +++ b/backend/src/main/java/org/ftclub/cabinet/admin/item/service/AdminItemFacadeService.java @@ -15,6 +15,7 @@ import org.ftclub.cabinet.item.service.ItemCommandService; import org.ftclub.cabinet.item.service.ItemHistoryCommandService; import org.ftclub.cabinet.item.service.ItemHistoryQueryService; +import org.ftclub.cabinet.item.service.ItemPolicyService; import org.ftclub.cabinet.item.service.ItemQueryService; import org.ftclub.cabinet.mapper.ItemMapper; import org.ftclub.cabinet.user.service.UserCommandService; @@ -31,6 +32,7 @@ public class AdminItemFacadeService { private final ItemCommandService itemCommandService; private final ItemHistoryQueryService itemHistoryQueryService; private final ItemHistoryCommandService itemHistoryCommandService; + private final ItemPolicyService itemPolicyService; private final ItemMapper itemMapper; private final UserCommandService userCommandService; @@ -58,6 +60,7 @@ public void assignCoin(List userIds, Sku sku, Long amount) { LocalDateTime now = null; Long coinAmount = item.getPrice(); if (sku.equals(Sku.ADMIN_REWARD_COIN)) { + itemPolicyService.verifyCoinAmount(amount); coinAmount = amount; } if (coinAmount > 0) { diff --git a/backend/src/main/java/org/ftclub/cabinet/dto/CoinHistoryDto.java b/backend/src/main/java/org/ftclub/cabinet/dto/CoinHistoryDto.java index 023469920..ef2b1afa3 100644 --- a/backend/src/main/java/org/ftclub/cabinet/dto/CoinHistoryDto.java +++ b/backend/src/main/java/org/ftclub/cabinet/dto/CoinHistoryDto.java @@ -13,7 +13,7 @@ public class CoinHistoryDto { private LocalDateTime date; - private Integer amount; + private Long amount; private String history; private String itemDetails; } diff --git a/backend/src/main/java/org/ftclub/cabinet/mapper/ItemMapper.java b/backend/src/main/java/org/ftclub/cabinet/mapper/ItemMapper.java index 71939ee98..ed7d19f36 100644 --- a/backend/src/main/java/org/ftclub/cabinet/mapper/ItemMapper.java +++ b/backend/src/main/java/org/ftclub/cabinet/mapper/ItemMapper.java @@ -40,6 +40,7 @@ public interface ItemMapper { @Mapping(target = "amount", source = "item.price") @Mapping(target = "history", source = "item.type.name") @Mapping(target = "itemDetails", source = "item.sku.details") + @Mapping(target = "amount", source = "itemHistory.amount") CoinHistoryDto toCoinHistoryDto(ItemHistory itemHistory, Item item); @Mapping(target = "itemSku", source = "item.sku") From 5aabdaad7f4f088bbd25d582a864233902048fbd Mon Sep 17 00:00:00 2001 From: saewoo1 Date: Fri, 25 Oct 2024 18:37:20 +0900 Subject: [PATCH 47/89] =?UTF-8?q?REFACTOR:=20Sku=EC=97=90=20=EB=AA=85?= =?UTF-8?q?=ED=99=95=ED=95=9C=20=EB=B3=B4=EC=83=81=20=EB=82=B4=EC=97=AD=20?= =?UTF-8?q?=EB=AA=85=EC=8B=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/org/ftclub/cabinet/item/domain/Sku.java | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/backend/src/main/java/org/ftclub/cabinet/item/domain/Sku.java b/backend/src/main/java/org/ftclub/cabinet/item/domain/Sku.java index 4e2d2b776..64b383a7a 100644 --- a/backend/src/main/java/org/ftclub/cabinet/item/domain/Sku.java +++ b/backend/src/main/java/org/ftclub/cabinet/item/domain/Sku.java @@ -25,12 +25,12 @@ public enum Sku { COIN_REWARD_1000("동전 줍기 20일 보상"), COIN_REWARD_2000("동전 줍기 20일 보상"), - ADMIN_REWARD_100("보상"), - ADMIN_REWARD_200("보상"), - ADMIN_REWARD_500("보상"), - ADMIN_REWARD_1000("보상"), - ADMIN_REWARD_2000("보상"), - ADMIN_REWARD_COIN("보상"), + ADMIN_REWARD_100("100"), + ADMIN_REWARD_200("200"), + ADMIN_REWARD_500("500"), + ADMIN_REWARD_1000("1000"), + ADMIN_REWARD_2000("2000"), + ADMIN_REWARD_COIN("지정 보상"), ; private final String details; From 43ba5742e72362772dd65061f0425ccd032131a6 Mon Sep 17 00:00:00 2001 From: chyo1 Date: Fri, 25 Oct 2024 18:41:13 +0900 Subject: [PATCH 48/89] =?UTF-8?q?[BE]=20FIX:=20itemHistory=EC=97=90?= =?UTF-8?q?=EC=84=9C=20=EC=95=84=EC=9D=B4=ED=85=9C=20=EA=B0=80=EA=B2=A9=20?= =?UTF-8?q?amount=EC=97=90=EC=84=9C=20=EB=B0=9B=EC=95=84=EC=98=A4=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/src/main/java/org/ftclub/cabinet/mapper/ItemMapper.java | 1 - 1 file changed, 1 deletion(-) diff --git a/backend/src/main/java/org/ftclub/cabinet/mapper/ItemMapper.java b/backend/src/main/java/org/ftclub/cabinet/mapper/ItemMapper.java index ed7d19f36..2649d97d4 100644 --- a/backend/src/main/java/org/ftclub/cabinet/mapper/ItemMapper.java +++ b/backend/src/main/java/org/ftclub/cabinet/mapper/ItemMapper.java @@ -37,7 +37,6 @@ public interface ItemMapper { ItemMapper INSTANCE = Mappers.getMapper(ItemMapper.class); @Mapping(target = "date", source = "itemHistory.purchaseAt") - @Mapping(target = "amount", source = "item.price") @Mapping(target = "history", source = "item.type.name") @Mapping(target = "itemDetails", source = "item.sku.details") @Mapping(target = "amount", source = "itemHistory.amount") From 800a8a5e4ab2d9cb4a9bb009bfbd70a6255c348c Mon Sep 17 00:00:00 2001 From: saewoo1 Date: Fri, 25 Oct 2024 18:46:52 +0900 Subject: [PATCH 49/89] =?UTF-8?q?REFACTOR:=20=EA=B4=80=EB=A6=AC=EC=9E=90?= =?UTF-8?q?=20=EA=B3=84=EC=A0=95=EC=97=90=EC=84=9C=20=EC=95=84=EC=9D=B4?= =?UTF-8?q?=ED=85=9C,=20=EC=BD=94=EC=9D=B8=20=EC=A7=80=EA=B8=89=20?= =?UTF-8?q?=EC=BB=A8=ED=8A=B8=EB=A1=A4=EB=9F=AC=20=ED=86=B5=ED=95=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../admin/item/controller/AdminItemController.java | 10 +--------- .../admin/item/service/AdminItemFacadeService.java | 14 +------------- .../ftclub/cabinet/dto/ItemAssignRequestDto.java | 1 + 3 files changed, 3 insertions(+), 22 deletions(-) diff --git a/backend/src/main/java/org/ftclub/cabinet/admin/item/controller/AdminItemController.java b/backend/src/main/java/org/ftclub/cabinet/admin/item/controller/AdminItemController.java index 95cbb1a30..46035ef85 100644 --- a/backend/src/main/java/org/ftclub/cabinet/admin/item/controller/AdminItemController.java +++ b/backend/src/main/java/org/ftclub/cabinet/admin/item/controller/AdminItemController.java @@ -7,7 +7,6 @@ import java.util.Map; import java.util.stream.Collectors; import lombok.RequiredArgsConstructor; -import org.ftclub.cabinet.admin.dto.AdminCoinAssignRequestDto; import org.ftclub.cabinet.admin.dto.AdminItemHistoryPaginationDto; import org.ftclub.cabinet.admin.item.service.AdminItemFacadeService; import org.ftclub.cabinet.auth.domain.AuthGuard; @@ -69,14 +68,7 @@ public ItemStoreResponseDto getAllItems() { @AuthGuard(level = AuthLevel.ADMIN_ONLY) public void assignItem(@RequestBody ItemAssignRequestDto itemAssignRequestDto) { adminItemFacadeService.assignItem(itemAssignRequestDto.getUserIds(), - itemAssignRequestDto.getItemSku()); - } - - @PostMapping("/assign/coin") - @AuthGuard(level = AuthLevel.ADMIN_ONLY) - public void assignCoin(@RequestBody AdminCoinAssignRequestDto coinAssignRequestDto) { - adminItemFacadeService.assignCoin(coinAssignRequestDto.getUserIds(), - coinAssignRequestDto.getItemSku(), coinAssignRequestDto.getAmount()); + itemAssignRequestDto.getItemSku(), itemAssignRequestDto.getAmount()); } /** diff --git a/backend/src/main/java/org/ftclub/cabinet/admin/item/service/AdminItemFacadeService.java b/backend/src/main/java/org/ftclub/cabinet/admin/item/service/AdminItemFacadeService.java index 601bdafe4..dda0e8fed 100644 --- a/backend/src/main/java/org/ftclub/cabinet/admin/item/service/AdminItemFacadeService.java +++ b/backend/src/main/java/org/ftclub/cabinet/admin/item/service/AdminItemFacadeService.java @@ -43,19 +43,7 @@ public void createItem(Integer Price, Sku sku, ItemType type) { } @Transactional - public void assignItem(List userIds, Sku sku) { - Item item = itemQueryService.getBySku(sku); - Long price = item.getPrice(); - LocalDateTime now = null; - if (price > 0) { - now = LocalDateTime.now(); - userCommandService.addBulkCoin(userIds, price); - } - itemHistoryCommandService.createItemHistories(userIds, item.getId(), now, price); - } - - @Transactional - public void assignCoin(List userIds, Sku sku, Long amount) { + public void assignItem(List userIds, Sku sku, Long amount) { Item item = itemQueryService.getBySku(sku); LocalDateTime now = null; Long coinAmount = item.getPrice(); diff --git a/backend/src/main/java/org/ftclub/cabinet/dto/ItemAssignRequestDto.java b/backend/src/main/java/org/ftclub/cabinet/dto/ItemAssignRequestDto.java index 20770c617..e8708378f 100644 --- a/backend/src/main/java/org/ftclub/cabinet/dto/ItemAssignRequestDto.java +++ b/backend/src/main/java/org/ftclub/cabinet/dto/ItemAssignRequestDto.java @@ -15,4 +15,5 @@ public class ItemAssignRequestDto { private Sku itemSku; private List userIds; + private Long amount; } From 04706a576596972293cd027360e6f0c1ba18e2a9 Mon Sep 17 00:00:00 2001 From: saewoo1 Date: Fri, 25 Oct 2024 19:04:26 +0900 Subject: [PATCH 50/89] =?UTF-8?q?FIX:=20=EC=A7=80=EA=B8=89=20=EC=BD=94?= =?UTF-8?q?=EC=9D=B8=20=EA=B0=80=EA=B2=A9=2010=EC=9C=BC=EB=A1=9C=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/database/cabi_local.sql | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/database/cabi_local.sql b/backend/database/cabi_local.sql index 3e5fbea6f..cf1645be0 100644 --- a/backend/database/cabi_local.sql +++ b/backend/database/cabi_local.sql @@ -743,7 +743,7 @@ VALUES (1, 0, 'EXTENSION_PREV', 'EXTENSION'), (18, 500, 'ADMIN_REWARD_500', 'ADMIN_REWARD'), (19, 1000, 'ADMIN_REWARD_1000', 'ADMIN_REWARD'), (20, 2000, 'ADMIN_REWARD_2000', 'ADMIN_REWARD'), - (21, 0, 'ADMIN_REWARD_COIN', 'ADMIN_REWARD'); + (21, 10, 'ADMIN_REWARD_COIN', 'ADMIN_REWARD'); /*!40000 ALTER TABLE `item` ENABLE KEYS */; UNLOCK TABLES; From 6be179e2dff80a3cddfd427071d187a4308ef150 Mon Sep 17 00:00:00 2001 From: seonmiki Date: Fri, 25 Oct 2024 19:08:01 +0900 Subject: [PATCH 51/89] =?UTF-8?q?[FE]=20FEAT:=20=EC=9C=A0=EC=A0=80=20?= =?UTF-8?q?=EC=95=84=EC=9D=B4=ED=85=9C=20=EC=A7=80=EA=B8=89=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84=20#1695?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/Cabinet/api/axios/axios.custom.ts | 26 +++++++++++++++--- .../StoreModal/AdminItemProvisionModal.tsx | 27 ++++++++++--------- 2 files changed, 36 insertions(+), 17 deletions(-) diff --git a/frontend/src/Cabinet/api/axios/axios.custom.ts b/frontend/src/Cabinet/api/axios/axios.custom.ts index 8ff595ce2..620d3f275 100644 --- a/frontend/src/Cabinet/api/axios/axios.custom.ts +++ b/frontend/src/Cabinet/api/axios/axios.custom.ts @@ -371,6 +371,23 @@ export const axiosItems = async (): Promise => { const response = await instance.get(axiosItemsURL); return response; } catch (error) { + console.log(error); + logAxiosError( + error, + ErrorType.STORE, + "상점 아이템 목록 불러오는중 오류 발생" + ); + throw error; + } +}; + +const axiosAdminItemsURL = "/v5/admin/items"; +export const axiosAdminItems = async (): Promise => { + try { + const response = await instance.get(axiosAdminItemsURL); + return response; + } catch (error) { + console.log(error); logAxiosError( error, ErrorType.STORE, @@ -743,9 +760,9 @@ export const axiosLentClubCabinet = async ( try { const response = await instance.post( axiosLentClubCabinetURL + - clubId.toString() + - "/cabinets/" + - cabinetId.toString() + clubId.toString() + + "/cabinets/" + + cabinetId.toString() ); return response; } catch (error) { @@ -905,6 +922,7 @@ export const axiosSendSlackNotificationToChannel = async ( } }; +// TODO: 확인하고 필요없으면 지우기 const axiosItemAssignURL = "v5/admin/items/assign"; export const axiosItemAssign = async ( itemSku: string, @@ -922,7 +940,7 @@ export const axiosItemAssign = async ( } }; -const axiosCoinAssignURL = "v5/admin/items/assign/coin"; +const axiosCoinAssignURL = "v5/admin/items/assign"; export const axiosCoinAssign = async ( itemSku: string, userIds: number[], diff --git a/frontend/src/Cabinet/components/Modals/StoreModal/AdminItemProvisionModal.tsx b/frontend/src/Cabinet/components/Modals/StoreModal/AdminItemProvisionModal.tsx index 89c8f616b..80f809c8e 100644 --- a/frontend/src/Cabinet/components/Modals/StoreModal/AdminItemProvisionModal.tsx +++ b/frontend/src/Cabinet/components/Modals/StoreModal/AdminItemProvisionModal.tsx @@ -15,8 +15,8 @@ import { import { IItemDetail } from "@/Cabinet/types/dto/store.dto"; import { StoreItemType } from "@/Cabinet/types/enum/store.enum"; import { - axiosCoinAssign, // axiosItemAssign, - axiosItems, + axiosCoinAssign, + axiosAdminItems, } from "@/Cabinet/api/axios/axios.custom"; interface IPenaltyModalProps { @@ -44,7 +44,6 @@ const AdminItemProvisionModal: React.FC = ({ onClose }) => { coinRefVal = coinRefVal == "" ? "0" : String(coinRefVal); setIsLoading(true); try { - // await axiosItemAssign(selectedItemSku, [targetUserInfo.userId!]); await axiosCoinAssign( selectedItemSku, [targetUserInfo.userId!], @@ -53,7 +52,7 @@ const AdminItemProvisionModal: React.FC = ({ onClose }) => { setModalTitle("아이템 지급완료"); } catch (error: any) { setHasErrorOnResponse(true); - if (error.response.ststus === 400) setModalTitle("아이템 지급실패"); + if (error.response.status === 400) setModalTitle("아이템 지급실패"); else error.response ? setModalTitle(error.response.data.message) @@ -82,7 +81,7 @@ const AdminItemProvisionModal: React.FC = ({ onClose }) => { const getItems = async () => { try { - const response = await axiosItems(); + const response = await axiosAdminItems(); setItems(response.data.items); } catch (error) { throw error; @@ -126,17 +125,19 @@ const AdminItemProvisionModal: React.FC = ({ onClose }) => { }, []); const getItemTypeOptions = (item: IItemDetail) => { + console.log(item.items); + return item.items.length === 1 ? [ - { - name: "타입이 없습니다", - value: item.items[0].itemSku, - hasNoOptions: true, - }, - ] + { + name: "타입이 없습니다", + value: item.items[0].itemSku, + hasNoOptions: true, + }, + ] : item.items.map((item) => { - return { name: item.itemDetails, value: item.itemSku }; - }); + return { name: item.itemDetails, value: item.itemSku }; + }); }; const modalContents: IModalContents = { From 8d521f553b9f3baf2b88fad28665c44d7b2dea55 Mon Sep 17 00:00:00 2001 From: jusohn Eddie Sohn Date: Mon, 28 Oct 2024 12:28:05 +0900 Subject: [PATCH 52/89] =?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 53/89] =?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 54/89] =?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 55/89] =?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 56/89] =?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 57/89] =?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 58/89] =?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 59/89] =?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 60/89] =?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 61/89] =?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 62/89] =?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 63/89] =?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 64/89] =?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 65/89] =?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 66/89] =?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 67/89] =?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 68/89] =?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 69/89] =?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 70/89] =?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 71/89] =?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 72/89] =?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 73/89] =?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 74/89] [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 zcma*OcQ~70{5KwACqmH(Ma`-$RK=*#)T~uOgQyUrMF}ab+O(n-tM;Z*2TAR% zrADijw)U>kTIIPv-{*RMzvsW-?@DrAx$fNO+$ZO}&wIRHuVZauXc&441iEf;*~-oe zh2;Q&K-|D*o8iB=zL}M=xdsTtuu1;c=B?G+6xNMs%V)a0`2Oz=rV@3TPbrEwigtzq zuiZW`yksl-l<(FjWSnR;U%D$=Gn)JU`KS>d(WzhReSed_&1aEn((@OBzh}l}fkNj_ zULKvKpR{eATt7bPJ8|AWkvoZ)J8`*6$cKKkS4H<@PmxU%cs&Ox(!Z`i4}=@`avWFR zY@E_X9hd3q%#XZpnjy|H8x}iD4-FXCyE5PhWZxFtS#x$SnAKQ3nhO~|`TeO~-JUzF za}c3o0gY^F{oSs0td;Pu3~|}&Gq-EsYQ#_H;je-0AmY%4PV7n^uYb(zE@+!Q5|p8{ znK3b?UKxwPm}<QKw#r>jG{zobtN->;23c__xW+T{s| zkYHKvf3n|%e-5ULRSA;q41^Kl8%>MYy$&vp_!KMaTP&ee4pL$_^w=4lf zjZM~&2w0I@%Xjw zUKb7|>Wk{v#6OJJm3$VPwj!dI;+LnaD_Z)%pAkQHzkB9H%w)d2QmiX&OBC~1tlZ0O zM%`EI4l~GbRXP0>zNNn`SrFsv#t{{IXw(3<&OQb1=~}qNYhuWWe2!CoUY=uO5xm%Z zngJz{$b&E5mQK}~XJM6cp5h{w^2mWQ4uA7zmmFlRWJhyJ>YlW>ZZmXcyPR7YA?<{e zbWN}Fr5%laiG&Vn;Kvg0nw@Ki%?e1sK%-`J`CoGCtrDMra!*oskgxG%LoPc6IjD$1v>RHRu-XDmKJoDf*{`ct2xzw)dF}}3fUm*#g zjxj32JD()(TRxuU0%rC3r_wP0$E;xgPEnbz1oi1cs4>vtM-$%tjskdBdYwf_@qIb* zAe0_`NIa~sx^gxwULOi#nAh1yTcdr$KN;)P3yYSD6Y>!|THB0r5rj-|qQ?HatKq?& zrwK}$+k5SQr#vpY*4YV72@2MQqk&#D;g9?vLDUhREh6Rc|7(WO%J=b_%=0 z0t|j)wwJ#N><0SP0m_OXla93?g<*glK`;#-k?G{NQLEp0@HWw5kkN2;CzIJiTJ3dU z&(S|`GqKlxHUXk(93P-5Ut?Zv=UZqSEO#a@JSm z{jKWv4B6jLt+w-RZ@SoQy}nAFS`wti79c0Io+E7D|E&}&T}sSD&q~iQPv4=mfAF&+ zg<+tADy(O1(K)R>y{VbIdZms~B3D?Ax3&4|;nW$+Y2EdvT)(%6!^5pJSD)CcnOn{Z z@tnQEc4<^DI(3nB2{UH471MTfL^aRILyw%8ZNF?il)2lcui~9o(9^p;XZuk#OdRVh z;GJ?IIrPU*VSfFSE(dSUgF^2H)#Lmg?wm~55qLGSVy{{Fg zd^|uz@o~hCUllJBWax8e>9C~h-1BlljWMBjT^8w=+9rimgvC+WIupuFTaVE54D=2G zo10ZAP`uEI<`PEL+GbF4X(sFs&GDsB$nRmLw&S}=ty{=LL(V!0_u*mnShKsRsx2u( zOUbP6Ujzfn(`p38IzZZzHY;W@0h_e`ew%vNnRI*&F*)>RwvJHk8}OV+fq3x6l* zrr8dX`VU;t4_LkC z{Wg_}Pb=%S!^kq{fWg7Gw|`q%&%WCz@K?X#Ph%%<)OC761}WjyD8d`wn1VJ8>DpY$ zt|-fHlQP$*1&4FX!~9GgPiwkdU-o3>X1k7v#b$Y>iMKs$eU>@36$kM<={{4)Vy7MW zbNlb{&&AuB0)VgY2oi&RRe3JnXX0JV8h95)&hdWItY9cGHjWT7@T!S;yo{b7A#Dn- zJV`$(2wVDQdHC&WVE~m6*f5$!z@G8=qr3kwH*v~M1c<43&cI(|NWIiy^$xZ%r&2FGq4i|#peO)y7gc9?GA=0MEr8)3aI3wflEbL!K(uYVWT`i*gWrvw~rxcxEL zw?)Uv%yD2I17BQcUaxBhRi}XRRKGoFe_W`V9ye>TsQ*nE9+4zAagk_g>_nl-m?0t>~)Ekgx&+s8iqV4KhK zJ}aR9;k@Uy_oo?@zurA7t=42U1H`p>T^u*}S7ub6(ctH@o^K;DEYnvCz4ObxX`l5r zZ>!9*+)s?rcaeh;XToF0g8DR!5@xkL?h{b5p5-Alo>@}KT(Fq{} z0lX4rH5}L3B2VGR9*vgYPA74gwnp?#N8Uk^8^M^sN27KzMeFbeZKFZ8q|m$J&DPP+ zXUgV1WQSwZz!Z@8alBZg?U2U#{VxoWS&8TN7}T!6e8&fCANzocmvVOZ zY0T5!@2RY9!mwZTut+zE-4$&lVdpVjEN*kZlX;@6vkAVw^juQ=I8BqXN4ruw{pTa8 zuOM;-YlNKb1D{1Ib2caIsQ)^Z_A2Yd*2|Y@IxSMe!szpdDO;;pdYBPsqynF?zA6OP z|E7?U)iD{@QSpLm>jCwBHav%kS`BvLtZL88boW|h)41~eB5#QV?caO7pP6#)pDl8D9|u|(v({&wT#D^Wi)bi+-zoG<;LOu^ zXS!_M>h>gKahft{+2p;>$3*x0BP5+A!g^ls_7bybez%MHFgAO^p4iB{I-LBtgfV49 ziS7E7`A*9n>*Kk%7y-Hds1SWq1bI%xeSF&fQegrAr>G!TGu!7q`OBV>tQ9S8u2E^t z!X<+L*@X?|9RWUVS#1%_fMbBHYCh7Lvsl@GjU?tTu*Kp6>1lJz3$=+V@ZLhCZAN+- z&DIq;&+Mfrq%zF7>C|OIXQ0}gqq3I_3r}tVn1N}Pip z4%pb!zixl9!`F34c3qB|<{JO-^P-n~igOj)^%VR%xdM52p0DL>NduN57a$w(fI}h_-BY z;ba~43!O#(VvieVxH0eRx5|X0n4l zoh0EB`;(}n#=rZHZ@efX-Wk66P9W%Jbf56%13S~`0ojB_ZNoSG<~~YDyhWNl8px2z9i1H{h29DaT~$L zr!}80acsx=so0chpJrrh9mLu{bq1?2(XK&TO19RRMG;sc3SDWs&#lZCU%)z=mLwZA0tS5$ljYmD@v#v*YF34z7RenDha&8 zJ)Rc)q+!^G74?7nh8E)Ev(?6EFGn^fvO6kVK&(cT31Op_=o_j7gD2mczVbl>u}lx~@4V2O@iR zBTC>yfx+>`G!dU+A(CoMjDc`9FKAmtt68Q_nCcgpI zGRg<>R=6`d=khk8vC~(a>0VfjG}*S*tfauDQMw+tEMnc8-kgo*93H&S0Tw2ynAjqT$pt6@^7 z+V7rP?MbV|0GUP*8;e8%;BmBBeMQ0AdWE?;&4Fw9`^qP}6;k5B*h(?0gUOYT^WMnf z-Y1sLSAx5TIaH~^JIvwi>IgEVqGgM(nTrYi3cIY@RcTGHOO9e9Un607L)uubs~547 zbj=l#dDY2xSjgtt1Y4Par285;E4_Vb1e9o>a`lIDZPcOTBkF=jG++uAl$QFQODsQX zN8Umc9_2NQ`urP-ao2S_U!+|@l2^|zuB_62Y1j30nXzDky6fqWP9d?l*RApa5w2TL z`Bi*HxwKOkXuuXfGfON=q#O`!Qzd}eM{Q^y%8QwupHEpEV@ z45?@1g*cbG@udp_vXG-0u{;y!`~^Qe(uP(#0Jyp`L+T$-f3TYR613S+uhs%zDX&rm zSz;qLH|xQ)xvgK2UtEnkhME zeEVyq)Srs~{aR=thKdxkEq%v1KGvgc?e>y^DHl1{$D@9h(wX&}lFr=v7Bp=o4?jsR z?%)z#^p>xAKL1o^!A5keKV48_GN!J+N*hvxsd`?exD{jYV|nLhRL`X!ET{|zVIY@L zPj27BWXWO@W02@md8UJ(rF|JElG-^ii1?BYOVjg(h3rjYa7gR0RrbP~az4$q33%jl zYP*=)2WJkZb;uF{>MO^+zkXB;W^Zzn^@sjv5wqZ~W$~Fjh({!;yyfQX%y)NLf6l5~ zfQQX&RhgR+HZzLs6dvoV-$Ft#&vb1w!CXtjF6-*Rq=weBdMF>N&Q@ZE&QLi!fADzK z+}L+S?5JfOnsv_!KC zmAUF##DK|IpZH8Ze-K-AAeazEm7pJ-TJ280D(gJ`6CH~aZo{(IAfqn{U~E$g6_~#Y z2(^l2$@cesb@3+n6Bvg34;q?tbof#1D#`u`N4vbeZ(}53T#X< zw(!e?%;{VVrAh6T&dM29BJbESvPIeg(OsJI2QE<^3YyG9iZUtbzwl<}OlACRp7D@VZGt8wX>l@6Bf7cK&QtObFlby~bRUfAyys7P6&uua8qqv-_ zI4C(v!BE>?G~jMC4NF%%z*z@Fov(DqG$L@PNGV;WSW7M7>WBrPI{d#4-q z>5g>eXYjn+Fpv;Jg>~%d?%&*YDyf?RAuj zxUE77{DFUS4zMtqN4NfGbd+1;!Uo}!8c;)>K`T*Kizy~zQ(lxd&C1?wLy#IyX(`&W zK&Un^#QUhT{UWlF2Ba|bV(uL^#J)T_Fe*vs@}L3l>)0X_`0LaA{tJ;nX3b;2|6Al4 zgQqF&=Y21C`(Wh7EW2}?dTcCeTT6^7Z=r6&FjrX1P5PdO%b`E^Hv|Z?W#;$+gY+b= ztk`eYW{re9Tq=?TOlS34?~LK*t~Kf3j} zr_Yd!oM|){FPz z#&FZy>a~cDqYdQ?UE3nm3ud(%q)OR4A53_#9?m;a4s)2wS}hgOWdbb;vC-WsYiM3V0A6nT-i z%gxzmPxO@U(2~y3gA1uoPb-!VGq`QN7qfl)7q7)Dd@Q7;hIfj~J5y*}WYQMR=5B<(sQ%V)=< zjMh`g?VDK4!%l5K)$#uA=gdDwVqyH&q}>8_>Ql5MJ(E(bG93TI>c(cH%-DU&VJ%L1 z4o#oFJVEXr0-jU0u{qn}#f?N~#!ENRi z$-59qAydH^|D9dT77-ic#XRFup1RNDHY_pJ@$qS>n#;(@vCpKJ7kG~C%SRXa zFh#`vxOQzmCu0@KQ#__?Or0gctPBimRD-__Gd(MNHD~|RxmvgypAR=;nU`lHm+R7b zSyVwQ+_V79_N9*Xt8zC_-&Oj^QZ@KuYYGD0G(O7fQ58#h>- zzJhR~t8w7(*%p@QdKQTj182qH@H%z;$3$R2_#S57_BT!-Q5Nja%@7^@%-*a4PhU$AFBArN@3YEI zAW8!WJ{>yqEb-|30SQbje-F-R*&(RB@QRZGfO)l)(0lw;`>}Dx2@IiSvG*;U+;CoL zGG2r4QNcSOXh)G0v$PfF5#Ro8wl`Pg5R;Gf!3m(Ng*$g#XYy1I!&V-fgHU5rA8`GA zrnlzFtl($|2O)Iq@)K$2eYoh&t28^e0V!}{0eh1ph>{wfuaC}W_V}{*AmqkA)+E-_ zdH+}T*C9?l=<-@*VT#UaW5Hf;c#MB}Ssf~8)%^1n^VLg!L8$m9KKWe+wBnufOrxpe z3{;=1)s6dhxi1@bd_eR({WXQ!1tYT@*~dDmTs|Ce`c4U*LuXaI1RXXdyQ>-497bKo zo&gX6J)VFsl>`* z)e<^wfp#3)Owmi01gDenq87&0&FfF})k@Mx7BVcK^|l&vUo!y!F`Vwm<)Om5rt9{E z_vJK58K$tj85V0}xIbW4J1VBI1f33g9dYG}2Fqvesk_S(x>$H*(eV%{*Xh_9rt&^$ zTL;3({i*^Vq5@>$0hVmB3JDGn145EIY{cBledNi(ltc zrvw`60C(|IgfOf<&qAK%cBjCFua8j>#L5+UhwHVM2(q)mFrir8gutOkaj1nVeYu?0 zn*{Jt0nod1wr~)lBsU1_&q2seYre#!n#O#nTB1_W7THd5C)e!&p?Xfk#Zy^e+CYIP zTRj>dyIly8v5drbZO6C+Fzx_UI{xb-y$lW;Y`mItyFHZiIp2}?ca8RdJwhn zYcruAqE1Ky@h%p)a0dh#A=j{YG06{tt~ z8SiS^|KZh7h8+k#&IFGl`?|%M$NBmm!XQevXF;%s8bG2kcraycyuGfyHKQ*5?qA=t zwlCf~dIJA~3JorMXZ=!{@6ixJJGIE)`Q53y_6R{5IGp zU9^976rU8>FF4)%{XFA_$HyrKJ%@J2g=C#lZQ|nsZC>T}J6#$eBE)a+{bC z!;fXDWo89?2VrHtH}SW%5HaxxH7;9Tr3c7%qMZ=P-hZb5;_$O3c4`;R1J z0N25#=Jhl6>SaOC$hV86#)3AofCVo^{{E`2O7?}4G&zg+p~2UhOEr8x2+5gh_(26O zlHgdvDp^vk1b0X9tN_E;X6KQG%JfWHwr>x1Ay3UIpG1A5zWYSbRdGF-1J?jGZ0oV2 zw`AjU-Kt1KO$EI1$JLX*gKV{55&#Zz0vWKiMNA052Fhao!zdXi5E8I|n#kK8!jbmZ zzu(*D%n;_(d!x!KfA3>vNf!_8&d`#%dSc{7}#GXz!aoZHc zm|hE$^vgN($!Qm4WZ}WqGH$ZpUb^-Hz?Y1gSy1?RquvrhSExRC{~%GhG*DhS10Yap^Q=KtU`a8ZTFBV=^$!2vd8loOF%U2$b94 z2@&|jr-jE7(p8ZKHAc$wE(dA30()PCY6qh`AMR8{|L44x6@lErHZ4sz_EjuR=q1u7 z9X#UzyX2JEF3&Z(P%1kdgKpNk0&^XL2-F^6Vrh(=4 zUn3-?Fki3PGPU*<{^?5Fa4Sw%hCI|>b} zRi^@wOt&E5X-kE4#t6109igGJVKsBXNxz&w`?JG3_vfNU$5|-`uW#YcK7*r9!K!5d zn1W+2tL03|R{&y5^Gb<+vZM6<{?>QL>etI#{fh7RR)JLLTUmR>X8>=u&PB=ZA_)~$ zdG9n!-V(7yMs$tKrz_#XC)d0OqxIue7Y&8&j-u?6{!d>jAf{^B$wxBq{ytu@Z!w)8HdJSSn(DNILH>(5!a-u~BbR42YD=By zo2p*2@ZQ^^-=gc9qjWNX+Uo2wsBW=TI8i)I5Vtcs42sE6qwelh*x0qc=f-7Q)y6AQXxbbb>cvq%3cjZ8MLpBhW4CkjDfWsgK4vUY7w$1oqv)tIv#~@Ze(Ru?zHBGN3Phw z;?3RUp8^O|drj95oLBa0@GWVr+?=bjX9H{7m6WO9cHG4Sg`0G{lkGkWDQFxInp&=@W=Xy6WHgzMG7=UwO{5%n9fqw=VRCO%B)DVD{U-7 zvHr|&RZ4m6gT+fmu>&V?H2bhK)df58ljA@3SoG^jjKQ>S({_p>{ z!mgURoM+Syav$!8t0%v?2?jshJCr z0_Os-w>St_qAhmKrggZGE_VMR9wgYo19d3Y$fPOmQ* zZEQqD{8fIPFVp<}ggU+1LkNviLSO({P^?GqFu;Eu(5zbw z5k)JOYoCe!;RY~W6>s?NAxau4C=jA<@!+k{jtU{F$1>xAuw8xDS{oF=x12}D4FM6s z%3^N80qV(sP%X!B9biUqAt%Xe6S3YBa-fT-zcU4rB$pJTJeuVY;yVG4zRehp%qaJ-*wY@2!5fM1D?PizIq9iALUdoq&{KF&u z;S2!qdW3^NsWAHdWfHhB$M8bz5Tir+ag!Wh4vZ(5SnVn_-}(fa!`iz{8j{(HpvM+7 z{RjHo3p$qtuVcw=`%oe?5v?ItD8Q)&WscXX`21XGBF38wBE-Lh5xEfWF$Z8@Mvx#k zAglq*{5X;7UNSG1VG7qXB$wf~!kxQ2J}eO`)_W6@FOX^L0wdZb!Dj`AfmiNzUvs(1&z zT4B<_Zanp*PgShuBva3tv)S0uSS{rQ0T zj~q{;T$rz+-Hq=b^T2KmbuWQsP7dfT(MewYw@upyj|X0Yb@TT`oj`8o;nllr+NS;b zZefhcDy~rmNr%$CP{o*=n#~n3zLz}6>CYzuV5Fm3?#qU12Bf1i~>$ffy(}mmSOUn!D zREf+|>_SZ65Zy}9z~{IlyI&Xt*aj!}vEnroPvLhRc`A_VDl+>^y#)O2zl^jbgzW!7 zh92xNfbjV|ODoMAC$A{Ou(JVDVFL*X1)(midT+87vaD@2{N;=r@FGg-FM49GAHQqI zk_(=FmsXoMG?IFmb;kA0X>zBoYnA*aHCDqXk0hJ6ZM9_ucFsB76vI~gW5%Q~;Fp^J zkvhZI=K#5p2vF?ooVc{h|2~JpNC;qD4V%d;DYaddH6i1K%h$PM*-)vV?3t8?;$V$-;Z(QdKtM z&V_@lud1>qji?g2Q%B7`VR{XJT+F1N*3WR8o|?XOj&DEP6?5vX0qC;hcG|^m5Eq<% zhyUd{(7eVGICfdQ4OhX7jmg(7wQLEyr2CEgQy9vpGp#ZtsMKR{%lZ-ZQ7%L65UBtC z2P=CRP(a*=qf{^?xsdQzuoB2rRnNAndar8=mw;S+UK8?u9s}O!=b1-9^2ENj5ZTa^ z?C7w+{y2G^ur01c@g0}NK+X?eNz!lY`WfyO1))0(F|@f+S{g4o=W%@s^l_Tq&(58# z_3f*u>`}TNi`S#s8z|n=f`ka8`xMsq^|*ZQicO{?um9aRHTWg+Gjn1gI7pOy^)YTb z05-2amge}4Bww{8d!ML`j%u6oxQ(4%3ubk}pA1>iamKm!bV0AawE}Uj=sTQUk9hO+ zoU^wWs26Tk_w-rM&m)jjV^)UmeN8Q|erL0XKCY zUg*J>dIGMnXMyX6@1H67xAiXL!OuqFt&Be2>`i9SmL{1>7MPk>+-}@hqgei+0KOqt zS4zMZJzqrTzNgm!T`zs9xS(etaIz)&M2z32^#a7qkv-!$IcG&MOtklwpH4u(R9W~* z`LFQ%LyZxFCsHO}<>)`52xZ{`w%WOWlD33C4bmd`dB@-xW^zM?Q~;Y~c4(i}CBGQ` ztB#Zd*035+4%2`w0{_u)B}ot((3IXv>cyl$#nStuSTAd4g6%|%JkFBZs+x4en=bgI zGQCwT<t&zqN8sRc&;l>%1b0s0TRz53T`hyxr^e@3OZINiZi`1~4me8%))VErCRrMFujMEvS}N1@t~3uJz*sOOaq&e6%R@M;rlX4((!5pIHjbPu>jGlt)AAk&OeE>NjAM%|w%aBGt=S9#S zjzw!ZPG2+IpDTz&4+zEB@6drEjp z9c7{05ddp%)XrXsWz^V=5Y2CQEsglJVA}s)hu`O!C@M=#P25`jK~cUie7`n%D<)9v zrYqMUycu(v`iCGGnY2XWt>0oYZlKT-cFc{Vy7fjJ`prFLi}PN=?~j!rJnyFB;aoZ+HAS~%kn|R*cK<(qqgr7;r0k01-OF5pa;WSafGJm{Yd*k7#Nysgw{0O~N+IKg zX3j5X_c!HUs> z$yB86JP_ffYY|2YY1_#_X7O_9h~8G+1{Ot5JUAk8$A!PkWWSh%S?`|QZJ2(BUAh??XnYUaQoM(uNbSq8JbJFk^(kr|1luD zIVRx&D@}0XVj3(rjJgPvrqZoVicHnDmoSy`Wt=}8hJi?iFlE}Rsa^;?6WW2LcOn6F zjdkGNw@H5O!(okvle-(*cVvL#R)hKKcXMmC2i!I$-|Ll`ZZFmjcv1jWK)zV@0?-{$ zd+dK-4B=?3r@mf@xeY-qfG9V%lk2$N?a;=qc$`d~Icfea?WhEzYQ`kWQfs(&0;m-c zlQ1Gc{n#Hnif&S2qNqoJ6d`Ym6I&-yD*!OGTkV|=Op&L^tpvDzaDIaNjfman3viIK z>qmd#NVTNa<2uiR@Yw^2>&z4bEkU{xG+icQl0n|L>?I&Bh!O##cLDOIUsCh~wu=Od&*r#S>2FL36#cgxLuE?D;6sfn?T3IG zWsbPGaX8iosKPuo%N{a&T0wAA>=#X1>H+Y*`F-^=lJZ9kQ~gH%PdE5b^$FIJyHC`ce~jS%GLFy%&@s?V~GE zt3;@@2xgpCj;9M9FiPuvu>fj7cR)_e0g;=$$$_rXmRe^L2+~Ldl#aA~{24%l5Ew|g zK!u%Eon4k_!;1K3b-Fl~+FUc8uKFi59XH9jgGS1p~4!l@;f?cgA~63 z_R%1Cf7sBn^*lOrdRu_hBbBa8ZYRFz9Nak_e1kc@Nj+;D5Y7ddN><45n@
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 { From 378a0985e2a56fe210bd6b4c79ae98f2c7a88888 Mon Sep 17 00:00:00 2001 From: seonmiki Date: Sun, 17 Nov 2024 16:13:14 +0900 Subject: [PATCH 75/89] =?UTF-8?q?[FE]=20FIX:=20LeftNav=204=EC=B8=B5=20?= =?UTF-8?q?=EC=A0=9C=EC=99=B8=20#1703?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../LeftNav/LeftMainNav/LeftMainNav.tsx | 24 ++++++++++--------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/frontend/src/Cabinet/components/LeftNav/LeftMainNav/LeftMainNav.tsx b/frontend/src/Cabinet/components/LeftNav/LeftMainNav/LeftMainNav.tsx index c4119c0d4..0fe716c4e 100644 --- a/frontend/src/Cabinet/components/LeftNav/LeftMainNav/LeftMainNav.tsx +++ b/frontend/src/Cabinet/components/LeftNav/LeftMainNav/LeftMainNav.tsx @@ -58,17 +58,19 @@ const LeftMainNav = ({ {floors && floors.map((floor, index) => ( - onClickFloorButton(floor)} - key={index} - > - {floor + "층"} - + floor !== 4 && ( + onClickFloorButton(floor)} + key={index} + > + {floor + "층"} + + ) ))} Date: Sun, 17 Nov 2024 16:21:00 +0900 Subject: [PATCH 76/89] =?UTF-8?q?[FE]=20FIX:=20localStorage=EC=9D=84=20?= =?UTF-8?q?=ED=86=B5=ED=95=9C=204=EC=B8=B5=20=EC=A0=91=EA=B7=BC=20?= =?UTF-8?q?=EC=A0=9C=ED=95=9C=20#1703?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../CabinetList/CabinetList.container.tsx | 25 ++++++++++++------- frontend/src/Cabinet/pages/MainPage.tsx | 5 ++-- 2 files changed, 19 insertions(+), 11 deletions(-) diff --git a/frontend/src/Cabinet/components/CabinetList/CabinetList.container.tsx b/frontend/src/Cabinet/components/CabinetList/CabinetList.container.tsx index 1e9dd4fc2..9a1304252 100644 --- a/frontend/src/Cabinet/components/CabinetList/CabinetList.container.tsx +++ b/frontend/src/Cabinet/components/CabinetList/CabinetList.container.tsx @@ -19,10 +19,11 @@ import useMultiSelect from "@/Cabinet/hooks/useMultiSelect"; interface ICabinetListContainer { isAdmin: boolean; + currentFloor: number; } const CabinetListContainer = ({ - isAdmin, + isAdmin, currentFloor }: ICabinetListContainer): JSX.Element => { const colNum = useRecoilValue(currentSectionColNumState); const currentSectionCabinets = useRecoilValue( @@ -53,14 +54,20 @@ const CabinetListContainer = ({ {currentFloorSectionNames.includes(currentSectionName) && ( )} - - {(currentSectionName === SectionType.elevator || - currentSectionName === SectionType.stairs) && ( - + {currentFloor === 4 ? ( + + ) : ( + <> + + {(currentSectionName === SectionType.elevator || + currentSectionName === SectionType.stairs) && ( + + )} + )} ); diff --git a/frontend/src/Cabinet/pages/MainPage.tsx b/frontend/src/Cabinet/pages/MainPage.tsx index 3550822bd..ce6e230c9 100644 --- a/frontend/src/Cabinet/pages/MainPage.tsx +++ b/frontend/src/Cabinet/pages/MainPage.tsx @@ -152,9 +152,10 @@ const MainPage = () => { - + {currentSectionName !== SectionType.elevator && - currentSectionName !== SectionType.stairs && ( + currentSectionName !== SectionType.stairs && + currentFloor !== 4 && ( Date: Sun, 17 Nov 2024 16:44:23 +0900 Subject: [PATCH 77/89] =?UTF-8?q?[FE]=20FIX:=20Admin=EC=97=90=EC=84=9C?= =?UTF-8?q?=EB=8A=94=204=EC=B8=B5=20=EB=B3=B4=EC=9D=B4=EB=8F=84=EB=A1=9D?= =?UTF-8?q?=20=EC=88=98=EC=A0=95=20=20#1703?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../components/CabinetList/CabinetList.container.tsx | 2 +- .../components/LeftNav/LeftMainNav/LeftMainNav.tsx | 8 ++++---- frontend/src/Cabinet/pages/admin/AdminMainPage.tsx | 2 +- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/frontend/src/Cabinet/components/CabinetList/CabinetList.container.tsx b/frontend/src/Cabinet/components/CabinetList/CabinetList.container.tsx index 9a1304252..caecd0822 100644 --- a/frontend/src/Cabinet/components/CabinetList/CabinetList.container.tsx +++ b/frontend/src/Cabinet/components/CabinetList/CabinetList.container.tsx @@ -54,7 +54,7 @@ const CabinetListContainer = ({ {currentFloorSectionNames.includes(currentSectionName) && ( )} - {currentFloor === 4 ? ( + {(!isAdmin && currentFloor === 4) ? ( ) : ( <> diff --git a/frontend/src/Cabinet/components/LeftNav/LeftMainNav/LeftMainNav.tsx b/frontend/src/Cabinet/components/LeftNav/LeftMainNav/LeftMainNav.tsx index 0fe716c4e..ec3933afd 100644 --- a/frontend/src/Cabinet/components/LeftNav/LeftMainNav/LeftMainNav.tsx +++ b/frontend/src/Cabinet/components/LeftNav/LeftMainNav/LeftMainNav.tsx @@ -57,8 +57,8 @@ const LeftMainNav = ({ Home {floors && - floors.map((floor, index) => ( - floor !== 4 && ( + floors.map((floor, index) => + !(!isAdmin && floor === 4) ? ( {floor + "층"} - ) - ))} + ) : null + )} { /> - + Date: Sun, 17 Nov 2024 17:09:07 +0900 Subject: [PATCH 78/89] =?UTF-8?q?[FE]=20FIX:=204=EC=B8=B5=20=EC=A0=91?= =?UTF-8?q?=EA=B7=BC=20=EC=8B=9C=20HeartIcon=20&=20RealViewNoti=20?= =?UTF-8?q?=EC=95=88=EB=B3=B4=EC=9D=B4=EB=8F=84=EB=A1=9D=20=EC=88=98?= =?UTF-8?q?=EC=A0=95=20#1703?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Cabinet/components/CabinetList/CabinetList.container.tsx | 2 +- .../components/LeftNav/LeftSectionNav/LeftSectionNav.tsx | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/frontend/src/Cabinet/components/CabinetList/CabinetList.container.tsx b/frontend/src/Cabinet/components/CabinetList/CabinetList.container.tsx index caecd0822..bf5b4ede3 100644 --- a/frontend/src/Cabinet/components/CabinetList/CabinetList.container.tsx +++ b/frontend/src/Cabinet/components/CabinetList/CabinetList.container.tsx @@ -51,7 +51,7 @@ const CabinetListContainer = ({ /> )} - {currentFloorSectionNames.includes(currentSectionName) && ( + {currentFloorSectionNames.includes(currentSectionName) && (currentFloor !== 4) && ( )} {(!isAdmin && currentFloor === 4) ? ( diff --git a/frontend/src/Cabinet/components/LeftNav/LeftSectionNav/LeftSectionNav.tsx b/frontend/src/Cabinet/components/LeftNav/LeftSectionNav/LeftSectionNav.tsx index 5939a9405..c5fd2ca12 100644 --- a/frontend/src/Cabinet/components/LeftNav/LeftSectionNav/LeftSectionNav.tsx +++ b/frontend/src/Cabinet/components/LeftNav/LeftSectionNav/LeftSectionNav.tsx @@ -2,7 +2,7 @@ import { useLocation } from "react-router-dom"; import { useRecoilValue } from "recoil"; import { useRecoilState } from "recoil"; import styled from "styled-components"; -import { currentSectionNameState } from "@/Cabinet/recoil/atoms"; +import { currentSectionNameState, currentFloorNumberState } from "@/Cabinet/recoil/atoms"; import { currentFloorSectionState } from "@/Cabinet/recoil/selectors"; import CabinetColorTable from "@/Cabinet/components/LeftNav/CabinetColorTable/CabinetColorTable"; import { clubSectionsData } from "@/Cabinet/assets/data/mapPositionData"; @@ -17,6 +17,7 @@ const LeftSectionNav = ({ closeLeftNav }: { closeLeftNav: () => void }) => { const [currentFloorSection, setCurrentFloorSection] = useRecoilState( currentSectionNameState ); + const currentFloorNumber = useRecoilValue(currentFloorNumberState); const { pathname } = useLocation(); const isAdmin = pathname.includes("admin"); @@ -45,6 +46,7 @@ const LeftSectionNav = ({ closeLeftNav }: { closeLeftNav: () => void }) => { {!isAdmin && !isClubSection && + currentFloorNumber !== 4 && (section.alarmRegistered ? ( ) : ( From ebacec3d67c42d6c65a1d75896e203d5af60b8a7 Mon Sep 17 00:00:00 2001 From: seonmiki Date: Sun, 17 Nov 2024 17:14:04 +0900 Subject: [PATCH 79/89] =?UTF-8?q?[FE]=20FIX:=20=EC=9A=B0=EC=B8=A1=20map?= =?UTF-8?q?=EC=97=90=EC=84=9C=204=EC=B8=B5=20=EC=A0=9C=EC=99=B8=20=20#1703?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../MapInfo/MapFloorSelectOption/MapFloorSelectOption.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/frontend/src/Cabinet/components/MapInfo/MapFloorSelectOption/MapFloorSelectOption.tsx b/frontend/src/Cabinet/components/MapInfo/MapFloorSelectOption/MapFloorSelectOption.tsx index 241ed3484..9245bfc5b 100644 --- a/frontend/src/Cabinet/components/MapInfo/MapFloorSelectOption/MapFloorSelectOption.tsx +++ b/frontend/src/Cabinet/components/MapInfo/MapFloorSelectOption/MapFloorSelectOption.tsx @@ -7,6 +7,7 @@ const MapFloorSelectOption: React.FC<{ return ( {floorInfo.map((info, idx) => ( + (info !== 4) && selectFloor(info)} From 4da08e427d935df0914b356822435d6f998497aa Mon Sep 17 00:00:00 2001 From: seonmiki Date: Sun, 17 Nov 2024 17:27:47 +0900 Subject: [PATCH 80/89] =?UTF-8?q?[FE]=20FIX:=204=EC=B8=B5=20=EC=A0=91?= =?UTF-8?q?=EA=B7=BC=20=EC=8B=9C=20map=20=EC=9D=80=202=EC=B8=B5=EC=9D=84?= =?UTF-8?q?=20default=EB=A1=9C=20#1703?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- frontend/src/Cabinet/components/MapInfo/MapInfo.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/frontend/src/Cabinet/components/MapInfo/MapInfo.tsx b/frontend/src/Cabinet/components/MapInfo/MapInfo.tsx index fd82be807..1259ed0c6 100644 --- a/frontend/src/Cabinet/components/MapInfo/MapInfo.tsx +++ b/frontend/src/Cabinet/components/MapInfo/MapInfo.tsx @@ -33,8 +33,8 @@ const MapInfo = ({ style={{ width: "24px", cursor: "pointer" }} /> - - + + ); }; From c1ae80e13ad64f083bc8e99350222b90c5dee253 Mon Sep 17 00:00:00 2001 From: jnkeniaem Date: Mon, 18 Nov 2024 17:02:54 +0900 Subject: [PATCH 81/89] =?UTF-8?q?[FE]=20FEAT:=20Sentry=20environment=20dev?= =?UTF-8?q?elopment=EC=99=80=20production=EC=9C=BC=EB=A1=9C=20=EB=B6=84?= =?UTF-8?q?=EB=A6=AC=20#1687?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- frontend/src/main.tsx | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/frontend/src/main.tsx b/frontend/src/main.tsx index 2d963d344..7de2f2301 100644 --- a/frontend/src/main.tsx +++ b/frontend/src/main.tsx @@ -17,7 +17,11 @@ import { GlobalStyle } from "@/Cabinet/assets/data/ColorTheme"; 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 59fa238121302b8b6bb36e0c25e420de2ab961c8 Mon Sep 17 00:00:00 2001 From: jnkeniaem Date: Wed, 20 Nov 2024 16:36:11 +0900 Subject: [PATCH 82/89] =?UTF-8?q?[FE]=20HOTFIX:=20=EB=A3=A8=ED=8A=B8=20url?= =?UTF-8?q?=EC=97=90=20=EC=A0=91=EC=86=8D=EC=8B=9C=20/home=EC=9C=BC?= =?UTF-8?q?=EB=A1=9C=20=EC=9D=B4=EB=8F=99=EC=95=88=EB=90=98=EB=8A=94=20?= =?UTF-8?q?=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 --- .../Cabinet/components/TopNav/TopNav.container.tsx | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/frontend/src/Cabinet/components/TopNav/TopNav.container.tsx b/frontend/src/Cabinet/components/TopNav/TopNav.container.tsx index ed95a9758..2f8260110 100644 --- a/frontend/src/Cabinet/components/TopNav/TopNav.container.tsx +++ b/frontend/src/Cabinet/components/TopNav/TopNav.container.tsx @@ -1,10 +1,8 @@ import React, { useEffect, useState } from "react"; -import { useLocation, useNavigate } from "react-router-dom"; 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 { staticColNumData } from "@/Cabinet/assets/data/sectionColNumData"; import useMenu from "@/Cabinet/hooks/useMenu"; const TopNavContainer: React.FC = () => { @@ -14,8 +12,6 @@ const TopNavContainer: React.FC = () => { ); const buildingsList = useRecoilValue>(buildingsState); const { toggleLeftNav } = useMenu(); - const navigator = useNavigate(); - const isLocation = useLocation(); const onClickLogo = () => { toggleLeftNav(); @@ -26,13 +22,6 @@ const TopNavContainer: React.FC = () => { setCurrentBuildingName(buildingsList[0]); }, [buildingsList]); - useEffect(() => { - if (currentBuildingName === undefined) return; - else if (currentBuildingName === staticColNumData[0].building) { - navigator(isLocation); - } - }, [currentBuildingName]); - return ( Date: Thu, 21 Nov 2024 15:14:47 +0900 Subject: [PATCH 83/89] =?UTF-8?q?[FE]=20REFACTOR:=204=EC=B8=B5=20DISABLED?= =?UTF-8?q?=5FFLOOR=20=ED=99=98=EA=B2=BD=EB=B3=80=EC=88=98=EB=A1=9C=20?= =?UTF-8?q?=EC=B2=98=EB=A6=AC=20#1703?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../CabinetList/CabinetList.container.tsx | 7 ++++--- .../components/LeftNav/LeftMainNav/LeftMainNav.tsx | 3 ++- .../LeftNav/LeftSectionNav/LeftSectionNav.tsx | 3 ++- .../MapFloorSelectOption/MapFloorSelectOption.tsx | 3 ++- frontend/src/Cabinet/components/MapInfo/MapInfo.tsx | 13 ++++++++++--- frontend/src/Cabinet/pages/AvailablePage.tsx | 1 - 6 files changed, 20 insertions(+), 10 deletions(-) diff --git a/frontend/src/Cabinet/components/CabinetList/CabinetList.container.tsx b/frontend/src/Cabinet/components/CabinetList/CabinetList.container.tsx index bf5b4ede3..89ebca973 100644 --- a/frontend/src/Cabinet/components/CabinetList/CabinetList.container.tsx +++ b/frontend/src/Cabinet/components/CabinetList/CabinetList.container.tsx @@ -9,6 +9,7 @@ import { currentSectionCabinetState, currentSectionColNumState, } from "@/Cabinet/recoil/selectors"; +import { DISABLED_FLOOR } from "@/Cabinet/pages/AvailablePage"; import CabinetList from "@/Cabinet/components/CabinetList/CabinetList"; import EmptySection from "@/Cabinet/components/CabinetList/EmptySection/EmptySection"; import RealViewNotification from "@/Cabinet/components/CabinetList/RealViewNotification/RealViewNotification"; @@ -51,11 +52,11 @@ const CabinetListContainer = ({ /> )} - {currentFloorSectionNames.includes(currentSectionName) && (currentFloor !== 4) && ( + {currentFloorSectionNames.includes(currentSectionName) && !(DISABLED_FLOOR.includes(currentFloor.toString())) && ( )} - {(!isAdmin && currentFloor === 4) ? ( - + {(!isAdmin && DISABLED_FLOOR.includes(currentFloor.toString())) ? ( + ) : ( <> {floors && floors.map((floor, index) => - !(!isAdmin && floor === 4) ? ( + !(!isAdmin && DISABLED_FLOOR.includes(floor.toString())) ? ( void }) => { {!isAdmin && !isClubSection && - currentFloorNumber !== 4 && + !DISABLED_FLOOR.includes(currentFloorNumber.toString()) && (section.alarmRegistered ? ( ) : ( diff --git a/frontend/src/Cabinet/components/MapInfo/MapFloorSelectOption/MapFloorSelectOption.tsx b/frontend/src/Cabinet/components/MapInfo/MapFloorSelectOption/MapFloorSelectOption.tsx index 9245bfc5b..9e7040198 100644 --- a/frontend/src/Cabinet/components/MapInfo/MapFloorSelectOption/MapFloorSelectOption.tsx +++ b/frontend/src/Cabinet/components/MapInfo/MapFloorSelectOption/MapFloorSelectOption.tsx @@ -1,4 +1,5 @@ import styled from "styled-components"; +import { DISABLED_FLOOR } from "@/Cabinet/pages/AvailablePage"; const MapFloorSelectOption: React.FC<{ selectFloor: Function; @@ -7,7 +8,7 @@ const MapFloorSelectOption: React.FC<{ return ( {floorInfo.map((info, idx) => ( - (info !== 4) && + !(DISABLED_FLOOR.includes(info.toString())) && selectFloor(info)} diff --git a/frontend/src/Cabinet/components/MapInfo/MapInfo.tsx b/frontend/src/Cabinet/components/MapInfo/MapInfo.tsx index 1259ed0c6..0ffc4c014 100644 --- a/frontend/src/Cabinet/components/MapInfo/MapInfo.tsx +++ b/frontend/src/Cabinet/components/MapInfo/MapInfo.tsx @@ -1,7 +1,9 @@ import styled from "styled-components"; import MapFloorSelect from "@/Cabinet/components/MapInfo/MapFloorSelect/MapFloorSelect"; import MapGrid from "@/Cabinet/components/MapInfo/MapGrid/MapGrid"; +import { DISABLED_FLOOR } from "@/Cabinet/pages/AvailablePage"; +const DEFAULT_FLOOR = 2; const MapInfo = ({ touchStart, touchEnd, @@ -12,11 +14,16 @@ const MapInfo = ({ }: { touchStart: React.TouchEventHandler; touchEnd: React.TouchEventHandler; - floor: number; + floor: number | undefined; setFloor: React.Dispatch>; floorInfo: number[]; closeMap: React.MouseEventHandler; }) => { + const currentFloor = floor ?? DEFAULT_FLOOR; + const validFloor = DISABLED_FLOOR.includes(currentFloor.toString()) + ? DEFAULT_FLOOR + : currentFloor; + return ( - - + + ); }; diff --git a/frontend/src/Cabinet/pages/AvailablePage.tsx b/frontend/src/Cabinet/pages/AvailablePage.tsx index 9ec0be173..005484fbe 100644 --- a/frontend/src/Cabinet/pages/AvailablePage.tsx +++ b/frontend/src/Cabinet/pages/AvailablePage.tsx @@ -29,7 +29,6 @@ const toggleList: toggleItem[] = [ { name: "공유", key: AvailableCabinetsType.SHARE }, ]; -/* TODO: DISABLED_FLOOR 을 환경변수로 넣기 */ export const DISABLED_FLOOR = ["4"]; const AvailablePage = () => { From 51e0b66e8ca36fb20e7d99da67d03e2808488366 Mon Sep 17 00:00:00 2001 From: jnkeniaem Date: Fri, 22 Nov 2024 18:42:42 +0900 Subject: [PATCH 84/89] =?UTF-8?q?[FE]=20ETC:=20Sentry=20traces=20sample,?= =?UTF-8?q?=20error=20replay=20sample=20=EB=B9=84=EC=9C=A8=20=EC=83=81?= =?UTF-8?q?=ED=96=A5=20#1709?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- frontend/src/main.tsx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/frontend/src/main.tsx b/frontend/src/main.tsx index 7de2f2301..a8de74500 100644 --- a/frontend/src/main.tsx +++ b/frontend/src/main.tsx @@ -38,7 +38,7 @@ Sentry.init({ // Set tracesSampleRate to 1.0 to capture 100% // of transactions for tracing. - tracesSampleRate: 0.05, + tracesSampleRate: 1.0, // Set `tracePropagationTargets` to control for which URLs trace propagation should be enabled // tracePropagationTargets: [/^\//, /^https:\/\/yourserver\.io\/api/], @@ -52,8 +52,8 @@ Sentry.init({ // Capture Replay for 100% of all sessions, // plus for 100% of sessions with an error - replaysSessionSampleRate: 0.2, - replaysOnErrorSampleRate: 0.2, + replaysSessionSampleRate: 0.1, + replaysOnErrorSampleRate: 1.0, }); ReactDOM.createRoot(document.getElementById("root") as HTMLElement).render( From 2e6347dfcec03c17f17fa4f2dc2c948f8db35695 Mon Sep 17 00:00:00 2001 From: seonmiki Date: Fri, 22 Nov 2024 19:25:35 +0900 Subject: [PATCH 85/89] =?UTF-8?q?[FE]=20REFACTOR:=204=EC=B8=B5=20DISABLED?= =?UTF-8?q?=5FFLOOR=20=ED=99=98=EA=B2=BD=EB=B3=80=EC=88=98=20=EB=B9=A0?= =?UTF-8?q?=EC=A7=84=20=EB=B6=80=EB=B6=84=20=EC=B6=94=EA=B0=80=EC=88=98?= =?UTF-8?q?=EC=A0=95=20#1703?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- frontend/src/Cabinet/pages/AvailablePage.tsx | 1 + frontend/src/Cabinet/pages/MainPage.tsx | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/frontend/src/Cabinet/pages/AvailablePage.tsx b/frontend/src/Cabinet/pages/AvailablePage.tsx index 005484fbe..9ec0be173 100644 --- a/frontend/src/Cabinet/pages/AvailablePage.tsx +++ b/frontend/src/Cabinet/pages/AvailablePage.tsx @@ -29,6 +29,7 @@ const toggleList: toggleItem[] = [ { name: "공유", key: AvailableCabinetsType.SHARE }, ]; +/* TODO: DISABLED_FLOOR 을 환경변수로 넣기 */ export const DISABLED_FLOOR = ["4"]; const AvailablePage = () => { diff --git a/frontend/src/Cabinet/pages/MainPage.tsx b/frontend/src/Cabinet/pages/MainPage.tsx index ce6e230c9..0901deb30 100644 --- a/frontend/src/Cabinet/pages/MainPage.tsx +++ b/frontend/src/Cabinet/pages/MainPage.tsx @@ -155,7 +155,7 @@ const MainPage = () => { {currentSectionName !== SectionType.elevator && currentSectionName !== SectionType.stairs && - currentFloor !== 4 && ( + !DISABLED_FLOOR.includes(currentFloor.toString()) && ( Date: Fri, 22 Nov 2024 22:21:58 +0900 Subject: [PATCH 86/89] =?UTF-8?q?[FE]=20FIX:=20=EA=B9=A8=EC=A7=80=EB=8A=94?= =?UTF-8?q?=20=EA=B8=80=EC=9E=90=20text=20=EC=86=8D=EC=84=B1=EA=B0=92?= =?UTF-8?q?=EC=9C=BC=EB=A1=9C=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- frontend/src/index.css | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/frontend/src/index.css b/frontend/src/index.css index 1c5a648fc..7d06409b8 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=새롬관로그인중수요지식회여기엔사물함이없어4층은현재용불가입니다!"); @import url("https://fonts.googleapis.com/css2?family=Noto+Sans+KR:wght@300;400;700&display=swap"); :root { @@ -224,6 +224,7 @@ input { -ms-overflow-style: none; scrollbar-width: none; } + .noScrollbar::-webkit-scrollbar { display: none; } @@ -254,4 +255,4 @@ input { .domainButtonActive { color: var(--sys-main-color) !important; -} +} \ No newline at end of file From b8f7712bac5ef729df13f9df581905f3d3163732 Mon Sep 17 00:00:00 2001 From: jnkeniaem Date: Tue, 26 Nov 2024 17:03:02 +0900 Subject: [PATCH 87/89] =?UTF-8?q?[FE]=20ETC:=20firebase=20messaging=20?= =?UTF-8?q?=EB=B8=8C=EB=9D=BC=EC=9A=B0=EC=A0=80=20=EC=A7=80=EC=9B=90=20?= =?UTF-8?q?=EC=97=AC=EB=B6=80=20=ED=99=95=EC=9D=B8=EC=95=88=ED=95=A0?= =?UTF-8?q?=EB=95=8C=20=EB=8F=99=EC=9E=91=20=ED=99=95=EC=9D=B8=EC=9A=A9=20?= =?UTF-8?q?=EC=BD=94=EB=93=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Cabinet/firebase/firebase-messaging-sw.ts | 48 ++++++++++--------- 1 file changed, 26 insertions(+), 22 deletions(-) diff --git a/frontend/src/Cabinet/firebase/firebase-messaging-sw.ts b/frontend/src/Cabinet/firebase/firebase-messaging-sw.ts index fdab56028..0509f1301 100644 --- a/frontend/src/Cabinet/firebase/firebase-messaging-sw.ts +++ b/frontend/src/Cabinet/firebase/firebase-messaging-sw.ts @@ -24,32 +24,33 @@ let messaging: null | Messaging = null; let isApiSupported = false; // NOTE : 사용자 브라우저가 푸시 알림 기능을 지원하는지 확인 -isSupported().then((result) => { - isApiSupported = result; - if ( - typeof window !== "undefined" && - typeof window.navigator !== "undefined" && - isApiSupported - ) { - messaging = getMessaging(app); - } -}); +// isSupported().then((result) => { +// isApiSupported = result; +// if ( +// typeof window !== "undefined" && +// typeof window.navigator !== "undefined" && +// isApiSupported +// ) { +// messaging = getMessaging(app); +// } +// }); +messaging = getMessaging(app); const unsupportedMsg = `사용 중인 환경에서는 푸시 알림 기능이 지원되지 않습니다. 데스크탑 이용을 권장드립니다.`; -const checkBrowserSupport = () => { - if (!isApiSupported) { - let error = new Error(unsupportedMsg); - error.name = "브라우저 알림 지원 제한"; - throw error; - } -}; +// const checkBrowserSupport = () => { +// if (!isApiSupported) { +// let error = new Error(unsupportedMsg); +// error.name = "브라우저 알림 지원 제한"; +// throw error; +// } +// }; // FCM APP을 등록 후 브라우저 알림 권한을 요청하고, 토큰을 반환 export const requestFcmAndGetDeviceToken = async (): Promise => { - checkBrowserSupport(); + // checkBrowserSupport(); console.log("권한 요청 중..."); const permission = await Notification.requestPermission(); @@ -60,14 +61,16 @@ export const requestFcmAndGetDeviceToken = async (): Promise => { console.log("알림 권한이 허용됨"); - const token = await getToken(messaging!, { + // 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) => { + onMessage(messaging, (payload) => { console.log("메시지가 도착했습니다.", payload); // ... }); @@ -77,8 +80,9 @@ export const requestFcmAndGetDeviceToken = async (): Promise => { // FCM 토큰 제거 및 브라우저 알람 권한 해제 export const deleteFcmToken = async (): Promise => { - checkBrowserSupport(); + // checkBrowserSupport(); - await deleteToken(messaging!); + // await deleteToken(messaging!); + await deleteToken(messaging); console.log("Token deleted."); }; From 045785f1e19fde2397bc92c65a56faf8035c075e Mon Sep 17 00:00:00 2001 From: jnkeniaem Date: Tue, 26 Nov 2024 17:22:35 +0900 Subject: [PATCH 88/89] =?UTF-8?q?[FE]=20ETC:=20firebase=20messaging=20?= =?UTF-8?q?=EA=B4=80=EB=A0=A8=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=ED=9B=84=20?= =?UTF-8?q?=EC=BD=94=EB=93=9C=20=EC=9B=90=EB=9E=98=EB=8C=80=EB=A1=9C=20?= =?UTF-8?q?=EB=B3=B5=EA=B5=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Cabinet/firebase/firebase-messaging-sw.ts | 48 +++++++++---------- 1 file changed, 22 insertions(+), 26 deletions(-) diff --git a/frontend/src/Cabinet/firebase/firebase-messaging-sw.ts b/frontend/src/Cabinet/firebase/firebase-messaging-sw.ts index 0509f1301..fdab56028 100644 --- a/frontend/src/Cabinet/firebase/firebase-messaging-sw.ts +++ b/frontend/src/Cabinet/firebase/firebase-messaging-sw.ts @@ -24,33 +24,32 @@ let messaging: null | Messaging = null; let isApiSupported = false; // NOTE : 사용자 브라우저가 푸시 알림 기능을 지원하는지 확인 -// isSupported().then((result) => { -// isApiSupported = result; -// if ( -// typeof window !== "undefined" && -// typeof window.navigator !== "undefined" && -// isApiSupported -// ) { -// messaging = getMessaging(app); -// } -// }); -messaging = getMessaging(app); +isSupported().then((result) => { + isApiSupported = result; + if ( + typeof window !== "undefined" && + typeof window.navigator !== "undefined" && + isApiSupported + ) { + messaging = getMessaging(app); + } +}); const unsupportedMsg = `사용 중인 환경에서는 푸시 알림 기능이 지원되지 않습니다. 데스크탑 이용을 권장드립니다.`; -// const checkBrowserSupport = () => { -// if (!isApiSupported) { -// let error = new Error(unsupportedMsg); -// error.name = "브라우저 알림 지원 제한"; -// throw error; -// } -// }; +const checkBrowserSupport = () => { + if (!isApiSupported) { + let error = new Error(unsupportedMsg); + error.name = "브라우저 알림 지원 제한"; + throw error; + } +}; // FCM APP을 등록 후 브라우저 알림 권한을 요청하고, 토큰을 반환 export const requestFcmAndGetDeviceToken = async (): Promise => { - // checkBrowserSupport(); + checkBrowserSupport(); console.log("권한 요청 중..."); const permission = await Notification.requestPermission(); @@ -61,16 +60,14 @@ export const requestFcmAndGetDeviceToken = async (): Promise => { console.log("알림 권한이 허용됨"); - // const token = await getToken(messaging!, { - 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) => { + onMessage(messaging!, (payload) => { console.log("메시지가 도착했습니다.", payload); // ... }); @@ -80,9 +77,8 @@ export const requestFcmAndGetDeviceToken = async (): Promise => { // FCM 토큰 제거 및 브라우저 알람 권한 해제 export const deleteFcmToken = async (): Promise => { - // checkBrowserSupport(); + checkBrowserSupport(); - // await deleteToken(messaging!); - await deleteToken(messaging); + await deleteToken(messaging!); console.log("Token deleted."); }; From 94639fda656302b6e347feb03e1084aa8e07ea6b Mon Sep 17 00:00:00 2001 From: jeekim <80810728+jnkeniaem@users.noreply.github.com> Date: Tue, 3 Dec 2024 14:45:26 +0900 Subject: [PATCH 89/89] =?UTF-8?q?[COMMON]=20DOCS:=20readme=EC=97=90=20?= =?UTF-8?q?=EC=88=98=EC=83=81=20=EB=82=B4=EC=97=AD=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/README.md b/README.md index 245ff01e0..7bbf0f042 100644 --- a/README.md +++ b/README.md @@ -40,6 +40,12 @@ - https://cabi.oopy.io/d208e0c9-1022-4c88-be6d-94f191899111 +### 수상 내역 🏆 + +- 이노베이션아카데미 성과 공유 컨퍼런스 2024 **과학기술정보통신부 장관상(🥇대상)** 수상 (2024) +- 이노베이션아카데미 성과 공유 컨퍼런스 2023 **정보통신기획평가원 원장상(🥈최우수상)** 수상 (2023) +- 이노베이션아카데미 성과 공유 컨퍼런스 2022 **이노베이션 아카데미 학장상(🥉우수상)** 수상 (2022) + ### 기술적 도전 - 지속할 수 있고, 확장할 수 있는 서비스를 지향하고, 한정된 자원으로 **증가하는 사용자**들에게 양질의 서비스를 제공하기 위해 **Cabi 팀**은 다음과 같이 노력했습니다: