From 2d44bdb7a629c85a0ba36f0956c80a9a0f55ff3e Mon Sep 17 00:00:00 2001 From: egg-silver Date: Tue, 10 Sep 2024 22:28:43 +0900 Subject: [PATCH] =?UTF-8?q?feat:=20=EB=A1=9C=EA=B7=B8=EC=9D=B8,=ED=9A=8C?= =?UTF-8?q?=EC=9B=90=EA=B0=80=EC=9E=85=20=EC=88=98=EC=A0=95/=EB=9D=BC?= =?UTF-8?q?=EC=9A=B0=ED=84=B0=20=EC=A0=95=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Router.tsx | 73 +++++ package.json | 2 + src/App.tsx | 45 +-- src/api/config.ts | 2 +- src/components/Header/LoginHeader.tsx | 6 +- src/components/Header/MyHeader.tsx | 13 +- src/components/Layout.tsx | 9 +- src/components/LayoutWithoutHeader.tsx | 13 + src/components/Tab/Pannels/ReadBooks.tsx | 6 +- src/components/main/StartNavigator.tsx | 6 +- .../SearchHistory/SearchHistorySwipe.tsx | 4 +- src/components/shelf/PageRecord.tsx | 5 +- src/components/statistics/Stack.tsx | 4 +- src/index.tsx | 34 ++- src/pages/BookStackPage.tsx | 14 +- src/pages/ChoosePage.tsx | 4 +- src/pages/LoginPage.tsx | 223 +++++--------- src/pages/MainPage.tsx | 2 +- src/pages/SearchPage.tsx | 2 - src/pages/SignUpPage.tsx | 279 ++++++++---------- src/pages/Statistics.tsx | 4 - tailwind.config.js | 4 + yarn.lock | 72 ++++- 23 files changed, 436 insertions(+), 390 deletions(-) create mode 100644 Router.tsx create mode 100644 src/components/LayoutWithoutHeader.tsx diff --git a/Router.tsx b/Router.tsx new file mode 100644 index 0000000..4a82a1f --- /dev/null +++ b/Router.tsx @@ -0,0 +1,73 @@ +import { createBrowserRouter } from 'react-router-dom' +import { lazy, Suspense } from 'react' +import { ClipLoader } from 'react-spinners' + +import Layout from './src/components/Layout' +import LayoutWithoutHeader from './src/components/LayoutWithoutHeader' // 새로운 레이아웃 +const MainPage = lazy(() => import('./src/pages/MainPage')) +const LoginPage = lazy(() => import('./src/pages/LoginPage')) +const SignUpPage = lazy(() => import('./src/pages/SignUpPage')) +const MyPage = lazy(() => import('./src/pages/MyPage')) +const SearchPage = lazy(() => import('./src/pages/SearchPage')) +const BookInfoPage = lazy(() => import('./src/pages/BookInfoPage')) +const ChoosePage = lazy(() => import('./src/pages/ChoosePage')) +const Statistics = lazy(() => import('./src/pages/Statistics')) +const BookStackPage = lazy(() => import('./src/pages/BookStackPage')) + +const router = createBrowserRouter([ + { + path: '/', + element: ( + + + + }> + + + ), + children: [ + { path: '/', element: }, + { path: '/login', element: }, + { path: '/signup', element: }, + ], + }, + { + path: '/', + element: ( + + + + }> + + + ), + children: [ + { path: '/mypage', element: }, + { path: '/booksearch', element: }, + { path: '/book/:id', element: }, + { path: '/choose', element: }, + { path: '/activity', element: }, + { path: '/stack', element: }, + ], + }, +]) + +export default router diff --git a/package.json b/package.json index 125abf8..fc1adc5 100644 --- a/package.json +++ b/package.json @@ -10,6 +10,7 @@ "preview": "vite preview" }, "dependencies": { + "@clerk/clerk-react": "^5.4.2", "@emotion/react": "^11.10.6", "@emotion/styled": "^11.10.6", "@fortawesome/fontawesome-svg-core": "^6.3.0", @@ -54,6 +55,7 @@ "react-router-dom": "^6.9.0", "react-scripts": "^5.0.1", "react-slick": "^0.29.0", + "react-spinners": "^0.14.1", "react-three-fiber": "^6.0.13", "react-toastify": "^9.1.3", "slick-carousel": "^1.8.1", diff --git a/src/App.tsx b/src/App.tsx index f2424f3..b039b64 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -1,51 +1,12 @@ -import { BrowserRouter as Router, Routes, Route } from 'react-router-dom' -// import WishShelf from './pages/WishShelf' -// import ReadingShelf from './pages/ReadingShelf' -// import EndShelf from './pages/EndShelf' -import Statistics from './pages/Statistics' -// import BookSearch from './pages/BookSearch' -import MainPage from './pages/MainPage' -import LoginPage from './pages/LoginPage' -import SignUpPage from './pages/SignUpPage' -import SearchPage from './pages/SearchPage' -import BookStackPage from './pages/BookStackPage' -import ChoosePage from './pages/ChoosePage' -import BookShelfPage from './pages/BookShelfPage' -import MyPage from './pages/MyPage' -import BookInfoPage from './pages/BookInfoPage' -import Layout from './components/Layout' import { QueryClient, QueryClientProvider } from 'react-query' +import { RouterProvider } from 'react-router-dom' +import router from '../Router' function App() { const queryClient = new QueryClient() return ( - - - - {/* 원준 */} - } /> - } /> - {/* 우희 */} - } /> - } /> - } /> - } /> - {/* 선재 */} - {/* } /> - } /> - } /> */} - } /> - {/* 추후 담당자 */} - {/* } /> - } /> */} - } /> - {/* } /> */} - - } /> - - - + ) } diff --git a/src/api/config.ts b/src/api/config.ts index f2e1b7d..4476cef 100644 --- a/src/api/config.ts +++ b/src/api/config.ts @@ -1,7 +1,7 @@ import axios from 'axios' const BASE_URL = 'http://localhost:8081/api/v1' - +// const BASE_URL = 'http://223.130.159.53:8081/api/v1' export const baseInstance = axios.create({ withCredentials: true, baseURL: BASE_URL, // 기본 URL 설정 diff --git a/src/components/Header/LoginHeader.tsx b/src/components/Header/LoginHeader.tsx index 8fd35d3..05fa518 100644 --- a/src/components/Header/LoginHeader.tsx +++ b/src/components/Header/LoginHeader.tsx @@ -12,7 +12,7 @@ const LoginHeader: FC = () => { const imageStyle = { width: 'auto', - height: '144px', + height: '80px', } const goToMain = () => { @@ -20,9 +20,7 @@ const LoginHeader: FC = () => { } return ( -
+
{/*

|

diff --git a/src/components/Layout.tsx b/src/components/Layout.tsx index fb01848..e64027a 100644 --- a/src/components/Layout.tsx +++ b/src/components/Layout.tsx @@ -1,7 +1,12 @@ -const Layout = ({ children }) => { +import { Outlet } from 'react-router-dom' +import MyHeader from './Header/MyHeader' +const Layout = () => { return (
-
{children}
+
+ + +
) } diff --git a/src/components/LayoutWithoutHeader.tsx b/src/components/LayoutWithoutHeader.tsx new file mode 100644 index 0000000..bb286bb --- /dev/null +++ b/src/components/LayoutWithoutHeader.tsx @@ -0,0 +1,13 @@ +import { Outlet } from 'react-router-dom' + +const LayoutWithoutHeader = () => { + return ( +
+
+ +
+
+ ) +} + +export default LayoutWithoutHeader diff --git a/src/components/Tab/Pannels/ReadBooks.tsx b/src/components/Tab/Pannels/ReadBooks.tsx index 75f9882..7f7566e 100644 --- a/src/components/Tab/Pannels/ReadBooks.tsx +++ b/src/components/Tab/Pannels/ReadBooks.tsx @@ -1,7 +1,7 @@ import BookBox from '../../shelf/BookBox' import StarRate from '../../shelf/StarRate' import { useMyContext } from '../../Context/MyContext' -import axios from 'axios' +import { baseInstance } from '../../../api/config' import { useEffect, useState } from 'react' import useInfiniteScroll from '../../../hooks/useInfiniteScroll' @@ -29,8 +29,8 @@ const ReadBook = () => { setIsLoading(true) const access = localStorage.getItem('accessToken') - const response = await axios.get( - `http://localhost:8081/api/v1/readings?status=READ&page=${page}`, + const response = await baseInstance.get( + `/readings?status=READ&page=${page}`, { headers: { Authorization: `Bearer ${access}` }, }, diff --git a/src/components/main/StartNavigator.tsx b/src/components/main/StartNavigator.tsx index 5666fab..e3f080e 100644 --- a/src/components/main/StartNavigator.tsx +++ b/src/components/main/StartNavigator.tsx @@ -2,15 +2,17 @@ import React from 'react' interface StartNavigatorProps { onClick: () => void + text: string + } -const StartNavigator: React.FC = ({ onClick }) => ( +const StartNavigator: React.FC = ({ onClick, text }) => (
diff --git a/src/components/search/swiper/SearchHistory/SearchHistorySwipe.tsx b/src/components/search/swiper/SearchHistory/SearchHistorySwipe.tsx index e60180b..ea770eb 100644 --- a/src/components/search/swiper/SearchHistory/SearchHistorySwipe.tsx +++ b/src/components/search/swiper/SearchHistory/SearchHistorySwipe.tsx @@ -19,8 +19,8 @@ const SearchHistorySwipe = ({ recentSearches, onSearch }: SearchHistorySwipeProp } return ( -
-

최근 히스토리

+
+

최근 히스토리

{ +const PageRecord = ({ pages, percentages, lastPage }: PageRecordProps) => { + if (percentages >= 100) { + percentages = 100 + } return ( <>
diff --git a/src/components/statistics/Stack.tsx b/src/components/statistics/Stack.tsx index 2b941b6..1865752 100644 --- a/src/components/statistics/Stack.tsx +++ b/src/components/statistics/Stack.tsx @@ -6,6 +6,7 @@ import { Html, Text } from '@react-three/drei' import { Group, Object3D } from 'three' import { baseInstance } from '../../api/config' import BookInfoModal from './BookModal' +import BookInfo from '../Modal/ModalAtom/BookInfo'; interface BookProps { model: Object3D @@ -85,8 +86,7 @@ const Stack: React.FC = () => { }, }) .then((response) => { - // 'response.data' 대신 'response.data.bookInfos'를 사용합니다. - const fetchedBooks = response.data.bookInfos.map((bookData: BookData) => { + const fetchedBooks = response.data.bookInfos.content?.map((bookData: BookData) => { return { model: model.clone(), thickness: bookData.pages / 2000, diff --git a/src/index.tsx b/src/index.tsx index c7a46c8..800276b 100644 --- a/src/index.tsx +++ b/src/index.tsx @@ -1,13 +1,27 @@ -import ReactDOM from 'react-dom'; -import App from './App'; -import reportWebVitals from './reportWebVitals'; -import "./index.css"; -import 'tailwindcss/tailwind.css'; +import { createRoot } from 'react-dom/client' +import App from './App' +import reportWebVitals from './reportWebVitals' +import './index.css' +import 'tailwindcss/tailwind.css' +import { ClerkProvider } from '@clerk/clerk-react' -ReactDOM.render( - , - document.getElementById('root') -); +const PUBLISHABLE_KEY = import.meta.env.VITE_CLERK_PUBLISHABLE_KEY +if (!PUBLISHABLE_KEY) { + throw new Error('Missing Clerk Publishable Key') +} -reportWebVitals(); +const domNode = document.getElementById('root') +if (!domNode) { + throw new Error('Root element not found') +} + +const root = createRoot(domNode) + +root.render( + + + , +) + +reportWebVitals() diff --git a/src/pages/BookStackPage.tsx b/src/pages/BookStackPage.tsx index de314f6..73f246c 100644 --- a/src/pages/BookStackPage.tsx +++ b/src/pages/BookStackPage.tsx @@ -1,13 +1,9 @@ import Stack from '../components/statistics/Stack' -import MyHeader from '../components/Header/MyHeader' export default function BookStackPage() { - return ( -
-
- -
- -
- ) + return ( +
+ +
+ ) } diff --git a/src/pages/ChoosePage.tsx b/src/pages/ChoosePage.tsx index e9297d4..1ef5ff6 100644 --- a/src/pages/ChoosePage.tsx +++ b/src/pages/ChoosePage.tsx @@ -1,4 +1,3 @@ -import MyHeader from '../components/Header/MyHeader' import { styled } from 'styled-components' import books from '../../public/img/books.png' import statistics from '../../public/img/statistics.png' @@ -7,7 +6,6 @@ import { Link } from 'react-router-dom' const ChoosePage = () => { return ( <> - @@ -22,7 +20,7 @@ const ChoosePage = () => {
- +
diff --git a/src/pages/LoginPage.tsx b/src/pages/LoginPage.tsx index fb65d05..5b69f91 100644 --- a/src/pages/LoginPage.tsx +++ b/src/pages/LoginPage.tsx @@ -1,7 +1,5 @@ -import React from 'react' -import styled from 'styled-components' +import React, { useState } from 'react' import LoginInput from '../components/Input/LoginInput' -import { useState } from 'react' import StartNavigator from '../components/main/StartNavigator' import LoginHeader from '../components/Header/LoginHeader' import { Link, useNavigate } from 'react-router-dom' @@ -12,10 +10,11 @@ import Bar3 from '../../public/img/Bar3.png' import { baseInstance } from '../api/config' import Swal from 'sweetalert2' import 'sweetalert2/src/sweetalert2.scss' +import { SignIn, SignedOut, SignInButton, UserButton, useUser } from '@clerk/clerk-react' export default function LoginPage() { const navigate = useNavigate() - + const { isLoaded, isSignedIn, user } = useUser() const handleLogin = async () => { if (id && pw) { try { @@ -34,16 +33,13 @@ export default function LoginPage() { icon: 'success', }) } else if (response.data.businessCode === 'U002') { - // 사용자가 없을 때 console.log('에러 내용: ', response.data.message) alert(response.data.message) } else if (response.data.code === 'U001') { - // 비밀번호가 틀렸을 때 console.log('에러 내용: ', response.data.message) alert('비밀번호가 틀렸습니다.') } } catch (error) { - // 에러 처리 Swal.fire({ title: '로그인 실패!', icon: 'error', @@ -51,8 +47,9 @@ export default function LoginPage() { } } } + // 탭 + const [activeTab, setActiveTab] = useState('regular') - // 아이디, 비밀번호 const [id, setId] = useState('') const [pw, setPw] = useState('') @@ -62,7 +59,6 @@ export default function LoginPage() { const handleIdKeyPress = (e: React.KeyboardEvent) => { if (e.key === 'Enter') { e.preventDefault() - // 여기에 다음 input의 ref를 사용하여 포커스 이동 pwInputRef.current?.focus() } } @@ -70,148 +66,89 @@ export default function LoginPage() { const handlePwKeyPress = (e: React.KeyboardEvent) => { if (e.key === 'Enter') { e.preventDefault() - // 모든 입력이 완료되면 '시작하기' 버튼의 동작을 수행 handleLogin() } } return ( - +
-
- - - 책 잇 - - 당신의 책을 함께 기억해요 - remember your book together - - - -
- ) => setId(e.target.value)} - onKeyPress={handleIdKeyPress} - ref={idInputRef} // 아이디 입력 필드에 대한 ref를 전달합니다. - /> - ) => setPw(e.target.value)} - onKeyPress={handlePwKeyPress} - ref={pwInputRef} // 비밀번호 입력 필드에 대한 ref를 전달합니다. - /> - - - 계정이 없으신가요? +
+
+
+

+ 책 잇 +

+
+

+ 당신의 책을 함께 기억해요 +

+

+ remember your book together +

+
+
+ {/* 탭 내비게이션 */} +
+ + +
+ + {activeTab === 'regular' && ( +
+ ) => setId(e.target.value)} + onKeyPress={handleIdKeyPress} + ref={idInputRef} + /> + ) => setPw(e.target.value)} + onKeyPress={handlePwKeyPress} + ref={pwInputRef} + /> + + + )} + {activeTab === 'social' && } +
+

계정이 없으신가요?

- 회원가입 + - - - - - - - +
+
+
+ Bar1 + Bar2 + Bar3 +
- - - +
) } -const LoginContainer = styled.div` - overflow: hidden; - max-height: 100vh; -` -const Container = styled.div` - margin-left: 14rem; - margin-top: 8.23rem; -` - -const TitleContainer = styled.div` - display: flex; - margin-bottom: 2.2rem; -` -const Title = styled.h1` - color: #000; - text-align: center; - /* font-family: BM Jua; */ - font-family: Noto Sans KR; - font-size: 7.3rem; - font-style: normal; - font-weight: 400; - line-height: normal; -` -const Text = styled.h2` - color: #000; - font-family: Noto Sans KR; - - font-style: normal; - font-weight: 400; - /* line-height: 3.75rem; */ -` -const TextContainer = styled.div` - display: flex; - flex-direction: column; - margin-top: 3.5rem; - margin-left: 1.1rem; -` - -const SignupLayout = styled.div` - display: flex; - margin-left: 6.5rem; - align-items: center; -` - -const SignupText = styled.h2` - color: #000; - text-align: center; - font-family: Noto Sans; - font-size: 1.05rem; - font-style: normal; - font-weight: 400; - line-height: normal; - padding-right: 1rem; -` -const StyledButton = styled.button` - color: #b2b2b2; - font-family: Noto Sans; - font-size: 1.05rem; - font-style: normal; - font-weight: 400; - line-height: normal; - text-decoration-line: underline; -` - -const ImgContainer = styled.div` - display: flex; - align-items: flex-end; - margin-top: 17rem; - margin-left: 21.5rem; - position: relative; -` - -const Bar1Image = styled.img` - width: 22rem; - height: 32rem; - position: absolute; - right: calc(100% - 89px); - z-index: 1; -` - -const Bar2Image = styled.img` - width: 17rem; - height: 33.3rem; -` - -const Bar3Image = styled.img` - width: 10.3rem; - height: 36rem; -` diff --git a/src/pages/MainPage.tsx b/src/pages/MainPage.tsx index 4ea3b5c..8ffbc02 100644 --- a/src/pages/MainPage.tsx +++ b/src/pages/MainPage.tsx @@ -27,7 +27,7 @@ const MainPage: React.FC = () => { - +
) } diff --git a/src/pages/SearchPage.tsx b/src/pages/SearchPage.tsx index 36c57de..599404a 100644 --- a/src/pages/SearchPage.tsx +++ b/src/pages/SearchPage.tsx @@ -1,7 +1,6 @@ import React, { useEffect, useState } from 'react' import axios from 'axios' import Ask from '../components/search/Ask' -import MyHeader from '../components/Header/MyHeader' import ViewedBooks from '../components/search/ViewedBooks' import PopularBooks from '../components/search/PopularBook' import RecentBooks from '../components/search/RecentBooks' @@ -126,7 +125,6 @@ const SearchPage = () => { return ( <> - {/* */} diff --git a/src/pages/SignUpPage.tsx b/src/pages/SignUpPage.tsx index 877607b..7211ab2 100644 --- a/src/pages/SignUpPage.tsx +++ b/src/pages/SignUpPage.tsx @@ -4,13 +4,14 @@ import LoginInput from '../components/Input/LoginInput' import { useCallback, useState } from 'react' import SignUpBtn from '../components/Btn/SignUpBtn' import LoginHeader from '../components/Header/LoginHeader' -import { useNavigate } from 'react-router-dom' +import { useNavigate, Link } from 'react-router-dom' import Swal from 'sweetalert2' import 'sweetalert2/src/sweetalert2.scss' import Bar1 from '../../public/img/Bar1.png' import Bar2 from '../../public/img/Bar2.png' import Bar3 from '../../public/img/Bar3.png' import { baseInstance } from '../api/config' +import { SignUp, SignedIn, SignedOut, SignInButton, UserButton } from '@clerk/clerk-react' export default function SignUpPage() { const navigate = useNavigate() @@ -76,6 +77,8 @@ export default function SignUpPage() { handleSignUp() } } + // 탭 + const [activeTab, setActiveTab] = useState('regular') // 아이디, 비밀번호, 비밀번호 확인 const [id, setId] = useState('') @@ -140,157 +143,133 @@ export default function SignUpPage() { ) return ( - +
-
- - - 책 잇 - - 당신의 책을 함께 기억해요 - remember your book together - - +
+
+
+

+ 책 잇 +

+
+

+ 당신의 책을 함께 기억해요 +

+

+ remember your book together +

+
+
- - - {id.length > 0 && ( - {idMessage} - )} - - - - {pw.length > 0 && ( - - {passwordMessage} - - )} - - - - {passwordConfirm.length > 0 && ( - - {passwordConfirmMessage} - - )} - - - - - - - -
+ {/* 탭 내비게이션 */} +
+ + +
+ + {/* 탭 */} + {activeTab === 'regular' && ( +
+
+ + {id.length > 0 && ( + + {idMessage} + + )} +
+
+ + {pw.length > 0 && ( + + {passwordMessage} + + )} +
+
+ + {passwordConfirm.length > 0 && ( + + {passwordConfirmMessage} + + )} +
+ +
+ )} + {activeTab === 'social' && ( +
+ +
+ )} +
+

계정이 있으신가요?

+ + + +
+
- - +
+ Bar1 + Bar2 + Bar3 +
+
+
) } - -const LoginContainer = styled.div` - overflow: hidden; - max-height: 100vh; -` -const Container = styled.div` - margin-left: 14rem; - margin-top: 8.23rem; -` - -const TitleContainer = styled.div` - display: flex; - margin-bottom: 2.2rem; -` -const Title = styled.h1` - color: #000; - text-align: center; - /* font-family: BM Jua; */ - font-family: Noto Sans KR; - font-size: 7.3rem; - font-style: normal; - font-weight: 400; - line-height: normal; -` -const Text = styled.h2` - color: #000; - font-family: Noto Sans KR; - - font-style: normal; - font-weight: 400; - /* line-height: 3.75rem; */ -` -const TextContainer = styled.div` - display: flex; - flex-direction: column; - margin-top: 3.5rem; - margin-left: 1.1rem; -` - -const ImgContainer = styled.div` - display: flex; - align-items: flex-end; - margin-top: 17rem; - margin-left: 21.5rem; - position: relative; -` - -const Bar1Image = styled.img` - width: 22rem; - height: 32rem; - position: absolute; - right: calc(100% - 89px); - z-index: 1; -` - -const Bar2Image = styled.img` - width: 17rem; - height: 33.3rem; -` - -const Bar3Image = styled.img` - width: 10.3rem; - height: 36rem; -` - -const FormBox = styled.div` - position: relative; - margin-bottom: 1.25rem; - .message { - font-weight: 500; - font-size: 1rem; - line-height: 1.5rem; - letter-spacing: -0.0625rem; - position: absolute; - top: 5rem; - left: 1rem; - &.success { - color: #b2b2b2; - } - &.error { - color: #b2b2b2; - } - } -` diff --git a/src/pages/Statistics.tsx b/src/pages/Statistics.tsx index 8c8e7f1..80b592b 100644 --- a/src/pages/Statistics.tsx +++ b/src/pages/Statistics.tsx @@ -3,7 +3,6 @@ import '../scss/MyShelf.scss' import Toolbar from '../components/statistics/Toolbar' import BarChart from '../components/statistics/BarChart' import LineChart from '../components/statistics/LineChart' -import MyHeader from '../components/Header/MyHeader' import { addWeeks, endOfWeek, startOfWeek, subWeeks } from 'date-fns' export default function Statistics() { @@ -33,9 +32,6 @@ export default function Statistics() { return (
-
- -
diff --git a/tailwind.config.js b/tailwind.config.js index 57920b0..b869391 100644 --- a/tailwind.config.js +++ b/tailwind.config.js @@ -35,4 +35,8 @@ module.exports = { extend: {}, }, plugins: [require('daisyui')], + daisyui: { + themes: ['light'], + // array: ['light'], // false: only light + dark | true: all themes | array: specific themes like this ["light", "dark", "cupcake"] + }, } diff --git a/yarn.lock b/yarn.lock index 3bdc505..1ff48d2 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1442,6 +1442,33 @@ resolved "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz" integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== +"@clerk/clerk-react@^5.4.2": + version "5.4.2" + resolved "https://registry.yarnpkg.com/@clerk/clerk-react/-/clerk-react-5.4.2.tgz#866c23b83ef32cd27ff402c9e75ce8ab1149495a" + integrity sha512-F6F9yZ2lZDv365M6rn4Cpct0V2ZxFMoSxxRGag1du9QP73+twL7YoEeIimp+j4/RxH5uSsGv9JL2I7a6jnktHw== + dependencies: + "@clerk/shared" "2.5.2" + "@clerk/types" "4.14.0" + tslib "2.4.1" + +"@clerk/shared@2.5.2": + version "2.5.2" + resolved "https://registry.yarnpkg.com/@clerk/shared/-/shared-2.5.2.tgz#03aba401cdd4ce91eede0978bba7f3ffd771f16c" + integrity sha512-3+I5vMhkn3wSqCuoxIIXRma3m8zpLJBH11MO2uxKOAeZJRyeALY0jGPeyptskl+Fl9j9Rtan0OWJIisMN8TiAA== + dependencies: + "@clerk/types" "4.14.0" + glob-to-regexp "0.4.1" + js-cookie "3.0.5" + std-env "^3.7.0" + swr "^2.2.0" + +"@clerk/types@4.14.0": + version "4.14.0" + resolved "https://registry.yarnpkg.com/@clerk/types/-/types-4.14.0.tgz#2215d3a8337f984a401c5a819b793de622d223a5" + integrity sha512-d3MUcWtXGTOS7QYCRVrOra7NYAGRiNWlb+Ke2KMSb+Z3lea6WlKeHa18uVnAkIVxBXtHlzdU2kwW0PrHkx8j9Q== + dependencies: + csstype "3.1.1" + "@colors/colors@1.5.0": version "1.5.0" resolved "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz" @@ -4993,6 +5020,11 @@ cli-table3@^0.6.3: optionalDependencies: "@colors/colors" "1.5.0" +client-only@^0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/client-only/-/client-only-0.0.1.tgz#38bba5d403c41ab150bff64a95c85013cf73bca1" + integrity sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA== + cliui@^7.0.2: version "7.0.4" resolved "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz" @@ -5503,6 +5535,11 @@ cssstyle@^2.3.0: dependencies: cssom "~0.3.6" +csstype@3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.1.tgz#841b532c45c758ee546a11d5bd7b7b473c8c30b9" + integrity sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw== + csstype@^3.0.2, csstype@^3.1.2: version "3.1.2" resolved "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz" @@ -7075,7 +7112,7 @@ glob-parent@^6.0.2: dependencies: is-glob "^4.0.3" -glob-to-regexp@^0.4.1: +glob-to-regexp@0.4.1, glob-to-regexp@^0.4.1: version "0.4.1" resolved "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz" integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw== @@ -8587,6 +8624,11 @@ js-base64@^2.4.9: resolved "https://registry.npmjs.org/js-base64/-/js-base64-2.6.4.tgz" integrity sha512-pZe//GGmwJndub7ZghVHz7vjb2LgC1m8B07Au3eYqeqv9emhESByMXxaEgkUkEqJe87oBbSniGYoQNIBklc7IQ== +js-cookie@3.0.5: + version "3.0.5" + resolved "https://registry.yarnpkg.com/js-cookie/-/js-cookie-3.0.5.tgz#0b7e2fd0c01552c58ba86e0841f94dc2557dcdbc" + integrity sha512-cEiJEAEoIbWfCZYKWhVwFuvPX1gETRYPw6LlaTKoxD3s2AkXzkCjnp6h0V77ozyqj0jakteJ4YqDJT830+lVGw== + js-sha3@0.8.0: version "0.8.0" resolved "https://registry.yarnpkg.com/js-sha3/-/js-sha3-0.8.0.tgz#b9b7a5da73afad7dedd0f8c463954cbde6818840" @@ -11350,6 +11392,11 @@ react-slick@^0.29.0: lodash.debounce "^4.0.8" resize-observer-polyfill "^1.5.0" +react-spinners@^0.14.1: + version "0.14.1" + resolved "https://registry.yarnpkg.com/react-spinners/-/react-spinners-0.14.1.tgz#de7d7d6b3e6d4f29d9620c65495b502c7dd90812" + integrity sha512-2Izq+qgQ08HTofCVEdcAQCXFEYfqTDdfeDQJeo/HHQiQJD4imOicNLhkfN2eh1NYEWVOX4D9ok2lhuDB0z3Aag== + react-three-fiber@^6.0.13: version "6.0.13" resolved "https://registry.yarnpkg.com/react-three-fiber/-/react-three-fiber-6.0.13.tgz#6dbbc5d8d5fe94c49986e9c71024af7eaf68a441" @@ -12268,6 +12315,11 @@ statuses@2.0.1: resolved "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz" integrity sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA== +std-env@^3.7.0: + version "3.7.0" + resolved "https://registry.yarnpkg.com/std-env/-/std-env-3.7.0.tgz#c9f7386ced6ecf13360b6c6c55b8aaa4ef7481d2" + integrity sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg== + stdout-stream@^1.4.0: version "1.4.1" resolved "https://registry.npmjs.org/stdout-stream/-/stdout-stream-1.4.1.tgz" @@ -12598,6 +12650,14 @@ swiper@*, swiper@^10.2.0: resolved "https://registry.yarnpkg.com/swiper/-/swiper-10.3.1.tgz#4d19d7e9d0bd184c30accf2c1b180cfe41b9f4af" integrity sha512-24Wk3YUdZHxjc9faID97GTu6xnLNia+adMt6qMTZG/HgdSUt4fS0REsGUXJOgpTED0Amh/j+gRGQxsLayJUlBQ== +swr@^2.2.0: + version "2.2.5" + resolved "https://registry.yarnpkg.com/swr/-/swr-2.2.5.tgz#063eea0e9939f947227d5ca760cc53696f46446b" + integrity sha512-QtxqyclFeAsxEUeZIYmsaQ0UjimSq1RZ9Un7I68/0ClKK/U3LoyQunwkQfJZr2fc22DfIXLNDc2wFyTEikCUpg== + dependencies: + client-only "^0.0.1" + use-sync-external-store "^1.2.0" + symbol-tree@^3.2.4: version "3.2.4" resolved "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz" @@ -12890,6 +12950,11 @@ tsconfig-paths@^3.14.2: minimist "^1.2.6" strip-bom "^3.0.0" +tslib@2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.4.1.tgz#0d0bfbaac2880b91e22df0768e55be9753a5b17e" + integrity sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA== + tslib@^1.8.1: version "1.14.1" resolved "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz" @@ -13178,6 +13243,11 @@ url-parse@^1.5.3: querystringify "^2.1.1" requires-port "^1.0.0" +use-sync-external-store@^1.2.0: + version "1.2.2" + resolved "https://registry.yarnpkg.com/use-sync-external-store/-/use-sync-external-store-1.2.2.tgz#c3b6390f3a30eba13200d2302dcdf1e7b57b2ef9" + integrity sha512-PElTlVMwpblvbNqQ82d2n6RjStvdSoNe9FG28kNfz3WiXilJm4DdNkEzRhCZuIDwY8U08WVihhGR5iRqAwfDiw== + utf-8-validate@^5.0.2: version "5.0.10" resolved "https://registry.yarnpkg.com/utf-8-validate/-/utf-8-validate-5.0.10.tgz#d7d10ea39318171ca982718b6b96a8d2442571a2"