From 6c0e520069fd7fbc0247fbc3f30b930cdd28eb7a Mon Sep 17 00:00:00 2001
From: sj0724
Date: Mon, 13 May 2024 16:42:17 +0900
Subject: [PATCH 01/23] =?UTF-8?q?feat:=20=EB=A1=9C=EA=B7=B8=EC=9D=B8=20?=
=?UTF-8?q?=ED=9A=8C=EC=9B=90=EA=B0=80=EC=9E=85=20=ED=8E=98=EC=9D=B4?=
=?UTF-8?q?=EC=A7=80=20=EC=88=98=EC=A0=95?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
components/Button/Button.styled.ts | 2 +-
components/Input/Input.styled.ts | 2 +-
components/Input/Input.tsx | 6 ++--
components/SignForm/SignForm.styled.ts | 23 --------------
components/SignForm/SignForm.tsx | 20 ------------
hooks/useValidate.ts | 3 +-
pages/signin.tsx | 34 +++++++++++++++------
pages/signup.tsx | 42 ++++++++++++++++++--------
styles/signin.styled.ts | 13 ++++----
9 files changed, 66 insertions(+), 79 deletions(-)
delete mode 100644 components/SignForm/SignForm.styled.ts
delete mode 100644 components/SignForm/SignForm.tsx
diff --git a/components/Button/Button.styled.ts b/components/Button/Button.styled.ts
index 0bf173229..f63a1270d 100644
--- a/components/Button/Button.styled.ts
+++ b/components/Button/Button.styled.ts
@@ -8,7 +8,7 @@ const buttonSize = {
lg: '40',
};
-export const Cta = styled.span`
+export const Cta = styled.button`
cursor: pointer;
text-decoration: none;
display: flex;
diff --git a/components/Input/Input.styled.ts b/components/Input/Input.styled.ts
index 5cdb80a6e..a455a9843 100644
--- a/components/Input/Input.styled.ts
+++ b/components/Input/Input.styled.ts
@@ -15,7 +15,7 @@ const InputModal = styled.input`
align-items: center;
border-radius: 0.8rem;
border: 1px solid
- var(${({ error }) => (error ? '--ErrorMessage' : '--Linkbrary-gray20')});
+ var(${({ $error }) => ($error ? '--ErrorMessage' : '--Linkbrary-gray20')});
background: var(--Section-white);
font-size: 1.6rem;
line-height: 2.4rem;
diff --git a/components/Input/Input.tsx b/components/Input/Input.tsx
index 50bfe8489..1807585d7 100644
--- a/components/Input/Input.tsx
+++ b/components/Input/Input.tsx
@@ -4,11 +4,11 @@ import InputModal from './Input.styled';
export interface InputProps extends HtmlHTMLAttributes {
type: string;
onChange: (e: ChangeEvent) => void;
- error: string;
+ $error: string;
size: 'sm' | 'md' | 'lg';
}
-function Input({ id, placeholder, type, onChange, error, size }: InputProps) {
+function Input({ id, placeholder, type, onChange, $error, size }: InputProps) {
return (
<>
>
diff --git a/components/SignForm/SignForm.styled.ts b/components/SignForm/SignForm.styled.ts
deleted file mode 100644
index f1bfc61a9..000000000
--- a/components/SignForm/SignForm.styled.ts
+++ /dev/null
@@ -1,23 +0,0 @@
-import styled from 'styled-components';
-
-export const SignForm = styled.form`
- display: flex;
- flex-direction: column;
- justify-content: flex-start;
-`;
-
-export const LoginButton = styled.button`
- width: 40rem;
- margin-top: 1rem;
- padding: 1.6rem 2rem;
- border: none;
- border-radius: 0.8rem;
- background: var(--Gradient-purpleblue-to-skyblue);
- color: var(--Gray-cta);
- font-family: Pretendard;
- font-size: 1.8rem;
- font-style: normal;
- font-weight: 600;
- line-height: normal;
- cursor: pointer;
-`;
diff --git a/components/SignForm/SignForm.tsx b/components/SignForm/SignForm.tsx
deleted file mode 100644
index 34bc0a32f..000000000
--- a/components/SignForm/SignForm.tsx
+++ /dev/null
@@ -1,20 +0,0 @@
-import { FormEvent, ReactNode } from 'react';
-import * as S from './SignForm.styled';
-import { Button } from '../Button/Button';
-
-function SignForm({ children }: { children: ReactNode }) {
- const submitForm = (e: FormEvent) => {
- e.preventDefault();
- };
-
- return (
-
- {children}
-
-
- );
-}
-
-export default SignForm;
diff --git a/hooks/useValidate.ts b/hooks/useValidate.ts
index b67f8e3a4..848ec2350 100644
--- a/hooks/useValidate.ts
+++ b/hooks/useValidate.ts
@@ -2,7 +2,7 @@ import { useState } from 'react';
import { emailCheck } from '@/util/util';
function useValidate() {
- const [ok, setOk] = useState(true);
+ const [ok, setOk] = useState(false);
const [textError, setTextError] = useState('');
const [emailError, setEmailError] = useState('');
const [passwordError, setPasswordError] = useState('');
@@ -13,7 +13,6 @@ function useValidate() {
setOk(false);
setTextError('내용을 다시 입력해주세요');
} else {
- setOk(false);
setTextError('');
}
};
diff --git a/pages/signin.tsx b/pages/signin.tsx
index 41526d41c..6257acbb4 100644
--- a/pages/signin.tsx
+++ b/pages/signin.tsx
@@ -1,30 +1,43 @@
import * as S from '@/styles/signin.styled';
-import SignForm from '@/components/SignForm/SignForm';
-import { ChangeEvent, useState } from 'react';
+import { ChangeEvent, FormEvent, useState } from 'react';
import useValidate from '@/hooks/useValidate';
import Input from '@/components/Input/Input';
import Link from 'next/link';
import Image from 'next/image';
+import { Button } from '@/components/Button/Button';
function SignIn() {
const [textHidden, setTextHidden] = useState(true);
const [emailValue, setEmailValue] = useState('');
const [passwordValue, setPasswordValue] = useState('');
- const { emailError, passwordError, validateEmail, validatePassword } =
+ const { ok, emailError, passwordError, validateEmail, validatePassword } =
useValidate();
+ const submitForm = (e: FormEvent) => {
+ e.preventDefault();
+ if (emailValue && passwordValue) {
+ if (ok) {
+ console.log('ok');
+ } else {
+ console.log('no');
+ }
+ } else {
+ alert('값을 입력하지 않았습니다! 다시 확인해주세요!');
+ }
+ };
+
const hiddenText = () => {
setTextHidden(!textHidden);
};
const changeEmailInput = (e: ChangeEvent) => {
setEmailValue(e.target.value);
- validateEmail(emailValue);
+ validateEmail(e.target.value);
};
const changePasswordInput = (e: ChangeEvent) => {
setPasswordValue(e.target.value);
- validatePassword(passwordValue);
+ validatePassword(e.target.value);
};
return (
@@ -42,7 +55,7 @@ function SignIn() {
-
+
@@ -64,7 +77,7 @@ function SignIn() {
id="password"
placeholder="비밀번호"
onChange={changePasswordInput}
- error={passwordError}
+ $error={passwordError}
size="md"
/>
@@ -74,7 +87,10 @@ function SignIn() {
{passwordError}
)}
-
+
+
소셜 로그인
diff --git a/pages/signup.tsx b/pages/signup.tsx
index de2009087..02600c0e6 100644
--- a/pages/signup.tsx
+++ b/pages/signup.tsx
@@ -1,10 +1,10 @@
import * as S from '@/styles/signin.styled';
-import SignForm from '@/components/SignForm/SignForm';
-import { ChangeEvent, useState } from 'react';
+import { ChangeEvent, FormEvent, useState } from 'react';
import useValidate from '@/hooks/useValidate';
import Input from '@/components/Input/Input';
import Link from 'next/link';
import Image from 'next/image';
+import { Button } from '@/components/Button/Button';
function SignUp() {
const [textHidden, setTextHidden] = useState(true);
@@ -12,6 +12,7 @@ function SignUp() {
const [passwordValue, setPasswordValue] = useState('');
const [confirmValue, setConfirmValue] = useState('');
const {
+ ok,
emailError,
passwordError,
passwordConfirmError,
@@ -20,23 +21,36 @@ function SignUp() {
validatePasswordConfirm,
} = useValidate();
+ const submitForm = (e: FormEvent) => {
+ e.preventDefault();
+ if (emailValue && passwordValue && confirmValue) {
+ if (ok) {
+ console.log('ok');
+ } else {
+ console.log('no');
+ }
+ } else {
+ alert('값을 입력하지 않았습니다! 다시 확인해주세요!');
+ }
+ };
+
const hiddenText = () => {
setTextHidden(!textHidden);
};
const changeEmailInput = (e: ChangeEvent) => {
setEmailValue(e.target.value);
- validateEmail(emailValue);
+ validateEmail(e.target.value);
};
const changePasswordInput = (e: ChangeEvent) => {
setPasswordValue(e.target.value);
- validatePassword(passwordValue);
+ validatePassword(e.target.value);
};
const changeConfirmInput = (e: ChangeEvent) => {
setConfirmValue(e.target.value);
- validatePasswordConfirm(confirmValue, passwordValue);
+ validatePasswordConfirm(e.target.value, passwordValue);
};
return (
@@ -49,12 +63,12 @@ function SignUp() {
이미 회원이신가요?
-
+
로그인하기
-
+
@@ -76,7 +90,7 @@ function SignUp() {
id="password"
placeholder="비밀번호"
onChange={changePasswordInput}
- error={passwordError}
+ $error={passwordError}
size="md"
/>
@@ -86,15 +100,14 @@ function SignUp() {
{passwordError}
)}
-
@@ -104,7 +117,10 @@ function SignUp() {
{passwordConfirmError}
)}
-
+
+
다른 방식으로 가입하기
diff --git a/styles/signin.styled.ts b/styles/signin.styled.ts
index 50e48a1c7..8b382c180 100644
--- a/styles/signin.styled.ts
+++ b/styles/signin.styled.ts
@@ -36,13 +36,6 @@ export const FormLogo = styled.div`
margin: 0 auto;
`;
-export const SignForm = styled.form`
- display: flex;
- flex-direction: column;
- justify-content: flex-start;
- gap: 2.4rem;
-`;
-
export const Question = styled.div`
display: flex;
align-items: center;
@@ -156,3 +149,9 @@ export const TextArea = styled.div`
display: flex;
align-items: center;
`;
+
+export const SignForm = styled.form`
+ display: flex;
+ flex-direction: column;
+ justify-content: flex-start;
+`;
From 350499f9a6623e523348dfabe446f35b921f1fa6 Mon Sep 17 00:00:00 2001
From: sj0724
Date: Mon, 13 May 2024 16:59:26 +0900
Subject: [PATCH 02/23] =?UTF-8?q?feat:=20=EC=9C=A0=EC=A0=80=20id=EC=A0=95?=
=?UTF-8?q?=EB=B3=B4=20context=EB=A1=9C=20=EA=B3=B5=EC=9C=A0?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
contexts/UserContext.tsx | 3 +++
hooks/useGetFolder.ts | 4 ++--
hooks/useGetFolderList.ts | 2 +-
pages/_app.tsx | 13 +++++++++----
pages/api/api.ts | 4 ++--
pages/folder.tsx | 5 +++--
6 files changed, 20 insertions(+), 11 deletions(-)
create mode 100644 contexts/UserContext.tsx
diff --git a/contexts/UserContext.tsx b/contexts/UserContext.tsx
new file mode 100644
index 000000000..0aafff5cc
--- /dev/null
+++ b/contexts/UserContext.tsx
@@ -0,0 +1,3 @@
+import { createContext } from 'react';
+
+export const UserContext = createContext('');
diff --git a/hooks/useGetFolder.ts b/hooks/useGetFolder.ts
index 1cb42ba3f..61e3a93a7 100644
--- a/hooks/useGetFolder.ts
+++ b/hooks/useGetFolder.ts
@@ -2,7 +2,7 @@ import { useEffect, useState } from 'react';
import { getFolderList } from '../pages/api/api';
export type Link = {
- id: number;
+ id: string;
created_at: Date;
updated_at?: Date;
url: string;
@@ -14,7 +14,7 @@ export type Link = {
interface Links extends Array {}
-function useGetFolder(id: number, searchKeyword: string, folderId: number) {
+function useGetFolder(id: string, searchKeyword: string, folderId: number) {
const [linkList, setLinkList] = useState([]);
const [loading, setLoading] = useState(false);
diff --git a/hooks/useGetFolderList.ts b/hooks/useGetFolderList.ts
index cb3da7840..8bad3cd95 100644
--- a/hooks/useGetFolderList.ts
+++ b/hooks/useGetFolderList.ts
@@ -16,7 +16,7 @@ export interface Folder {
export interface Folders extends Array {}
-function useGetFolderList(userId: number) {
+function useGetFolderList(userId: string) {
const [link, setLink] = useState([]);
useEffect(() => {
diff --git a/pages/_app.tsx b/pages/_app.tsx
index 076d57d6f..38dcc3e59 100644
--- a/pages/_app.tsx
+++ b/pages/_app.tsx
@@ -1,20 +1,25 @@
import Footer from '@/components/Footer/Footer';
import Nav from '@/components/Nav/Nav';
import { ModalProvider } from '@/contexts/ModalContext';
+import { UserContext } from '@/contexts/UserContext';
import '@/styles/globals.css';
import type { AppProps } from 'next/app';
import Head from 'next/head';
export default function App({ Component, pageProps }: AppProps) {
+ const id = '1';
+
return (
<>
Linkbrary
-
-
-
-
+
+
+
+
+
+
>
);
diff --git a/pages/api/api.ts b/pages/api/api.ts
index e2df69fed..6a3f6540e 100644
--- a/pages/api/api.ts
+++ b/pages/api/api.ts
@@ -39,7 +39,7 @@ export async function getSampleFolder() {
}
}
-export async function getFolder(id: number) {
+export async function getFolder(id: string) {
try {
const { data } = await axios.get(`/users/${id}/folders`);
return data;
@@ -49,7 +49,7 @@ export async function getFolder(id: number) {
}
}
-export async function getFolderList(id: number, folderId: number) {
+export async function getFolderList(id: string, folderId: number) {
if (folderId) {
try {
const query = `/${id}/links?folderId=${folderId}`;
diff --git a/pages/folder.tsx b/pages/folder.tsx
index 4796a9bb8..f960d9826 100644
--- a/pages/folder.tsx
+++ b/pages/folder.tsx
@@ -1,4 +1,4 @@
-import { ReactNode } from 'react';
+import { ReactNode, useContext } from 'react';
import { useEffect, useRef, useState } from 'react';
import * as S from '../styles/folder.styled';
import SearchBar from '../components/SearchBar/SearchBar';
@@ -16,6 +16,7 @@ import AddfolderModal from '../components/Modal/AddFolderModal/AddFolderModal';
import DeleteLinkModal from '../components/Modal/DeleteLinkModal/DeleteLinkModal';
import ModalPortal from '../Portal';
import Image from 'next/image';
+import { UserContext } from '@/contexts/UserContext';
function FolderIcon({
image,
@@ -37,7 +38,7 @@ function FolderIcon({
}
function Folder() {
- const id = 1;
+ const id = useContext(UserContext);
const [folderId, setFolderId] = useState(0);
const [folderName, setFolderName] = useState('');
const [searchKeyword, setSearchKeyWord] = useState('');
From 979234083e23353dfb0573c9fbfef2880aecaf78 Mon Sep 17 00:00:00 2001
From: sj0724
Date: Mon, 13 May 2024 17:21:30 +0900
Subject: [PATCH 03/23] =?UTF-8?q?feat:=20=EB=A1=9C=EA=B7=B8=EC=9D=B8=20api?=
=?UTF-8?q?=EC=B6=94=EA=B0=80,=20=ED=86=A0=ED=81=B0=20=EB=A1=9C=EC=BB=AC?=
=?UTF-8?q?=EC=8A=A4=ED=86=A0=EB=A6=AC=EC=A7=80=20=EC=A0=80=EC=9E=A5?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
pages/api/api.ts | 13 +++++++++++++
pages/signin.tsx | 3 ++-
2 files changed, 15 insertions(+), 1 deletion(-)
diff --git a/pages/api/api.ts b/pages/api/api.ts
index 6a3f6540e..37b89481e 100644
--- a/pages/api/api.ts
+++ b/pages/api/api.ts
@@ -80,3 +80,16 @@ export async function getUser(id: number) {
throw error;
}
}
+
+export async function postSignIn(id: string, password: string) {
+ try {
+ const { data } = await axios.post('/sign-in', {
+ email: id,
+ password: password,
+ });
+ localStorage.setItem('token', data.data.accessToken);
+ } catch (error) {
+ console.error('Error fetching sign-in:', error);
+ throw error;
+ }
+}
diff --git a/pages/signin.tsx b/pages/signin.tsx
index 6257acbb4..671bbefe3 100644
--- a/pages/signin.tsx
+++ b/pages/signin.tsx
@@ -5,6 +5,7 @@ import Input from '@/components/Input/Input';
import Link from 'next/link';
import Image from 'next/image';
import { Button } from '@/components/Button/Button';
+import { postSignIn } from './api/api';
function SignIn() {
const [textHidden, setTextHidden] = useState(true);
@@ -17,7 +18,7 @@ function SignIn() {
e.preventDefault();
if (emailValue && passwordValue) {
if (ok) {
- console.log('ok');
+ postSignIn(emailValue, passwordValue);
} else {
console.log('no');
}
From 6e5f12b0558caa9d9329c662679f7f53fa7bf97b Mon Sep 17 00:00:00 2001
From: sj0724
Date: Mon, 13 May 2024 23:02:17 +0900
Subject: [PATCH 04/23] =?UTF-8?q?feat:=20=ED=86=A0=ED=81=B0=EC=9C=BC?=
=?UTF-8?q?=EB=A1=9C=20=EB=A1=9C=EA=B7=B8=EC=9D=B8=20=EA=B8=B0=EB=8A=A5=20?=
=?UTF-8?q?=EA=B5=AC=ED=98=84?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../Modal/AddFolderModal/AddFolderModal.tsx | 2 +-
components/Modal/EditModal/EditModal.tsx | 2 +-
components/Nav/Nav.tsx | 6 ++--
hooks/useGetUser.ts | 8 ++---
pages/_app.tsx | 29 +++++++++++++++++--
pages/api/api.ts | 8 +++--
pages/shared.tsx | 2 +-
7 files changed, 41 insertions(+), 16 deletions(-)
diff --git a/components/Modal/AddFolderModal/AddFolderModal.tsx b/components/Modal/AddFolderModal/AddFolderModal.tsx
index 7bbea7b3e..7325042be 100644
--- a/components/Modal/AddFolderModal/AddFolderModal.tsx
+++ b/components/Modal/AddFolderModal/AddFolderModal.tsx
@@ -13,7 +13,7 @@ function AddFolderModal({ onClose }: { onClose: (modalName: string) => void }) {
checkText(e.target.value)}
size="sm"
/>
diff --git a/components/Modal/EditModal/EditModal.tsx b/components/Modal/EditModal/EditModal.tsx
index 53bdaf46f..4cf6eec59 100644
--- a/components/Modal/EditModal/EditModal.tsx
+++ b/components/Modal/EditModal/EditModal.tsx
@@ -14,7 +14,7 @@ function EditModal({ onClose }: { onClose: (modalName: string) => void }) {
checkText(e.target.value)}
size="sm"
/>
diff --git a/components/Nav/Nav.tsx b/components/Nav/Nav.tsx
index 3d277e2f6..4c3c1de2b 100644
--- a/components/Nav/Nav.tsx
+++ b/components/Nav/Nav.tsx
@@ -1,6 +1,6 @@
import { Button } from '../Button/Button';
import * as S from './Nav.styled';
-import useGetUser, { User } from '../../hooks/useGetUser';
+import { User } from '../../hooks/useGetUser';
import Link from 'next/link';
function NavUser({ user }: { user: User }) {
@@ -14,9 +14,7 @@ function NavUser({ user }: { user: User }) {
);
}
-function Nav() {
- const { user } = useGetUser(1);
-
+function Nav({ user }: { user: User }) {
return (
diff --git a/hooks/useGetUser.ts b/hooks/useGetUser.ts
index 79c21a689..4f49b8e91 100644
--- a/hooks/useGetUser.ts
+++ b/hooks/useGetUser.ts
@@ -2,7 +2,7 @@ import { useEffect, useState } from 'react';
import { getUser } from '../pages/api/api';
export interface User {
- id: number;
+ id: string;
created_at: Date;
name: string;
image_source: string;
@@ -10,17 +10,17 @@ export interface User {
auth_id: string;
}
-function useGetUser(userId: number) {
+function useGetUser(accessToken: string) {
const [user, setUser] = useState();
useEffect(() => {
const loadUser = async () => {
- const response = await getUser(userId);
+ const response = await getUser(accessToken);
setUser(response[0]);
};
loadUser();
- }, [userId]);
+ }, [accessToken]);
return { user };
}
diff --git a/pages/_app.tsx b/pages/_app.tsx
index 38dcc3e59..d1d48187c 100644
--- a/pages/_app.tsx
+++ b/pages/_app.tsx
@@ -5,17 +5,40 @@ import { UserContext } from '@/contexts/UserContext';
import '@/styles/globals.css';
import type { AppProps } from 'next/app';
import Head from 'next/head';
+import { useEffect, useState } from 'react';
+import { getUser } from './api/api';
+import { User } from '@/hooks/useGetUser';
export default function App({ Component, pageProps }: AppProps) {
- const id = '1';
+ const [user, setUser] = useState({
+ id: '',
+ created_at: new Date(),
+ name: '',
+ image_source: '',
+ email: '',
+ auth_id: '',
+ });
+
+ useEffect(() => {
+ const userAccess = localStorage.getItem('token');
+ if (userAccess) {
+ const loadUser = async () => {
+ const response = await getUser(userAccess);
+ setUser(response[0]);
+ };
+ loadUser();
+ } else {
+ return;
+ }
+ }, []);
return (
<>
Linkbrary
-
-
+
+
diff --git a/pages/api/api.ts b/pages/api/api.ts
index 37b89481e..d26f0554a 100644
--- a/pages/api/api.ts
+++ b/pages/api/api.ts
@@ -71,9 +71,13 @@ export async function getFolderList(id: string, folderId: number) {
}
}
-export async function getUser(id: number) {
+export async function getUser(accessToken: string) {
try {
- const { data } = await axios.get(`/users/${id}`);
+ const { data } = await axios.get('/users', {
+ headers: {
+ Authorization: accessToken,
+ },
+ });
return data.data;
} catch (error) {
console.error('Error fetching user:', error);
diff --git a/pages/shared.tsx b/pages/shared.tsx
index e5ab8e5f8..3505b4e42 100644
--- a/pages/shared.tsx
+++ b/pages/shared.tsx
@@ -14,7 +14,7 @@ type Owner = {
};
type Link = {
- id: number;
+ id: string;
created_at: Date;
url: string;
title: string;
From babb6cb4364cca001132edebc575d00dcd702833 Mon Sep 17 00:00:00 2001
From: sj0724
Date: Tue, 14 May 2024 11:29:24 +0900
Subject: [PATCH 05/23] =?UTF-8?q?feat:=20=EB=A1=9C=EA=B7=B8=EC=9D=B8=20?=
=?UTF-8?q?=EA=B8=B0=EB=8A=A5=20=EA=B5=AC=ED=98=84?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
components/Layout/Layout.tsx | 15 ---------------
components/Nav/Nav.tsx | 2 +-
hooks/useGetFolder.ts | 34 ++++++++++++++++++----------------
hooks/useGetFolderList.ts | 12 +++++++-----
pages/_app.tsx | 2 --
pages/api/api.ts | 4 +++-
pages/signin.tsx | 2 --
styles/index.styled.ts | 1 +
8 files changed, 30 insertions(+), 42 deletions(-)
delete mode 100644 components/Layout/Layout.tsx
diff --git a/components/Layout/Layout.tsx b/components/Layout/Layout.tsx
deleted file mode 100644
index 81c990ea0..000000000
--- a/components/Layout/Layout.tsx
+++ /dev/null
@@ -1,15 +0,0 @@
-import React, { ReactNode } from 'react';
-import Footer from '../Footer/Footer';
-import Nav from '../Nav/Nav';
-
-function Layout({ children }: { children: ReactNode }) {
- return (
- <>
-
- {children}
-
- >
- );
-}
-
-export default Layout;
diff --git a/components/Nav/Nav.tsx b/components/Nav/Nav.tsx
index 4c3c1de2b..03c86659a 100644
--- a/components/Nav/Nav.tsx
+++ b/components/Nav/Nav.tsx
@@ -22,7 +22,7 @@ function Nav({ user }: { user: User }) {
- {user ? (
+ {user.id ? (
) : (
diff --git a/hooks/useGetFolder.ts b/hooks/useGetFolder.ts
index 61e3a93a7..6da6fbfd2 100644
--- a/hooks/useGetFolder.ts
+++ b/hooks/useGetFolder.ts
@@ -43,22 +43,24 @@ function useGetFolder(id: string, searchKeyword: string, folderId: number) {
};
useEffect(() => {
- try {
- setLoading(true);
- const loadFolder = async () => {
- const list = await getFolderList(id, folderId);
- if (searchKeyword) {
- const searchList = search(list);
- setLinkList(searchList);
- } else {
- setLinkList(list);
- }
- };
- loadFolder();
- setLoading(false);
- } catch (error) {
- console.error(error);
- setLoading(false);
+ if (id) {
+ try {
+ setLoading(true);
+ const loadFolder = async () => {
+ const list = await getFolderList(id, folderId);
+ if (searchKeyword) {
+ const searchList = search(list);
+ setLinkList(searchList);
+ } else {
+ setLinkList(list);
+ }
+ };
+ loadFolder();
+ setLoading(false);
+ } catch (error) {
+ console.error(error);
+ setLoading(false);
+ }
}
}, [folderId, id, searchKeyword]);
diff --git a/hooks/useGetFolderList.ts b/hooks/useGetFolderList.ts
index 8bad3cd95..460572b3f 100644
--- a/hooks/useGetFolderList.ts
+++ b/hooks/useGetFolderList.ts
@@ -20,11 +20,13 @@ function useGetFolderList(userId: string) {
const [link, setLink] = useState([]);
useEffect(() => {
- const loadFolderList = async () => {
- const links = await getFolder(userId);
- setLink(links.data);
- };
- loadFolderList();
+ if (userId) {
+ const loadFolderList = async () => {
+ const links = await getFolder(userId);
+ setLink(links.data);
+ };
+ loadFolderList();
+ }
}, [userId]);
return {
diff --git a/pages/_app.tsx b/pages/_app.tsx
index d1d48187c..b734455dd 100644
--- a/pages/_app.tsx
+++ b/pages/_app.tsx
@@ -27,8 +27,6 @@ export default function App({ Component, pageProps }: AppProps) {
setUser(response[0]);
};
loadUser();
- } else {
- return;
}
}, []);
diff --git a/pages/api/api.ts b/pages/api/api.ts
index d26f0554a..d1015ec83 100644
--- a/pages/api/api.ts
+++ b/pages/api/api.ts
@@ -92,8 +92,10 @@ export async function postSignIn(id: string, password: string) {
password: password,
});
localStorage.setItem('token', data.data.accessToken);
+ window.location.href = '/';
+ return data;
} catch (error) {
console.error('Error fetching sign-in:', error);
- throw error;
+ alert('로그인할 수 없습니다! 아이디와 비밀번호를 확인해주세요!');
}
}
diff --git a/pages/signin.tsx b/pages/signin.tsx
index 671bbefe3..723eeb575 100644
--- a/pages/signin.tsx
+++ b/pages/signin.tsx
@@ -19,8 +19,6 @@ function SignIn() {
if (emailValue && passwordValue) {
if (ok) {
postSignIn(emailValue, passwordValue);
- } else {
- console.log('no');
}
} else {
alert('값을 입력하지 않았습니다! 다시 확인해주세요!');
diff --git a/styles/index.styled.ts b/styles/index.styled.ts
index 61e312187..700938e55 100644
--- a/styles/index.styled.ts
+++ b/styles/index.styled.ts
@@ -61,6 +61,7 @@ export const Slogan_gradient = styled.span`
`;
export const Header__image = styled.div`
+ position: relative;
padding: 5rem 4rem 0 4rem;
width: 120rem;
aspect-ratio: 2;
From 97babbda586ac26a88cd94a6af86b41a8918b7df Mon Sep 17 00:00:00 2001
From: sj0724
Date: Tue, 14 May 2024 11:55:53 +0900
Subject: [PATCH 06/23] =?UTF-8?q?feat:=20=EB=A1=9C=EA=B7=B8=EC=95=84?=
=?UTF-8?q?=EC=9B=83=20=EA=B8=B0=EB=8A=A5=20=EC=B6=94=EA=B0=80?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
components/Nav/Nav.styled.ts | 30 ++++++++++++++++++++++++++++++
components/Nav/Nav.tsx | 35 +++++++++++++++++++++++++++--------
pages/index.tsx | 2 +-
3 files changed, 58 insertions(+), 9 deletions(-)
diff --git a/components/Nav/Nav.styled.ts b/components/Nav/Nav.styled.ts
index 09cf0dcd5..ab9c6794a 100644
--- a/components/Nav/Nav.styled.ts
+++ b/components/Nav/Nav.styled.ts
@@ -12,11 +12,18 @@ export const NavLogo = styled.img`
`;
export const UserProfile = styled.div`
+ position: relative;
display: flex;
align-items: center;
gap: 1rem;
`;
+export const ProfileBody = styled.div`
+ display: flex;
+ align-items: center;
+ gap: 0.8rem;
+`;
+
export const UserPicture = styled.img`
width: 2.8rem;
height: 2.8rem;
@@ -40,3 +47,26 @@ export const NavBar = styled.div`
font-size: 1.2rem;
}
`;
+
+export const ToggleMenu = styled.div`
+ padding: 1rem;
+ width: 100%;
+ height: 5rem;
+ background-color: #fff;
+ position: absolute;
+ top: 3rem;
+ display: flex;
+ flex-direction: column;
+ justify-content: center;
+ font-size: 1.2rem;
+ border-radius: 1.2rem;
+
+ p {
+ padding: 0.5rem;
+ border-radius: 0.5rem;
+ }
+
+ p:hover {
+ background-color: var(--Gray-cta);
+ }
+`;
diff --git a/components/Nav/Nav.tsx b/components/Nav/Nav.tsx
index 03c86659a..52cda6e14 100644
--- a/components/Nav/Nav.tsx
+++ b/components/Nav/Nav.tsx
@@ -2,19 +2,38 @@ import { Button } from '../Button/Button';
import * as S from './Nav.styled';
import { User } from '../../hooks/useGetUser';
import Link from 'next/link';
+import { Dispatch, useState } from 'react';
+
+function NavUser({
+ user,
+ toggle,
+ setToggle,
+}: {
+ user: User;
+ toggle: boolean;
+ setToggle: Dispatch>;
+}) {
+ const isLogout = () => {
+ localStorage.clear();
+ window.location.href = '/';
+ };
-function NavUser({ user }: { user: User }) {
return (
- <>
-
-
- {user.email}
-
- >
+
+
+ setToggle(!toggle)}>{user.email}
+ {toggle && (
+
+ 로그아웃
+
+ )}
+
);
}
function Nav({ user }: { user: User }) {
+ const [toggleNav, setToggleNav] = useState(false);
+
return (
@@ -23,7 +42,7 @@ function Nav({ user }: { user: User }) {
{user.id ? (
-
+
) : (
diff --git a/pages/index.tsx b/pages/index.tsx
index a699cc85e..d8f31d39d 100644
--- a/pages/index.tsx
+++ b/pages/index.tsx
@@ -20,7 +20,7 @@ function Main() {
세상의 모든 정보를
쉽게 저장하고 관리해 보세요
-
+
From b0ed51deb5a24d28a510eb91dd09ac1f65881fb0 Mon Sep 17 00:00:00 2001
From: sj0724
Date: Tue, 14 May 2024 13:13:14 +0900
Subject: [PATCH 07/23] =?UTF-8?q?feat:=20=ED=9A=8C=EC=9B=90=EA=B0=80?=
=?UTF-8?q?=EC=9E=85=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC=ED=98=84?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
pages/api/api.ts | 28 ++++++++++++++++++++++++++++
pages/signup.tsx | 12 +++++++-----
2 files changed, 35 insertions(+), 5 deletions(-)
diff --git a/pages/api/api.ts b/pages/api/api.ts
index d1015ec83..d3eae61d5 100644
--- a/pages/api/api.ts
+++ b/pages/api/api.ts
@@ -99,3 +99,31 @@ export async function postSignIn(id: string, password: string) {
alert('로그인할 수 없습니다! 아이디와 비밀번호를 확인해주세요!');
}
}
+
+export async function postCheckEmail(email: string) {
+ try {
+ const { data } = await axios.post('/check-email', {
+ email: email,
+ });
+ return data;
+ } catch (error) {
+ console.error('Error fetching sign-in:', error);
+ alert('이미 가입된 이메일입니다! 다시 입력해주세요!');
+ }
+}
+
+export async function postSignUp(id: string, password: string) {
+ try {
+ const { data } = await axios.post('/sign-up', {
+ email: id,
+ password: password,
+ });
+ alert('회원가입이 완료되었습니다!');
+ localStorage.setItem('token', data.data.accessToken);
+ window.location.href = '/';
+ return data;
+ } catch (error) {
+ console.error('Error fetching sign-in:', error);
+ alert('로그인할 수 없습니다! 아이디와 비밀번호를 확인해주세요!');
+ }
+}
diff --git a/pages/signup.tsx b/pages/signup.tsx
index 02600c0e6..890ef8f98 100644
--- a/pages/signup.tsx
+++ b/pages/signup.tsx
@@ -5,6 +5,7 @@ import Input from '@/components/Input/Input';
import Link from 'next/link';
import Image from 'next/image';
import { Button } from '@/components/Button/Button';
+import { postCheckEmail, postSignUp } from './api/api';
function SignUp() {
const [textHidden, setTextHidden] = useState(true);
@@ -21,13 +22,14 @@ function SignUp() {
validatePasswordConfirm,
} = useValidate();
- const submitForm = (e: FormEvent) => {
+ const submitForm = async (e: FormEvent) => {
e.preventDefault();
if (emailValue && passwordValue && confirmValue) {
if (ok) {
- console.log('ok');
- } else {
- console.log('no');
+ const result = await postCheckEmail(emailValue);
+ if (result) {
+ postSignUp(emailValue, passwordValue);
+ }
}
} else {
alert('값을 입력하지 않았습니다! 다시 확인해주세요!');
@@ -118,7 +120,7 @@ function SignUp() {
)}
From 94f2d2e91da9fc9b91490614b27d5d6beb0ba1c0 Mon Sep 17 00:00:00 2001
From: sj0724
Date: Tue, 14 May 2024 13:32:48 +0900
Subject: [PATCH 08/23] =?UTF-8?q?fix:=20=EB=A1=9C=EA=B7=B8=EC=9D=B8?=
=?UTF-8?q?=EC=A0=84=20=ED=8E=98=EC=9D=B4=EC=A7=80=20=EC=9D=B4=EB=8F=99?=
=?UTF-8?q?=EC=8B=9C=20=EB=A1=9C=EA=B7=B8=EC=9D=B8=20=ED=8E=98=EC=9D=B4?=
=?UTF-8?q?=EC=A7=80=EB=A1=9C=20=EC=9D=B4=EB=8F=99=20=EB=B0=8F=20css=20?=
=?UTF-8?q?=EC=88=98=EC=A0=95?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
components/ContentsContainer.tsx | 1 +
components/Footer/Footer.styled.ts | 4 ++--
components/Footer/Footer.tsx | 4 ++--
components/Modal/AddModal/AddModal.styled.ts | 2 +-
pages/index.tsx | 9 +++++++--
5 files changed, 13 insertions(+), 7 deletions(-)
diff --git a/components/ContentsContainer.tsx b/components/ContentsContainer.tsx
index ae9905786..6ac1bd5a4 100644
--- a/components/ContentsContainer.tsx
+++ b/components/ContentsContainer.tsx
@@ -2,6 +2,7 @@ import { ReactNode } from 'react';
import styled from 'styled-components';
const Container = styled.div<{ $empty: number }>`
+ height: 40rem;
gap: 2rem;
display: grid;
grid-template-columns: ${(props) =>
diff --git a/components/Footer/Footer.styled.ts b/components/Footer/Footer.styled.ts
index 1eee3a5de..49547aae2 100644
--- a/components/Footer/Footer.styled.ts
+++ b/components/Footer/Footer.styled.ts
@@ -3,7 +3,7 @@ import { Description } from '../MainSectionCard/MainSectionCard.styled';
export const Footer = styled.div`
width: 100%;
- margin: 6rem auto 0;
+ margin: auto 0;
background: var(--Footer-black);
padding: 3.2rem 10.4rem 6.4rem;
color: #cfcfcf;
@@ -26,7 +26,7 @@ export const Footer__menu = styled.div`
justify-content: space-between;
`;
-export const FooterDescrption = styled(Description)`
+export const FooterDescription = styled(Description)`
width: fit-content;
@media (max-width: 768px) {
diff --git a/components/Footer/Footer.tsx b/components/Footer/Footer.tsx
index 0f50028b1..5ea60cd3d 100644
--- a/components/Footer/Footer.tsx
+++ b/components/Footer/Footer.tsx
@@ -17,9 +17,9 @@ function Footer() {
return (
- ©codeit - 2023
+ ©codeit - 2023
- Privacy Polic
+ Privacy Policy
FAQ
diff --git a/components/Modal/AddModal/AddModal.styled.ts b/components/Modal/AddModal/AddModal.styled.ts
index 452a51bf0..3fdc291db 100644
--- a/components/Modal/AddModal/AddModal.styled.ts
+++ b/components/Modal/AddModal/AddModal.styled.ts
@@ -29,7 +29,7 @@ export const FolderContainer = styled.div`
display: flex;
flex-direction: column;
align-items: center;
- height: 20rem;
+ max-height: 20rem;
overflow: auto;
`;
diff --git a/pages/index.tsx b/pages/index.tsx
index d8f31d39d..e588fb25b 100644
--- a/pages/index.tsx
+++ b/pages/index.tsx
@@ -1,12 +1,14 @@
-import { useEffect, useState } from 'react';
+import { useContext, useEffect, useState } from 'react';
import * as S from '../styles/index.styled';
import MainSectionCard from '../components/MainSectionCard/MainSectionCard';
import { sectionDescription } from '../util/sectionDescription';
import { Button } from '../components/Button/Button';
import Link from 'next/link';
+import { UserContext } from '@/contexts/UserContext';
function Main() {
const [sectionList, setSectionList] = useState([]);
+ const id = useContext(UserContext);
useEffect(() => {
setSectionList(sectionDescription);
@@ -20,7 +22,10 @@ function Main() {
세상의 모든 정보를
쉽게 저장하고 관리해 보세요
-
+
From 049aa3dd66ecd9dec8daad7ad48b152ca6cb480b Mon Sep 17 00:00:00 2001
From: sj0724
Date: Tue, 14 May 2024 15:47:51 +0900
Subject: [PATCH 09/23] =?UTF-8?q?fix:=20=EB=AA=A8=EB=8B=AC=20=EC=97=90?=
=?UTF-8?q?=EB=9F=AC=20=EB=A9=94=EC=84=B8=EC=A7=80=20=EC=B6=94=EA=B0=80=20?=
=?UTF-8?q?=EB=B0=8F=20css=20=EC=88=98=EC=A0=95?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
components/Card/Card.tsx | 6 ++--
components/Input/Input.styled.ts | 1 -
.../MainSectionCard/MainSectionCard.styled.ts | 2 +-
.../Modal/AddFolderModal/AddFolderModal.tsx | 5 +++-
components/Modal/AddModal/AddModal.styled.ts | 17 +++++------
components/Modal/AddModal/AddModal.tsx | 5 ++--
.../Modal/EditModal/EditModal.styled.ts | 28 +++++++++++++++----
components/Modal/EditModal/EditModal.tsx | 5 +++-
.../Modal/ShareModal/ShareModal.styled.ts | 1 -
components/SearchBar/SearchBar.tsx | 6 ++--
hooks/useGetUser.ts | 2 +-
hooks/useValidate.ts | 3 ++
pages/api/api.ts | 3 +-
pages/signin.tsx | 4 +--
pages/signup.tsx | 4 +--
styles/signin.styled.ts | 2 +-
16 files changed, 58 insertions(+), 36 deletions(-)
diff --git a/components/Card/Card.tsx b/components/Card/Card.tsx
index f6ba0626d..70030187a 100644
--- a/components/Card/Card.tsx
+++ b/components/Card/Card.tsx
@@ -9,7 +9,7 @@ function Card({ item }: { item: Link }) {
const [createdAt, setCreatedAt] = useState({ time: 0, result: '' });
const [fullDate, setFullDate] = useState('');
const { image_source } = item;
- const [kebabView, setKebaView] = useState(false);
+ const [kebabView, setKebabView] = useState(false);
const [like, setLike] = useState(false);
const kebabRef = useRef(null);
@@ -32,7 +32,7 @@ function Card({ item }: { item: Link }) {
kebabRef.current &&
!kebabRef.current.contains(e.target)
) {
- setKebaView(false);
+ setKebabView(false);
}
}
@@ -62,7 +62,7 @@ function Card({ item }: { item: Link }) {
setKebaView(!kebabView)}
+ onClick={() => setKebabView(!kebabView)}
/>
{createdText}
diff --git a/components/Input/Input.styled.ts b/components/Input/Input.styled.ts
index a455a9843..24b0984ae 100644
--- a/components/Input/Input.styled.ts
+++ b/components/Input/Input.styled.ts
@@ -18,7 +18,6 @@ const InputModal = styled.input`
var(${({ $error }) => ($error ? '--ErrorMessage' : '--Linkbrary-gray20')});
background: var(--Section-white);
font-size: 1.6rem;
- line-height: 2.4rem;
&:focus {
border: 1px solid var(--Primary);
diff --git a/components/MainSectionCard/MainSectionCard.styled.ts b/components/MainSectionCard/MainSectionCard.styled.ts
index d5f8c6885..202cc3db1 100644
--- a/components/MainSectionCard/MainSectionCard.styled.ts
+++ b/components/MainSectionCard/MainSectionCard.styled.ts
@@ -54,7 +54,7 @@ export const Description = styled.p`
width: 29.1rem;
color: var(--Description);
font-family: Abel;
- font-size: 1rem;
+ font-size: 1.6rem;
font-style: normal;
font-weight: 400;
line-height: 150%; /* 24px */
diff --git a/components/Modal/AddFolderModal/AddFolderModal.tsx b/components/Modal/AddFolderModal/AddFolderModal.tsx
index 7325042be..ef3c55321 100644
--- a/components/Modal/AddFolderModal/AddFolderModal.tsx
+++ b/components/Modal/AddFolderModal/AddFolderModal.tsx
@@ -9,7 +9,7 @@ function AddFolderModal({ onClose }: { onClose: (modalName: string) => void }) {
return (
- 폴더 추가
+ 폴더 추가
void }) {
onChange={(e) => checkText(e.target.value)}
size="sm"
/>
+
+ {textError && {textError}}
+
e.preventDefault()}>
추가하기
diff --git a/components/Modal/AddModal/AddModal.styled.ts b/components/Modal/AddModal/AddModal.styled.ts
index 3fdc291db..f6d68ced2 100644
--- a/components/Modal/AddModal/AddModal.styled.ts
+++ b/components/Modal/AddModal/AddModal.styled.ts
@@ -6,13 +6,6 @@ export const Header = styled.div`
align-items: center;
gap: 0.8rem;
- p {
- font-size: 2rem;
- font-style: normal;
- font-weight: 700;
- line-height: normal;
- }
-
span {
width: 4.2rem;
color: var(--Linkbrary-gray60);
@@ -25,6 +18,14 @@ export const Header = styled.div`
}
`;
+export const Title = styled.p`
+ font-size: 2rem;
+ font-style: normal;
+ font-weight: 700;
+ line-height: normal;
+ margin: 1.5rem 0;
+`;
+
export const FolderContainer = styled.div`
display: flex;
flex-direction: column;
@@ -63,7 +64,7 @@ export const FolderInfo = styled.div`
p {
color: var(--Linkbrary-gray60);
font-family: Pretendard;
- font-size: 1.4rem;
+ font-size: 1.2rem;
font-style: normal;
font-weight: 400;
line-height: normal;
diff --git a/components/Modal/AddModal/AddModal.tsx b/components/Modal/AddModal/AddModal.tsx
index 89f596951..3cc8b34d5 100644
--- a/components/Modal/AddModal/AddModal.tsx
+++ b/components/Modal/AddModal/AddModal.tsx
@@ -15,7 +15,7 @@ function FolderButton({ item }: { item: Folder }) {
{item.link.count}개의 링크
{check && (
-
+
)}
);
@@ -31,8 +31,7 @@ function AddModal({
return (
- 폴더에 추가
- 폴더명
+ 폴더에 추가
{link.map((item) => (
diff --git a/components/Modal/EditModal/EditModal.styled.ts b/components/Modal/EditModal/EditModal.styled.ts
index 7f958345e..773df0797 100644
--- a/components/Modal/EditModal/EditModal.styled.ts
+++ b/components/Modal/EditModal/EditModal.styled.ts
@@ -1,15 +1,17 @@
import styled from 'styled-components';
+export const Title = styled.p`
+ font-size: 2rem;
+ font-style: normal;
+ font-weight: 700;
+ line-height: normal;
+ margin: 1.5rem 0;
+`;
+
export const ModalForm = styled.form`
display: flex;
flex-direction: column;
align-items: center;
- gap: 1.5rem;
-
- p {
- font-size: 2rem;
- font-weight: 700;
- }
`;
export const ModalButton = styled.button`
@@ -30,3 +32,17 @@ export const ModalButton = styled.button`
font-weight: 600;
line-height: normal;
`;
+
+export const TextArea = styled.div`
+ height: 1.5rem;
+ width: 100%;
+ display: flex;
+ align-items: center;
+ margin: 1rem 0;
+`;
+
+export const WarningMessage = styled.p`
+ color: var(--ErrorMessage);
+ font-size: 1.4rem;
+ margin: 0;
+`;
diff --git a/components/Modal/EditModal/EditModal.tsx b/components/Modal/EditModal/EditModal.tsx
index 4cf6eec59..36cac8fd2 100644
--- a/components/Modal/EditModal/EditModal.tsx
+++ b/components/Modal/EditModal/EditModal.tsx
@@ -10,7 +10,7 @@ function EditModal({ onClose }: { onClose: (modalName: string) => void }) {
return (
- 폴더이름 변경
+ 폴더이름 변경
void }) {
onChange={(e) => checkText(e.target.value)}
size="sm"
/>
+
+ {textError && {textError}}
+
diff --git a/components/Modal/ShareModal/ShareModal.styled.ts b/components/Modal/ShareModal/ShareModal.styled.ts
index 8dcbabf71..77b305b59 100644
--- a/components/Modal/ShareModal/ShareModal.styled.ts
+++ b/components/Modal/ShareModal/ShareModal.styled.ts
@@ -14,7 +14,6 @@ export const Header = styled.div`
}
span {
- height: 4.2rem;
color: var(--Linkbrary-gray60);
text-align: center;
font-family: Pretendard;
diff --git a/components/SearchBar/SearchBar.tsx b/components/SearchBar/SearchBar.tsx
index 4533c688f..796200a15 100644
--- a/components/SearchBar/SearchBar.tsx
+++ b/components/SearchBar/SearchBar.tsx
@@ -1,16 +1,16 @@
-import { Dispatch, FormEvent } from 'react';
+import { ChangeEvent, Dispatch, FormEvent, SetStateAction } from 'react';
import { useEffect, useState } from 'react';
import * as S from './SearchBar.styled';
interface PropsType {
- setSearchKeyWord: Dispatch>;
+ setSearchKeyWord: Dispatch>;
}
function SearchModal({ setSearchKeyWord }: PropsType) {
const [text, setText] = useState('');
const [inputImage, setInputImage] = useState('');
- const searchLink = (e: FormEvent) => {
+ const searchLink = (e: ChangeEvent) => {
e.preventDefault();
setSearchKeyWord(text);
};
diff --git a/hooks/useGetUser.ts b/hooks/useGetUser.ts
index 4f49b8e91..ac53759a1 100644
--- a/hooks/useGetUser.ts
+++ b/hooks/useGetUser.ts
@@ -11,7 +11,7 @@ export interface User {
}
function useGetUser(accessToken: string) {
- const [user, setUser] = useState();
+ const [user, setUser] = useState();
useEffect(() => {
const loadUser = async () => {
diff --git a/hooks/useValidate.ts b/hooks/useValidate.ts
index 848ec2350..7c61486f3 100644
--- a/hooks/useValidate.ts
+++ b/hooks/useValidate.ts
@@ -47,6 +47,9 @@ function useValidate() {
if (passwordConfirm === '') {
setOk(false);
setPasswordConfirmError('비밀번호를 다시 입력해주세요.');
+ } else if (passwordConfirm.length <= 8) {
+ setOk(false);
+ setPasswordConfirmError('비밀번호는 8자 이상으로 설정해주세요.');
} else if (passwordConfirm) {
if (passwordConfirm && passwordConfirm !== password) {
setOk(false);
diff --git a/pages/api/api.ts b/pages/api/api.ts
index d3eae61d5..80626772a 100644
--- a/pages/api/api.ts
+++ b/pages/api/api.ts
@@ -108,7 +108,6 @@ export async function postCheckEmail(email: string) {
return data;
} catch (error) {
console.error('Error fetching sign-in:', error);
- alert('이미 가입된 이메일입니다! 다시 입력해주세요!');
}
}
@@ -124,6 +123,6 @@ export async function postSignUp(id: string, password: string) {
return data;
} catch (error) {
console.error('Error fetching sign-in:', error);
- alert('로그인할 수 없습니다! 아이디와 비밀번호를 확인해주세요!');
+ alert('회원가입할 수 없습니다! 아이디와 비밀번호를 확인해주세요!');
}
}
diff --git a/pages/signin.tsx b/pages/signin.tsx
index 723eeb575..5700de65c 100644
--- a/pages/signin.tsx
+++ b/pages/signin.tsx
@@ -1,5 +1,5 @@
import * as S from '@/styles/signin.styled';
-import { ChangeEvent, FormEvent, useState } from 'react';
+import { ChangeEvent, useState } from 'react';
import useValidate from '@/hooks/useValidate';
import Input from '@/components/Input/Input';
import Link from 'next/link';
@@ -14,7 +14,7 @@ function SignIn() {
const { ok, emailError, passwordError, validateEmail, validatePassword } =
useValidate();
- const submitForm = (e: FormEvent) => {
+ const submitForm = (e: ChangeEvent) => {
e.preventDefault();
if (emailValue && passwordValue) {
if (ok) {
diff --git a/pages/signup.tsx b/pages/signup.tsx
index 890ef8f98..e6d0a9ec4 100644
--- a/pages/signup.tsx
+++ b/pages/signup.tsx
@@ -1,5 +1,5 @@
import * as S from '@/styles/signin.styled';
-import { ChangeEvent, FormEvent, useState } from 'react';
+import { ChangeEvent, useState } from 'react';
import useValidate from '@/hooks/useValidate';
import Input from '@/components/Input/Input';
import Link from 'next/link';
@@ -22,7 +22,7 @@ function SignUp() {
validatePasswordConfirm,
} = useValidate();
- const submitForm = async (e: FormEvent) => {
+ const submitForm = async (e: ChangeEvent) => {
e.preventDefault();
if (emailValue && passwordValue && confirmValue) {
if (ok) {
diff --git a/styles/signin.styled.ts b/styles/signin.styled.ts
index 8b382c180..b871f8ec3 100644
--- a/styles/signin.styled.ts
+++ b/styles/signin.styled.ts
@@ -85,7 +85,7 @@ export const TextHiddenButton = styled.span<{ $hidden: boolean }>`
margin: 0;
padding: 0;
right: 1.5rem;
- top: 5.2rem;
+ top: 4.7rem;
height: 1.6rem;
width: 1.6rem;
height: 1.6rem;
From c3a8163925e5d170ec98d0f565b3e86736d5c2b5 Mon Sep 17 00:00:00 2001
From: sj0724
Date: Tue, 14 May 2024 16:09:51 +0900
Subject: [PATCH 10/23] =?UTF-8?q?fix:=20=EC=9D=B8=ED=92=8B=20=EC=98=B5?=
=?UTF-8?q?=EC=A0=80=EB=B2=84=20=EC=98=81=EC=97=AD=20css=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
---
.../FolderButtonContainer.styled.ts | 3 +-
pages/folder.tsx | 30 ++++++++++---------
styles/folder.styled.ts | 6 ++++
styles/reset.css | 4 +++
4 files changed, 28 insertions(+), 15 deletions(-)
diff --git a/components/FolderButtonContainer/FolderButtonContainer.styled.ts b/components/FolderButtonContainer/FolderButtonContainer.styled.ts
index 31fdef72a..ca41d0b61 100644
--- a/components/FolderButtonContainer/FolderButtonContainer.styled.ts
+++ b/components/FolderButtonContainer/FolderButtonContainer.styled.ts
@@ -12,7 +12,8 @@ export const FolderButtons = styled.div`
display: flex;
align-items: center;
gap: 1.2rem;
- flex-wrap: wrap;
+ overflow: auto;
+ width: 100%;
`;
export const TotalFolderButton = styled(FolderName)``;
diff --git a/pages/folder.tsx b/pages/folder.tsx
index f960d9826..755909927 100644
--- a/pages/folder.tsx
+++ b/pages/folder.tsx
@@ -70,21 +70,23 @@ function Folder() {
return (
<>
-
-
-
-
- openModal('add')}>
- 추가하기
-
- {modalState.add && (
-
-
-
- )}
-
-
+
+
+
+
+
+ openModal('add')}>
+ 추가하기
+
+ {modalState.add && (
+
+
+
+ )}
+
+
+
{searchKeyword && (
diff --git a/styles/folder.styled.ts b/styles/folder.styled.ts
index 1c8756c34..6cd89eb11 100644
--- a/styles/folder.styled.ts
+++ b/styles/folder.styled.ts
@@ -77,6 +77,12 @@ export const Header = styled.div<{ $view: boolean }>`
}
`;
+export const HeaderBody = styled.div`
+ width: 100%;
+ height: 12rem;
+ background-color: var(--Background);
+`;
+
export const FolderContents = styled.div`
display: flex;
flex-direction: column;
diff --git a/styles/reset.css b/styles/reset.css
index b6a7e2f42..5d0ebf24b 100644
--- a/styles/reset.css
+++ b/styles/reset.css
@@ -143,3 +143,7 @@ button {
a {
text-decoration: none;
}
+
+::-webkit-scrollbar {
+ display: none;
+}
From c4867c1c562f82ca5a07d62d51d602d934957475 Mon Sep 17 00:00:00 2001
From: sj0724
Date: Wed, 15 May 2024 00:03:51 +0900
Subject: [PATCH 11/23] =?UTF-8?q?feat:=20=ED=8C=8C=EC=9D=BC=20=EC=B6=94?=
=?UTF-8?q?=EA=B0=80=20api=20=EC=97=B0=EB=8F=99?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../FolderButton/FolderButton.styled.ts | 5 +++++
.../Modal/AddFolderModal/AddFolderModal.tsx | 22 ++++++++++++++-----
pages/api/api.ts | 20 +++++++++++++++++
3 files changed, 42 insertions(+), 5 deletions(-)
diff --git a/components/FolderButton/FolderButton.styled.ts b/components/FolderButton/FolderButton.styled.ts
index 8882bc8a2..74a45766e 100644
--- a/components/FolderButton/FolderButton.styled.ts
+++ b/components/FolderButton/FolderButton.styled.ts
@@ -15,6 +15,11 @@ export const FolderName = styled.span<{ $select: string | boolean }>`
white-space: nowrap;
color: ${(props) => (props.$select === 'select' ? '#fff' : '#000')};
+ &:hover {
+ background-color: var(--Linkbrary-gray10);
+ color: #000;
+ }
+
@media (max-width: 768px) {
font-size: 1.2rem;
}
diff --git a/components/Modal/AddFolderModal/AddFolderModal.tsx b/components/Modal/AddFolderModal/AddFolderModal.tsx
index ef3c55321..e429c2411 100644
--- a/components/Modal/AddFolderModal/AddFolderModal.tsx
+++ b/components/Modal/AddFolderModal/AddFolderModal.tsx
@@ -2,27 +2,39 @@ import * as S from '../EditModal/EditModal.styled';
import BaseModal from '../BaseModal/BaseModal';
import useValidate from '@/hooks/useValidate';
import Input from '@/components/Input/Input';
+import { ChangeEvent, useState } from 'react';
+import { postFolder } from '@/pages/api/api';
+import { useRouter } from 'next/router';
function AddFolderModal({ onClose }: { onClose: (modalName: string) => void }) {
const { checkText, textError } = useValidate();
+ const [title, setTitle] = useState('');
+ const router = useRouter();
+
+ const addFolder = (e: ChangeEvent) => {
+ e.preventDefault();
+ postFolder(title);
+ router.reload();
+ };
return (
-
+
폴더 추가
checkText(e.target.value)}
+ onChange={(e) => {
+ checkText(e.target.value);
+ setTitle(e.target.value);
+ }}
size="sm"
/>
{textError && {textError}}
- e.preventDefault()}>
- 추가하기
-
+ 추가하기
);
diff --git a/pages/api/api.ts b/pages/api/api.ts
index 80626772a..da9bbc19c 100644
--- a/pages/api/api.ts
+++ b/pages/api/api.ts
@@ -126,3 +126,23 @@ export async function postSignUp(id: string, password: string) {
alert('회원가입할 수 없습니다! 아이디와 비밀번호를 확인해주세요!');
}
}
+
+export async function postFolder(name: string) {
+ try {
+ const token = localStorage.getItem('token');
+ const { data } = await axios.post(
+ '/folders',
+ {
+ name: name,
+ },
+ {
+ headers: {
+ Authorization: token,
+ },
+ }
+ );
+ return data;
+ } catch (error) {
+ console.error('Error fetching post folder:', error);
+ }
+}
From 071bdccc1d1d1c33e2561d40e7a853212adcddd3 Mon Sep 17 00:00:00 2001
From: sj0724
Date: Wed, 15 May 2024 21:28:31 +0900
Subject: [PATCH 12/23] =?UTF-8?q?feat:=20=ED=8F=B4=EB=8D=94=20=EC=82=AD?=
=?UTF-8?q?=EC=A0=9C=EA=B8=B0=EB=8A=A5=20=EA=B5=AC=ED=98=84?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
components/FolderButton/FolderButton.tsx | 2 +-
.../FolderButtonContainer.tsx | 4 ++--
.../Modal/AddFolderModal/AddFolderModal.tsx | 4 ++--
components/Modal/DeleteModal/DeleteModal.tsx | 14 +++++++++++++-
hooks/useGetFolder.ts | 4 ++--
hooks/useGetFolderList.ts | 2 +-
pages/api/api.ts | 16 +++++++++++++++-
pages/folder.tsx | 10 +++++++---
8 files changed, 43 insertions(+), 13 deletions(-)
diff --git a/components/FolderButton/FolderButton.tsx b/components/FolderButton/FolderButton.tsx
index 557126e20..be4a80300 100644
--- a/components/FolderButton/FolderButton.tsx
+++ b/components/FolderButton/FolderButton.tsx
@@ -11,7 +11,7 @@ function FolderButton({
index,
}: {
item: Folder;
- setFolderId: React.Dispatch>;
+ setFolderId: React.Dispatch>;
setFolderName: React.Dispatch>;
isSelected: string;
handleMenuClick: (index: number) => void;
diff --git a/components/FolderButtonContainer/FolderButtonContainer.tsx b/components/FolderButtonContainer/FolderButtonContainer.tsx
index d8eb9a372..85a9eba2b 100644
--- a/components/FolderButtonContainer/FolderButtonContainer.tsx
+++ b/components/FolderButtonContainer/FolderButtonContainer.tsx
@@ -11,7 +11,7 @@ function FolderButtonContainer({
}: {
link: Folders;
setFolderName: React.Dispatch>;
- setFolderId: React.Dispatch>;
+ setFolderId: React.Dispatch>;
}) {
const [linkSelected, setLinkSelected] = useState([]);
const [totalBtn, setTotalBtn] = useState(true);
@@ -27,7 +27,7 @@ function FolderButtonContainer({
const handleClickTotalButton = () => {
const totalArr: string[] = new Array(link.length).fill('white');
setLinkSelected(totalArr);
- setFolderId(0);
+ setFolderId('');
setFolderName('');
setTotalBtn(true);
};
diff --git a/components/Modal/AddFolderModal/AddFolderModal.tsx b/components/Modal/AddFolderModal/AddFolderModal.tsx
index e429c2411..5caab8f0c 100644
--- a/components/Modal/AddFolderModal/AddFolderModal.tsx
+++ b/components/Modal/AddFolderModal/AddFolderModal.tsx
@@ -11,9 +11,9 @@ function AddFolderModal({ onClose }: { onClose: (modalName: string) => void }) {
const [title, setTitle] = useState('');
const router = useRouter();
- const addFolder = (e: ChangeEvent) => {
+ const addFolder = async (e: ChangeEvent) => {
e.preventDefault();
- postFolder(title);
+ await postFolder(title);
router.reload();
};
diff --git a/components/Modal/DeleteModal/DeleteModal.tsx b/components/Modal/DeleteModal/DeleteModal.tsx
index 445bb89e2..9d099538a 100644
--- a/components/Modal/DeleteModal/DeleteModal.tsx
+++ b/components/Modal/DeleteModal/DeleteModal.tsx
@@ -1,19 +1,31 @@
import React from 'react';
import * as S from './DeleteModal.styled';
import BaseModal from '../BaseModal/BaseModal';
+import { deleteFolder } from '@/pages/api/api';
+import { useRouter } from 'next/router';
function DeleteModal({
folderName,
onClose,
+ folderId,
}: {
folderName: string;
onClose: (modalName: string) => void;
+ folderId: string;
}) {
+ const router = useRouter();
+
+ const isDeleteModal = async (e: React.MouseEvent) => {
+ e.preventDefault();
+ await deleteFolder(folderId);
+ router.reload();
+ };
+
return (
폴더 삭제
{folderName}
- e.preventDefault()}>
+
삭제하기
diff --git a/hooks/useGetFolder.ts b/hooks/useGetFolder.ts
index 6da6fbfd2..9254e07e5 100644
--- a/hooks/useGetFolder.ts
+++ b/hooks/useGetFolder.ts
@@ -9,12 +9,12 @@ export type Link = {
title: string;
description: string;
image_source: string;
- folder_id?: number;
+ folder_id?: string;
};
interface Links extends Array {}
-function useGetFolder(id: string, searchKeyword: string, folderId: number) {
+function useGetFolder(id: string, searchKeyword: string, folderId: string) {
const [linkList, setLinkList] = useState([]);
const [loading, setLoading] = useState(false);
diff --git a/hooks/useGetFolderList.ts b/hooks/useGetFolderList.ts
index 460572b3f..f9173c0be 100644
--- a/hooks/useGetFolderList.ts
+++ b/hooks/useGetFolderList.ts
@@ -6,7 +6,7 @@ type Like = {
};
export interface Folder {
- id: number;
+ id: string;
created_at: Date;
name: string;
user_id: number;
diff --git a/pages/api/api.ts b/pages/api/api.ts
index da9bbc19c..ea8461936 100644
--- a/pages/api/api.ts
+++ b/pages/api/api.ts
@@ -49,7 +49,7 @@ export async function getFolder(id: string) {
}
}
-export async function getFolderList(id: string, folderId: number) {
+export async function getFolderList(id: string, folderId: string) {
if (folderId) {
try {
const query = `/${id}/links?folderId=${folderId}`;
@@ -146,3 +146,17 @@ export async function postFolder(name: string) {
console.error('Error fetching post folder:', error);
}
}
+
+export async function deleteFolder(folderId: string) {
+ try {
+ const token = localStorage.getItem('token');
+ const { data } = await axios.delete(`/folders/${folderId}`, {
+ headers: {
+ Authorization: token,
+ },
+ });
+ return data;
+ } catch (error) {
+ console.error('Error fetching post folder:', error);
+ }
+}
diff --git a/pages/folder.tsx b/pages/folder.tsx
index 755909927..1ac8770d2 100644
--- a/pages/folder.tsx
+++ b/pages/folder.tsx
@@ -39,7 +39,7 @@ function FolderIcon({
function Folder() {
const id = useContext(UserContext);
- const [folderId, setFolderId] = useState(0);
+ const [folderId, setFolderId] = useState('');
const [folderName, setFolderName] = useState('');
const [searchKeyword, setSearchKeyWord] = useState('');
const { linkList, loading } = useGetFolder(id, searchKeyword, folderId);
@@ -101,7 +101,7 @@ function Folder() {
/>
{folderName ? folderName : '전체'}
- {folderId > 0 && (
+ {folderId && (
공유
@@ -128,7 +128,11 @@ function Folder() {
{modalState.delete && (
-
+
)}
From 9c6ab07ed79db7ae92ac0592bc0ebe5bf8d3e723 Mon Sep 17 00:00:00 2001
From: sj0724
Date: Thu, 16 May 2024 13:14:55 +0900
Subject: [PATCH 13/23] =?UTF-8?q?fix:=20kebab=EB=A9=94=EB=89=B4=20?=
=?UTF-8?q?=EB=A1=9C=EC=A7=81=20kebab=20=EC=BB=B4=ED=8F=AC=EB=84=8C?=
=?UTF-8?q?=ED=8A=B8=EB=A1=9C=20=EC=9D=B4=EB=8F=9F=E3=85=87?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
components/Button/Button.tsx | 6 +-
components/Card/Card.styled.ts | 1 +
components/Card/Card.tsx | 88 ++++++++-----------
.../FolderButton/FolderButton.styled.ts | 4 +-
components/KebabMenu/KebabMenu.tsx | 42 +++++++--
hooks/useGetFolder.ts | 4 +-
6 files changed, 80 insertions(+), 65 deletions(-)
diff --git a/components/Button/Button.tsx b/components/Button/Button.tsx
index e79ffc861..9f3257bc5 100644
--- a/components/Button/Button.tsx
+++ b/components/Button/Button.tsx
@@ -6,9 +6,5 @@ export interface ButtonProps extends ButtonHTMLAttributes {
}
export function Button({ children, size }: ButtonProps) {
- return (
- <>
- {children}
- >
- );
+ return {children};
}
diff --git a/components/Card/Card.styled.ts b/components/Card/Card.styled.ts
index 673fabe42..c3bed43e9 100644
--- a/components/Card/Card.styled.ts
+++ b/components/Card/Card.styled.ts
@@ -77,6 +77,7 @@ export const KebabIcon = styled.img`
position: absolute;
right: 2rem;
top: 1.5rem;
+ z-index: 10;
`;
export const ItemDate = styled.p`
diff --git a/components/Card/Card.tsx b/components/Card/Card.tsx
index 70030187a..931e42729 100644
--- a/components/Card/Card.tsx
+++ b/components/Card/Card.tsx
@@ -2,17 +2,16 @@ import { useEffect, useRef, useState } from 'react';
import { changeDate, calculateDate } from '../../util/util';
import * as S from './Card.styled';
import KebabMenu from '../KebabMenu/KebabMenu';
-import { Link } from '../../hooks/useGetFolder';
+import { LinkData } from '../../hooks/useGetFolder';
import Image from 'next/image';
+import Link from 'next/link';
-function Card({ item }: { item: Link }) {
+function Card({ item }: { item: LinkData }) {
const [createdAt, setCreatedAt] = useState({ time: 0, result: '' });
const [fullDate, setFullDate] = useState('');
const { image_source } = item;
const [kebabView, setKebabView] = useState(false);
const [like, setLike] = useState(false);
- const kebabRef = useRef(null);
-
const { url, description } = item;
const createdText = `${createdAt.time} ${createdAt.result} ago`;
@@ -25,55 +24,44 @@ function Card({ item }: { item: Link }) {
setFullDate(changeDate(createdate));
}, [item]);
- useEffect(() => {
- function handleClickOutside(e: any) {
- if (
- kebabView &&
- kebabRef.current &&
- !kebabRef.current.contains(e.target)
- ) {
- setKebabView(false);
- }
- }
-
- document.addEventListener('mousedown', handleClickOutside);
- return () => {
- document.removeEventListener('mousedown', handleClickOutside);
- };
- }, [kebabView]);
-
return (
-
- {
- setLike(!like);
- }}
- />
- {image_source ? (
-
- ) : (
-
-
-
- )}
-
- setKebabView(!kebabView)}
+
+
+ {
+ setLike(!like);
+ e.preventDefault();
+ }}
/>
- {createdText}
-
-
+ {image_source ? (
+
+ ) : (
+
+
+
+ )}
+
+ {
+ setKebabView(!kebabView);
+ e.preventDefault();
+ }}
+ />
+ {createdText}
+
{description ? description : url}
-
-
- {fullDate}
-
- {kebabView && }
-
+
+ {fullDate}
+
+ {kebabView && (
+
+ )}
+
+
);
}
diff --git a/components/FolderButton/FolderButton.styled.ts b/components/FolderButton/FolderButton.styled.ts
index 74a45766e..ca1d95894 100644
--- a/components/FolderButton/FolderButton.styled.ts
+++ b/components/FolderButton/FolderButton.styled.ts
@@ -16,8 +16,8 @@ export const FolderName = styled.span<{ $select: string | boolean }>`
color: ${(props) => (props.$select === 'select' ? '#fff' : '#000')};
&:hover {
- background-color: var(--Linkbrary-gray10);
- color: #000;
+ background-color: var(--Primary);
+ color: #fff;
}
@media (max-width: 768px) {
diff --git a/components/KebabMenu/KebabMenu.tsx b/components/KebabMenu/KebabMenu.tsx
index 12cb828d6..e1294b641 100644
--- a/components/KebabMenu/KebabMenu.tsx
+++ b/components/KebabMenu/KebabMenu.tsx
@@ -1,20 +1,50 @@
-import React from 'react';
+import React, { Dispatch, SetStateAction, useEffect, useRef } from 'react';
import { useModal } from '@/contexts/ModalContext';
import * as S from './KebabMenu.styled';
function KebabMenu({
- menuRef,
+ kebabView,
+ setKebabView,
}: {
- menuRef: React.RefObject;
+ kebabView: boolean;
+ setKebabView: Dispatch>;
}) {
+ const kebabRef = useRef(null);
const { openModal } = useModal();
+ useEffect(() => {
+ function handleClickOutside(e: any) {
+ if (
+ kebabView &&
+ kebabRef.current &&
+ !kebabRef.current.contains(e.target)
+ ) {
+ setKebabView(false);
+ }
+ }
+
+ document.addEventListener('mousedown', handleClickOutside);
+ return () => {
+ document.removeEventListener('mousedown', handleClickOutside);
+ };
+ }, [kebabView]);
+
return (
-
- openModal('deleteLink')}>
+
+ {
+ openModal('deleteLink');
+ e.preventDefault();
+ }}
+ >
삭제하기
- openModal('add')}>
+ {
+ openModal('add');
+ e.preventDefault();
+ }}
+ >
폴더에 추가
diff --git a/hooks/useGetFolder.ts b/hooks/useGetFolder.ts
index 9254e07e5..8619cd3d8 100644
--- a/hooks/useGetFolder.ts
+++ b/hooks/useGetFolder.ts
@@ -1,7 +1,7 @@
import { useEffect, useState } from 'react';
import { getFolderList } from '../pages/api/api';
-export type Link = {
+export type LinkData = {
id: string;
created_at: Date;
updated_at?: Date;
@@ -12,7 +12,7 @@ export type Link = {
folder_id?: string;
};
-interface Links extends Array {}
+interface Links extends Array {}
function useGetFolder(id: string, searchKeyword: string, folderId: string) {
const [linkList, setLinkList] = useState([]);
From 445af50ddc32628319075d312804f5a6b25bc446 Mon Sep 17 00:00:00 2001
From: sj0724
Date: Thu, 16 May 2024 13:21:14 +0900
Subject: [PATCH 14/23] =?UTF-8?q?fix:=20=EB=A9=94=EC=9D=B8=20=ED=8E=98?=
=?UTF-8?q?=EC=9D=B4=EC=A7=80=20card=20=EC=9D=B4=EB=AF=B8=EC=A7=80=20?=
=?UTF-8?q?=EC=BD=94=EB=93=9C=20=EC=88=98=EC=A0=95?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../MainSectionCard/MainSectionCard.tsx | 25 +++----------------
util/sectionDescription.ts | 4 +++
2 files changed, 7 insertions(+), 22 deletions(-)
diff --git a/components/MainSectionCard/MainSectionCard.tsx b/components/MainSectionCard/MainSectionCard.tsx
index f0261ca7e..a22d99321 100644
--- a/components/MainSectionCard/MainSectionCard.tsx
+++ b/components/MainSectionCard/MainSectionCard.tsx
@@ -5,36 +5,17 @@ interface SectionItem {
title: string;
description: string;
id: number;
+ image: string;
}
function MainSectionCard({ item }: { item: SectionItem }) {
- const { title, description, id } = item;
- const [sectionImage, setSectionImage] = useState('');
-
- useEffect(() => {
- switch (id) {
- case 1:
- setSectionImage('/img_1.png');
- break;
- case 2:
- setSectionImage('/img_2.png');
- break;
- case 3:
- setSectionImage('/img_3.png');
- break;
- case 4:
- setSectionImage('/img_4.png');
- break;
- default:
- break;
- }
- }, [id]);
+ const { title, description, image } = item;
return (
{title}
{description}
-
+
);
}
diff --git a/util/sectionDescription.ts b/util/sectionDescription.ts
index c67ed8794..5dc94874c 100644
--- a/util/sectionDescription.ts
+++ b/util/sectionDescription.ts
@@ -4,21 +4,25 @@ export const sectionDescription = [
title: '원하는 링크를 저장하세요',
description:
'나중에 읽고 싶은 글, 다시 보고 싶은 영상, 사고 싶은 옷, 기억하고 싶은 모든 것을 한 공간에 저장하세요.',
+ image: '/img_1.png',
},
{
id: 2,
title: '링크로 폴더를 관리하세요',
description: '나만의 폴더를 무제한으로 만들고 다양하게 활용할 수 있습니다.',
+ image: '/img_2.png',
},
{
id: 3,
title: '저장한 링크를 공유해보세요',
description:
'여러 링크를 폴더에 담고 공유할 수 있습니다. 가족, 친구, 동료들에게 쉽고 빠르게 링크를 공유해 보세요.',
+ image: '/img_3.png',
},
{
id: 4,
title: '저장한 링크를 검색해보세요',
description: '중요한 정보들을 검색으로 쉽게 찾아보세요.',
+ image: '/img_4.png',
},
];
From 5dd36c196504e48afceb8e47769283d745321b76 Mon Sep 17 00:00:00 2001
From: sj0724
Date: Thu, 16 May 2024 14:09:49 +0900
Subject: [PATCH 15/23] =?UTF-8?q?fix:=20=ED=8F=B4=EB=8D=94=20=EB=AA=A8?=
=?UTF-8?q?=EB=8B=AC=20=EB=B2=84=ED=8A=BC=20=EC=BB=B4=ED=8F=AC=EB=84=8C?=
=?UTF-8?q?=ED=8A=B8=EB=A1=9C=20=EB=B3=80=EA=B2=BD=20=EB=B0=8F=20=EB=AA=A8?=
=?UTF-8?q?=EB=8B=AC=20=EB=A1=9C=EC=A7=81=20=EC=88=98=EC=A0=95?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
components/Card/Card.tsx | 9 +-
.../FolderButtonContainer.tsx | 9 +-
.../FolderModals.styled.ts | 16 ++++
.../FolderModalContainer/FolderModals.tsx | 62 ++++++++++++++
components/KebabMenu/KebabMenu.tsx | 73 ++++++++--------
.../Modal/AddFolderModal/AddFolderModal.tsx | 4 +-
components/Modal/AddModal/AddModal.tsx | 10 +--
components/Modal/BaseModal/BaseModal.tsx | 7 +-
.../Modal/DeleteLinkModal/DeleteLinkModal.tsx | 8 +-
components/Modal/DeleteModal/DeleteModal.tsx | 4 +-
components/Modal/EditModal/EditModal.tsx | 4 +-
components/Modal/ShareModal/ShareModal.tsx | 10 +--
contexts/ModalContext.tsx | 1 -
hooks/useGetFolder.ts | 2 +-
pages/folder.tsx | 85 ++-----------------
15 files changed, 155 insertions(+), 149 deletions(-)
create mode 100644 components/FolderModalContainer/FolderModals.styled.ts
create mode 100644 components/FolderModalContainer/FolderModals.tsx
diff --git a/components/Card/Card.tsx b/components/Card/Card.tsx
index 931e42729..db9da17f4 100644
--- a/components/Card/Card.tsx
+++ b/components/Card/Card.tsx
@@ -5,8 +5,9 @@ import KebabMenu from '../KebabMenu/KebabMenu';
import { LinkData } from '../../hooks/useGetFolder';
import Image from 'next/image';
import Link from 'next/link';
+import { Folders } from '@/hooks/useGetFolderList';
-function Card({ item }: { item: LinkData }) {
+function Card({ item, list }: { item: LinkData; list: Folders }) {
const [createdAt, setCreatedAt] = useState({ time: 0, result: '' });
const [fullDate, setFullDate] = useState('');
const { image_source } = item;
@@ -58,7 +59,11 @@ function Card({ item }: { item: LinkData }) {
{fullDate}
{kebabView && (
-
+
)}
diff --git a/components/FolderButtonContainer/FolderButtonContainer.tsx b/components/FolderButtonContainer/FolderButtonContainer.tsx
index 85a9eba2b..889c2831b 100644
--- a/components/FolderButtonContainer/FolderButtonContainer.tsx
+++ b/components/FolderButtonContainer/FolderButtonContainer.tsx
@@ -3,6 +3,8 @@ import * as S from './FolderButtonContainer.styled';
import FolderButton from '../FolderButton/FolderButton';
import { useModal } from '../../contexts/ModalContext';
import { Folders } from '../../hooks/useGetFolderList';
+import ModalPortal from '@/Portal';
+import AddFolderModal from '../Modal/AddFolderModal/AddFolderModal';
function FolderButtonContainer({
link,
@@ -15,7 +17,7 @@ function FolderButtonContainer({
}) {
const [linkSelected, setLinkSelected] = useState([]);
const [totalBtn, setTotalBtn] = useState(true);
- const { openModal } = useModal();
+ const { modalState, openModal } = useModal();
const handleMenuClick = (index: number) => {
const booleanArr: string[] = new Array(link.length).fill('white');
@@ -59,6 +61,11 @@ function FolderButtonContainer({
폴더 추가
+ {modalState.addFolder && (
+
+
+
+ )}
);
}
diff --git a/components/FolderModalContainer/FolderModals.styled.ts b/components/FolderModalContainer/FolderModals.styled.ts
new file mode 100644
index 000000000..c903fa94f
--- /dev/null
+++ b/components/FolderModalContainer/FolderModals.styled.ts
@@ -0,0 +1,16 @@
+import styled from 'styled-components';
+
+export const FolderModal = styled.div`
+ display: flex;
+ align-items: center;
+ gap: 1.2rem;
+`;
+
+export const FolderModalIcon = styled.div`
+ cursor: pointer;
+ display: flex;
+ align-items: center;
+ gap: 0.4rem;
+ color: var(--Linkbrary-gray60);
+ font-size: 1.4rem;
+`;
diff --git a/components/FolderModalContainer/FolderModals.tsx b/components/FolderModalContainer/FolderModals.tsx
new file mode 100644
index 000000000..04b3d0cea
--- /dev/null
+++ b/components/FolderModalContainer/FolderModals.tsx
@@ -0,0 +1,62 @@
+import Image from 'next/image';
+import { ReactNode } from 'react';
+import * as S from './FolderModals.styled';
+import { useModal } from '@/contexts/ModalContext';
+import ModalPortal from '@/Portal';
+import ShareModal from '../Modal/ShareModal/ShareModal';
+import EditModal from '../Modal/EditModal/EditModal';
+import DeleteModal from '../Modal/DeleteModal/DeleteModal';
+
+function FolderIcon({
+ image,
+ children,
+ onOpen,
+ state,
+}: {
+ image: string;
+ children: ReactNode;
+ onOpen: (modalName: string) => void;
+ state: string;
+}) {
+ return (
+ onOpen(`${state}`)}>
+
+ {children}
+
+ );
+}
+
+function FolderModals({ id, name }: { id: string; name: string }) {
+ const { modalState, openModal, closeModal } = useModal();
+
+ return (
+
+
+ 공유
+
+
+ 이름 변경
+
+
+ 삭제
+
+ {modalState.share && (
+
+
+
+ )}
+ {modalState.edit && (
+
+
+
+ )}
+ {modalState.delete && (
+
+
+
+ )}
+
+ );
+}
+
+export default FolderModals;
diff --git a/components/KebabMenu/KebabMenu.tsx b/components/KebabMenu/KebabMenu.tsx
index e1294b641..f9a41fc64 100644
--- a/components/KebabMenu/KebabMenu.tsx
+++ b/components/KebabMenu/KebabMenu.tsx
@@ -1,53 +1,54 @@
import React, { Dispatch, SetStateAction, useEffect, useRef } from 'react';
import { useModal } from '@/contexts/ModalContext';
import * as S from './KebabMenu.styled';
+import ModalPortal from '@/Portal';
+import AddModal from '../Modal/AddModal/AddModal';
+import DeleteLinkModal from '../Modal/DeleteLinkModal/DeleteLinkModal';
+import { Folders } from '@/hooks/useGetFolderList';
function KebabMenu({
kebabView,
setKebabView,
+ list,
}: {
kebabView: boolean;
setKebabView: Dispatch>;
+ list: Folders;
}) {
const kebabRef = useRef(null);
- const { openModal } = useModal();
-
- useEffect(() => {
- function handleClickOutside(e: any) {
- if (
- kebabView &&
- kebabRef.current &&
- !kebabRef.current.contains(e.target)
- ) {
- setKebabView(false);
- }
- }
-
- document.addEventListener('mousedown', handleClickOutside);
- return () => {
- document.removeEventListener('mousedown', handleClickOutside);
- };
- }, [kebabView]);
+ const { modalState, openModal } = useModal();
return (
-
- {
- openModal('deleteLink');
- e.preventDefault();
- }}
- >
- 삭제하기
-
- {
- openModal('add');
- e.preventDefault();
- }}
- >
- 폴더에 추가
-
-
+ <>
+
+ {
+ openModal('deleteLink');
+ e.preventDefault();
+ }}
+ >
+ 삭제하기
+
+ {
+ openModal('add');
+ e.preventDefault();
+ }}
+ >
+ 폴더에 추가
+
+
+ {modalState.add && (
+
+
+
+ )}
+ {modalState.deleteLink && (
+
+
+
+ )}
+ >
);
}
diff --git a/components/Modal/AddFolderModal/AddFolderModal.tsx b/components/Modal/AddFolderModal/AddFolderModal.tsx
index 5caab8f0c..5f754dc1c 100644
--- a/components/Modal/AddFolderModal/AddFolderModal.tsx
+++ b/components/Modal/AddFolderModal/AddFolderModal.tsx
@@ -6,7 +6,7 @@ import { ChangeEvent, useState } from 'react';
import { postFolder } from '@/pages/api/api';
import { useRouter } from 'next/router';
-function AddFolderModal({ onClose }: { onClose: (modalName: string) => void }) {
+function AddFolderModal() {
const { checkText, textError } = useValidate();
const [title, setTitle] = useState('');
const router = useRouter();
@@ -18,7 +18,7 @@ function AddFolderModal({ onClose }: { onClose: (modalName: string) => void }) {
};
return (
-
+
폴더 추가
void;
-}) {
+function AddModal({ link }: { link: Folders }) {
return (
-
+
폴더에 추가
diff --git a/components/Modal/BaseModal/BaseModal.tsx b/components/Modal/BaseModal/BaseModal.tsx
index f833c1182..6e9b1eb6f 100644
--- a/components/Modal/BaseModal/BaseModal.tsx
+++ b/components/Modal/BaseModal/BaseModal.tsx
@@ -1,15 +1,16 @@
import React from 'react';
import * as S from './BaseModal.styled';
+import { useModal } from '@/contexts/ModalContext';
function BaseModal({
children,
- onClose,
state,
}: {
children: React.ReactNode;
- onClose: (modalName: string) => void;
state: string;
}) {
+ const { closeModal } = useModal();
+
return (
@@ -17,7 +18,7 @@ function BaseModal({
onClose(`${state}`)}
+ onClick={() => closeModal(`${state}`)}
/>
diff --git a/components/Modal/DeleteLinkModal/DeleteLinkModal.tsx b/components/Modal/DeleteLinkModal/DeleteLinkModal.tsx
index dff6327e3..7d7842251 100644
--- a/components/Modal/DeleteLinkModal/DeleteLinkModal.tsx
+++ b/components/Modal/DeleteLinkModal/DeleteLinkModal.tsx
@@ -2,13 +2,9 @@ import React from 'react';
import * as S from '../DeleteModal/DeleteModal.styled';
import BaseModal from '../BaseModal/BaseModal';
-function DeleteLinkModal({
- onClose,
-}: {
- onClose: (modalName: string) => void;
-}) {
+function DeleteLinkModal() {
return (
-
+
링크 삭제
e.preventDefault()}>
삭제하기
diff --git a/components/Modal/DeleteModal/DeleteModal.tsx b/components/Modal/DeleteModal/DeleteModal.tsx
index 9d099538a..1349fc831 100644
--- a/components/Modal/DeleteModal/DeleteModal.tsx
+++ b/components/Modal/DeleteModal/DeleteModal.tsx
@@ -6,11 +6,9 @@ import { useRouter } from 'next/router';
function DeleteModal({
folderName,
- onClose,
folderId,
}: {
folderName: string;
- onClose: (modalName: string) => void;
folderId: string;
}) {
const router = useRouter();
@@ -22,7 +20,7 @@ function DeleteModal({
};
return (
-
+
폴더 삭제
{folderName}
diff --git a/components/Modal/EditModal/EditModal.tsx b/components/Modal/EditModal/EditModal.tsx
index 36cac8fd2..af6926f34 100644
--- a/components/Modal/EditModal/EditModal.tsx
+++ b/components/Modal/EditModal/EditModal.tsx
@@ -4,11 +4,11 @@ import useValidate from '@/hooks/useValidate';
import { Button } from '@/components/Button/Button';
import Input from '@/components/Input/Input';
-function EditModal({ onClose }: { onClose: (modalName: string) => void }) {
+function EditModal() {
const { checkText, textError } = useValidate();
return (
-
+
폴더이름 변경
void;
-}) {
+function ShareModal({ folderName }: { folderName: string }) {
return (
-
+
폴더 공유
{folderName}
diff --git a/contexts/ModalContext.tsx b/contexts/ModalContext.tsx
index 28a76c61b..5bf27782b 100644
--- a/contexts/ModalContext.tsx
+++ b/contexts/ModalContext.tsx
@@ -38,7 +38,6 @@ export const ModalProvider = ({ children }: { children: ReactNode }) => {
const openModal = (modalName: string) => {
dispatch({ type: 'OPEN_MODAL', modalName });
- console.log(modalName);
};
const closeModal = (modalName: string) => {
diff --git a/hooks/useGetFolder.ts b/hooks/useGetFolder.ts
index 8619cd3d8..90c1ff3d0 100644
--- a/hooks/useGetFolder.ts
+++ b/hooks/useGetFolder.ts
@@ -12,7 +12,7 @@ export type LinkData = {
folder_id?: string;
};
-interface Links extends Array {}
+export interface Links extends Array {}
function useGetFolder(id: string, searchKeyword: string, folderId: string) {
const [linkList, setLinkList] = useState([]);
diff --git a/pages/folder.tsx b/pages/folder.tsx
index 1ac8770d2..57949fbd1 100644
--- a/pages/folder.tsx
+++ b/pages/folder.tsx
@@ -1,4 +1,4 @@
-import { ReactNode, useContext } from 'react';
+import { useContext } from 'react';
import { useEffect, useRef, useState } from 'react';
import * as S from '../styles/folder.styled';
import SearchBar from '../components/SearchBar/SearchBar';
@@ -9,33 +9,9 @@ import useGetFolderList from '../hooks/useGetFolderList';
import FolderButtonContainer from '../components/FolderButtonContainer/FolderButtonContainer';
import { ContextValue, useModal } from '../contexts/ModalContext';
import AddModal from '../components/Modal/AddModal/AddModal';
-import ShareModal from '../components/Modal/ShareModal/ShareModal';
-import EditModal from '../components/Modal/EditModal/EditModal';
-import DeleteModal from '../components/Modal/DeleteModal/DeleteModal';
-import AddfolderModal from '../components/Modal/AddFolderModal/AddFolderModal';
-import DeleteLinkModal from '../components/Modal/DeleteLinkModal/DeleteLinkModal';
import ModalPortal from '../Portal';
-import Image from 'next/image';
import { UserContext } from '@/contexts/UserContext';
-
-function FolderIcon({
- image,
- children,
- onOpen,
- state,
-}: {
- image: string;
- children: ReactNode;
- onOpen: (modalName: string) => void;
- state: string;
-}) {
- return (
- onOpen(`${state}`)}>
-
- {children}
-
- );
-}
+import FolderModals from '@/components/FolderModalContainer/FolderModals';
function Folder() {
const id = useContext(UserContext);
@@ -46,7 +22,7 @@ function Folder() {
const { link } = useGetFolderList(id);
const obsRef = useRef(null);
const [toggleInput, setToggleInput] = useState(true);
- const { modalState, openModal, closeModal }: ContextValue = useModal();
+ const { modalState, openModal }: ContextValue = useModal();
const handleObserver = (entries: IntersectionObserverEntry[]) => {
entries.forEach((entry) => {
@@ -79,11 +55,6 @@ function Folder() {
openModal('add')}>
추가하기
- {modalState.add && (
-
-
-
- )}
@@ -101,58 +72,20 @@ function Folder() {
/>
{folderName ? folderName : '전체'}
- {folderId && (
-
-
- 공유
-
- {modalState.share && (
-
-
-
- )}
-
- 이름 변경
-
- {modalState.edit && (
-
-
-
- )}
-
- 삭제
-
- {modalState.delete && (
-
-
-
- )}
-
- )}
+ {folderName && }
{linkList.length > 0 ? (
- linkList.map((item) => )
+ linkList.map((item) => (
+
+ ))
) : (
저장된 링크가 없습니다.
)}
- {modalState.addFolder && (
-
-
-
- )}
- {modalState.deleteLink && (
+ {modalState.add && (
-
+
)}
From e9350fd972873ce39f944f769f786d20a0ca78a2 Mon Sep 17 00:00:00 2001
From: sj0724
Date: Thu, 16 May 2024 14:25:08 +0900
Subject: [PATCH 16/23] =?UTF-8?q?fix:=20=ED=8F=B4=EB=8D=94=20id,=20name=20?=
=?UTF-8?q?state=20=ED=86=B5=ED=95=A9?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
components/FolderButton/FolderButton.tsx | 11 +++++-----
.../FolderButtonContainer.tsx | 14 ++++++-------
pages/folder.tsx | 20 +++++++++----------
3 files changed, 21 insertions(+), 24 deletions(-)
diff --git a/components/FolderButton/FolderButton.tsx b/components/FolderButton/FolderButton.tsx
index be4a80300..26edc7af4 100644
--- a/components/FolderButton/FolderButton.tsx
+++ b/components/FolderButton/FolderButton.tsx
@@ -4,22 +4,21 @@ import { Folder } from '@/hooks/useGetFolderList';
function FolderButton({
item,
- setFolderId,
- setFolderName,
isSelected,
handleMenuClick,
index,
+ setOnSelect,
}: {
item: Folder;
- setFolderId: React.Dispatch>;
- setFolderName: React.Dispatch>;
isSelected: string;
handleMenuClick: (index: number) => void;
index: number;
+ setOnSelect: React.Dispatch<
+ React.SetStateAction<{ id: string; name: string }>
+ >;
}) {
const changeFolder = () => {
- setFolderId(item.id);
- setFolderName(item.name);
+ setOnSelect({ id: item.id, name: item.name });
handleMenuClick(index);
};
diff --git a/components/FolderButtonContainer/FolderButtonContainer.tsx b/components/FolderButtonContainer/FolderButtonContainer.tsx
index 889c2831b..1b7b4d8e9 100644
--- a/components/FolderButtonContainer/FolderButtonContainer.tsx
+++ b/components/FolderButtonContainer/FolderButtonContainer.tsx
@@ -8,12 +8,12 @@ import AddFolderModal from '../Modal/AddFolderModal/AddFolderModal';
function FolderButtonContainer({
link,
- setFolderName,
- setFolderId,
+ setOnSelect,
}: {
link: Folders;
- setFolderName: React.Dispatch>;
- setFolderId: React.Dispatch>;
+ setOnSelect: React.Dispatch<
+ React.SetStateAction<{ id: string; name: string }>
+ >;
}) {
const [linkSelected, setLinkSelected] = useState([]);
const [totalBtn, setTotalBtn] = useState(true);
@@ -29,8 +29,7 @@ function FolderButtonContainer({
const handleClickTotalButton = () => {
const totalArr: string[] = new Array(link.length).fill('white');
setLinkSelected(totalArr);
- setFolderId('');
- setFolderName('');
+ setOnSelect({ id: '', name: '' });
setTotalBtn(true);
};
@@ -48,8 +47,7 @@ function FolderButtonContainer({
{searchKeyword}
으로 검색한 결과입니다.
)}
-
+
- {folderName ? folderName : '전체'}
- {folderName && }
+ {onSelect.name ? onSelect.name : '전체'}
+ {onSelect.name && (
+
+ )}
{linkList.length > 0 ? (
From 445c1abfc584335ab8a6b7c3f2ad9e5b29c05520 Mon Sep 17 00:00:00 2001
From: sj0724
Date: Thu, 16 May 2024 14:27:48 +0900
Subject: [PATCH 17/23] =?UTF-8?q?fix:=20=EA=B2=80=EC=83=89=EB=B0=94=20?=
=?UTF-8?q?=EC=9D=B4=EB=AF=B8=EC=A7=80=20=EC=82=BC=ED=95=AD=EC=97=B0?=
=?UTF-8?q?=EC=82=B0=EC=9E=90=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
---
components/SearchBar/SearchBar.tsx | 18 ++++++------------
1 file changed, 6 insertions(+), 12 deletions(-)
diff --git a/components/SearchBar/SearchBar.tsx b/components/SearchBar/SearchBar.tsx
index 796200a15..88d628eb7 100644
--- a/components/SearchBar/SearchBar.tsx
+++ b/components/SearchBar/SearchBar.tsx
@@ -1,5 +1,5 @@
-import { ChangeEvent, Dispatch, FormEvent, SetStateAction } from 'react';
-import { useEffect, useState } from 'react';
+import { ChangeEvent, Dispatch, SetStateAction } from 'react';
+import { useState } from 'react';
import * as S from './SearchBar.styled';
interface PropsType {
@@ -8,7 +8,6 @@ interface PropsType {
function SearchModal({ setSearchKeyWord }: PropsType) {
const [text, setText] = useState('');
- const [inputImage, setInputImage] = useState('');
const searchLink = (e: ChangeEvent) => {
e.preventDefault();
@@ -20,14 +19,6 @@ function SearchModal({ setSearchKeyWord }: PropsType) {
setSearchKeyWord('');
};
- useEffect(() => {
- if (text) {
- setInputImage('/SearchPurple.svg');
- return;
- }
- setInputImage('/Search.svg');
- }, [text]);
-
return (
@@ -37,7 +28,10 @@ function SearchModal({ setSearchKeyWord }: PropsType) {
id="word"
value={text}
/>
-
+
{text && (
Date: Thu, 16 May 2024 22:17:54 +0900
Subject: [PATCH 18/23] =?UTF-8?q?feat:=20=EB=A7=81=ED=81=AC=20=EC=B6=94?=
=?UTF-8?q?=EA=B0=80=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC=ED=98=84=20=EB=B0=8F?=
=?UTF-8?q?=20=EB=82=A0=EC=A7=9C=20=EA=B5=AC=ED=98=84=EB=A1=9C=EC=A7=81=20?=
=?UTF-8?q?=EC=88=98=EC=A0=95,=20=EC=BC=80=EB=B0=A5=EC=97=90=EC=84=9C=20?=
=?UTF-8?q?=EB=A7=81=ED=81=AC=20=EC=B6=94=EA=B0=80=20=EA=B8=B0=EB=8A=A5=20?=
=?UTF-8?q?=EA=B5=AC=ED=98=84=EC=A4=91?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
components/Card/Card.styled.ts | 2 -
components/Card/Card.tsx | 12 +---
components/ContentsContainer.tsx | 3 +-
components/FolderButton/FolderButton.tsx | 2 +-
.../FolderButtonContainer.tsx | 4 +-
.../FolderModalContainer/FolderModals.tsx | 2 +-
components/KebabMenu/KebabMenu.tsx | 14 +---
components/Modal/AddModal/AddModal.styled.ts | 7 +-
components/Modal/AddModal/AddModal.tsx | 66 ++++++++++++++++---
components/Modal/DeleteModal/DeleteModal.tsx | 2 +-
hooks/useGetFolder.ts | 4 +-
hooks/useGetFolderList.ts | 2 +-
pages/api/api.ts | 25 ++++++-
pages/folder.tsx | 11 ++--
util/util.ts | 47 ++-----------
15 files changed, 111 insertions(+), 92 deletions(-)
diff --git a/components/Card/Card.styled.ts b/components/Card/Card.styled.ts
index c3bed43e9..6df1d6eb0 100644
--- a/components/Card/Card.styled.ts
+++ b/components/Card/Card.styled.ts
@@ -56,7 +56,6 @@ export const StarIcon = styled.img`
position: absolute;
top: 1.5rem;
right: 1.5rem;
- z-index: 10;
`;
export const ItemInfo = styled.div`
@@ -77,7 +76,6 @@ export const KebabIcon = styled.img`
position: absolute;
right: 2rem;
top: 1.5rem;
- z-index: 10;
`;
export const ItemDate = styled.p`
diff --git a/components/Card/Card.tsx b/components/Card/Card.tsx
index db9da17f4..0d267c301 100644
--- a/components/Card/Card.tsx
+++ b/components/Card/Card.tsx
@@ -1,4 +1,4 @@
-import { useEffect, useRef, useState } from 'react';
+import { useEffect, useState } from 'react';
import { changeDate, calculateDate } from '../../util/util';
import * as S from './Card.styled';
import KebabMenu from '../KebabMenu/KebabMenu';
@@ -19,7 +19,7 @@ function Card({ item, list }: { item: LinkData; list: Folders }) {
useEffect(() => {
const nowDate = new Date();
- let createdate = new Date(item.created_at);
+ const createdate = new Date(item.created_at);
const date = (Number(nowDate) - Number(createdate)) / 1000;
setCreatedAt(calculateDate(date));
setFullDate(changeDate(createdate));
@@ -58,13 +58,7 @@ function Card({ item, list }: { item: LinkData; list: Folders }) {
{fullDate}
- {kebabView && (
-
- )}
+ {kebabView && }
);
diff --git a/components/ContentsContainer.tsx b/components/ContentsContainer.tsx
index 6ac1bd5a4..fd8b487b1 100644
--- a/components/ContentsContainer.tsx
+++ b/components/ContentsContainer.tsx
@@ -2,13 +2,14 @@ import { ReactNode } from 'react';
import styled from 'styled-components';
const Container = styled.div<{ $empty: number }>`
- height: 40rem;
+ min-height: 40rem;
gap: 2rem;
display: grid;
grid-template-columns: ${(props) =>
props.$empty > 0 ? 'repeat(3, 1fr)' : 'none'};
margin: 0 auto;
position: relative;
+ margin-bottom: 10rem;
@media (max-width: 1199px) {
grid-template-columns: ${(props) => (props.$empty > 0 ? '1fr 1fr' : '1fr')};
diff --git a/components/FolderButton/FolderButton.tsx b/components/FolderButton/FolderButton.tsx
index 26edc7af4..cc0c2bbcb 100644
--- a/components/FolderButton/FolderButton.tsx
+++ b/components/FolderButton/FolderButton.tsx
@@ -14,7 +14,7 @@ function FolderButton({
handleMenuClick: (index: number) => void;
index: number;
setOnSelect: React.Dispatch<
- React.SetStateAction<{ id: string; name: string }>
+ React.SetStateAction<{ id: number; name: string }>
>;
}) {
const changeFolder = () => {
diff --git a/components/FolderButtonContainer/FolderButtonContainer.tsx b/components/FolderButtonContainer/FolderButtonContainer.tsx
index 1b7b4d8e9..dcb0a95d9 100644
--- a/components/FolderButtonContainer/FolderButtonContainer.tsx
+++ b/components/FolderButtonContainer/FolderButtonContainer.tsx
@@ -12,7 +12,7 @@ function FolderButtonContainer({
}: {
link: Folders;
setOnSelect: React.Dispatch<
- React.SetStateAction<{ id: string; name: string }>
+ React.SetStateAction<{ id: number; name: string }>
>;
}) {
const [linkSelected, setLinkSelected] = useState([]);
@@ -29,7 +29,7 @@ function FolderButtonContainer({
const handleClickTotalButton = () => {
const totalArr: string[] = new Array(link.length).fill('white');
setLinkSelected(totalArr);
- setOnSelect({ id: '', name: '' });
+ setOnSelect({ id: 0, name: '' });
setTotalBtn(true);
};
diff --git a/components/FolderModalContainer/FolderModals.tsx b/components/FolderModalContainer/FolderModals.tsx
index 04b3d0cea..31548cb44 100644
--- a/components/FolderModalContainer/FolderModals.tsx
+++ b/components/FolderModalContainer/FolderModals.tsx
@@ -26,7 +26,7 @@ function FolderIcon({
);
}
-function FolderModals({ id, name }: { id: string; name: string }) {
+function FolderModals({ id, name }: { id: number; name: string }) {
const { modalState, openModal, closeModal } = useModal();
return (
diff --git a/components/KebabMenu/KebabMenu.tsx b/components/KebabMenu/KebabMenu.tsx
index f9a41fc64..3c3ef02f2 100644
--- a/components/KebabMenu/KebabMenu.tsx
+++ b/components/KebabMenu/KebabMenu.tsx
@@ -1,4 +1,4 @@
-import React, { Dispatch, SetStateAction, useEffect, useRef } from 'react';
+import React, { useRef } from 'react';
import { useModal } from '@/contexts/ModalContext';
import * as S from './KebabMenu.styled';
import ModalPortal from '@/Portal';
@@ -6,15 +6,7 @@ import AddModal from '../Modal/AddModal/AddModal';
import DeleteLinkModal from '../Modal/DeleteLinkModal/DeleteLinkModal';
import { Folders } from '@/hooks/useGetFolderList';
-function KebabMenu({
- kebabView,
- setKebabView,
- list,
-}: {
- kebabView: boolean;
- setKebabView: Dispatch>;
- list: Folders;
-}) {
+function KebabMenu({ list, url }: { list: Folders; url: string }) {
const kebabRef = useRef(null);
const { modalState, openModal } = useModal();
@@ -40,7 +32,7 @@ function KebabMenu({
{modalState.add && (
-
+
)}
{modalState.deleteLink && (
diff --git a/components/Modal/AddModal/AddModal.styled.ts b/components/Modal/AddModal/AddModal.styled.ts
index f6d68ced2..08ef9c7a1 100644
--- a/components/Modal/AddModal/AddModal.styled.ts
+++ b/components/Modal/AddModal/AddModal.styled.ts
@@ -34,7 +34,7 @@ export const FolderContainer = styled.div`
overflow: auto;
`;
-export const FolderButton = styled.div<{ $check: boolean }>`
+export const FolderButton = styled.div<{ $isSelected: string }>`
cursor: pointer;
width: 26.4rem;
display: flex;
@@ -43,7 +43,8 @@ export const FolderButton = styled.div<{ $check: boolean }>`
align-items: center;
gap: 0.8rem;
border-radius: 0.8rem;
- background: ${(props) => props.$check && 'var(--Background)'};
+ background: ${(props) =>
+ props.$isSelected === 'select' && 'var(--Background)'};
`;
export const FolderInfo = styled.div`
@@ -70,3 +71,5 @@ export const FolderInfo = styled.div`
line-height: normal;
}
`;
+
+export const InputForm = styled.form``;
diff --git a/components/Modal/AddModal/AddModal.tsx b/components/Modal/AddModal/AddModal.tsx
index fe4a66778..d840d5eb4 100644
--- a/components/Modal/AddModal/AddModal.tsx
+++ b/components/Modal/AddModal/AddModal.tsx
@@ -1,38 +1,84 @@
-import { useState } from 'react';
+import { FormEvent, useEffect, useState } from 'react';
import * as S from './AddModal.styled';
import BaseModal from '../BaseModal/BaseModal';
import { Folder, Folders } from '../../../hooks/useGetFolderList';
import { Button } from '../../Button/Button';
import Image from 'next/image';
+import { postLink } from '@/pages/api/api';
+import { useRouter } from 'next/router';
-function FolderButton({ item }: { item: Folder }) {
- const [check, setCheck] = useState(false);
-
+function FolderButton({
+ item,
+ $isSelected,
+ index,
+ handleMenuClick,
+ folderId,
+}: {
+ item: Folder;
+ $isSelected: string;
+ index: number;
+ handleMenuClick: (index: number, folderId: number) => void;
+ folderId: number;
+}) {
return (
- setCheck(!check)}>
+ {
+ handleMenuClick(index, folderId);
+ }}
+ >
{item.name}
{item.link.count}개의 링크
- {check && (
+ {$isSelected === 'select' && (
)}
);
}
-function AddModal({ link }: { link: Folders }) {
+function AddModal({ link, url }: { link: Folders; url: string }) {
+ const [folderSelected, setFolderSelected] = useState([]);
+ const [selectedId, setSelectedId] = useState(0);
+ const router = useRouter();
+
+ const handleMenuClick = (index: number, folderId: number) => {
+ const booleanArr: string[] = new Array(link.length).fill('none');
+ booleanArr[index] = 'select';
+ setFolderSelected(booleanArr);
+ setSelectedId(folderId);
+ console.log(url);
+ };
+
+ const addLink = async (e: FormEvent) => {
+ e.preventDefault();
+ await postLink(selectedId, url);
+ router.reload();
+ };
+
return (
폴더에 추가
- {link.map((item) => (
-
+ {link.map((item, index) => (
+
))}
-
+
+
+
);
}
diff --git a/components/Modal/DeleteModal/DeleteModal.tsx b/components/Modal/DeleteModal/DeleteModal.tsx
index 1349fc831..5418aba93 100644
--- a/components/Modal/DeleteModal/DeleteModal.tsx
+++ b/components/Modal/DeleteModal/DeleteModal.tsx
@@ -9,7 +9,7 @@ function DeleteModal({
folderId,
}: {
folderName: string;
- folderId: string;
+ folderId: number;
}) {
const router = useRouter();
diff --git a/hooks/useGetFolder.ts b/hooks/useGetFolder.ts
index 90c1ff3d0..43ac65b16 100644
--- a/hooks/useGetFolder.ts
+++ b/hooks/useGetFolder.ts
@@ -2,7 +2,7 @@ import { useEffect, useState } from 'react';
import { getFolderList } from '../pages/api/api';
export type LinkData = {
- id: string;
+ id: number;
created_at: Date;
updated_at?: Date;
url: string;
@@ -14,7 +14,7 @@ export type LinkData = {
export interface Links extends Array {}
-function useGetFolder(id: string, searchKeyword: string, folderId: string) {
+function useGetFolder(id: string, searchKeyword: string, folderId: number) {
const [linkList, setLinkList] = useState([]);
const [loading, setLoading] = useState(false);
diff --git a/hooks/useGetFolderList.ts b/hooks/useGetFolderList.ts
index f9173c0be..460572b3f 100644
--- a/hooks/useGetFolderList.ts
+++ b/hooks/useGetFolderList.ts
@@ -6,7 +6,7 @@ type Like = {
};
export interface Folder {
- id: string;
+ id: number;
created_at: Date;
name: string;
user_id: number;
diff --git a/pages/api/api.ts b/pages/api/api.ts
index ea8461936..bcaefed14 100644
--- a/pages/api/api.ts
+++ b/pages/api/api.ts
@@ -49,7 +49,7 @@ export async function getFolder(id: string) {
}
}
-export async function getFolderList(id: string, folderId: string) {
+export async function getFolderList(id: string, folderId: number) {
if (folderId) {
try {
const query = `/${id}/links?folderId=${folderId}`;
@@ -147,7 +147,7 @@ export async function postFolder(name: string) {
}
}
-export async function deleteFolder(folderId: string) {
+export async function deleteFolder(folderId: number) {
try {
const token = localStorage.getItem('token');
const { data } = await axios.delete(`/folders/${folderId}`, {
@@ -160,3 +160,24 @@ export async function deleteFolder(folderId: string) {
console.error('Error fetching post folder:', error);
}
}
+
+export async function postLink(folderId: number, url: string) {
+ try {
+ const token = localStorage.getItem('token');
+ const { data } = await axios.post(
+ '/links',
+ {
+ url: url,
+ folderId: folderId,
+ },
+ {
+ headers: {
+ Authorization: token,
+ },
+ }
+ );
+ return data;
+ } catch (error) {
+ console.error('Error fetching post folder:', error);
+ }
+}
diff --git a/pages/folder.tsx b/pages/folder.tsx
index a90b423f9..b8d405769 100644
--- a/pages/folder.tsx
+++ b/pages/folder.tsx
@@ -16,15 +16,16 @@ import FolderModals from '@/components/FolderModalContainer/FolderModals';
function Folder() {
const id = useContext(UserContext);
const [onSelect, setOnSelect] = useState({
- id: '',
+ id: 0,
name: '',
});
const [searchKeyword, setSearchKeyWord] = useState('');
const { linkList, loading } = useGetFolder(id, searchKeyword, onSelect.id);
const { link } = useGetFolderList(id);
- const obsRef = useRef(null);
const [toggleInput, setToggleInput] = useState(true);
const { modalState, openModal }: ContextValue = useModal();
+ const obsRef = useRef(null);
+ const inputRef = useRef(null);
const handleObserver = (entries: IntersectionObserverEntry[]) => {
entries.forEach((entry) => {
@@ -53,7 +54,7 @@ function Folder() {
-
+
openModal('add')}>
추가하기
@@ -83,9 +84,9 @@ function Folder() {
저장된 링크가 없습니다.
)}
- {modalState.add && (
+ {modalState.add && inputRef.current && (
-
+
)}
diff --git a/util/util.ts b/util/util.ts
index 83a0fa94b..fef6e2494 100644
--- a/util/util.ts
+++ b/util/util.ts
@@ -1,21 +1,21 @@
export const calculateDate = (date: number) => {
if (date < 60 * 2) {
- return { time: date, result: 'minute' };
+ return { time: 1, result: 'minute' };
}
if (date <= 60 * 59) {
- const minute = Math.floor(date / (60 * 59));
+ const minute = Math.floor(date / 59);
return { time: minute, result: 'minutes' };
}
if (date < 60 * 60 * 24) {
- const day = Math.floor(date / (60 * 60 * 24));
+ const day = Math.floor(date / (120 * 24));
return { time: day, result: 'hours' };
}
if (date < 60 * 60 * 24 * 30) {
- const day = Math.floor(date / (60 * 60 * 24));
+ const day = Math.floor(date / (120 * 24 * 30));
return { time: day, result: 'days' };
}
if (date < 60 * 60 * 24 * 30 * 12) {
- const month = Math.floor(date / (60 * 60 * 24 * 30));
+ const month = Math.floor(date / (120 * 24 * 30 * 12));
return { time: month, result: 'months' };
}
if (date >= 60 * 60 * 24 * 30 * 12) {
@@ -44,40 +44,3 @@ const emailPattern =
export function emailCheck(email: string) {
return emailPattern.test(email);
}
-
-export function validateInfo({
- email,
- password,
- passwordConfirm,
-}: {
- email: string;
- password?: string;
- passwordConfirm?: string;
-}) {
- let result = {
- ok: true,
- emailError: '',
- passwordError: '',
- passwordConfirmError: '',
- };
- if (email === '') {
- result.ok = false;
- result.emailError = '이메일을 입력해주세요';
- } else if (!emailCheck(email)) {
- result.ok = false;
- result.emailError = '올바른 이메일 주소가 아닙니다.';
- }
- if (password === '') {
- result.ok = false;
- result.passwordError = '비밀번호을 입력해주세요.';
- }
- if (passwordConfirm === '') {
- result.ok = false;
- result.passwordConfirmError = '비밀번호를 다시 입력해주세요.';
- }
- if (passwordConfirm && passwordConfirm !== password) {
- result.ok = false;
- result.passwordConfirmError = '비밀번호가 일치하지 않습니다.';
- }
- return result;
-}
From 0b7614782ff52d0d17eb1eefb418d3eceebf029d Mon Sep 17 00:00:00 2001
From: sj0724
Date: Fri, 17 May 2024 09:45:07 +0900
Subject: [PATCH 19/23] =?UTF-8?q?fix:=20=EC=BC=80=EB=B0=A5=EC=97=90?=
=?UTF-8?q?=EC=84=9C=20=EB=A7=81=ED=81=AC=20=EC=B6=94=EA=B0=80=20=EA=B8=B0?=
=?UTF-8?q?=EB=8A=A5=20=EA=B5=AC=ED=98=84=20=EC=99=84=EB=A3=8C?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
components/Card/Card.styled.ts | 3 +-
components/Card/Card.tsx | 13 +-
components/Input/Input.tsx | 1 +
components/KebabMenu/KebabMenu.tsx | 32 +-
components/Modal/AddModal/AddModal.tsx | 9 +-
package-lock.json | 1618 +++++++++++++-----------
pages/api/api.ts | 1 +
pages/folder.tsx | 15 +-
pages/shared.tsx | 4 +-
9 files changed, 959 insertions(+), 737 deletions(-)
diff --git a/components/Card/Card.styled.ts b/components/Card/Card.styled.ts
index 6df1d6eb0..25faf06e2 100644
--- a/components/Card/Card.styled.ts
+++ b/components/Card/Card.styled.ts
@@ -24,7 +24,7 @@ export const ItemImg = styled.div<{ image: string }>`
background-position: center;
&:hover {
- background-size: 130%;
+ background-size: 150%;
}
`;
@@ -87,6 +87,7 @@ export const ItemDescription = styled.p`
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
+ padding-top: 0.2rem;
a {
text-decoration: none;
diff --git a/components/Card/Card.tsx b/components/Card/Card.tsx
index 0d267c301..599f4f3ff 100644
--- a/components/Card/Card.tsx
+++ b/components/Card/Card.tsx
@@ -1,13 +1,18 @@
-import { useEffect, useState } from 'react';
+import { Dispatch, SetStateAction, useEffect, useState } from 'react';
import { changeDate, calculateDate } from '../../util/util';
import * as S from './Card.styled';
import KebabMenu from '../KebabMenu/KebabMenu';
import { LinkData } from '../../hooks/useGetFolder';
import Image from 'next/image';
import Link from 'next/link';
-import { Folders } from '@/hooks/useGetFolderList';
-function Card({ item, list }: { item: LinkData; list: Folders }) {
+function Card({
+ item,
+ setUrl,
+}: {
+ item: LinkData;
+ setUrl: Dispatch>;
+}) {
const [createdAt, setCreatedAt] = useState({ time: 0, result: '' });
const [fullDate, setFullDate] = useState('');
const { image_source } = item;
@@ -58,7 +63,7 @@ function Card({ item, list }: { item: LinkData; list: Folders }) {
{fullDate}
- {kebabView && }
+ {kebabView && }
);
diff --git a/components/Input/Input.tsx b/components/Input/Input.tsx
index 1807585d7..ac32aeac3 100644
--- a/components/Input/Input.tsx
+++ b/components/Input/Input.tsx
@@ -6,6 +6,7 @@ export interface InputProps extends HtmlHTMLAttributes {
onChange: (e: ChangeEvent) => void;
$error: string;
size: 'sm' | 'md' | 'lg';
+ placeholder: string;
}
function Input({ id, placeholder, type, onChange, $error, size }: InputProps) {
diff --git a/components/KebabMenu/KebabMenu.tsx b/components/KebabMenu/KebabMenu.tsx
index 3c3ef02f2..c4c07a6c1 100644
--- a/components/KebabMenu/KebabMenu.tsx
+++ b/components/KebabMenu/KebabMenu.tsx
@@ -1,15 +1,25 @@
-import React, { useRef } from 'react';
+import React, { Dispatch, SetStateAction, useRef } from 'react';
import { useModal } from '@/contexts/ModalContext';
import * as S from './KebabMenu.styled';
import ModalPortal from '@/Portal';
-import AddModal from '../Modal/AddModal/AddModal';
import DeleteLinkModal from '../Modal/DeleteLinkModal/DeleteLinkModal';
-import { Folders } from '@/hooks/useGetFolderList';
-function KebabMenu({ list, url }: { list: Folders; url: string }) {
+function KebabMenu({
+ url,
+ setUrl,
+}: {
+ url: string;
+ setUrl: Dispatch>;
+}) {
const kebabRef = useRef(null);
const { modalState, openModal } = useModal();
+ const addLinkKebab = (e: React.MouseEvent) => {
+ e.preventDefault();
+ openModal('add');
+ setUrl(url);
+ };
+
return (
<>
@@ -21,20 +31,8 @@ function KebabMenu({ list, url }: { list: Folders; url: string }) {
>
삭제하기
- {
- openModal('add');
- e.preventDefault();
- }}
- >
- 폴더에 추가
-
+ 폴더에 추가
- {modalState.add && (
-
-
-
- )}
{modalState.deleteLink && (
diff --git a/components/Modal/AddModal/AddModal.tsx b/components/Modal/AddModal/AddModal.tsx
index d840d5eb4..38064757f 100644
--- a/components/Modal/AddModal/AddModal.tsx
+++ b/components/Modal/AddModal/AddModal.tsx
@@ -1,4 +1,4 @@
-import { FormEvent, useEffect, useState } from 'react';
+import { FormEvent, useState } from 'react';
import * as S from './AddModal.styled';
import BaseModal from '../BaseModal/BaseModal';
import { Folder, Folders } from '../../../hooks/useGetFolderList';
@@ -48,13 +48,14 @@ function AddModal({ link, url }: { link: Folders; url: string }) {
booleanArr[index] = 'select';
setFolderSelected(booleanArr);
setSelectedId(folderId);
- console.log(url);
};
const addLink = async (e: FormEvent) => {
e.preventDefault();
- await postLink(selectedId, url);
- router.reload();
+ const result = await postLink(selectedId, url);
+ if (result) {
+ router.reload();
+ }
};
return (
diff --git a/package-lock.json b/package-lock.json
index dee51d716..e4806997b 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -24,15 +24,6 @@
"typescript": "^5"
}
},
- "node_modules/@aashutoshrathi/word-wrap": {
- "version": "1.2.6",
- "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz",
- "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==",
- "dev": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
"node_modules/@ampproject/remapping": {
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz",
@@ -102,29 +93,6 @@
"url": "https://opencollective.com/babel"
}
},
- "node_modules/@babel/core/node_modules/json5": {
- "version": "2.2.3",
- "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz",
- "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==",
- "dev": true,
- "peer": true,
- "bin": {
- "json5": "lib/cli.js"
- },
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/@babel/core/node_modules/semver": {
- "version": "6.3.1",
- "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
- "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
- "dev": true,
- "peer": true,
- "bin": {
- "semver": "bin/semver.js"
- }
- },
"node_modules/@babel/generator": {
"version": "7.24.5",
"resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.5.tgz",
@@ -170,33 +138,6 @@
"node": ">=6.9.0"
}
},
- "node_modules/@babel/helper-compilation-targets/node_modules/lru-cache": {
- "version": "5.1.1",
- "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
- "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "yallist": "^3.0.2"
- }
- },
- "node_modules/@babel/helper-compilation-targets/node_modules/semver": {
- "version": "6.3.1",
- "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
- "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
- "dev": true,
- "peer": true,
- "bin": {
- "semver": "bin/semver.js"
- }
- },
- "node_modules/@babel/helper-compilation-targets/node_modules/yallist": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
- "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==",
- "dev": true,
- "peer": true
- },
"node_modules/@babel/helper-environment-visitor": {
"version": "7.22.20",
"resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz",
@@ -360,84 +301,6 @@
"node": ">=6.9.0"
}
},
- "node_modules/@babel/highlight/node_modules/ansi-styles": {
- "version": "3.2.1",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
- "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "color-convert": "^1.9.0"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/@babel/highlight/node_modules/chalk": {
- "version": "2.4.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
- "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "ansi-styles": "^3.2.1",
- "escape-string-regexp": "^1.0.5",
- "supports-color": "^5.3.0"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/@babel/highlight/node_modules/color-convert": {
- "version": "1.9.3",
- "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
- "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "color-name": "1.1.3"
- }
- },
- "node_modules/@babel/highlight/node_modules/color-name": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
- "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==",
- "dev": true,
- "peer": true
- },
- "node_modules/@babel/highlight/node_modules/escape-string-regexp": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
- "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
- "dev": true,
- "peer": true,
- "engines": {
- "node": ">=0.8.0"
- }
- },
- "node_modules/@babel/highlight/node_modules/has-flag": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
- "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==",
- "dev": true,
- "peer": true,
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/@babel/highlight/node_modules/supports-color": {
- "version": "5.5.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
- "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "has-flag": "^3.0.0"
- },
- "engines": {
- "node": ">=4"
- }
- },
"node_modules/@babel/parser": {
"version": "7.24.5",
"resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.5.tgz",
@@ -467,9 +330,9 @@
}
},
"node_modules/@babel/runtime": {
- "version": "7.23.4",
- "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.4.tgz",
- "integrity": "sha512-2Yv65nlWnWlSpe3fXEyX5i7fx5kIKo4Qbcj+hMO0odwaneFjfXw5fdum+4yL20O0QiaHpia0cYQ9xpNMqrBwHg==",
+ "version": "7.24.5",
+ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.5.tgz",
+ "integrity": "sha512-Nms86NXrsaeU9vbBJKni6gXiEXZ4CVpYVzEjDH9Sb8vmZ3UljyA1GSOJl/6LGPO8EHLuSF9H+IxNXHPX8QHJ4g==",
"dev": true,
"dependencies": {
"regenerator-runtime": "^0.14.0"
@@ -515,16 +378,6 @@
"node": ">=6.9.0"
}
},
- "node_modules/@babel/traverse/node_modules/globals": {
- "version": "11.12.0",
- "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz",
- "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==",
- "dev": true,
- "peer": true,
- "engines": {
- "node": ">=4"
- }
- },
"node_modules/@babel/types": {
"version": "7.24.5",
"resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.5.tgz",
@@ -582,9 +435,9 @@
}
},
"node_modules/@eslint/eslintrc": {
- "version": "2.1.3",
- "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.3.tgz",
- "integrity": "sha512-yZzuIG+jnVu6hNSzFEN07e8BxF3uAzYtQb6uDkaYZLo6oYZDCq454c5kB8zxnzfCYyP4MIuyBn10L0DqwujTmA==",
+ "version": "2.1.4",
+ "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz",
+ "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==",
"dev": true,
"dependencies": {
"ajv": "^6.12.4",
@@ -604,23 +457,38 @@
"url": "https://opencollective.com/eslint"
}
},
+ "node_modules/@eslint/eslintrc/node_modules/globals": {
+ "version": "13.24.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz",
+ "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==",
+ "dev": true,
+ "dependencies": {
+ "type-fest": "^0.20.2"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
"node_modules/@eslint/js": {
- "version": "8.54.0",
- "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.54.0.tgz",
- "integrity": "sha512-ut5V+D+fOoWPgGGNj83GGjnntO39xDy6DWxO0wb7Jp3DcMX0TfIqdzHF85VTQkerdyGmuuMD9AKAo5KiNlf/AQ==",
+ "version": "8.57.0",
+ "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz",
+ "integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==",
"dev": true,
"engines": {
"node": "^12.22.0 || ^14.17.0 || >=16.0.0"
}
},
"node_modules/@humanwhocodes/config-array": {
- "version": "0.11.13",
- "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.13.tgz",
- "integrity": "sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ==",
+ "version": "0.11.14",
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz",
+ "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==",
"dev": true,
"dependencies": {
- "@humanwhocodes/object-schema": "^2.0.1",
- "debug": "^4.1.1",
+ "@humanwhocodes/object-schema": "^2.0.2",
+ "debug": "^4.3.1",
"minimatch": "^3.0.5"
},
"engines": {
@@ -641,9 +509,9 @@
}
},
"node_modules/@humanwhocodes/object-schema": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.1.tgz",
- "integrity": "sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==",
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz",
+ "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==",
"dev": true
},
"node_modules/@jridgewell/gen-mapping": {
@@ -884,9 +752,9 @@
}
},
"node_modules/@rushstack/eslint-patch": {
- "version": "1.6.0",
- "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.6.0.tgz",
- "integrity": "sha512-2/U3GXA6YiPYQDLGwtGlnNgKYBSwCFIHf8Y9LUY5VATHdtbLlU0Y1R3QoBnT0aB4qv/BEiVVsj7LJXoQCgJ2vA==",
+ "version": "1.10.2",
+ "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.10.2.tgz",
+ "integrity": "sha512-hw437iINopmQuxWPSUEvqE56NCPsiU8N4AYtfHmJFckclktzK9YQJieD3XkDCDH4OjL+C7zgPUh73R/nrcHrqw==",
"dev": true
},
"node_modules/@swc/helpers": {
@@ -904,61 +772,54 @@
"dev": true
},
"node_modules/@types/node": {
- "version": "20.9.4",
- "resolved": "https://registry.npmjs.org/@types/node/-/node-20.9.4.tgz",
- "integrity": "sha512-wmyg8HUhcn6ACjsn8oKYjkN/zUzQeNtMy44weTJSM6p4MMzEOuKbA3OjJ267uPCOW7Xex9dyrNTful8XTQYoDA==",
+ "version": "20.12.12",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-20.12.12.tgz",
+ "integrity": "sha512-eWLDGF/FOSPtAvEqeRAQ4C8LSA7M1I7i0ky1I8U7kD1J5ITyW3AsRhQrKVoWf5pFKZ2kILsEGJhsI9r93PYnOw==",
"dev": true,
"dependencies": {
"undici-types": "~5.26.4"
}
},
"node_modules/@types/prop-types": {
- "version": "15.7.11",
- "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.11.tgz",
- "integrity": "sha512-ga8y9v9uyeiLdpKddhxYQkxNDrfvuPrlFb0N1qnZZByvcElJaXthF1UhvCh9TLWJBEHeNtdnbysW7Y6Uq8CVng==",
+ "version": "15.7.12",
+ "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.12.tgz",
+ "integrity": "sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==",
"dev": true
},
"node_modules/@types/react": {
- "version": "18.2.38",
- "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.38.tgz",
- "integrity": "sha512-cBBXHzuPtQK6wNthuVMV6IjHAFkdl/FOPFIlkd81/Cd1+IqkHu/A+w4g43kaQQoYHik/ruaQBDL72HyCy1vuMw==",
+ "version": "18.3.2",
+ "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.2.tgz",
+ "integrity": "sha512-Btgg89dAnqD4vV7R3hlwOxgqobUQKgx3MmrQRi0yYbs/P0ym8XozIAlkqVilPqHQwXs4e9Tf63rrCgl58BcO4w==",
"dev": true,
"dependencies": {
"@types/prop-types": "*",
- "@types/scheduler": "*",
"csstype": "^3.0.2"
}
},
"node_modules/@types/react-dom": {
- "version": "18.2.17",
- "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.2.17.tgz",
- "integrity": "sha512-rvrT/M7Df5eykWFxn6MYt5Pem/Dbyc1N8Y0S9Mrkw2WFCRiqUgw9P7ul2NpwsXCSM1DVdENzdG9J5SreqfAIWg==",
+ "version": "18.3.0",
+ "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.0.tgz",
+ "integrity": "sha512-EhwApuTmMBmXuFOikhQLIBUn6uFg81SwLMOAUgodJF14SOBOCMdU04gDoYi0WOJJHD144TL32z4yDqCW3dnkQg==",
"dev": true,
"dependencies": {
"@types/react": "*"
}
},
- "node_modules/@types/scheduler": {
- "version": "0.16.8",
- "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.8.tgz",
- "integrity": "sha512-WZLiwShhwLRmeV6zH+GkbOFT6Z6VklCItrDioxUnv+u4Ll+8vKeFySoFyK/0ctcRpOmwAicELfmys1sDc/Rw+A==",
- "dev": true
- },
"node_modules/@types/stylis": {
"version": "4.2.5",
"resolved": "https://registry.npmjs.org/@types/stylis/-/stylis-4.2.5.tgz",
"integrity": "sha512-1Xve+NMN7FWjY14vLoY5tL3BVEQ/n42YLwaqJIPYhotZ9uBHt87VceMwWQpzmdEt2TNXIorIFG+YeCUUW7RInw=="
},
"node_modules/@typescript-eslint/parser": {
- "version": "6.12.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.12.0.tgz",
- "integrity": "sha512-s8/jNFPKPNRmXEnNXfuo1gemBdVmpQsK1pcu+QIvuNJuhFzGrpD7WjOcvDc/+uEdfzSYpNu7U/+MmbScjoQ6vg==",
+ "version": "6.21.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.21.0.tgz",
+ "integrity": "sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ==",
"dev": true,
"dependencies": {
- "@typescript-eslint/scope-manager": "6.12.0",
- "@typescript-eslint/types": "6.12.0",
- "@typescript-eslint/typescript-estree": "6.12.0",
- "@typescript-eslint/visitor-keys": "6.12.0",
+ "@typescript-eslint/scope-manager": "6.21.0",
+ "@typescript-eslint/types": "6.21.0",
+ "@typescript-eslint/typescript-estree": "6.21.0",
+ "@typescript-eslint/visitor-keys": "6.21.0",
"debug": "^4.3.4"
},
"engines": {
@@ -978,13 +839,13 @@
}
},
"node_modules/@typescript-eslint/scope-manager": {
- "version": "6.12.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.12.0.tgz",
- "integrity": "sha512-5gUvjg+XdSj8pcetdL9eXJzQNTl3RD7LgUiYTl8Aabdi8hFkaGSYnaS6BLc0BGNaDH+tVzVwmKtWvu0jLgWVbw==",
+ "version": "6.21.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.21.0.tgz",
+ "integrity": "sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg==",
"dev": true,
"dependencies": {
- "@typescript-eslint/types": "6.12.0",
- "@typescript-eslint/visitor-keys": "6.12.0"
+ "@typescript-eslint/types": "6.21.0",
+ "@typescript-eslint/visitor-keys": "6.21.0"
},
"engines": {
"node": "^16.0.0 || >=18.0.0"
@@ -995,9 +856,9 @@
}
},
"node_modules/@typescript-eslint/types": {
- "version": "6.12.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.12.0.tgz",
- "integrity": "sha512-MA16p/+WxM5JG/F3RTpRIcuOghWO30//VEOvzubM8zuOOBYXsP+IfjoCXXiIfy2Ta8FRh9+IO9QLlaFQUU+10Q==",
+ "version": "6.21.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.21.0.tgz",
+ "integrity": "sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg==",
"dev": true,
"engines": {
"node": "^16.0.0 || >=18.0.0"
@@ -1008,16 +869,17 @@
}
},
"node_modules/@typescript-eslint/typescript-estree": {
- "version": "6.12.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.12.0.tgz",
- "integrity": "sha512-vw9E2P9+3UUWzhgjyyVczLWxZ3GuQNT7QpnIY3o5OMeLO/c8oHljGc8ZpryBMIyympiAAaKgw9e5Hl9dCWFOYw==",
+ "version": "6.21.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.21.0.tgz",
+ "integrity": "sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ==",
"dev": true,
"dependencies": {
- "@typescript-eslint/types": "6.12.0",
- "@typescript-eslint/visitor-keys": "6.12.0",
+ "@typescript-eslint/types": "6.21.0",
+ "@typescript-eslint/visitor-keys": "6.21.0",
"debug": "^4.3.4",
"globby": "^11.1.0",
"is-glob": "^4.0.3",
+ "minimatch": "9.0.3",
"semver": "^7.5.4",
"ts-api-utils": "^1.0.1"
},
@@ -1034,13 +896,49 @@
}
}
},
+ "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
+ "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
+ "dev": true,
+ "dependencies": {
+ "balanced-match": "^1.0.0"
+ }
+ },
+ "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": {
+ "version": "9.0.3",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz",
+ "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==",
+ "dev": true,
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=16 || 14 >=14.17"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": {
+ "version": "7.6.2",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz",
+ "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==",
+ "dev": true,
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
"node_modules/@typescript-eslint/visitor-keys": {
- "version": "6.12.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.12.0.tgz",
- "integrity": "sha512-rg3BizTZHF1k3ipn8gfrzDXXSFKyOEB5zxYXInQ6z0hUvmQlhaZQzK+YmHmNViMA9HzW5Q9+bPPt90bU6GQwyw==",
+ "version": "6.21.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.21.0.tgz",
+ "integrity": "sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A==",
"dev": true,
"dependencies": {
- "@typescript-eslint/types": "6.12.0",
+ "@typescript-eslint/types": "6.21.0",
"eslint-visitor-keys": "^3.4.1"
},
"engines": {
@@ -1058,9 +956,9 @@
"dev": true
},
"node_modules/acorn": {
- "version": "8.11.2",
- "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.2.tgz",
- "integrity": "sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==",
+ "version": "8.11.3",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz",
+ "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==",
"dev": true,
"bin": {
"acorn": "bin/acorn"
@@ -1104,18 +1002,16 @@
}
},
"node_modules/ansi-styles": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
- "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
"dev": true,
+ "peer": true,
"dependencies": {
- "color-convert": "^2.0.1"
+ "color-convert": "^1.9.0"
},
"engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ "node": ">=4"
}
},
"node_modules/argparse": {
@@ -1134,28 +1030,32 @@
}
},
"node_modules/array-buffer-byte-length": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz",
- "integrity": "sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==",
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz",
+ "integrity": "sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==",
"dev": true,
"dependencies": {
- "call-bind": "^1.0.2",
- "is-array-buffer": "^3.0.1"
+ "call-bind": "^1.0.5",
+ "is-array-buffer": "^3.0.4"
+ },
+ "engines": {
+ "node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/array-includes": {
- "version": "3.1.7",
- "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.7.tgz",
- "integrity": "sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ==",
+ "version": "3.1.8",
+ "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.8.tgz",
+ "integrity": "sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==",
"dev": true,
"dependencies": {
- "call-bind": "^1.0.2",
- "define-properties": "^1.2.0",
- "es-abstract": "^1.22.1",
- "get-intrinsic": "^1.2.1",
+ "call-bind": "^1.0.7",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.23.2",
+ "es-object-atoms": "^1.0.0",
+ "get-intrinsic": "^1.2.4",
"is-string": "^1.0.7"
},
"engines": {
@@ -1174,17 +1074,38 @@
"node": ">=8"
}
},
+ "node_modules/array.prototype.findlast": {
+ "version": "1.2.5",
+ "resolved": "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz",
+ "integrity": "sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.7",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.23.2",
+ "es-errors": "^1.3.0",
+ "es-object-atoms": "^1.0.0",
+ "es-shim-unscopables": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
"node_modules/array.prototype.findlastindex": {
- "version": "1.2.3",
- "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.3.tgz",
- "integrity": "sha512-LzLoiOMAxvy+Gd3BAq3B7VeIgPdo+Q8hthvKtXybMvRV0jrXfJM/t8mw7nNlpEcVlVUnCnM2KSX4XU5HmpodOA==",
+ "version": "1.2.5",
+ "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.5.tgz",
+ "integrity": "sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==",
"dev": true,
"dependencies": {
- "call-bind": "^1.0.2",
- "define-properties": "^1.2.0",
- "es-abstract": "^1.22.1",
- "es-shim-unscopables": "^1.0.0",
- "get-intrinsic": "^1.2.1"
+ "call-bind": "^1.0.7",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.23.2",
+ "es-errors": "^1.3.0",
+ "es-object-atoms": "^1.0.0",
+ "es-shim-unscopables": "^1.0.2"
},
"engines": {
"node": ">= 0.4"
@@ -1229,31 +1150,44 @@
"url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/array.prototype.tosorted": {
+ "node_modules/array.prototype.toreversed": {
"version": "1.1.2",
- "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.2.tgz",
- "integrity": "sha512-HuQCHOlk1Weat5jzStICBCd83NxiIMwqDg/dHEsoefabn/hJRj5pVdWcPUSpRrwhwxZOsQassMpgN/xRYFBMIg==",
+ "resolved": "https://registry.npmjs.org/array.prototype.toreversed/-/array.prototype.toreversed-1.1.2.tgz",
+ "integrity": "sha512-wwDCoT4Ck4Cz7sLtgUmzR5UV3YF5mFHUlbChCzZBQZ+0m2cl/DH3tKgvphv1nKgFsJ48oCSg6p91q2Vm0I/ZMA==",
"dev": true,
"dependencies": {
"call-bind": "^1.0.2",
"define-properties": "^1.2.0",
"es-abstract": "^1.22.1",
- "es-shim-unscopables": "^1.0.0",
- "get-intrinsic": "^1.2.1"
+ "es-shim-unscopables": "^1.0.0"
+ }
+ },
+ "node_modules/array.prototype.tosorted": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.3.tgz",
+ "integrity": "sha512-/DdH4TiTmOKzyQbp/eadcCVexiCb36xJg7HshYOYJnNZFDj33GEv0P7GxsynpShhq4OLYJzbGcBDkLsDt7MnNg==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.5",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.22.3",
+ "es-errors": "^1.1.0",
+ "es-shim-unscopables": "^1.0.2"
}
},
"node_modules/arraybuffer.prototype.slice": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.2.tgz",
- "integrity": "sha512-yMBKppFur/fbHu9/6USUe03bZ4knMYiwFBcyiaXB8Go0qNehwX6inYPzK9U0NeQvGxKthcmHcaR8P5MStSRBAw==",
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz",
+ "integrity": "sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==",
"dev": true,
"dependencies": {
- "array-buffer-byte-length": "^1.0.0",
- "call-bind": "^1.0.2",
- "define-properties": "^1.2.0",
- "es-abstract": "^1.22.1",
- "get-intrinsic": "^1.2.1",
- "is-array-buffer": "^3.0.2",
+ "array-buffer-byte-length": "^1.0.1",
+ "call-bind": "^1.0.5",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.22.3",
+ "es-errors": "^1.2.1",
+ "get-intrinsic": "^1.2.3",
+ "is-array-buffer": "^3.0.4",
"is-shared-array-buffer": "^1.0.2"
},
"engines": {
@@ -1269,25 +1203,19 @@
"integrity": "sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==",
"dev": true
},
- "node_modules/asynciterator.prototype": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/asynciterator.prototype/-/asynciterator.prototype-1.0.0.tgz",
- "integrity": "sha512-wwHYEIS0Q80f5mosx3L/dfG5t5rjEa9Ft51GTaNt862EnpyGHpgz2RkZvLPp1oF5TnAiTohkEKVEu8pQPJI7Vg==",
- "dev": true,
- "dependencies": {
- "has-symbols": "^1.0.3"
- }
- },
"node_modules/asynckit": {
"version": "0.4.0",
"resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
"integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="
},
"node_modules/available-typed-arrays": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz",
- "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==",
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz",
+ "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==",
"dev": true,
+ "dependencies": {
+ "possible-typed-array-names": "^1.0.0"
+ },
"engines": {
"node": ">= 0.4"
},
@@ -1412,14 +1340,19 @@
}
},
"node_modules/call-bind": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.5.tgz",
- "integrity": "sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==",
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz",
+ "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==",
"dev": true,
"dependencies": {
+ "es-define-property": "^1.0.0",
+ "es-errors": "^1.3.0",
"function-bind": "^1.1.2",
- "get-intrinsic": "^1.2.1",
- "set-function-length": "^1.1.1"
+ "get-intrinsic": "^1.2.4",
+ "set-function-length": "^1.2.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
@@ -1443,9 +1376,9 @@
}
},
"node_modules/caniuse-lite": {
- "version": "1.0.30001617",
- "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001617.tgz",
- "integrity": "sha512-mLyjzNI9I+Pix8zwcrpxEbGlfqOkF9kM3ptzmKNw5tizSyYwMe+nGLTqMK9cO+0E+Bh6TsBxNAaHWEM8xwSsmA==",
+ "version": "1.0.30001620",
+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001620.tgz",
+ "integrity": "sha512-WJvYsOjd1/BYUY6SNGUosK9DUidBPDTnOARHp3fSmFO1ekdxaY6nKRttEVrfMmYi80ctS0kz1wiWmm14fVc3ew==",
"funding": [
{
"type": "opencollective",
@@ -1462,19 +1395,18 @@
]
},
"node_modules/chalk": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
- "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
"dev": true,
+ "peer": true,
"dependencies": {
- "ansi-styles": "^4.1.0",
- "supports-color": "^7.1.0"
+ "ansi-styles": "^3.2.1",
+ "escape-string-regexp": "^1.0.5",
+ "supports-color": "^5.3.0"
},
"engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/chalk/chalk?sponsor=1"
+ "node": ">=4"
}
},
"node_modules/client-only": {
@@ -1483,22 +1415,21 @@
"integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA=="
},
"node_modules/color-convert": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
- "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "version": "1.9.3",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
+ "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
"dev": true,
+ "peer": true,
"dependencies": {
- "color-name": "~1.1.4"
- },
- "engines": {
- "node": ">=7.0.0"
+ "color-name": "1.1.3"
}
},
"node_modules/color-name": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
- "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
- "dev": true
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
+ "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==",
+ "dev": true,
+ "peer": true
},
"node_modules/combined-stream": {
"version": "1.0.8",
@@ -1567,6 +1498,57 @@
"integrity": "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==",
"dev": true
},
+ "node_modules/data-view-buffer": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.1.tgz",
+ "integrity": "sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.6",
+ "es-errors": "^1.3.0",
+ "is-data-view": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/data-view-byte-length": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz",
+ "integrity": "sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.7",
+ "es-errors": "^1.3.0",
+ "is-data-view": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/data-view-byte-offset": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz",
+ "integrity": "sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.6",
+ "es-errors": "^1.3.0",
+ "is-data-view": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
"node_modules/debug": {
"version": "4.3.4",
"resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
@@ -1591,17 +1573,20 @@
"dev": true
},
"node_modules/define-data-property": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.1.tgz",
- "integrity": "sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==",
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz",
+ "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==",
"dev": true,
"dependencies": {
- "get-intrinsic": "^1.2.1",
- "gopd": "^1.0.1",
- "has-property-descriptors": "^1.0.0"
+ "es-define-property": "^1.0.0",
+ "es-errors": "^1.3.0",
+ "gopd": "^1.0.1"
},
"engines": {
"node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/define-properties": {
@@ -1663,9 +1648,9 @@
}
},
"node_modules/electron-to-chromium": {
- "version": "1.4.763",
- "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.763.tgz",
- "integrity": "sha512-k4J8NrtJ9QrvHLRo8Q18OncqBCB7tIUyqxRcJnlonQ0ioHKYB988GcDFF3ZePmnb8eHEopDs/wPHR/iGAFgoUQ==",
+ "version": "1.4.772",
+ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.772.tgz",
+ "integrity": "sha512-jFfEbxR/abTTJA3ci+2ok1NTuOBBtB4jH+UT6PUmRN+DY3WSD4FFRsgoVQ+QNIJ0T7wrXwzsWCI2WKC46b++2A==",
"dev": true,
"peer": true
},
@@ -1676,9 +1661,9 @@
"dev": true
},
"node_modules/enhanced-resolve": {
- "version": "5.15.0",
- "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz",
- "integrity": "sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==",
+ "version": "5.16.1",
+ "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.16.1.tgz",
+ "integrity": "sha512-4U5pNsuDl0EhuZpq46M5xPslstkviJuhrdobaRDBk2Jy2KO37FDAJl4lb2KlNabxT0m4MTK2UHNrsAcphE8nyw==",
"dev": true,
"dependencies": {
"graceful-fs": "^4.2.4",
@@ -1689,50 +1674,57 @@
}
},
"node_modules/es-abstract": {
- "version": "1.22.3",
- "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.3.tgz",
- "integrity": "sha512-eiiY8HQeYfYH2Con2berK+To6GrK2RxbPawDkGq4UiCQQfZHb6wX9qQqkbpPqaxQFcl8d9QzZqo0tGE0VcrdwA==",
- "dev": true,
- "dependencies": {
- "array-buffer-byte-length": "^1.0.0",
- "arraybuffer.prototype.slice": "^1.0.2",
- "available-typed-arrays": "^1.0.5",
- "call-bind": "^1.0.5",
- "es-set-tostringtag": "^2.0.1",
+ "version": "1.23.3",
+ "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.3.tgz",
+ "integrity": "sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==",
+ "dev": true,
+ "dependencies": {
+ "array-buffer-byte-length": "^1.0.1",
+ "arraybuffer.prototype.slice": "^1.0.3",
+ "available-typed-arrays": "^1.0.7",
+ "call-bind": "^1.0.7",
+ "data-view-buffer": "^1.0.1",
+ "data-view-byte-length": "^1.0.1",
+ "data-view-byte-offset": "^1.0.0",
+ "es-define-property": "^1.0.0",
+ "es-errors": "^1.3.0",
+ "es-object-atoms": "^1.0.0",
+ "es-set-tostringtag": "^2.0.3",
"es-to-primitive": "^1.2.1",
"function.prototype.name": "^1.1.6",
- "get-intrinsic": "^1.2.2",
- "get-symbol-description": "^1.0.0",
+ "get-intrinsic": "^1.2.4",
+ "get-symbol-description": "^1.0.2",
"globalthis": "^1.0.3",
"gopd": "^1.0.1",
- "has-property-descriptors": "^1.0.0",
- "has-proto": "^1.0.1",
+ "has-property-descriptors": "^1.0.2",
+ "has-proto": "^1.0.3",
"has-symbols": "^1.0.3",
- "hasown": "^2.0.0",
- "internal-slot": "^1.0.5",
- "is-array-buffer": "^3.0.2",
+ "hasown": "^2.0.2",
+ "internal-slot": "^1.0.7",
+ "is-array-buffer": "^3.0.4",
"is-callable": "^1.2.7",
- "is-negative-zero": "^2.0.2",
+ "is-data-view": "^1.0.1",
+ "is-negative-zero": "^2.0.3",
"is-regex": "^1.1.4",
- "is-shared-array-buffer": "^1.0.2",
+ "is-shared-array-buffer": "^1.0.3",
"is-string": "^1.0.7",
- "is-typed-array": "^1.1.12",
+ "is-typed-array": "^1.1.13",
"is-weakref": "^1.0.2",
"object-inspect": "^1.13.1",
"object-keys": "^1.1.1",
- "object.assign": "^4.1.4",
- "regexp.prototype.flags": "^1.5.1",
- "safe-array-concat": "^1.0.1",
- "safe-regex-test": "^1.0.0",
- "string.prototype.trim": "^1.2.8",
- "string.prototype.trimend": "^1.0.7",
- "string.prototype.trimstart": "^1.0.7",
- "typed-array-buffer": "^1.0.0",
- "typed-array-byte-length": "^1.0.0",
- "typed-array-byte-offset": "^1.0.0",
- "typed-array-length": "^1.0.4",
+ "object.assign": "^4.1.5",
+ "regexp.prototype.flags": "^1.5.2",
+ "safe-array-concat": "^1.1.2",
+ "safe-regex-test": "^1.0.3",
+ "string.prototype.trim": "^1.2.9",
+ "string.prototype.trimend": "^1.0.8",
+ "string.prototype.trimstart": "^1.0.8",
+ "typed-array-buffer": "^1.0.2",
+ "typed-array-byte-length": "^1.0.1",
+ "typed-array-byte-offset": "^1.0.2",
+ "typed-array-length": "^1.0.6",
"unbox-primitive": "^1.0.2",
- "which-typed-array": "^1.1.13"
+ "which-typed-array": "^1.1.15"
},
"engines": {
"node": ">= 0.4"
@@ -1741,37 +1733,73 @@
"url": "https://github.com/sponsors/ljharb"
}
},
+ "node_modules/es-define-property": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz",
+ "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==",
+ "dev": true,
+ "dependencies": {
+ "get-intrinsic": "^1.2.4"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/es-errors": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz",
+ "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
"node_modules/es-iterator-helpers": {
- "version": "1.0.15",
- "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.0.15.tgz",
- "integrity": "sha512-GhoY8uYqd6iwUl2kgjTm4CZAf6oo5mHK7BPqx3rKgx893YSsy0LGHV6gfqqQvZt/8xM8xeOnfXBCfqclMKkJ5g==",
+ "version": "1.0.19",
+ "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.0.19.tgz",
+ "integrity": "sha512-zoMwbCcH5hwUkKJkT8kDIBZSz9I6mVG//+lDCinLCGov4+r7NIy0ld8o03M0cJxl2spVf6ESYVS6/gpIfq1FFw==",
"dev": true,
"dependencies": {
- "asynciterator.prototype": "^1.0.0",
- "call-bind": "^1.0.2",
+ "call-bind": "^1.0.7",
"define-properties": "^1.2.1",
- "es-abstract": "^1.22.1",
- "es-set-tostringtag": "^2.0.1",
- "function-bind": "^1.1.1",
- "get-intrinsic": "^1.2.1",
+ "es-abstract": "^1.23.3",
+ "es-errors": "^1.3.0",
+ "es-set-tostringtag": "^2.0.3",
+ "function-bind": "^1.1.2",
+ "get-intrinsic": "^1.2.4",
"globalthis": "^1.0.3",
- "has-property-descriptors": "^1.0.0",
- "has-proto": "^1.0.1",
+ "has-property-descriptors": "^1.0.2",
+ "has-proto": "^1.0.3",
"has-symbols": "^1.0.3",
- "internal-slot": "^1.0.5",
+ "internal-slot": "^1.0.7",
"iterator.prototype": "^1.1.2",
- "safe-array-concat": "^1.0.1"
+ "safe-array-concat": "^1.1.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/es-object-atoms": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz",
+ "integrity": "sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==",
+ "dev": true,
+ "dependencies": {
+ "es-errors": "^1.3.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
}
},
"node_modules/es-set-tostringtag": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.2.tgz",
- "integrity": "sha512-BuDyupZt65P9D2D2vA/zqcI3G5xRsklm5N3xCwuiy+/vKy8i0ifdsQP1sLgO4tZDSCaQUSnmC48khknGMV3D2Q==",
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz",
+ "integrity": "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==",
"dev": true,
"dependencies": {
- "get-intrinsic": "^1.2.2",
- "has-tostringtag": "^1.0.0",
- "hasown": "^2.0.0"
+ "get-intrinsic": "^1.2.4",
+ "has-tostringtag": "^1.0.2",
+ "hasown": "^2.0.1"
},
"engines": {
"node": ">= 0.4"
@@ -1814,28 +1842,26 @@
}
},
"node_modules/escape-string-regexp": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
- "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+ "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
"dev": true,
+ "peer": true,
"engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
+ "node": ">=0.8.0"
}
},
"node_modules/eslint": {
- "version": "8.54.0",
- "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.54.0.tgz",
- "integrity": "sha512-NY0DfAkM8BIZDVl6PgSa1ttZbx3xHgJzSNJKYcQglem6CppHyMhRIQkBVSSMaSRnLhig3jsDbEzOjwCVt4AmmA==",
+ "version": "8.57.0",
+ "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz",
+ "integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==",
"dev": true,
"dependencies": {
"@eslint-community/eslint-utils": "^4.2.0",
"@eslint-community/regexpp": "^4.6.1",
- "@eslint/eslintrc": "^2.1.3",
- "@eslint/js": "8.54.0",
- "@humanwhocodes/config-array": "^0.11.13",
+ "@eslint/eslintrc": "^2.1.4",
+ "@eslint/js": "8.57.0",
+ "@humanwhocodes/config-array": "^0.11.14",
"@humanwhocodes/module-importer": "^1.0.1",
"@nodelib/fs.walk": "^1.2.8",
"@ungap/structured-clone": "^1.2.0",
@@ -1952,9 +1978,9 @@
}
},
"node_modules/eslint-module-utils": {
- "version": "2.8.0",
- "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.0.tgz",
- "integrity": "sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==",
+ "version": "2.8.1",
+ "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.1.tgz",
+ "integrity": "sha512-rXDXR3h7cs7dy9RNpUlQf80nX31XWJEyGq1tRMo+6GsO5VmTe4UTwtmonAD4ZkAsrfMVDA2wlGJ3790Ys+D49Q==",
"dev": true,
"dependencies": {
"debug": "^3.2.7"
@@ -1978,9 +2004,9 @@
}
},
"node_modules/eslint-plugin-import": {
- "version": "2.29.0",
- "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.29.0.tgz",
- "integrity": "sha512-QPOO5NO6Odv5lpoTkddtutccQjysJuFxoPS7fAHO+9m9udNHvTCPSAMW9zGAYj8lAIdr40I8yPCdUYrncXtrwg==",
+ "version": "2.29.1",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.29.1.tgz",
+ "integrity": "sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==",
"dev": true,
"dependencies": {
"array-includes": "^3.1.7",
@@ -1999,7 +2025,7 @@
"object.groupby": "^1.0.1",
"object.values": "^1.1.7",
"semver": "^6.3.1",
- "tsconfig-paths": "^3.14.2"
+ "tsconfig-paths": "^3.15.0"
},
"engines": {
"node": ">=4"
@@ -2029,15 +2055,6 @@
"node": ">=0.10.0"
}
},
- "node_modules/eslint-plugin-import/node_modules/semver": {
- "version": "6.3.1",
- "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
- "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
- "dev": true,
- "bin": {
- "semver": "bin/semver.js"
- }
- },
"node_modules/eslint-plugin-jsx-a11y": {
"version": "6.8.0",
"resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.8.0.tgz",
@@ -2069,27 +2086,29 @@
}
},
"node_modules/eslint-plugin-react": {
- "version": "7.33.2",
- "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.33.2.tgz",
- "integrity": "sha512-73QQMKALArI8/7xGLNI/3LylrEYrlKZSb5C9+q3OtOewTnMQi5cT+aE9E41sLCmli3I9PGGmD1yiZydyo4FEPw==",
+ "version": "7.34.1",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.34.1.tgz",
+ "integrity": "sha512-N97CxlouPT1AHt8Jn0mhhN2RrADlUAsk1/atcT2KyA/l9Q/E6ll7OIGwNumFmWfZ9skV3XXccYS19h80rHtgkw==",
"dev": true,
"dependencies": {
- "array-includes": "^3.1.6",
- "array.prototype.flatmap": "^1.3.1",
- "array.prototype.tosorted": "^1.1.1",
+ "array-includes": "^3.1.7",
+ "array.prototype.findlast": "^1.2.4",
+ "array.prototype.flatmap": "^1.3.2",
+ "array.prototype.toreversed": "^1.1.2",
+ "array.prototype.tosorted": "^1.1.3",
"doctrine": "^2.1.0",
- "es-iterator-helpers": "^1.0.12",
+ "es-iterator-helpers": "^1.0.17",
"estraverse": "^5.3.0",
"jsx-ast-utils": "^2.4.1 || ^3.0.0",
"minimatch": "^3.1.2",
- "object.entries": "^1.1.6",
- "object.fromentries": "^2.0.6",
- "object.hasown": "^1.1.2",
- "object.values": "^1.1.6",
+ "object.entries": "^1.1.7",
+ "object.fromentries": "^2.0.7",
+ "object.hasown": "^1.1.3",
+ "object.values": "^1.1.7",
"prop-types": "^15.8.1",
- "resolve": "^2.0.0-next.4",
+ "resolve": "^2.0.0-next.5",
"semver": "^6.3.1",
- "string.prototype.matchall": "^4.0.8"
+ "string.prototype.matchall": "^4.0.10"
},
"engines": {
"node": ">=4"
@@ -2099,9 +2118,9 @@
}
},
"node_modules/eslint-plugin-react-hooks": {
- "version": "4.6.0",
- "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz",
- "integrity": "sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==",
+ "version": "4.6.2",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.2.tgz",
+ "integrity": "sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ==",
"dev": true,
"engines": {
"node": ">=10"
@@ -2139,15 +2158,6 @@
"url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/eslint-plugin-react/node_modules/semver": {
- "version": "6.3.1",
- "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
- "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
- "dev": true,
- "bin": {
- "semver": "bin/semver.js"
- }
- },
"node_modules/eslint-scope": {
"version": "7.2.2",
"resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz",
@@ -2176,6 +2186,103 @@
"url": "https://opencollective.com/eslint"
}
},
+ "node_modules/eslint/node_modules/ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
+ "dependencies": {
+ "color-convert": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/eslint/node_modules/chalk": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "dev": true,
+ "dependencies": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/chalk?sponsor=1"
+ }
+ },
+ "node_modules/eslint/node_modules/color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "dependencies": {
+ "color-name": "~1.1.4"
+ },
+ "engines": {
+ "node": ">=7.0.0"
+ }
+ },
+ "node_modules/eslint/node_modules/color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
+ },
+ "node_modules/eslint/node_modules/escape-string-regexp": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
+ "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/eslint/node_modules/globals": {
+ "version": "13.24.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz",
+ "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==",
+ "dev": true,
+ "dependencies": {
+ "type-fest": "^0.20.2"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/eslint/node_modules/has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/eslint/node_modules/supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
"node_modules/espree": {
"version": "9.6.1",
"resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz",
@@ -2282,9 +2389,9 @@
"dev": true
},
"node_modules/fastq": {
- "version": "1.15.0",
- "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz",
- "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==",
+ "version": "1.17.1",
+ "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz",
+ "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==",
"dev": true,
"dependencies": {
"reusify": "^1.0.4"
@@ -2345,9 +2452,9 @@
}
},
"node_modules/flatted": {
- "version": "3.2.9",
- "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.9.tgz",
- "integrity": "sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==",
+ "version": "3.3.1",
+ "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz",
+ "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==",
"dev": true
},
"node_modules/follow-redirects": {
@@ -2444,28 +2551,33 @@
}
},
"node_modules/get-intrinsic": {
- "version": "1.2.2",
- "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.2.tgz",
- "integrity": "sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==",
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz",
+ "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==",
"dev": true,
"dependencies": {
+ "es-errors": "^1.3.0",
"function-bind": "^1.1.2",
"has-proto": "^1.0.1",
"has-symbols": "^1.0.3",
"hasown": "^2.0.0"
},
+ "engines": {
+ "node": ">= 0.4"
+ },
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/get-symbol-description": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz",
- "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==",
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz",
+ "integrity": "sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==",
"dev": true,
"dependencies": {
- "call-bind": "^1.0.2",
- "get-intrinsic": "^1.1.1"
+ "call-bind": "^1.0.5",
+ "es-errors": "^1.3.0",
+ "get-intrinsic": "^1.2.4"
},
"engines": {
"node": ">= 0.4"
@@ -2475,9 +2587,9 @@
}
},
"node_modules/get-tsconfig": {
- "version": "4.7.2",
- "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.7.2.tgz",
- "integrity": "sha512-wuMsz4leaj5hbGgg4IvDU0bqJagpftG5l5cXIAvo8uZrqn0NJqwtfupTN00VnkQJPcIRrxYrm1Ue24btpCha2A==",
+ "version": "4.7.5",
+ "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.7.5.tgz",
+ "integrity": "sha512-ZCuZCnlqNzjb4QprAzXKdpp/gh6KTxSJuw3IBsPnV/7fV4NxC9ckB+vPTt8w7fJA0TaSD7c55BR47JD6MEDyDw==",
"dev": true,
"dependencies": {
"resolve-pkg-maps": "^1.0.0"
@@ -2524,27 +2636,23 @@
"integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw=="
},
"node_modules/globals": {
- "version": "13.23.0",
- "resolved": "https://registry.npmjs.org/globals/-/globals-13.23.0.tgz",
- "integrity": "sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA==",
+ "version": "11.12.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz",
+ "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==",
"dev": true,
- "dependencies": {
- "type-fest": "^0.20.2"
- },
+ "peer": true,
"engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
+ "node": ">=4"
}
},
"node_modules/globalthis": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz",
- "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==",
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz",
+ "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==",
"dev": true,
"dependencies": {
- "define-properties": "^1.1.3"
+ "define-properties": "^1.2.1",
+ "gopd": "^1.0.1"
},
"engines": {
"node": ">= 0.4"
@@ -2606,30 +2714,31 @@
}
},
"node_modules/has-flag": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
- "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+ "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==",
"dev": true,
+ "peer": true,
"engines": {
- "node": ">=8"
+ "node": ">=4"
}
},
"node_modules/has-property-descriptors": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz",
- "integrity": "sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==",
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz",
+ "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==",
"dev": true,
"dependencies": {
- "get-intrinsic": "^1.2.2"
+ "es-define-property": "^1.0.0"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/has-proto": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz",
- "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==",
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz",
+ "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==",
"dev": true,
"engines": {
"node": ">= 0.4"
@@ -2651,12 +2760,12 @@
}
},
"node_modules/has-tostringtag": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz",
- "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==",
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz",
+ "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==",
"dev": true,
"dependencies": {
- "has-symbols": "^1.0.2"
+ "has-symbols": "^1.0.3"
},
"engines": {
"node": ">= 0.4"
@@ -2666,9 +2775,9 @@
}
},
"node_modules/hasown": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz",
- "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==",
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz",
+ "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==",
"dev": true,
"dependencies": {
"function-bind": "^1.1.2"
@@ -2678,9 +2787,9 @@
}
},
"node_modules/ignore": {
- "version": "5.3.0",
- "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.0.tgz",
- "integrity": "sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg==",
+ "version": "5.3.1",
+ "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz",
+ "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==",
"dev": true,
"engines": {
"node": ">= 4"
@@ -2728,12 +2837,12 @@
"dev": true
},
"node_modules/internal-slot": {
- "version": "1.0.6",
- "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.6.tgz",
- "integrity": "sha512-Xj6dv+PsbtwyPpEflsejS+oIZxmMlV44zAhG479uYu89MsjcYOhCFnNyKrkJrihbsiasQyY0afoCl/9BLR65bg==",
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz",
+ "integrity": "sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==",
"dev": true,
"dependencies": {
- "get-intrinsic": "^1.2.2",
+ "es-errors": "^1.3.0",
"hasown": "^2.0.0",
"side-channel": "^1.0.4"
},
@@ -2742,14 +2851,16 @@
}
},
"node_modules/is-array-buffer": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz",
- "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==",
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz",
+ "integrity": "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==",
"dev": true,
"dependencies": {
"call-bind": "^1.0.2",
- "get-intrinsic": "^1.2.0",
- "is-typed-array": "^1.1.10"
+ "get-intrinsic": "^1.2.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
@@ -2822,6 +2933,21 @@
"url": "https://github.com/sponsors/ljharb"
}
},
+ "node_modules/is-data-view": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.1.tgz",
+ "integrity": "sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==",
+ "dev": true,
+ "dependencies": {
+ "is-typed-array": "^1.1.13"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
"node_modules/is-date-object": {
"version": "1.0.5",
"resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz",
@@ -2886,18 +3012,21 @@
}
},
"node_modules/is-map": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.2.tgz",
- "integrity": "sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==",
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz",
+ "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==",
"dev": true,
+ "engines": {
+ "node": ">= 0.4"
+ },
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/is-negative-zero": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz",
- "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==",
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz",
+ "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==",
"dev": true,
"engines": {
"node": ">= 0.4"
@@ -2956,21 +3085,27 @@
}
},
"node_modules/is-set": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.2.tgz",
- "integrity": "sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==",
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz",
+ "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==",
"dev": true,
+ "engines": {
+ "node": ">= 0.4"
+ },
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/is-shared-array-buffer": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz",
- "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==",
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz",
+ "integrity": "sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==",
"dev": true,
"dependencies": {
- "call-bind": "^1.0.2"
+ "call-bind": "^1.0.7"
+ },
+ "engines": {
+ "node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
@@ -3007,12 +3142,12 @@
}
},
"node_modules/is-typed-array": {
- "version": "1.1.12",
- "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.12.tgz",
- "integrity": "sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==",
+ "version": "1.1.13",
+ "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz",
+ "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==",
"dev": true,
"dependencies": {
- "which-typed-array": "^1.1.11"
+ "which-typed-array": "^1.1.14"
},
"engines": {
"node": ">= 0.4"
@@ -3022,10 +3157,13 @@
}
},
"node_modules/is-weakmap": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.1.tgz",
- "integrity": "sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==",
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz",
+ "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==",
"dev": true,
+ "engines": {
+ "node": ">= 0.4"
+ },
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
@@ -3043,13 +3181,16 @@
}
},
"node_modules/is-weakset": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.2.tgz",
- "integrity": "sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==",
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.3.tgz",
+ "integrity": "sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ==",
"dev": true,
"dependencies": {
- "call-bind": "^1.0.2",
- "get-intrinsic": "^1.1.1"
+ "call-bind": "^1.0.7",
+ "get-intrinsic": "^1.2.4"
+ },
+ "engines": {
+ "node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
@@ -3129,15 +3270,16 @@
"dev": true
},
"node_modules/json5": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz",
- "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==",
+ "version": "2.2.3",
+ "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz",
+ "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==",
"dev": true,
- "dependencies": {
- "minimist": "^1.2.0"
- },
+ "peer": true,
"bin": {
"json5": "lib/cli.js"
+ },
+ "engines": {
+ "node": ">=6"
}
},
"node_modules/jsx-ast-utils": {
@@ -3234,15 +3376,13 @@
}
},
"node_modules/lru-cache": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
- "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
+ "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==",
"dev": true,
+ "peer": true,
"dependencies": {
- "yallist": "^4.0.0"
- },
- "engines": {
- "node": ">=10"
+ "yallist": "^3.0.2"
}
},
"node_modules/merge2": {
@@ -3416,13 +3556,13 @@
}
},
"node_modules/object.assign": {
- "version": "4.1.4",
- "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz",
- "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==",
+ "version": "4.1.5",
+ "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz",
+ "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==",
"dev": true,
"dependencies": {
- "call-bind": "^1.0.2",
- "define-properties": "^1.1.4",
+ "call-bind": "^1.0.5",
+ "define-properties": "^1.2.1",
"has-symbols": "^1.0.3",
"object-keys": "^1.1.1"
},
@@ -3434,28 +3574,29 @@
}
},
"node_modules/object.entries": {
- "version": "1.1.7",
- "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.7.tgz",
- "integrity": "sha512-jCBs/0plmPsOnrKAfFQXRG2NFjlhZgjjcBLSmTnEhU8U6vVTsVe8ANeQJCHTl3gSsI4J+0emOoCgoKlmQPMgmA==",
+ "version": "1.1.8",
+ "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.8.tgz",
+ "integrity": "sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ==",
"dev": true,
"dependencies": {
- "call-bind": "^1.0.2",
- "define-properties": "^1.2.0",
- "es-abstract": "^1.22.1"
+ "call-bind": "^1.0.7",
+ "define-properties": "^1.2.1",
+ "es-object-atoms": "^1.0.0"
},
"engines": {
"node": ">= 0.4"
}
},
"node_modules/object.fromentries": {
- "version": "2.0.7",
- "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.7.tgz",
- "integrity": "sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA==",
+ "version": "2.0.8",
+ "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz",
+ "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==",
"dev": true,
"dependencies": {
- "call-bind": "^1.0.2",
- "define-properties": "^1.2.0",
- "es-abstract": "^1.22.1"
+ "call-bind": "^1.0.7",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.23.2",
+ "es-object-atoms": "^1.0.0"
},
"engines": {
"node": ">= 0.4"
@@ -3465,39 +3606,45 @@
}
},
"node_modules/object.groupby": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.1.tgz",
- "integrity": "sha512-HqaQtqLnp/8Bn4GL16cj+CUYbnpe1bh0TtEaWvybszDG4tgxCJuRpV8VGuvNaI1fAnI4lUJzDG55MXcOH4JZcQ==",
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.3.tgz",
+ "integrity": "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==",
"dev": true,
"dependencies": {
- "call-bind": "^1.0.2",
- "define-properties": "^1.2.0",
- "es-abstract": "^1.22.1",
- "get-intrinsic": "^1.2.1"
+ "call-bind": "^1.0.7",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.23.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
}
},
"node_modules/object.hasown": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.3.tgz",
- "integrity": "sha512-fFI4VcYpRHvSLXxP7yiZOMAd331cPfd2p7PFDVbgUsYOfCT3tICVqXWngbjr4m49OvsBwUBQ6O2uQoJvy3RexA==",
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.4.tgz",
+ "integrity": "sha512-FZ9LZt9/RHzGySlBARE3VF+gE26TxR38SdmqOqliuTnl9wrKulaQs+4dee1V+Io8VfxqzAfHu6YuRgUy8OHoTg==",
"dev": true,
"dependencies": {
- "define-properties": "^1.2.0",
- "es-abstract": "^1.22.1"
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.23.2",
+ "es-object-atoms": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/object.values": {
- "version": "1.1.7",
- "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.7.tgz",
- "integrity": "sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng==",
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.0.tgz",
+ "integrity": "sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==",
"dev": true,
"dependencies": {
- "call-bind": "^1.0.2",
- "define-properties": "^1.2.0",
- "es-abstract": "^1.22.1"
+ "call-bind": "^1.0.7",
+ "define-properties": "^1.2.1",
+ "es-object-atoms": "^1.0.0"
},
"engines": {
"node": ">= 0.4"
@@ -3516,17 +3663,17 @@
}
},
"node_modules/optionator": {
- "version": "0.9.3",
- "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz",
- "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==",
+ "version": "0.9.4",
+ "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz",
+ "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==",
"dev": true,
"dependencies": {
- "@aashutoshrathi/word-wrap": "^1.2.3",
"deep-is": "^0.1.3",
"fast-levenshtein": "^2.0.6",
"levn": "^0.4.1",
"prelude-ls": "^1.2.1",
- "type-check": "^0.4.0"
+ "type-check": "^0.4.0",
+ "word-wrap": "^1.2.5"
},
"engines": {
"node": ">= 0.8.0"
@@ -3617,9 +3764,9 @@
}
},
"node_modules/picocolors": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz",
- "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ=="
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz",
+ "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew=="
},
"node_modules/picomatch": {
"version": "2.3.1",
@@ -3633,6 +3780,15 @@
"url": "https://github.com/sponsors/jonschlinkert"
}
},
+ "node_modules/possible-typed-array-names": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz",
+ "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
"node_modules/postcss": {
"version": "8.4.31",
"resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz",
@@ -3720,9 +3876,9 @@
]
},
"node_modules/react": {
- "version": "18.2.0",
- "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz",
- "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==",
+ "version": "18.3.1",
+ "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz",
+ "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==",
"dependencies": {
"loose-envify": "^1.1.0"
},
@@ -3731,15 +3887,15 @@
}
},
"node_modules/react-dom": {
- "version": "18.2.0",
- "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz",
- "integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==",
+ "version": "18.3.1",
+ "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz",
+ "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==",
"dependencies": {
"loose-envify": "^1.1.0",
- "scheduler": "^0.23.0"
+ "scheduler": "^0.23.2"
},
"peerDependencies": {
- "react": "^18.2.0"
+ "react": "^18.3.1"
}
},
"node_modules/react-is": {
@@ -3749,15 +3905,16 @@
"dev": true
},
"node_modules/reflect.getprototypeof": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.4.tgz",
- "integrity": "sha512-ECkTw8TmJwW60lOTR+ZkODISW6RQ8+2CL3COqtiJKLd6MmB45hN51HprHFziKLGkAuTGQhBb91V8cy+KHlaCjw==",
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.6.tgz",
+ "integrity": "sha512-fmfw4XgoDke3kdI6h4xcUz1dG8uaiv5q9gcEwLS4Pnth2kxT+GZ7YehS1JTMGBQmtV7Y4GFGbs2re2NqhdozUg==",
"dev": true,
"dependencies": {
- "call-bind": "^1.0.2",
- "define-properties": "^1.2.0",
- "es-abstract": "^1.22.1",
- "get-intrinsic": "^1.2.1",
+ "call-bind": "^1.0.7",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.23.1",
+ "es-errors": "^1.3.0",
+ "get-intrinsic": "^1.2.4",
"globalthis": "^1.0.3",
"which-builtin-type": "^1.1.3"
},
@@ -3769,20 +3926,21 @@
}
},
"node_modules/regenerator-runtime": {
- "version": "0.14.0",
- "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.0.tgz",
- "integrity": "sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==",
+ "version": "0.14.1",
+ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz",
+ "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==",
"dev": true
},
"node_modules/regexp.prototype.flags": {
- "version": "1.5.1",
- "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.1.tgz",
- "integrity": "sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==",
+ "version": "1.5.2",
+ "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz",
+ "integrity": "sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==",
"dev": true,
"dependencies": {
- "call-bind": "^1.0.2",
- "define-properties": "^1.2.0",
- "set-function-name": "^2.0.0"
+ "call-bind": "^1.0.6",
+ "define-properties": "^1.2.1",
+ "es-errors": "^1.3.0",
+ "set-function-name": "^2.0.1"
},
"engines": {
"node": ">= 0.4"
@@ -3875,13 +4033,13 @@
}
},
"node_modules/safe-array-concat": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.0.1.tgz",
- "integrity": "sha512-6XbUAseYE2KtOuGueyeobCySj9L4+66Tn6KQMOPQJrAJEowYKW/YR/MGJZl7FdydUdaFu4LYyDZjxf4/Nmo23Q==",
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.2.tgz",
+ "integrity": "sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==",
"dev": true,
"dependencies": {
- "call-bind": "^1.0.2",
- "get-intrinsic": "^1.2.1",
+ "call-bind": "^1.0.7",
+ "get-intrinsic": "^1.2.4",
"has-symbols": "^1.0.3",
"isarray": "^2.0.5"
},
@@ -3893,66 +4051,66 @@
}
},
"node_modules/safe-regex-test": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz",
- "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==",
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz",
+ "integrity": "sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==",
"dev": true,
"dependencies": {
- "call-bind": "^1.0.2",
- "get-intrinsic": "^1.1.3",
+ "call-bind": "^1.0.6",
+ "es-errors": "^1.3.0",
"is-regex": "^1.1.4"
},
+ "engines": {
+ "node": ">= 0.4"
+ },
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/scheduler": {
- "version": "0.23.0",
- "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz",
- "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==",
+ "version": "0.23.2",
+ "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz",
+ "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==",
"dependencies": {
"loose-envify": "^1.1.0"
}
},
"node_modules/semver": {
- "version": "7.5.4",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz",
- "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==",
+ "version": "6.3.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
+ "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
"dev": true,
- "dependencies": {
- "lru-cache": "^6.0.0"
- },
"bin": {
"semver": "bin/semver.js"
- },
- "engines": {
- "node": ">=10"
}
},
"node_modules/set-function-length": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.1.1.tgz",
- "integrity": "sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ==",
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz",
+ "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==",
"dev": true,
"dependencies": {
- "define-data-property": "^1.1.1",
- "get-intrinsic": "^1.2.1",
+ "define-data-property": "^1.1.4",
+ "es-errors": "^1.3.0",
+ "function-bind": "^1.1.2",
+ "get-intrinsic": "^1.2.4",
"gopd": "^1.0.1",
- "has-property-descriptors": "^1.0.0"
+ "has-property-descriptors": "^1.0.2"
},
"engines": {
"node": ">= 0.4"
}
},
"node_modules/set-function-name": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.1.tgz",
- "integrity": "sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA==",
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz",
+ "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==",
"dev": true,
"dependencies": {
- "define-data-property": "^1.0.1",
+ "define-data-property": "^1.1.4",
+ "es-errors": "^1.3.0",
"functions-have-names": "^1.2.3",
- "has-property-descriptors": "^1.0.0"
+ "has-property-descriptors": "^1.0.2"
},
"engines": {
"node": ">= 0.4"
@@ -3985,14 +4143,18 @@
}
},
"node_modules/side-channel": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz",
- "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==",
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz",
+ "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==",
"dev": true,
"dependencies": {
- "call-bind": "^1.0.0",
- "get-intrinsic": "^1.0.2",
- "object-inspect": "^1.9.0"
+ "call-bind": "^1.0.7",
+ "es-errors": "^1.3.0",
+ "get-intrinsic": "^1.2.4",
+ "object-inspect": "^1.13.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
@@ -4024,34 +4186,41 @@
}
},
"node_modules/string.prototype.matchall": {
- "version": "4.0.10",
- "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.10.tgz",
- "integrity": "sha512-rGXbGmOEosIQi6Qva94HUjgPs9vKW+dkG7Y8Q5O2OYkWL6wFaTRZO8zM4mhP94uX55wgyrXzfS2aGtGzUL7EJQ==",
+ "version": "4.0.11",
+ "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.11.tgz",
+ "integrity": "sha512-NUdh0aDavY2og7IbBPenWqR9exH+E26Sv8e0/eTe1tltDGZL+GtBkDAnnyBtmekfK6/Dq3MkcGtzXFEd1LQrtg==",
"dev": true,
"dependencies": {
- "call-bind": "^1.0.2",
- "define-properties": "^1.2.0",
- "es-abstract": "^1.22.1",
- "get-intrinsic": "^1.2.1",
+ "call-bind": "^1.0.7",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.23.2",
+ "es-errors": "^1.3.0",
+ "es-object-atoms": "^1.0.0",
+ "get-intrinsic": "^1.2.4",
+ "gopd": "^1.0.1",
"has-symbols": "^1.0.3",
- "internal-slot": "^1.0.5",
- "regexp.prototype.flags": "^1.5.0",
- "set-function-name": "^2.0.0",
- "side-channel": "^1.0.4"
+ "internal-slot": "^1.0.7",
+ "regexp.prototype.flags": "^1.5.2",
+ "set-function-name": "^2.0.2",
+ "side-channel": "^1.0.6"
+ },
+ "engines": {
+ "node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/string.prototype.trim": {
- "version": "1.2.8",
- "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.8.tgz",
- "integrity": "sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==",
+ "version": "1.2.9",
+ "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz",
+ "integrity": "sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==",
"dev": true,
"dependencies": {
- "call-bind": "^1.0.2",
- "define-properties": "^1.2.0",
- "es-abstract": "^1.22.1"
+ "call-bind": "^1.0.7",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.23.0",
+ "es-object-atoms": "^1.0.0"
},
"engines": {
"node": ">= 0.4"
@@ -4061,28 +4230,31 @@
}
},
"node_modules/string.prototype.trimend": {
- "version": "1.0.7",
- "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.7.tgz",
- "integrity": "sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==",
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz",
+ "integrity": "sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==",
"dev": true,
"dependencies": {
- "call-bind": "^1.0.2",
- "define-properties": "^1.2.0",
- "es-abstract": "^1.22.1"
+ "call-bind": "^1.0.7",
+ "define-properties": "^1.2.1",
+ "es-object-atoms": "^1.0.0"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/string.prototype.trimstart": {
- "version": "1.0.7",
- "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.7.tgz",
- "integrity": "sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==",
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz",
+ "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==",
"dev": true,
"dependencies": {
- "call-bind": "^1.0.2",
- "define-properties": "^1.2.0",
- "es-abstract": "^1.22.1"
+ "call-bind": "^1.0.7",
+ "define-properties": "^1.2.1",
+ "es-object-atoms": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
@@ -4203,15 +4375,16 @@
"integrity": "sha512-bhtUjWd/z6ltJiQwg0dUfxEJ+W+jdqQd8TbWLWyeIJHlnsqmGLRFFd8e5mA0AZi/zx90smXRlN66YMTcaSFifg=="
},
"node_modules/supports-color": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
- "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
"dev": true,
+ "peer": true,
"dependencies": {
- "has-flag": "^4.0.0"
+ "has-flag": "^3.0.0"
},
"engines": {
- "node": ">=8"
+ "node": ">=4"
}
},
"node_modules/supports-preserve-symlinks-flag": {
@@ -4263,21 +4436,21 @@
}
},
"node_modules/ts-api-utils": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.0.3.tgz",
- "integrity": "sha512-wNMeqtMz5NtwpT/UZGY5alT+VoKdSsOOP/kqHFcUW1P/VRhH2wJ48+DN2WwUliNbQ976ETwDL0Ifd2VVvgonvg==",
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.3.0.tgz",
+ "integrity": "sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==",
"dev": true,
"engines": {
- "node": ">=16.13.0"
+ "node": ">=16"
},
"peerDependencies": {
"typescript": ">=4.2.0"
}
},
"node_modules/tsconfig-paths": {
- "version": "3.14.2",
- "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz",
- "integrity": "sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g==",
+ "version": "3.15.0",
+ "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz",
+ "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==",
"dev": true,
"dependencies": {
"@types/json5": "^0.0.29",
@@ -4286,6 +4459,18 @@
"strip-bom": "^3.0.0"
}
},
+ "node_modules/tsconfig-paths/node_modules/json5": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz",
+ "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==",
+ "dev": true,
+ "dependencies": {
+ "minimist": "^1.2.0"
+ },
+ "bin": {
+ "json5": "lib/cli.js"
+ }
+ },
"node_modules/tslib": {
"version": "2.6.2",
"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz",
@@ -4316,29 +4501,30 @@
}
},
"node_modules/typed-array-buffer": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz",
- "integrity": "sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==",
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz",
+ "integrity": "sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==",
"dev": true,
"dependencies": {
- "call-bind": "^1.0.2",
- "get-intrinsic": "^1.2.1",
- "is-typed-array": "^1.1.10"
+ "call-bind": "^1.0.7",
+ "es-errors": "^1.3.0",
+ "is-typed-array": "^1.1.13"
},
"engines": {
"node": ">= 0.4"
}
},
"node_modules/typed-array-byte-length": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz",
- "integrity": "sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==",
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz",
+ "integrity": "sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==",
"dev": true,
"dependencies": {
- "call-bind": "^1.0.2",
+ "call-bind": "^1.0.7",
"for-each": "^0.3.3",
- "has-proto": "^1.0.1",
- "is-typed-array": "^1.1.10"
+ "gopd": "^1.0.1",
+ "has-proto": "^1.0.3",
+ "is-typed-array": "^1.1.13"
},
"engines": {
"node": ">= 0.4"
@@ -4348,16 +4534,17 @@
}
},
"node_modules/typed-array-byte-offset": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz",
- "integrity": "sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==",
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz",
+ "integrity": "sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==",
"dev": true,
"dependencies": {
- "available-typed-arrays": "^1.0.5",
- "call-bind": "^1.0.2",
+ "available-typed-arrays": "^1.0.7",
+ "call-bind": "^1.0.7",
"for-each": "^0.3.3",
- "has-proto": "^1.0.1",
- "is-typed-array": "^1.1.10"
+ "gopd": "^1.0.1",
+ "has-proto": "^1.0.3",
+ "is-typed-array": "^1.1.13"
},
"engines": {
"node": ">= 0.4"
@@ -4367,23 +4554,29 @@
}
},
"node_modules/typed-array-length": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz",
- "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==",
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.6.tgz",
+ "integrity": "sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==",
"dev": true,
"dependencies": {
- "call-bind": "^1.0.2",
+ "call-bind": "^1.0.7",
"for-each": "^0.3.3",
- "is-typed-array": "^1.1.9"
+ "gopd": "^1.0.1",
+ "has-proto": "^1.0.3",
+ "is-typed-array": "^1.1.13",
+ "possible-typed-array-names": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/typescript": {
- "version": "5.3.2",
- "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.3.2.tgz",
- "integrity": "sha512-6l+RyNy7oAHDfxC4FzSJcz9vnjTKxrLpDG5M2Vu4SHRVNg6xzqZp6LYSR9zjqQTu8DU/f5xwxUdADOkbrIX2gQ==",
+ "version": "5.4.5",
+ "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.5.tgz",
+ "integrity": "sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==",
"dev": true,
"bin": {
"tsc": "bin/tsc",
@@ -4415,9 +4608,9 @@
"dev": true
},
"node_modules/update-browserslist-db": {
- "version": "1.0.15",
- "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.15.tgz",
- "integrity": "sha512-K9HWH62x3/EalU1U6sjSZiylm9C8tgq2mSvshZpqc7QE69RaA2qjhkW2HlNA0tFpEbtyFz7HTqbSdN4MSwUodA==",
+ "version": "1.0.16",
+ "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.16.tgz",
+ "integrity": "sha512-KVbTxlBYlckhF5wgfyZXTWnMn7MMZjMu9XG8bPlliUOP9ThaF4QnhP8qrjrH7DRzHfSk0oQv1wToW+iA5GajEQ==",
"dev": true,
"funding": [
{
@@ -4436,7 +4629,7 @@
"peer": true,
"dependencies": {
"escalade": "^3.1.2",
- "picocolors": "^1.0.0"
+ "picocolors": "^1.0.1"
},
"bin": {
"update-browserslist-db": "cli.js"
@@ -4524,31 +4717,34 @@
}
},
"node_modules/which-collection": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.1.tgz",
- "integrity": "sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==",
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz",
+ "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==",
"dev": true,
"dependencies": {
- "is-map": "^2.0.1",
- "is-set": "^2.0.1",
- "is-weakmap": "^2.0.1",
- "is-weakset": "^2.0.1"
+ "is-map": "^2.0.3",
+ "is-set": "^2.0.3",
+ "is-weakmap": "^2.0.2",
+ "is-weakset": "^2.0.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/which-typed-array": {
- "version": "1.1.13",
- "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.13.tgz",
- "integrity": "sha512-P5Nra0qjSncduVPEAr7xhoF5guty49ArDTwzJ/yNuPIbZppyRxFQsRCWrocxIY+CnMVG+qfbU2FmDKyvSGClow==",
+ "version": "1.1.15",
+ "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.15.tgz",
+ "integrity": "sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==",
"dev": true,
"dependencies": {
- "available-typed-arrays": "^1.0.5",
- "call-bind": "^1.0.4",
+ "available-typed-arrays": "^1.0.7",
+ "call-bind": "^1.0.7",
"for-each": "^0.3.3",
"gopd": "^1.0.1",
- "has-tostringtag": "^1.0.0"
+ "has-tostringtag": "^1.0.2"
},
"engines": {
"node": ">= 0.4"
@@ -4557,6 +4753,15 @@
"url": "https://github.com/sponsors/ljharb"
}
},
+ "node_modules/word-wrap": {
+ "version": "1.2.5",
+ "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz",
+ "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
"node_modules/wrappy": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
@@ -4564,10 +4769,11 @@
"dev": true
},
"node_modules/yallist": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
- "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
- "dev": true
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
+ "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==",
+ "dev": true,
+ "peer": true
},
"node_modules/yocto-queue": {
"version": "0.1.0",
diff --git a/pages/api/api.ts b/pages/api/api.ts
index bcaefed14..19fde3b3d 100644
--- a/pages/api/api.ts
+++ b/pages/api/api.ts
@@ -178,6 +178,7 @@ export async function postLink(folderId: number, url: string) {
);
return data;
} catch (error) {
+ alert('url과 폴더를 지정해주세요!');
console.error('Error fetching post folder:', error);
}
}
diff --git a/pages/folder.tsx b/pages/folder.tsx
index b8d405769..36d26a5ac 100644
--- a/pages/folder.tsx
+++ b/pages/folder.tsx
@@ -26,6 +26,7 @@ function Folder() {
const { modalState, openModal }: ContextValue = useModal();
const obsRef = useRef(null);
const inputRef = useRef(null);
+ const [url, setUrl] = useState('');
const handleObserver = (entries: IntersectionObserverEntry[]) => {
entries.forEach((entry) => {
@@ -55,7 +56,15 @@ function Folder() {
- openModal('add')}>
+ {
+ openModal('add');
+ if (inputRef.current) {
+ setUrl(inputRef.current.value);
+ }
+ }}
+ >
추가하기
@@ -78,7 +87,7 @@ function Folder() {
{linkList.length > 0 ? (
linkList.map((item) => (
-
+
))
) : (
저장된 링크가 없습니다.
@@ -86,7 +95,7 @@ function Folder() {
{modalState.add && inputRef.current && (
-
+
)}
diff --git a/pages/shared.tsx b/pages/shared.tsx
index 3505b4e42..232ca09cf 100644
--- a/pages/shared.tsx
+++ b/pages/shared.tsx
@@ -14,7 +14,7 @@ type Owner = {
};
type Link = {
- id: string;
+ id: number;
created_at: Date;
url: string;
title: string;
@@ -77,7 +77,7 @@ function Shared() {
/>
{linkList.map((item) => (
-
+ {}} />
))}
From b2ff7295a1ca8519fecca42234ea3bf9acf53720 Mon Sep 17 00:00:00 2001
From: sj0724
Date: Fri, 17 May 2024 11:56:55 +0900
Subject: [PATCH 20/23] =?UTF-8?q?feat:=20=EB=A7=81=ED=81=AC=20=EC=82=AD?=
=?UTF-8?q?=EC=A0=9C=EA=B8=B0=EB=8A=A5=20=EA=B5=AC=ED=98=84=20=EB=B0=8F=20?=
=?UTF-8?q?addlink=20=EB=AA=A8=EB=8B=AC=20=EC=88=98=EC=A0=95?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
components/Card/Card.tsx | 4 +--
components/KebabMenu/KebabMenu.tsx | 24 +++++++-------
components/Modal/AddModal/AddModal.styled.ts | 13 ++++++++
components/Modal/AddModal/AddModal.tsx | 33 +++++++++++++------
.../Modal/DeleteLinkModal/DeleteLinkModal.tsx | 16 +++++++--
pages/api/api.ts | 14 ++++++++
6 files changed, 79 insertions(+), 25 deletions(-)
diff --git a/components/Card/Card.tsx b/components/Card/Card.tsx
index 599f4f3ff..ec2731f4a 100644
--- a/components/Card/Card.tsx
+++ b/components/Card/Card.tsx
@@ -18,7 +18,7 @@ function Card({
const { image_source } = item;
const [kebabView, setKebabView] = useState(false);
const [like, setLike] = useState(false);
- const { url, description } = item;
+ const { url, description, id } = item;
const createdText = `${createdAt.time} ${createdAt.result} ago`;
@@ -63,7 +63,7 @@ function Card({
{fullDate}
- {kebabView && }
+ {kebabView && }
);
diff --git a/components/KebabMenu/KebabMenu.tsx b/components/KebabMenu/KebabMenu.tsx
index c4c07a6c1..f0b162db8 100644
--- a/components/KebabMenu/KebabMenu.tsx
+++ b/components/KebabMenu/KebabMenu.tsx
@@ -6,36 +6,38 @@ import DeleteLinkModal from '../Modal/DeleteLinkModal/DeleteLinkModal';
function KebabMenu({
url,
+ id,
setUrl,
}: {
url: string;
+ id: number;
setUrl: Dispatch>;
}) {
const kebabRef = useRef(null);
const { modalState, openModal } = useModal();
- const addLinkKebab = (e: React.MouseEvent) => {
+ const handleAddKebab = (e: React.MouseEvent) => {
e.preventDefault();
openModal('add');
setUrl(url);
};
+ const handleDeleteKebab = (
+ e: React.MouseEvent
+ ) => {
+ e.preventDefault();
+ openModal('deleteLink');
+ };
+
return (
<>
- {
- openModal('deleteLink');
- e.preventDefault();
- }}
- >
- 삭제하기
-
- 폴더에 추가
+ 삭제하기
+ 폴더에 추가
{modalState.deleteLink && (
-
+
)}
>
diff --git a/components/Modal/AddModal/AddModal.styled.ts b/components/Modal/AddModal/AddModal.styled.ts
index 08ef9c7a1..9edcb33b9 100644
--- a/components/Modal/AddModal/AddModal.styled.ts
+++ b/components/Modal/AddModal/AddModal.styled.ts
@@ -73,3 +73,16 @@ export const FolderInfo = styled.div`
`;
export const InputForm = styled.form``;
+
+export const AddFolder = styled.div`
+ padding-top: 0.2rem;
+ text-align: center;
+ text-height: 1rem;
+ font-size: 1.6rem;
+ color: var(--Primary);
+ cursor: pointer;
+
+ &:hover {
+ font-weight: 700;
+ }
+`;
diff --git a/components/Modal/AddModal/AddModal.tsx b/components/Modal/AddModal/AddModal.tsx
index 38064757f..fbf1224c9 100644
--- a/components/Modal/AddModal/AddModal.tsx
+++ b/components/Modal/AddModal/AddModal.tsx
@@ -6,6 +6,7 @@ import { Button } from '../../Button/Button';
import Image from 'next/image';
import { postLink } from '@/pages/api/api';
import { useRouter } from 'next/router';
+import { useModal } from '@/contexts/ModalContext';
function FolderButton({
item,
@@ -41,6 +42,7 @@ function FolderButton({
function AddModal({ link, url }: { link: Folders; url: string }) {
const [folderSelected, setFolderSelected] = useState([]);
const [selectedId, setSelectedId] = useState(0);
+ const { openModal, closeModal } = useModal();
const router = useRouter();
const handleMenuClick = (index: number, folderId: number) => {
@@ -64,16 +66,27 @@ function AddModal({ link, url }: { link: Folders; url: string }) {
폴더에 추가
- {link.map((item, index) => (
-
- ))}
+ {link[0] ? (
+ link.map((item, index) => (
+
+ ))
+ ) : (
+ {
+ closeModal('add');
+ openModal('addFolder');
+ }}
+ >
+ 폴더 추가
+
+ )}