From abd50f4979c266eae73c62db45d1753b1832fbbf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=A0=95=ED=98=84=EC=A1=B0?= Date: Tue, 8 Oct 2024 09:20:44 +0900 Subject: [PATCH 1/3] =?UTF-8?q?Feat:=20=ED=91=B8=ED=84=B0=20=EA=B0=9C?= =?UTF-8?q?=EC=9D=B8=EC=A0=95=EB=B3=B4=EC=B2=98=EB=A6=AC=EB=B0=A9=EC=B9=A8?= =?UTF-8?q?,=20=EC=84=9C=EB=B9=84=EC=8A=A4=20=EC=95=BD=EA=B4=80=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 --- frontend/src/components/Footer/Modal.tsx | 31 ++++++ frontend/src/components/Footer/index.tsx | 129 ++++++++++++++++++++++- 2 files changed, 157 insertions(+), 3 deletions(-) create mode 100644 frontend/src/components/Footer/Modal.tsx diff --git a/frontend/src/components/Footer/Modal.tsx b/frontend/src/components/Footer/Modal.tsx new file mode 100644 index 0000000..3424e9a --- /dev/null +++ b/frontend/src/components/Footer/Modal.tsx @@ -0,0 +1,31 @@ +import { Dialog, DialogContent, DialogOverlay, DialogTitle, DialogClose } from '@radix-ui/react-dialog'; +import { X } from 'lucide-react'; + +interface ModalProps { + title: string; + content: React.ReactNode; + open: boolean; + onClose: () => void; +} + +export default function Modal({ title, content, open, onClose }: ModalProps) { + return ( + + + +
+ {title} + + + +
+
{content}
+
+
+ ); +} diff --git a/frontend/src/components/Footer/index.tsx b/frontend/src/components/Footer/index.tsx index 4459e8f..edf63d6 100644 --- a/frontend/src/components/Footer/index.tsx +++ b/frontend/src/components/Footer/index.tsx @@ -1,14 +1,18 @@ import * as React from 'react'; +import Modal from './Modal'; import { cn } from '@/lib/utils'; - export interface FooterProps extends React.HTMLAttributes {} export default function Footer({ className, ...props }: FooterProps) { + const [isTermsOpen, setIsTermsOpen] = React.useState(false); + const [isPrivacyOpen, setIsPrivacyOpen] = React.useState(false); + return (
+ {' '}
@@ -16,12 +20,131 @@ export default function Footer({ className, ...props }: FooterProps) {

Copyright © 2024 WorLabel All rights reserved

-
서비스 이용약관
+
-
개인정보 처리방침
+
+ {/* Terms of Service Modal */} + +

+ 제1조 목적 +

+

+ 이 약관은 WorLabel(이하 "회사")이 제공하는 모든 서비스(이하 "서비스")의 이용과 관련된 사항을 규정하는 것을 + 목적으로 합니다. +

+
+

+ 제2조 정의 +

+

+ 1. "서비스"란 회사가 제공하는 모든 온라인 콘텐츠와 기능을 의미합니다. +
+ 2. "회원"이란 회사의 서비스에 접속하여 본 약관에 동의한 자를 말합니다. +

+
+

+ 제3조 약관의 효력 및 변경 +

+

+ 1. 본 약관은 서비스 화면에 공지되며, 회원이 약관에 동의한 시점부터 효력이 발생합니다. +
+ 2. 회사는 필요에 따라 본 약관을 변경할 수 있으며, 변경된 약관은 서비스 화면에 공지됩니다. +

+
+

+ 제4조 서비스 이용 +

+

+ 1. 회원은 회사가 제공하는 서비스를 본 약관에 따라 이용할 수 있습니다. +
+ 2. 회사는 서비스의 운영 또는 기술적 필요에 따라 서비스의 전부 또는 일부를 변경할 수 있습니다. +

+
+

+ 제5조 회원의 의무 +

+

+ 1. 회원은 서비스 이용 시 본 약관을 준수해야 하며, 법령을 위반하는 행위를 해서는 안 됩니다. +
+ 2. 회원은 타인의 개인정보를 침해하거나, 서비스의 안정적 운영을 방해하는 행위를 해서는 안 됩니다. +

+ + } + open={isTermsOpen} + onClose={() => setIsTermsOpen(false)} + /> + {/* Privacy Policy Modal */} + +

+ 제1조 수집하는 개인정보의 항목 +

+

+ 1. 회사는 서비스 제공을 위해 필요한 최소한의 개인정보를 수집합니다. +
+ 2. 수집하는 개인정보 항목은 다음과 같습니다: 이름, 이메일, 서비스 이용 기록, 접속 로그, 쿠키 등. +

+
+

+ 제2조 개인정보의 수집 및 이용 목적 +

+

+ 1. 회사는 다음의 목적을 위해 개인정보를 수집 및 이용합니다: +
+ - 회원관리, 서비스 제공, 계약 이행 및 요금 정산. +
+ 2. 서비스 개선 및 맞춤형 서비스 제공을 위해 활용될 수 있습니다. +

+
+

+ 제3조 개인정보의 보유 및 이용 기간 +

+

+ 1. 회원의 개인정보는 회원 탈퇴 시 지체 없이 파기됩니다. +
+ 2. 단, 관계 법령에 따라 일정 기간 보관해야 하는 경우 해당 기간 동안 보유합니다. +

+
+

+ 제4조 개인정보의 제3자 제공 +

+

+ 1. 회사는 원칙적으로 회원의 동의 없이 개인정보를 외부에 제공하지 않습니다. +
+ 2. 다만, 법령에 의해 요구되는 경우나 회원의 사전 동의를 받은 경우에 한해 제공됩니다. +

+
+

+ 제5조 회원의 권리와 행사 방법 +

+

+ 1. 회원은 언제든지 자신의 개인정보를 조회하거나 수정할 수 있으며, 개인정보의 삭제를 요청할 수 있습니다. +
+ 2. 회원은 개인정보의 처리에 관한 동의를 철회할 수 있습니다. +

+ + } + open={isPrivacyOpen} + onClose={() => setIsPrivacyOpen(false)} + />
); } From fc31e0a3f9bb1d23bfb44e7288ff03347e8265c8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=A0=95=ED=98=84=EC=A1=B0?= Date: Tue, 8 Oct 2024 09:23:36 +0900 Subject: [PATCH 2/3] =?UTF-8?q?Design:=20=EB=B2=84=ED=8A=BC=20=EC=9C=84?= =?UTF-8?q?=EC=B9=98=20=EA=B5=AC=EA=B8=80=20=EB=A1=9C=EA=B7=B8=EC=9D=B8=20?= =?UTF-8?q?=EB=B2=84=ED=8A=BC=EA=B3=BC=20=EB=A7=9E=EC=B6=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- frontend/src/pages/Home.tsx | 1 - 1 file changed, 1 deletion(-) diff --git a/frontend/src/pages/Home.tsx b/frontend/src/pages/Home.tsx index c8c0498..14be38c 100644 --- a/frontend/src/pages/Home.tsx +++ b/frontend/src/pages/Home.tsx @@ -42,7 +42,6 @@ export default function Home() { asChild variant="blue" size="lg" - className="mt-8" > 시작하기 From 7848a3cc8ed5366e762b8d51ae54043f36fd81ad Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=A0=95=ED=98=84=EC=A1=B0?= Date: Tue, 8 Oct 2024 09:52:00 +0900 Subject: [PATCH 3/3] =?UTF-8?q?Fix:=20=EC=97=85=EB=A1=9C=EB=93=9C=20?= =?UTF-8?q?=ED=8D=BC=EC=84=BC=ED=8A=B8=20=EB=B3=B5=EA=B5=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- frontend/src/components/ImagePreSignedForm/index.tsx | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/frontend/src/components/ImagePreSignedForm/index.tsx b/frontend/src/components/ImagePreSignedForm/index.tsx index 4705f6a..daace94 100644 --- a/frontend/src/components/ImagePreSignedForm/index.tsx +++ b/frontend/src/components/ImagePreSignedForm/index.tsx @@ -148,8 +148,7 @@ export default function ImagePreSignedForm({ onProgress: (progress) => { setUploadStatus((prevStatus) => { const completedFiles = Math.round((progress / 100) * files.length); - const newStatus = prevStatus.map((status, index) => (index < completedFiles ? 'success' : status)); - return newStatus; + return prevStatus.map((status, index) => (index < completedFiles ? 'success' : status)); }); }, useSingleUpload: uploadType === 'file', @@ -166,7 +165,7 @@ export default function ImagePreSignedForm({ } }; - const totalProgress = Math.round((uploadStatus.filter((status) => status !== null).length / files.length) * 100); + const totalProgress = Math.round((uploadStatus.filter((status) => status === 'success').length / files.length) * 100); useEffect(() => { onFileCount(files.length);