From beda72c259a2b544eb92427c18e543f1bde28820 Mon Sep 17 00:00:00 2001 From: owl1753 Date: Thu, 13 Feb 2025 23:01:58 +0900 Subject: [PATCH 1/6] =?UTF-8?q?refactor:=20useGetArrayState=20template?= =?UTF-8?q?=EC=9C=BC=EB=A1=9C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/hooks/useGetArrayState.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/hooks/useGetArrayState.ts b/src/hooks/useGetArrayState.ts index 84d62c7..bc045bb 100644 --- a/src/hooks/useGetArrayState.ts +++ b/src/hooks/useGetArrayState.ts @@ -1,6 +1,6 @@ import { useMemo } from 'react'; import { ArrayState } from '../type/common.type.ts'; -export const useGetArrayState = (array: unknown[]) => { +export const useGetArrayState = (array: T[]) => { return useMemo((): ArrayState => (array.length === 0 ? 'EMPTY' : 'FILLED'), [array]); }; From 5c8768547ab968bfc696ff69d261c8d1ea41cf4e Mon Sep 17 00:00:00 2001 From: owl1753 Date: Thu, 13 Feb 2025 23:27:35 +0900 Subject: [PATCH 2/6] =?UTF-8?q?refactor:=20Sentry=20ErrorBoundary=EB=A1=9C?= =?UTF-8?q?=20=EA=B5=90=EC=B2=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package.json | 1 - pnpm-lock.yaml | 13 --- src/components/SoongptErrorBoundary.tsx | 100 +++++++++++------------- src/hooks/useGetCourses.ts | 2 +- src/pages/CourseSelectionActivity.tsx | 2 +- 5 files changed, 47 insertions(+), 71 deletions(-) diff --git a/package.json b/package.json index 69fe08b..d564a6e 100644 --- a/package.json +++ b/package.json @@ -33,7 +33,6 @@ "motion": "^12.0.6", "react": "^18.3.1", "react-dom": "^18.3.1", - "react-error-boundary": "^5.0.0", "react-use-measure": "^2.1.7", "tailwind-merge": "^3.0.1", "tailwindcss": "^4.0.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 832a199..40dd697 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -74,9 +74,6 @@ importers: react-dom: specifier: ^18.3.1 version: 18.3.1(react@18.3.1) - react-error-boundary: - specifier: ^5.0.0 - version: 5.0.0(react@18.3.1) react-use-measure: specifier: ^2.1.7 version: 2.1.7(react-dom@18.3.1(react@18.3.1))(react@18.3.1) @@ -2072,11 +2069,6 @@ packages: peerDependencies: react: ^18.3.1 - react-error-boundary@5.0.0: - resolution: {integrity: sha512-tnjAxG+IkpLephNcePNA7v6F/QpWLH8He65+DmedchDwg162JZqx4NmbXj0mlAYVVEd81OW7aFhmbsScYfiAFQ==} - peerDependencies: - react: '>=16.13.1' - react-fast-compare@3.2.2: resolution: {integrity: sha512-nsO+KSNgo1SbJqJEYRE9ERzo7YtYbou/OqjSQKxV7jcKox7+usiUVZOAC+XnDOABXggQTno0Y1CpVnuWEc1boQ==} @@ -4143,11 +4135,6 @@ snapshots: react: 18.3.1 scheduler: 0.23.2 - react-error-boundary@5.0.0(react@18.3.1): - dependencies: - '@babel/runtime': 7.26.0 - react: 18.3.1 - react-fast-compare@3.2.2: {} react-is@16.13.1: {} diff --git a/src/components/SoongptErrorBoundary.tsx b/src/components/SoongptErrorBoundary.tsx index 7fb5868..96da4ca 100644 --- a/src/components/SoongptErrorBoundary.tsx +++ b/src/components/SoongptErrorBoundary.tsx @@ -1,72 +1,62 @@ import { QueryErrorResetBoundary } from '@tanstack/react-query'; -import { ErrorBoundary, FallbackProps, useErrorBoundary } from 'react-error-boundary'; -import { ReactNode } from 'react'; +import { ReactElement, ReactNode } from 'react'; +import * as Sentry from '@sentry/react'; +import { SoongptError } from '../schemas/errorSchema.ts'; import { motion } from 'motion/react'; import Wrench from '../assets/wrench.svg'; -const ErrorLayout = () => { - const { resetBoundary } = useErrorBoundary(); - - return ( - -
-

- {'서버와의 연결이\n원활하지 않아요.'} -

- 재요청 하더라도 사용자님의 정보는 기억할게요! -
-
- {'wrench'} -
-
- -
-
- ); -}; - -const Fallback = ({ error, children }: FallbackProps & { children: ReactNode }) => { - const errorRange = Math.floor((error.status ?? 500) / 100); - - switch (errorRange) { - case 4: - return children; - default: - return ; - } -}; - interface SoongptErrorBoundaryProps { children: ReactNode; - fallback: ReactNode; + FallbackComponent: ReactElement; } -const SoongptErrorBoundary = ({ fallback, children }: SoongptErrorBoundaryProps) => { - const makeFallback = (fallback: ReactNode) => { - return (props: FallbackProps) => {fallback}; - }; - +const SoongptErrorBoundary = ({ FallbackComponent, children }: SoongptErrorBoundaryProps) => { return ( {({ reset }) => ( - { + const errorRange = Math.floor(((error as SoongptError).status ?? 500) / 100); + + switch (errorRange) { + case 4: + return FallbackComponent; + default: + return ( + +
+

+ {'서버와의 연결이\n원활하지 않아요.'} +

+ + 재요청 하더라도 사용자님의 정보는 기억할게요! + +
+
+ {'wrench'} +
+
+ +
+
+ ); + } + }} > {children} -
+ )}
); diff --git a/src/hooks/useGetCourses.ts b/src/hooks/useGetCourses.ts index 789d059..492bbb8 100644 --- a/src/hooks/useGetCourses.ts +++ b/src/hooks/useGetCourses.ts @@ -23,7 +23,7 @@ export const useGetCourses = (info: StudentWithoutChapel) => { const response = await api .get(`courses/${url[type]}`, { searchParams: info, - timeout: false, + timeout: 0, }) .json(); diff --git a/src/pages/CourseSelectionActivity.tsx b/src/pages/CourseSelectionActivity.tsx index f746497..e07ef20 100644 --- a/src/pages/CourseSelectionActivity.tsx +++ b/src/pages/CourseSelectionActivity.tsx @@ -25,7 +25,7 @@ const CourseSelectionActivity: ActivityComponentType
- }> + }> }> From ff9ab0b4f9dfb749270178f3c9a4ccbb5f59d6d0 Mon Sep 17 00:00:00 2001 From: owl1753 Date: Fri, 14 Feb 2025 13:22:20 +0900 Subject: [PATCH 3/6] =?UTF-8?q?fix:=20useGetCourses=20timeout=20=EC=A0=9C?= =?UTF-8?q?=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/hooks/useGetCourses.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/hooks/useGetCourses.ts b/src/hooks/useGetCourses.ts index 492bbb8..789d059 100644 --- a/src/hooks/useGetCourses.ts +++ b/src/hooks/useGetCourses.ts @@ -23,7 +23,7 @@ export const useGetCourses = (info: StudentWithoutChapel) => { const response = await api .get(`courses/${url[type]}`, { searchParams: info, - timeout: 0, + timeout: false, }) .json(); From 274b1954a3d02c353a26bb567f26774d78bf0683 Mon Sep 17 00:00:00 2001 From: owl1753 Date: Fri, 14 Feb 2025 15:19:59 +0900 Subject: [PATCH 4/6] =?UTF-8?q?feat:=20TimetableSelection=20Activity=20Err?= =?UTF-8?q?orBoundary=20=EB=B0=8F=20Suspense=20=EC=B2=98=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package.json | 8 +- pnpm-lock.yaml | 578 +++++++++--------- src/components/DesireCredit.tsx | 278 +++++++++ src/components/SelectedCoursesBottomSheet.tsx | 143 ++--- src/components/SoongptErrorBoundary.tsx | 67 +- .../TimetableSelection/TimetableSelection.tsx | 81 +++ .../TimetableSelectionFallback.tsx | 62 ++ .../TimetableSelectionView.tsx | 42 ++ src/hooks/usePostTimetable.ts | 5 + src/hooks/useTimetables.ts | 46 ++ src/pages/CourseSelectionActivity.tsx | 2 +- src/pages/DesiredCreditActivity.tsx | 285 +-------- src/pages/TimetableSelectionActivity.tsx | 171 +----- 13 files changed, 934 insertions(+), 834 deletions(-) create mode 100644 src/components/DesireCredit.tsx create mode 100644 src/components/TimetableSelection/TimetableSelection.tsx create mode 100644 src/components/TimetableSelection/TimetableSelectionFallback.tsx create mode 100644 src/components/TimetableSelection/TimetableSelectionView.tsx create mode 100644 src/hooks/useTimetables.ts diff --git a/package.json b/package.json index d564a6e..6f8a2dd 100644 --- a/package.json +++ b/package.json @@ -31,8 +31,8 @@ "lucide-react": "^0.473.0", "mixpanel-browser": "^2.60.0", "motion": "^12.0.6", - "react": "^18.3.1", - "react-dom": "^18.3.1", + "react": "^19.0.0", + "react-dom": "^19.0.0", "react-use-measure": "^2.1.7", "tailwind-merge": "^3.0.1", "tailwindcss": "^4.0.0", @@ -43,8 +43,8 @@ "@eslint/js": "^9.17.0", "@types/lodash": "^4.17.15", "@types/mixpanel-browser": "^2.51.0", - "@types/react": "^18.3.18", - "@types/react-dom": "^18.3.5", + "@types/react": "^19.0.0", + "@types/react-dom": "^19.0.0", "@vitejs/plugin-react": "^4.3.4", "eslint": "^9.17.0", "eslint-config-prettier": "^10.0.1", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 40dd697..3890947 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -13,13 +13,13 @@ importers: version: 2.0.0 '@radix-ui/react-popover': specifier: ^1.1.5 - version: 1.1.5(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 1.1.5(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) '@radix-ui/react-toast': specifier: ^1.2.6 - version: 1.2.6(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 1.2.6(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) '@sentry/react': specifier: ^9.0.1 - version: 9.0.1(react@18.3.1) + version: 9.0.1(react@19.0.0) '@sentry/vite-plugin': specifier: ^3.1.2 version: 3.1.2 @@ -28,28 +28,28 @@ importers: version: 1.1.1 '@stackflow/plugin-basic-ui': specifier: ^1.11.1 - version: 1.11.1(@stackflow/core@1.1.1)(@stackflow/react@1.4.2(@stackflow/config@1.2.1)(@stackflow/core@1.1.1)(@types/react@18.3.18)(react@18.3.1))(@types/react@18.3.18)(react@18.3.1) + version: 1.11.1(@stackflow/core@1.1.1)(@stackflow/react@1.4.2(@stackflow/config@1.2.1)(@stackflow/core@1.1.1)(@types/react@19.0.0)(react@19.0.0))(@types/react@19.0.0)(react@19.0.0) '@stackflow/plugin-history-sync': specifier: ^1.7.1 - version: 1.7.1(@stackflow/config@1.2.1)(@stackflow/core@1.1.1)(@stackflow/react@1.4.2(@stackflow/config@1.2.1)(@stackflow/core@1.1.1)(@types/react@18.3.18)(react@18.3.1))(@types/react@18.3.18)(react@18.3.1) + version: 1.7.1(@stackflow/config@1.2.1)(@stackflow/core@1.1.1)(@stackflow/react@1.4.2(@stackflow/config@1.2.1)(@stackflow/core@1.1.1)(@types/react@19.0.0)(react@19.0.0))(@types/react@19.0.0)(react@19.0.0) '@stackflow/plugin-renderer-basic': specifier: ^1.1.13 - version: 1.1.13(@stackflow/core@1.1.1)(@stackflow/react@1.4.2(@stackflow/config@1.2.1)(@stackflow/core@1.1.1)(@types/react@18.3.18)(react@18.3.1))(@types/react@18.3.18)(react@18.3.1) + version: 1.1.13(@stackflow/core@1.1.1)(@stackflow/react@1.4.2(@stackflow/config@1.2.1)(@stackflow/core@1.1.1)(@types/react@19.0.0)(react@19.0.0))(@types/react@19.0.0)(react@19.0.0) '@stackflow/react': specifier: ^1.4.2 - version: 1.4.2(@stackflow/config@1.2.1)(@stackflow/core@1.1.1)(@types/react@18.3.18)(react@18.3.1) + version: 1.4.2(@stackflow/config@1.2.1)(@stackflow/core@1.1.1)(@types/react@19.0.0)(react@19.0.0) '@tailwindcss/vite': specifier: ^4.0.0 version: 4.0.0(vite@6.0.11(jiti@2.4.2)(lightningcss@1.29.1)(yaml@2.6.1)) '@tanstack/react-query': specifier: ^5.64.2 - version: 5.64.2(react@18.3.1) + version: 5.64.2(react@19.0.0) '@xstate/react': specifier: ^5.0.2 - version: 5.0.2(@types/react@18.3.18)(react@18.3.1)(xstate@5.19.2) + version: 5.0.2(@types/react@19.0.0)(react@19.0.0)(xstate@5.19.2) embla-carousel-react: specifier: ^8.5.2 - version: 8.5.2(react@18.3.1) + version: 8.5.2(react@19.0.0) html2canvas: specifier: ^1.4.1 version: 1.4.1 @@ -61,22 +61,22 @@ importers: version: 4.17.21 lucide-react: specifier: ^0.473.0 - version: 0.473.0(react@18.3.1) + version: 0.473.0(react@19.0.0) mixpanel-browser: specifier: ^2.60.0 version: 2.60.0 motion: specifier: ^12.0.6 - version: 12.0.6(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 12.0.6(react-dom@19.0.0(react@19.0.0))(react@19.0.0) react: - specifier: ^18.3.1 - version: 18.3.1 + specifier: ^19.0.0 + version: 19.0.0 react-dom: - specifier: ^18.3.1 - version: 18.3.1(react@18.3.1) + specifier: ^19.0.0 + version: 19.0.0(react@19.0.0) react-use-measure: specifier: ^2.1.7 - version: 2.1.7(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 2.1.7(react-dom@19.0.0(react@19.0.0))(react@19.0.0) tailwind-merge: specifier: ^3.0.1 version: 3.0.1 @@ -100,11 +100,11 @@ importers: specifier: ^2.51.0 version: 2.51.0 '@types/react': - specifier: ^18.3.18 - version: 18.3.18 + specifier: ^19.0.0 + version: 19.0.0 '@types/react-dom': - specifier: ^18.3.5 - version: 18.3.5(@types/react@18.3.18) + specifier: ^19.0.0 + version: 19.0.0 '@vitejs/plugin-react': specifier: ^4.3.4 version: 4.3.4(vite@6.0.11(jiti@2.4.2)(lightningcss@1.29.1)(yaml@2.6.1)) @@ -1134,14 +1134,15 @@ packages: '@types/prop-types@15.7.14': resolution: {integrity: sha512-gNMvNH49DJ7OJYv+KAKn0Xp45p8PLl6zo2YnvDIbTd4J6MER2BmWN49TG7n9LvkyihINxeKW8+3bfS2yDC9dzQ==} - '@types/react-dom@18.3.5': - resolution: {integrity: sha512-P4t6saawp+b/dFrUr2cvkVsfvPguwsxtH6dNIYRllMsefqFzkZk5UIjzyDOv5g1dXIPdG4Sp1yCR4Z6RCUsG/Q==} - peerDependencies: - '@types/react': ^18.0.0 + '@types/react-dom@19.0.0': + resolution: {integrity: sha512-1KfiQKsH1o00p9m5ag12axHQSb3FOU9H20UTrujVSkNhuCrRHiQWFqgEnTNK5ZNfnzZv8UWrnXVqCmCF9fgY3w==} '@types/react@18.3.18': resolution: {integrity: sha512-t4yC+vtgnkYjNSKlFx1jkAhH8LgTo2N/7Qvi83kdEaUtMDiwpbLAktKDaAMlRcJ5eSxZkH74eEGt1ky31d7kfQ==} + '@types/react@19.0.0': + resolution: {integrity: sha512-MY3oPudxvMYyesqs/kW1Bh8y9VqSmf+tzqw3ae8a9DZW68pUe3zAdHeI1jc6iAysuRdACnVknHP8AhwD4/dxtg==} + '@typescript-eslint/eslint-plugin@8.21.0': resolution: {integrity: sha512-eTH+UOR4I7WbdQnG4Z48ebIA6Bgi7WO8HvFEneeYBxG8qCOYgTOFPSg6ek9ITIDvGjDQzWHcoWHCDO2biByNzA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -1810,10 +1811,6 @@ packages: resolution: {integrity: sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w==} engines: {node: '>=18'} - loose-envify@1.4.0: - resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} - hasBin: true - lru-cache@10.4.3: resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} @@ -2064,10 +2061,10 @@ packages: queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} - react-dom@18.3.1: - resolution: {integrity: sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==} + react-dom@19.0.0: + resolution: {integrity: sha512-4GV5sHFG0e/0AD4X+ySy6UJd3jVl1iNsNHdpad0qhABJ11twS3TTBnseqsKurKcsNqCEFeGL3uLpVChpIO3QfQ==} peerDependencies: - react: ^18.3.1 + react: ^19.0.0 react-fast-compare@3.2.2: resolution: {integrity: sha512-nsO+KSNgo1SbJqJEYRE9ERzo7YtYbou/OqjSQKxV7jcKox7+usiUVZOAC+XnDOABXggQTno0Y1CpVnuWEc1boQ==} @@ -2118,8 +2115,8 @@ packages: react-dom: optional: true - react@18.3.1: - resolution: {integrity: sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==} + react@19.0.0: + resolution: {integrity: sha512-V8AVnmPIICiWpGfm6GLzCR/W5FXLchHop40W4nXBmdlEceh16rCN8O8LNWm5bh5XUX91fh7KpA+W0TgMKmgTpQ==} engines: {node: '>=0.10.0'} readdirp@3.6.0: @@ -2161,8 +2158,8 @@ packages: run-parallel@1.2.0: resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} - scheduler@0.23.2: - resolution: {integrity: sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==} + scheduler@0.25.0: + resolution: {integrity: sha512-xFVuu11jh+xcO7JOAGJNOXld8/TcEHK/4CituBUeUb5hqxJLj9YuemAEuvm9gQ/+pgXYfbQuqAkiYu+u7YEsNA==} semver@6.3.1: resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} @@ -2654,11 +2651,11 @@ snapshots: '@floating-ui/core': 1.6.9 '@floating-ui/utils': 0.2.9 - '@floating-ui/react-dom@2.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@floating-ui/react-dom@2.1.2(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: '@floating-ui/dom': 1.6.13 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) '@floating-ui/utils@0.2.9': {} @@ -2706,260 +2703,260 @@ snapshots: '@radix-ui/primitive@1.1.1': {} - '@radix-ui/react-arrow@1.1.1(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-arrow@1.1.1(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: - '@radix-ui/react-primitive': 2.0.1(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) + '@radix-ui/react-primitive': 2.0.1(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) optionalDependencies: - '@types/react': 18.3.18 - '@types/react-dom': 18.3.5(@types/react@18.3.18) + '@types/react': 19.0.0 + '@types/react-dom': 19.0.0 - '@radix-ui/react-collection@1.1.2(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-collection@1.1.2(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: - '@radix-ui/react-compose-refs': 1.1.1(@types/react@18.3.18)(react@18.3.1) - '@radix-ui/react-context': 1.1.1(@types/react@18.3.18)(react@18.3.1) - '@radix-ui/react-primitive': 2.0.2(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-slot': 1.1.2(@types/react@18.3.18)(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) + '@radix-ui/react-compose-refs': 1.1.1(@types/react@19.0.0)(react@19.0.0) + '@radix-ui/react-context': 1.1.1(@types/react@19.0.0)(react@19.0.0) + '@radix-ui/react-primitive': 2.0.2(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-slot': 1.1.2(@types/react@19.0.0)(react@19.0.0) + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) optionalDependencies: - '@types/react': 18.3.18 - '@types/react-dom': 18.3.5(@types/react@18.3.18) + '@types/react': 19.0.0 + '@types/react-dom': 19.0.0 - '@radix-ui/react-compose-refs@1.1.1(@types/react@18.3.18)(react@18.3.1)': + '@radix-ui/react-compose-refs@1.1.1(@types/react@19.0.0)(react@19.0.0)': dependencies: - react: 18.3.1 + react: 19.0.0 optionalDependencies: - '@types/react': 18.3.18 + '@types/react': 19.0.0 - '@radix-ui/react-context@1.1.1(@types/react@18.3.18)(react@18.3.1)': + '@radix-ui/react-context@1.1.1(@types/react@19.0.0)(react@19.0.0)': dependencies: - react: 18.3.1 + react: 19.0.0 optionalDependencies: - '@types/react': 18.3.18 + '@types/react': 19.0.0 - '@radix-ui/react-dismissable-layer@1.1.4(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-dismissable-layer@1.1.4(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: '@radix-ui/primitive': 1.1.1 - '@radix-ui/react-compose-refs': 1.1.1(@types/react@18.3.18)(react@18.3.1) - '@radix-ui/react-primitive': 2.0.1(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.18)(react@18.3.1) - '@radix-ui/react-use-escape-keydown': 1.1.0(@types/react@18.3.18)(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) + '@radix-ui/react-compose-refs': 1.1.1(@types/react@19.0.0)(react@19.0.0) + '@radix-ui/react-primitive': 2.0.1(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@19.0.0)(react@19.0.0) + '@radix-ui/react-use-escape-keydown': 1.1.0(@types/react@19.0.0)(react@19.0.0) + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) optionalDependencies: - '@types/react': 18.3.18 - '@types/react-dom': 18.3.5(@types/react@18.3.18) + '@types/react': 19.0.0 + '@types/react-dom': 19.0.0 - '@radix-ui/react-dismissable-layer@1.1.5(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-dismissable-layer@1.1.5(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: '@radix-ui/primitive': 1.1.1 - '@radix-ui/react-compose-refs': 1.1.1(@types/react@18.3.18)(react@18.3.1) - '@radix-ui/react-primitive': 2.0.2(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.18)(react@18.3.1) - '@radix-ui/react-use-escape-keydown': 1.1.0(@types/react@18.3.18)(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) + '@radix-ui/react-compose-refs': 1.1.1(@types/react@19.0.0)(react@19.0.0) + '@radix-ui/react-primitive': 2.0.2(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@19.0.0)(react@19.0.0) + '@radix-ui/react-use-escape-keydown': 1.1.0(@types/react@19.0.0)(react@19.0.0) + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) optionalDependencies: - '@types/react': 18.3.18 - '@types/react-dom': 18.3.5(@types/react@18.3.18) + '@types/react': 19.0.0 + '@types/react-dom': 19.0.0 - '@radix-ui/react-focus-guards@1.1.1(@types/react@18.3.18)(react@18.3.1)': + '@radix-ui/react-focus-guards@1.1.1(@types/react@19.0.0)(react@19.0.0)': dependencies: - react: 18.3.1 + react: 19.0.0 optionalDependencies: - '@types/react': 18.3.18 + '@types/react': 19.0.0 - '@radix-ui/react-focus-scope@1.1.1(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-focus-scope@1.1.1(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: - '@radix-ui/react-compose-refs': 1.1.1(@types/react@18.3.18)(react@18.3.1) - '@radix-ui/react-primitive': 2.0.1(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.18)(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) + '@radix-ui/react-compose-refs': 1.1.1(@types/react@19.0.0)(react@19.0.0) + '@radix-ui/react-primitive': 2.0.1(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@19.0.0)(react@19.0.0) + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) optionalDependencies: - '@types/react': 18.3.18 - '@types/react-dom': 18.3.5(@types/react@18.3.18) + '@types/react': 19.0.0 + '@types/react-dom': 19.0.0 - '@radix-ui/react-id@1.1.0(@types/react@18.3.18)(react@18.3.1)': + '@radix-ui/react-id@1.1.0(@types/react@19.0.0)(react@19.0.0)': dependencies: - '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.18)(react@18.3.1) - react: 18.3.1 + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@19.0.0)(react@19.0.0) + react: 19.0.0 optionalDependencies: - '@types/react': 18.3.18 + '@types/react': 19.0.0 - '@radix-ui/react-popover@1.1.5(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-popover@1.1.5(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: '@radix-ui/primitive': 1.1.1 - '@radix-ui/react-compose-refs': 1.1.1(@types/react@18.3.18)(react@18.3.1) - '@radix-ui/react-context': 1.1.1(@types/react@18.3.18)(react@18.3.1) - '@radix-ui/react-dismissable-layer': 1.1.4(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-focus-guards': 1.1.1(@types/react@18.3.18)(react@18.3.1) - '@radix-ui/react-focus-scope': 1.1.1(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-id': 1.1.0(@types/react@18.3.18)(react@18.3.1) - '@radix-ui/react-popper': 1.2.1(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-portal': 1.1.3(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-presence': 1.1.2(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-primitive': 2.0.1(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-slot': 1.1.1(@types/react@18.3.18)(react@18.3.1) - '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-compose-refs': 1.1.1(@types/react@19.0.0)(react@19.0.0) + '@radix-ui/react-context': 1.1.1(@types/react@19.0.0)(react@19.0.0) + '@radix-ui/react-dismissable-layer': 1.1.4(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-focus-guards': 1.1.1(@types/react@19.0.0)(react@19.0.0) + '@radix-ui/react-focus-scope': 1.1.1(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-id': 1.1.0(@types/react@19.0.0)(react@19.0.0) + '@radix-ui/react-popper': 1.2.1(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-portal': 1.1.3(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-presence': 1.1.2(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-primitive': 2.0.1(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-slot': 1.1.1(@types/react@19.0.0)(react@19.0.0) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@19.0.0)(react@19.0.0) aria-hidden: 1.2.4 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - react-remove-scroll: 2.6.3(@types/react@18.3.18)(react@18.3.1) + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) + react-remove-scroll: 2.6.3(@types/react@19.0.0)(react@19.0.0) optionalDependencies: - '@types/react': 18.3.18 - '@types/react-dom': 18.3.5(@types/react@18.3.18) - - '@radix-ui/react-popper@1.2.1(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@floating-ui/react-dom': 2.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-arrow': 1.1.1(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-compose-refs': 1.1.1(@types/react@18.3.18)(react@18.3.1) - '@radix-ui/react-context': 1.1.1(@types/react@18.3.18)(react@18.3.1) - '@radix-ui/react-primitive': 2.0.1(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.18)(react@18.3.1) - '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.18)(react@18.3.1) - '@radix-ui/react-use-rect': 1.1.0(@types/react@18.3.18)(react@18.3.1) - '@radix-ui/react-use-size': 1.1.0(@types/react@18.3.18)(react@18.3.1) + '@types/react': 19.0.0 + '@types/react-dom': 19.0.0 + + '@radix-ui/react-popper@1.2.1(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + dependencies: + '@floating-ui/react-dom': 2.1.2(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-arrow': 1.1.1(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-compose-refs': 1.1.1(@types/react@19.0.0)(react@19.0.0) + '@radix-ui/react-context': 1.1.1(@types/react@19.0.0)(react@19.0.0) + '@radix-ui/react-primitive': 2.0.1(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@19.0.0)(react@19.0.0) + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@19.0.0)(react@19.0.0) + '@radix-ui/react-use-rect': 1.1.0(@types/react@19.0.0)(react@19.0.0) + '@radix-ui/react-use-size': 1.1.0(@types/react@19.0.0)(react@19.0.0) '@radix-ui/rect': 1.1.0 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) optionalDependencies: - '@types/react': 18.3.18 - '@types/react-dom': 18.3.5(@types/react@18.3.18) + '@types/react': 19.0.0 + '@types/react-dom': 19.0.0 - '@radix-ui/react-portal@1.1.3(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-portal@1.1.3(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: - '@radix-ui/react-primitive': 2.0.1(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.18)(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) + '@radix-ui/react-primitive': 2.0.1(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@19.0.0)(react@19.0.0) + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) optionalDependencies: - '@types/react': 18.3.18 - '@types/react-dom': 18.3.5(@types/react@18.3.18) + '@types/react': 19.0.0 + '@types/react-dom': 19.0.0 - '@radix-ui/react-portal@1.1.4(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-portal@1.1.4(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: - '@radix-ui/react-primitive': 2.0.2(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.18)(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) + '@radix-ui/react-primitive': 2.0.2(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@19.0.0)(react@19.0.0) + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) optionalDependencies: - '@types/react': 18.3.18 - '@types/react-dom': 18.3.5(@types/react@18.3.18) + '@types/react': 19.0.0 + '@types/react-dom': 19.0.0 - '@radix-ui/react-presence@1.1.2(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-presence@1.1.2(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: - '@radix-ui/react-compose-refs': 1.1.1(@types/react@18.3.18)(react@18.3.1) - '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.18)(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) + '@radix-ui/react-compose-refs': 1.1.1(@types/react@19.0.0)(react@19.0.0) + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@19.0.0)(react@19.0.0) + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) optionalDependencies: - '@types/react': 18.3.18 - '@types/react-dom': 18.3.5(@types/react@18.3.18) + '@types/react': 19.0.0 + '@types/react-dom': 19.0.0 - '@radix-ui/react-primitive@2.0.1(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-primitive@2.0.1(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: - '@radix-ui/react-slot': 1.1.1(@types/react@18.3.18)(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) + '@radix-ui/react-slot': 1.1.1(@types/react@19.0.0)(react@19.0.0) + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) optionalDependencies: - '@types/react': 18.3.18 - '@types/react-dom': 18.3.5(@types/react@18.3.18) + '@types/react': 19.0.0 + '@types/react-dom': 19.0.0 - '@radix-ui/react-primitive@2.0.2(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-primitive@2.0.2(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: - '@radix-ui/react-slot': 1.1.2(@types/react@18.3.18)(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) + '@radix-ui/react-slot': 1.1.2(@types/react@19.0.0)(react@19.0.0) + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) optionalDependencies: - '@types/react': 18.3.18 - '@types/react-dom': 18.3.5(@types/react@18.3.18) + '@types/react': 19.0.0 + '@types/react-dom': 19.0.0 - '@radix-ui/react-slot@1.1.1(@types/react@18.3.18)(react@18.3.1)': + '@radix-ui/react-slot@1.1.1(@types/react@19.0.0)(react@19.0.0)': dependencies: - '@radix-ui/react-compose-refs': 1.1.1(@types/react@18.3.18)(react@18.3.1) - react: 18.3.1 + '@radix-ui/react-compose-refs': 1.1.1(@types/react@19.0.0)(react@19.0.0) + react: 19.0.0 optionalDependencies: - '@types/react': 18.3.18 + '@types/react': 19.0.0 - '@radix-ui/react-slot@1.1.2(@types/react@18.3.18)(react@18.3.1)': + '@radix-ui/react-slot@1.1.2(@types/react@19.0.0)(react@19.0.0)': dependencies: - '@radix-ui/react-compose-refs': 1.1.1(@types/react@18.3.18)(react@18.3.1) - react: 18.3.1 + '@radix-ui/react-compose-refs': 1.1.1(@types/react@19.0.0)(react@19.0.0) + react: 19.0.0 optionalDependencies: - '@types/react': 18.3.18 + '@types/react': 19.0.0 - '@radix-ui/react-toast@1.2.6(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-toast@1.2.6(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: '@radix-ui/primitive': 1.1.1 - '@radix-ui/react-collection': 1.1.2(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-compose-refs': 1.1.1(@types/react@18.3.18)(react@18.3.1) - '@radix-ui/react-context': 1.1.1(@types/react@18.3.18)(react@18.3.1) - '@radix-ui/react-dismissable-layer': 1.1.5(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-portal': 1.1.4(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-presence': 1.1.2(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-primitive': 2.0.2(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.18)(react@18.3.1) - '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.18)(react@18.3.1) - '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.18)(react@18.3.1) - '@radix-ui/react-visually-hidden': 1.1.2(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) + '@radix-ui/react-collection': 1.1.2(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-compose-refs': 1.1.1(@types/react@19.0.0)(react@19.0.0) + '@radix-ui/react-context': 1.1.1(@types/react@19.0.0)(react@19.0.0) + '@radix-ui/react-dismissable-layer': 1.1.5(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-portal': 1.1.4(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-presence': 1.1.2(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-primitive': 2.0.2(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@19.0.0)(react@19.0.0) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@19.0.0)(react@19.0.0) + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@19.0.0)(react@19.0.0) + '@radix-ui/react-visually-hidden': 1.1.2(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) optionalDependencies: - '@types/react': 18.3.18 - '@types/react-dom': 18.3.5(@types/react@18.3.18) + '@types/react': 19.0.0 + '@types/react-dom': 19.0.0 - '@radix-ui/react-use-callback-ref@1.1.0(@types/react@18.3.18)(react@18.3.1)': + '@radix-ui/react-use-callback-ref@1.1.0(@types/react@19.0.0)(react@19.0.0)': dependencies: - react: 18.3.1 + react: 19.0.0 optionalDependencies: - '@types/react': 18.3.18 + '@types/react': 19.0.0 - '@radix-ui/react-use-controllable-state@1.1.0(@types/react@18.3.18)(react@18.3.1)': + '@radix-ui/react-use-controllable-state@1.1.0(@types/react@19.0.0)(react@19.0.0)': dependencies: - '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.18)(react@18.3.1) - react: 18.3.1 + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@19.0.0)(react@19.0.0) + react: 19.0.0 optionalDependencies: - '@types/react': 18.3.18 + '@types/react': 19.0.0 - '@radix-ui/react-use-escape-keydown@1.1.0(@types/react@18.3.18)(react@18.3.1)': + '@radix-ui/react-use-escape-keydown@1.1.0(@types/react@19.0.0)(react@19.0.0)': dependencies: - '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.18)(react@18.3.1) - react: 18.3.1 + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@19.0.0)(react@19.0.0) + react: 19.0.0 optionalDependencies: - '@types/react': 18.3.18 + '@types/react': 19.0.0 - '@radix-ui/react-use-layout-effect@1.1.0(@types/react@18.3.18)(react@18.3.1)': + '@radix-ui/react-use-layout-effect@1.1.0(@types/react@19.0.0)(react@19.0.0)': dependencies: - react: 18.3.1 + react: 19.0.0 optionalDependencies: - '@types/react': 18.3.18 + '@types/react': 19.0.0 - '@radix-ui/react-use-rect@1.1.0(@types/react@18.3.18)(react@18.3.1)': + '@radix-ui/react-use-rect@1.1.0(@types/react@19.0.0)(react@19.0.0)': dependencies: '@radix-ui/rect': 1.1.0 - react: 18.3.1 + react: 19.0.0 optionalDependencies: - '@types/react': 18.3.18 + '@types/react': 19.0.0 - '@radix-ui/react-use-size@1.1.0(@types/react@18.3.18)(react@18.3.1)': + '@radix-ui/react-use-size@1.1.0(@types/react@19.0.0)(react@19.0.0)': dependencies: - '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.18)(react@18.3.1) - react: 18.3.1 + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@19.0.0)(react@19.0.0) + react: 19.0.0 optionalDependencies: - '@types/react': 18.3.18 + '@types/react': 19.0.0 - '@radix-ui/react-visually-hidden@1.1.2(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-visually-hidden@1.1.2(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: - '@radix-ui/react-primitive': 2.0.2(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) + '@radix-ui/react-primitive': 2.0.2(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) optionalDependencies: - '@types/react': 18.3.18 - '@types/react-dom': 18.3.5(@types/react@18.3.18) + '@types/react': 19.0.0 + '@types/react-dom': 19.0.0 '@radix-ui/rect@1.1.0': {} @@ -3106,12 +3103,12 @@ snapshots: '@sentry/core@9.0.1': {} - '@sentry/react@9.0.1(react@18.3.1)': + '@sentry/react@9.0.1(react@19.0.0)': dependencies: '@sentry/browser': 9.0.1 '@sentry/core': 9.0.1 hoist-non-react-statics: 3.3.2 - react: 18.3.1 + react: 19.0.0 '@sentry/vite-plugin@3.1.2': dependencies: @@ -3127,52 +3124,52 @@ snapshots: dependencies: react-fast-compare: 3.2.2 - '@stackflow/plugin-basic-ui@1.11.1(@stackflow/core@1.1.1)(@stackflow/react@1.4.2(@stackflow/config@1.2.1)(@stackflow/core@1.1.1)(@types/react@18.3.18)(react@18.3.1))(@types/react@18.3.18)(react@18.3.1)': + '@stackflow/plugin-basic-ui@1.11.1(@stackflow/core@1.1.1)(@stackflow/react@1.4.2(@stackflow/config@1.2.1)(@stackflow/core@1.1.1)(@types/react@19.0.0)(react@19.0.0))(@types/react@19.0.0)(react@19.0.0)': dependencies: '@stackflow/core': 1.1.1 - '@stackflow/react': 1.4.2(@stackflow/config@1.2.1)(@stackflow/core@1.1.1)(@types/react@18.3.18)(react@18.3.1) - '@stackflow/react-ui-core': 1.2.1(@stackflow/core@1.1.1)(@stackflow/react@1.4.2(@stackflow/config@1.2.1)(@stackflow/core@1.1.1)(@types/react@18.3.18)(react@18.3.1))(@types/react@18.3.18)(react@18.3.1) - '@types/react': 18.3.18 + '@stackflow/react': 1.4.2(@stackflow/config@1.2.1)(@stackflow/core@1.1.1)(@types/react@19.0.0)(react@19.0.0) + '@stackflow/react-ui-core': 1.2.1(@stackflow/core@1.1.1)(@stackflow/react@1.4.2(@stackflow/config@1.2.1)(@stackflow/core@1.1.1)(@types/react@19.0.0)(react@19.0.0))(@types/react@19.0.0)(react@19.0.0) + '@types/react': 19.0.0 '@vanilla-extract/css': 1.17.0 '@vanilla-extract/dynamic': 2.1.2 '@vanilla-extract/private': 1.0.6 '@vanilla-extract/recipes': 0.5.5(@vanilla-extract/css@1.17.0) - react: 18.3.1 + react: 19.0.0 transitivePeerDependencies: - babel-plugin-macros - '@stackflow/plugin-history-sync@1.7.1(@stackflow/config@1.2.1)(@stackflow/core@1.1.1)(@stackflow/react@1.4.2(@stackflow/config@1.2.1)(@stackflow/core@1.1.1)(@types/react@18.3.18)(react@18.3.1))(@types/react@18.3.18)(react@18.3.1)': + '@stackflow/plugin-history-sync@1.7.1(@stackflow/config@1.2.1)(@stackflow/core@1.1.1)(@stackflow/react@1.4.2(@stackflow/config@1.2.1)(@stackflow/core@1.1.1)(@types/react@19.0.0)(react@19.0.0))(@types/react@19.0.0)(react@19.0.0)': dependencies: '@stackflow/config': 1.2.1 '@stackflow/core': 1.1.1 - '@stackflow/react': 1.4.2(@stackflow/config@1.2.1)(@stackflow/core@1.1.1)(@types/react@18.3.18)(react@18.3.1) - '@types/react': 18.3.18 + '@stackflow/react': 1.4.2(@stackflow/config@1.2.1)(@stackflow/core@1.1.1)(@types/react@19.0.0)(react@19.0.0) + '@types/react': 19.0.0 flatted: 3.3.2 history: 5.3.0 - react: 18.3.1 + react: 19.0.0 url-pattern: 1.0.3 - '@stackflow/plugin-renderer-basic@1.1.13(@stackflow/core@1.1.1)(@stackflow/react@1.4.2(@stackflow/config@1.2.1)(@stackflow/core@1.1.1)(@types/react@18.3.18)(react@18.3.1))(@types/react@18.3.18)(react@18.3.1)': + '@stackflow/plugin-renderer-basic@1.1.13(@stackflow/core@1.1.1)(@stackflow/react@1.4.2(@stackflow/config@1.2.1)(@stackflow/core@1.1.1)(@types/react@19.0.0)(react@19.0.0))(@types/react@19.0.0)(react@19.0.0)': dependencies: '@stackflow/core': 1.1.1 - '@stackflow/react': 1.4.2(@stackflow/config@1.2.1)(@stackflow/core@1.1.1)(@types/react@18.3.18)(react@18.3.1) - '@types/react': 18.3.18 - react: 18.3.1 + '@stackflow/react': 1.4.2(@stackflow/config@1.2.1)(@stackflow/core@1.1.1)(@types/react@19.0.0)(react@19.0.0) + '@types/react': 19.0.0 + react: 19.0.0 - '@stackflow/react-ui-core@1.2.1(@stackflow/core@1.1.1)(@stackflow/react@1.4.2(@stackflow/config@1.2.1)(@stackflow/core@1.1.1)(@types/react@18.3.18)(react@18.3.1))(@types/react@18.3.18)(react@18.3.1)': + '@stackflow/react-ui-core@1.2.1(@stackflow/core@1.1.1)(@stackflow/react@1.4.2(@stackflow/config@1.2.1)(@stackflow/core@1.1.1)(@types/react@19.0.0)(react@19.0.0))(@types/react@19.0.0)(react@19.0.0)': dependencies: '@stackflow/core': 1.1.1 - '@stackflow/react': 1.4.2(@stackflow/config@1.2.1)(@stackflow/core@1.1.1)(@types/react@18.3.18)(react@18.3.1) - '@types/react': 18.3.18 - react: 18.3.1 + '@stackflow/react': 1.4.2(@stackflow/config@1.2.1)(@stackflow/core@1.1.1)(@types/react@19.0.0)(react@19.0.0) + '@types/react': 19.0.0 + react: 19.0.0 - '@stackflow/react@1.4.2(@stackflow/config@1.2.1)(@stackflow/core@1.1.1)(@types/react@18.3.18)(react@18.3.1)': + '@stackflow/react@1.4.2(@stackflow/config@1.2.1)(@stackflow/core@1.1.1)(@types/react@19.0.0)(react@19.0.0)': dependencies: '@stackflow/config': 1.2.1 '@stackflow/core': 1.1.1 - '@types/react': 18.3.18 + '@types/react': 19.0.0 history: 5.3.0 - react: 18.3.1 + react: 19.0.0 react-fast-compare: 3.2.2 url-pattern: 1.0.3 @@ -3239,10 +3236,10 @@ snapshots: '@tanstack/query-core@5.64.2': {} - '@tanstack/react-query@5.64.2(react@18.3.1)': + '@tanstack/react-query@5.64.2(react@19.0.0)': dependencies: '@tanstack/query-core': 5.64.2 - react: 18.3.1 + react: 19.0.0 '@types/babel__core@7.20.5': dependencies: @@ -3277,7 +3274,7 @@ snapshots: '@types/prop-types@15.7.14': {} - '@types/react-dom@18.3.5(@types/react@18.3.18)': + '@types/react-dom@19.0.0': dependencies: '@types/react': 18.3.18 @@ -3286,6 +3283,10 @@ snapshots: '@types/prop-types': 15.7.14 csstype: 3.1.3 + '@types/react@19.0.0': + dependencies: + csstype: 3.1.3 + '@typescript-eslint/eslint-plugin@8.21.0(@typescript-eslint/parser@8.21.0(eslint@9.18.0(jiti@2.4.2))(typescript@5.6.3))(eslint@9.18.0(jiti@2.4.2))(typescript@5.6.3)': dependencies: '@eslint-community/regexpp': 4.12.1 @@ -3403,11 +3404,11 @@ snapshots: '@xstate/fsm@1.6.5': {} - '@xstate/react@5.0.2(@types/react@18.3.18)(react@18.3.1)(xstate@5.19.2)': + '@xstate/react@5.0.2(@types/react@19.0.0)(react@19.0.0)(xstate@5.19.2)': dependencies: - react: 18.3.1 - use-isomorphic-layout-effect: 1.2.0(@types/react@18.3.18)(react@18.3.1) - use-sync-external-store: 1.4.0(react@18.3.1) + react: 19.0.0 + use-isomorphic-layout-effect: 1.2.0(@types/react@19.0.0)(react@19.0.0) + use-sync-external-store: 1.4.0(react@19.0.0) optionalDependencies: xstate: 5.19.2 transitivePeerDependencies: @@ -3563,11 +3564,11 @@ snapshots: electron-to-chromium@1.5.86: {} - embla-carousel-react@8.5.2(react@18.3.1): + embla-carousel-react@8.5.2(react@19.0.0): dependencies: embla-carousel: 8.5.2 embla-carousel-reactive-utils: 8.5.2(embla-carousel@8.5.2) - react: 18.3.1 + react: 19.0.0 embla-carousel-reactive-utils@8.5.2(embla-carousel@8.5.2): dependencies: @@ -3750,14 +3751,14 @@ snapshots: flatted@3.3.2: {} - framer-motion@12.0.6(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + framer-motion@12.0.6(react-dom@19.0.0(react@19.0.0))(react@19.0.0): dependencies: motion-dom: 12.0.0 motion-utils: 12.0.0 tslib: 2.8.1 optionalDependencies: - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) fs.realpath@1.0.0: {} @@ -3970,19 +3971,15 @@ snapshots: strip-ansi: 7.1.0 wrap-ansi: 9.0.0 - loose-envify@1.4.0: - dependencies: - js-tokens: 4.0.0 - lru-cache@10.4.3: {} lru-cache@5.1.1: dependencies: yallist: 3.1.1 - lucide-react@0.473.0(react@18.3.1): + lucide-react@0.473.0(react@19.0.0): dependencies: - react: 18.3.1 + react: 19.0.0 magic-string@0.30.8: dependencies: @@ -4035,13 +4032,13 @@ snapshots: motion-utils@12.0.0: {} - motion@12.0.6(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + motion@12.0.6(react-dom@19.0.0(react@19.0.0))(react@19.0.0): dependencies: - framer-motion: 12.0.6(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + framer-motion: 12.0.6(react-dom@19.0.0(react@19.0.0))(react@19.0.0) tslib: 2.8.1 optionalDependencies: - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) ms@2.1.3: {} @@ -4129,11 +4126,10 @@ snapshots: queue-microtask@1.2.3: {} - react-dom@18.3.1(react@18.3.1): + react-dom@19.0.0(react@19.0.0): dependencies: - loose-envify: 1.4.0 - react: 18.3.1 - scheduler: 0.23.2 + react: 19.0.0 + scheduler: 0.25.0 react-fast-compare@3.2.2: {} @@ -4141,42 +4137,40 @@ snapshots: react-refresh@0.14.2: {} - react-remove-scroll-bar@2.3.8(@types/react@18.3.18)(react@18.3.1): + react-remove-scroll-bar@2.3.8(@types/react@19.0.0)(react@19.0.0): dependencies: - react: 18.3.1 - react-style-singleton: 2.2.3(@types/react@18.3.18)(react@18.3.1) + react: 19.0.0 + react-style-singleton: 2.2.3(@types/react@19.0.0)(react@19.0.0) tslib: 2.8.1 optionalDependencies: - '@types/react': 18.3.18 + '@types/react': 19.0.0 - react-remove-scroll@2.6.3(@types/react@18.3.18)(react@18.3.1): + react-remove-scroll@2.6.3(@types/react@19.0.0)(react@19.0.0): dependencies: - react: 18.3.1 - react-remove-scroll-bar: 2.3.8(@types/react@18.3.18)(react@18.3.1) - react-style-singleton: 2.2.3(@types/react@18.3.18)(react@18.3.1) + react: 19.0.0 + react-remove-scroll-bar: 2.3.8(@types/react@19.0.0)(react@19.0.0) + react-style-singleton: 2.2.3(@types/react@19.0.0)(react@19.0.0) tslib: 2.8.1 - use-callback-ref: 1.3.3(@types/react@18.3.18)(react@18.3.1) - use-sidecar: 1.1.3(@types/react@18.3.18)(react@18.3.1) + use-callback-ref: 1.3.3(@types/react@19.0.0)(react@19.0.0) + use-sidecar: 1.1.3(@types/react@19.0.0)(react@19.0.0) optionalDependencies: - '@types/react': 18.3.18 + '@types/react': 19.0.0 - react-style-singleton@2.2.3(@types/react@18.3.18)(react@18.3.1): + react-style-singleton@2.2.3(@types/react@19.0.0)(react@19.0.0): dependencies: get-nonce: 1.0.1 - react: 18.3.1 + react: 19.0.0 tslib: 2.8.1 optionalDependencies: - '@types/react': 18.3.18 + '@types/react': 19.0.0 - react-use-measure@2.1.7(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + react-use-measure@2.1.7(react-dom@19.0.0(react@19.0.0))(react@19.0.0): dependencies: - react: 18.3.1 + react: 19.0.0 optionalDependencies: - react-dom: 18.3.1(react@18.3.1) + react-dom: 19.0.0(react@19.0.0) - react@18.3.1: - dependencies: - loose-envify: 1.4.0 + react@19.0.0: {} readdirp@3.6.0: dependencies: @@ -4243,9 +4237,7 @@ snapshots: dependencies: queue-microtask: 1.2.3 - scheduler@0.23.2: - dependencies: - loose-envify: 1.4.0 + scheduler@0.25.0: {} semver@6.3.1: {} @@ -4348,30 +4340,30 @@ snapshots: url-pattern@1.0.3: {} - use-callback-ref@1.3.3(@types/react@18.3.18)(react@18.3.1): + use-callback-ref@1.3.3(@types/react@19.0.0)(react@19.0.0): dependencies: - react: 18.3.1 + react: 19.0.0 tslib: 2.8.1 optionalDependencies: - '@types/react': 18.3.18 + '@types/react': 19.0.0 - use-isomorphic-layout-effect@1.2.0(@types/react@18.3.18)(react@18.3.1): + use-isomorphic-layout-effect@1.2.0(@types/react@19.0.0)(react@19.0.0): dependencies: - react: 18.3.1 + react: 19.0.0 optionalDependencies: - '@types/react': 18.3.18 + '@types/react': 19.0.0 - use-sidecar@1.1.3(@types/react@18.3.18)(react@18.3.1): + use-sidecar@1.1.3(@types/react@19.0.0)(react@19.0.0): dependencies: detect-node-es: 1.1.0 - react: 18.3.1 + react: 19.0.0 tslib: 2.8.1 optionalDependencies: - '@types/react': 18.3.18 + '@types/react': 19.0.0 - use-sync-external-store@1.4.0(react@18.3.1): + use-sync-external-store@1.4.0(react@19.0.0): dependencies: - react: 18.3.1 + react: 19.0.0 utrie@1.0.2: dependencies: diff --git a/src/components/DesireCredit.tsx b/src/components/DesireCredit.tsx new file mode 100644 index 0000000..a5bdef3 --- /dev/null +++ b/src/components/DesireCredit.tsx @@ -0,0 +1,278 @@ +import RollingNumber from './RollingNumber.tsx'; +import * as Popover from '@radix-ui/react-popover'; +import { Check, ChevronDown } from 'lucide-react'; +import { AnimatePresence, motion } from 'motion/react'; +import Hint from './Hint.tsx'; +import { useState } from 'react'; +import { StudentMachineContext } from '../machines/studentMachine.ts'; +import { usePostTimetable } from '../hooks/usePostTimetable.ts'; +import { Mixpanel } from '../utils/mixpanel.ts'; +import { DesiredCreditParams } from '../pages/DesiredCreditActivity.tsx'; +import { useFlow } from '../stackflow.ts'; + +const getAvailableCredits = (currentCredit: number, baseCredit: number = 0): number[] => { + return Array.from({ length: MAX_CREDIT - currentCredit + 1 }, (_, i) => i + baseCredit); +}; + +type Classification = '전공필수' | '전공선택' | '교양필수' | '교양선택'; + +const MAX_CREDIT = 22; + +const DesireCredit = (params: DesiredCreditParams) => { + const previousCredit = params.majorRequired + params.majorElective + params.generalRequired; // 과목 선택 페이지에서 선택한 전필 + 전선 + 교필 학점 + const [desiredCredit, setDesiredCredit] = useState(previousCredit); // 희망 학점 + const { push } = useFlow(); + + const [availableMajorElective, setAvailableMajorElective] = useState(() => + getAvailableCredits(previousCredit, params.majorElective), + ); // 수강 가능한 전공선택 학점 + const [availableGeneralElective, setAvailableGeneralElective] = useState(() => + getAvailableCredits(previousCredit), + ); // 수강 가능한 교양선택 학점 + + const [majorElective, setMajorElective] = useState(params.majorElective); // 전공선택 학점 + const [generalElective, setGeneralElective] = useState(0); // 교양선택 학점 + + const [showMajorElectiveDropdown, setShowMajorElectiveDropdown] = useState(false); + const [showGeneralElectiveDropdown, setShowGeneralElectiveDropdown] = useState(false); + + const context = StudentMachineContext.useSelector((state) => state.context); + const postTimetableMutation = usePostTimetable(); + + const handleCreditSelect = ({ + type, + selectedCredit, + }: { + type: Classification; + selectedCredit: number; + }) => { + if (type === '전공선택') { + const majorElectiveDiff = selectedCredit - majorElective; + + setMajorElective(selectedCredit); + setDesiredCredit((prev) => prev + majorElectiveDiff); + setAvailableGeneralElective( + getAvailableCredits(desiredCredit + majorElectiveDiff - generalElective), + ); + + setShowMajorElectiveDropdown(false); + } else if (type === '교양선택') { + const generalElectiveDiff = selectedCredit - generalElective; + const majorElectiveDiff = majorElective - params.majorElective; + + setGeneralElective(selectedCredit); + setDesiredCredit((prev) => prev + generalElectiveDiff); + setAvailableMajorElective( + getAvailableCredits( + desiredCredit + generalElectiveDiff - majorElectiveDiff, + params.majorElective, + ), + ); + + setShowGeneralElectiveDropdown(false); + } + }; + + const handleNextClick = () => { + // 시간표 추천 API 요청 + postTimetableMutation.mutate({ + schoolId: context.admissionYear, + department: context.department, + grade: context.grade, + isChapel: context.chapel, + majorRequiredCourses: params.majorRequiredCourses, + majorElectiveCourses: params.majorElectiveCourses, + generalRequiredCourses: params.generalRequiredCourses, + majorElectiveCredit: majorElective, + generalElectiveCredit: generalElective, + }); + + // Mixpanel 이벤트 추적 + Mixpanel.trackDesiredCreditClick({ + majorRequiredCourses: params.majorRequiredCourses, + majorElectiveCourses: params.majorElectiveCourses, + generalRequiredCourses: params.generalRequiredCourses, + majorElectiveCredit: majorElective, + generalElectiveCredit: generalElective, + }); + + push('TimetableSelectionActivity', {}); + }; + + return ( +
+

+ 사용자님의 이번학기
+ 희망 학점은 + 학점이군요! +

+ 희망 학점에 맞추어 선택과목을 추천해드릴게요. +
+
+ + +
+ +
+ + + + + + + + {showMajorElectiveDropdown && ( + + + {availableMajorElective.map((availableCredit) => ( +
  • + +
  • + ))} +
    +
    + )} +
    +
    +
    + +
    + + +
    + +
    + + + + + + + + + {showGeneralElectiveDropdown && ( + + + {availableGeneralElective.map((availableCredit) => ( +
  • + +
  • + ))} +
    +
    + )} +
    +
    +
    +
    + + + + 이수 가능한 최대 학점은 22학점이에요. + + + + 네 맞아요 + +
    + ); +}; + +export default DesireCredit; diff --git a/src/components/SelectedCoursesBottomSheet.tsx b/src/components/SelectedCoursesBottomSheet.tsx index 648beca..befd1da 100644 --- a/src/components/SelectedCoursesBottomSheet.tsx +++ b/src/components/SelectedCoursesBottomSheet.tsx @@ -69,81 +69,84 @@ const SelectedCoursesBottomSheet = ({ open, handleClose }: SelectedCourseBottomS }; return ( - root && - createPortal( - - {open && ( - - -
    -
    -
    + root && ( + <> + {createPortal( + + {open && ( -
    - {courses.length === 0 ? ( -
    선택된 과목이 없어요.
    - ) : ( - courses.map((course) => ( - {}} - isSelected={false} - /> - )) - )} -
    +
    +
    +
    + +
    + {courses.length === 0 ? ( +
    선택된 과목이 없어요.
    + ) : ( + courses.map((course) => ( + {}} + isSelected={false} + /> + )) + )} +
    +
    + +
    - -
    - + )} +
    , + root, )} - , - root, + ) ); }; diff --git a/src/components/SoongptErrorBoundary.tsx b/src/components/SoongptErrorBoundary.tsx index 96da4ca..809448a 100644 --- a/src/components/SoongptErrorBoundary.tsx +++ b/src/components/SoongptErrorBoundary.tsx @@ -7,10 +7,10 @@ import Wrench from '../assets/wrench.svg'; interface SoongptErrorBoundaryProps { children: ReactNode; - FallbackComponent: ReactElement; + clientErrorComponent?: ReactElement; } -const SoongptErrorBoundary = ({ FallbackComponent, children }: SoongptErrorBoundaryProps) => { +const SoongptErrorBoundary = ({ clientErrorComponent, children }: SoongptErrorBoundaryProps) => { return ( {({ reset }) => ( @@ -18,40 +18,43 @@ const SoongptErrorBoundary = ({ FallbackComponent, children }: SoongptErrorBound onError={reset} fallback={({ error, resetError }) => { const errorRange = Math.floor(((error as SoongptError).status ?? 500) / 100); + const serverErrorComponent = ( + +
    +

    + {'서버와의 연결이\n원활하지 않아요.'} +

    + + 재요청 하더라도 사용자님의 정보는 기억할게요! + +
    +
    + {'wrench'} +
    +
    + +
    +
    + ); + + if (clientErrorComponent === undefined) return serverErrorComponent; switch (errorRange) { case 4: - return FallbackComponent; + return clientErrorComponent; default: - return ( - -
    -

    - {'서버와의 연결이\n원활하지 않아요.'} -

    - - 재요청 하더라도 사용자님의 정보는 기억할게요! - -
    -
    - {'wrench'} -
    -
    - -
    -
    - ); + return serverErrorComponent; } }} > diff --git a/src/components/TimetableSelection/TimetableSelection.tsx b/src/components/TimetableSelection/TimetableSelection.tsx new file mode 100644 index 0000000..911d52e --- /dev/null +++ b/src/components/TimetableSelection/TimetableSelection.tsx @@ -0,0 +1,81 @@ +import TimetableSelectionView from './TimetableSelectionView.tsx'; +import Timetable from '../Timetable.tsx'; +import { useRef, useState } from 'react'; +import { useFlow } from '../../stackflow.ts'; +import { Mixpanel } from '../../utils/mixpanel.ts'; +import { useTimetables } from '../../hooks/useTimetables.ts'; + +const TimetableSelection = () => { + const [selectedIndex, setSelectedIndex] = useState(0); + const timetables = useTimetables(); + + const { push } = useFlow(); + + const timetableRefs = useRef<(HTMLDivElement | null)[]>([]); + + const handleTimetableClick = (index: number) => { + setSelectedIndex(index); + timetableRefs.current[index]?.scrollIntoView({ + behavior: 'smooth', + block: 'center', + }); + }; + + const handleNextClick = () => { + const selectedTimetable = timetables[selectedIndex]; + const unSelectedTimetable = timetables.filter( + (timetable) => timetable.timetableId !== selectedTimetable.timetableId, + ); + + // Mixpanel 이벤트 추적 + Mixpanel.trackTimetableSelectionClick(selectedTimetable, unSelectedTimetable); + + push('TimetableSharingActivity', { + timetableId: selectedTimetable.timetableId, + }); + }; + + return ( + + {timetables.map((timetable, index) => ( +
    { + { + /* div 요소가 마운트 될 때 실행*/ + } + timetableRefs.current[index] = element; + }} + onClick={() => handleTimetableClick(index)} + > + + + +
    + ))} + + } + /> + ); +}; + +export default TimetableSelection; diff --git a/src/components/TimetableSelection/TimetableSelectionFallback.tsx b/src/components/TimetableSelection/TimetableSelectionFallback.tsx new file mode 100644 index 0000000..98e3051 --- /dev/null +++ b/src/components/TimetableSelection/TimetableSelectionFallback.tsx @@ -0,0 +1,62 @@ +import TimetableSelectionView from './TimetableSelectionView.tsx'; +import { ReactElement } from 'react'; +import { TimetableSkeleton } from '../TimetableSkeleton.tsx'; +import Warning from '../../assets/warning.svg'; +import { useFlow } from '../../stackflow.ts'; + +type TimetableSelectionFallbackType = 'pending' | 'error'; + +interface TimetableSelectionFallbackInfo { + title: string; + buttonText: string; + buttonDisabled: boolean; + handleNextClick?: () => void; + element: ReactElement; +} + +interface TimetableSelectionFallbackProps { + type: TimetableSelectionFallbackType; +} + +const TimetableSelectionFallback = ({ type }: TimetableSelectionFallbackProps) => { + const { pop } = useFlow(); + + const timetableSelectionFallbackInfo: Record< + TimetableSelectionFallbackType, + TimetableSelectionFallbackInfo + > = { + pending: { + title: '사용자님을 위한\n시간표를 가져오는 중이에요!', + buttonText: '이 시간표가 좋아요', + buttonDisabled: true, + element: ( + + + + ), + }, + error: { + title: '사용자님을 위한\n시간표를 찾지 못했어요..', + buttonText: '다시 만들기', + buttonDisabled: false, + handleNextClick: () => pop(2), + element: ( +
    + Warning +
    + ), + }, + }; + + return ( + + ); +}; + +export default TimetableSelectionFallback; diff --git a/src/components/TimetableSelection/TimetableSelectionView.tsx b/src/components/TimetableSelection/TimetableSelectionView.tsx new file mode 100644 index 0000000..eb8deea --- /dev/null +++ b/src/components/TimetableSelection/TimetableSelectionView.tsx @@ -0,0 +1,42 @@ +import { motion } from 'motion/react'; +import { ReactElement } from 'react'; + +interface TimetableSelectionViewProps { + element: ReactElement; + handleNextClick?: () => void; + buttonText: string; + title: string; + buttonDisabled: boolean; +} + +const TimetableSelectionView = ({ + element, + handleNextClick, + buttonDisabled, + buttonText, + title, +}: TimetableSelectionViewProps) => { + return ( + +

    {title}

    +
    {element}
    +
    + +
    +
    + ); +}; + +export default TimetableSelectionView; diff --git a/src/hooks/usePostTimetable.ts b/src/hooks/usePostTimetable.ts index 6c869fd..abdc04f 100644 --- a/src/hooks/usePostTimetable.ts +++ b/src/hooks/usePostTimetable.ts @@ -4,6 +4,8 @@ import api from '../api/client'; import { StudentTimetable } from '../schemas/studentSchema'; import { timetableArrayResponseSchema } from '../schemas/timetableSchema'; import { transformError } from '../utils/error.ts'; +import { Mixpanel } from '../utils/mixpanel.ts'; +import { SoongptError } from '../schemas/errorSchema.ts'; export const usePostTimetable = () => { return useMutation({ @@ -21,5 +23,8 @@ export const usePostTimetable = () => { return timetableArrayResponseSchema.parse(response); }, + onError: (error: SoongptError) => { + Mixpanel.trackTimetableSelectionError(error); + }, }); }; diff --git a/src/hooks/useTimetables.ts b/src/hooks/useTimetables.ts new file mode 100644 index 0000000..dbbffd9 --- /dev/null +++ b/src/hooks/useTimetables.ts @@ -0,0 +1,46 @@ +import { MutationState, useMutationState } from '@tanstack/react-query'; +import { TimetableArrayResponse } from '../schemas/timetableSchema.ts'; +import { SoongptError } from '../schemas/errorSchema.ts'; +import { use, useMemo } from 'react'; +import { Timetable } from '../schemas/timetableSchema.ts'; + +export const useTimetables = () => { + const timetableMutation = useMutationState>({ + filters: { mutationKey: ['timetables'] }, + }); + + const latestMutation = timetableMutation[timetableMutation.length - 1]; + + const promise = useMemo(() => { + if (!latestMutation) { + return Promise.resolve([]); + } + + const { status, data, error } = latestMutation; + + switch (status) { + case 'success': { + if (!data) { + return Promise.resolve([]); + } + return Promise.resolve(data.result.timetables); + } + case 'error': + return Promise.reject(error); + case 'pending': + return new Promise((resolve) => { + queueMicrotask(() => { + if (!data) { + resolve([]); + return; + } + resolve(data.result.timetables); + }); + }); + default: + return Promise.resolve([]); + } + }, [latestMutation]); + + return use(promise); +}; diff --git a/src/pages/CourseSelectionActivity.tsx b/src/pages/CourseSelectionActivity.tsx index e07ef20..04b2a08 100644 --- a/src/pages/CourseSelectionActivity.tsx +++ b/src/pages/CourseSelectionActivity.tsx @@ -25,7 +25,7 @@ const CourseSelectionActivity: ActivityComponentType
    - }> + }> }> diff --git a/src/pages/DesiredCreditActivity.tsx b/src/pages/DesiredCreditActivity.tsx index a16f904..b4ab986 100644 --- a/src/pages/DesiredCreditActivity.tsx +++ b/src/pages/DesiredCreditActivity.tsx @@ -1,19 +1,11 @@ import { AppScreen } from '@stackflow/plugin-basic-ui'; import { ActivityComponentType } from '@stackflow/react'; -import * as Popover from '@radix-ui/react-popover'; -import { Check, ChevronDown } from 'lucide-react'; -import { AnimatePresence, motion } from 'motion/react'; -import { useState } from 'react'; import AppBar from '../components/AppBar'; -import Hint from '../components/Hint'; -import RollingNumber from '../components/RollingNumber'; -import { usePostTimetable } from '../hooks/usePostTimetable'; -import { StudentMachineContext } from '../machines/studentMachine'; -import { useFlow } from '../stackflow'; -import { Mixpanel } from '../utils/mixpanel'; +import SoongptErrorBoundary from '../components/SoongptErrorBoundary.tsx'; +import DesireCredit from '../components/DesireCredit.tsx'; -type DesiredCreditParams = { +export type DesiredCreditParams = { majorRequired: number; majorElective: number; generalRequired: number; @@ -22,272 +14,21 @@ type DesiredCreditParams = { generalRequiredCourses: string[]; }; -const getAvailableCredits = (currentCredit: number, baseCredit: number = 0): number[] => { - return Array.from({ length: MAX_CREDIT - currentCredit + 1 }, (_, i) => i + baseCredit); -}; - -type Classification = '전공필수' | '전공선택' | '교양필수' | '교양선택'; - -const MAX_CREDIT = 22; - const DesiredCreditActivity: ActivityComponentType = ({ params }) => { - const previousCredit = params.majorRequired + params.majorElective + params.generalRequired; // 과목 선택 페이지에서 선택한 전필 + 전선 + 교필 학점 - const [desiredCredit, setDesiredCredit] = useState(previousCredit); // 희망 학점 - - const [availableMajorElective, setAvailableMajorElective] = useState(() => - getAvailableCredits(previousCredit, params.majorElective), - ); // 수강 가능한 전공선택 학점 - const [availableGeneralElective, setAvailableGeneralElective] = useState(() => - getAvailableCredits(previousCredit), - ); // 수강 가능한 교양선택 학점 - - const [majorElective, setMajorElective] = useState(params.majorElective); // 전공선택 학점 - const [generalElective, setGeneralElective] = useState(0); // 교양선택 학점 - - const [showMajorElectiveDropdown, setShowMajorElectiveDropdown] = useState(false); - const [showGeneralElectiveDropdown, setShowGeneralElectiveDropdown] = useState(false); - - const context = StudentMachineContext.useSelector((state) => state.context); - const postTimetableMutation = usePostTimetable(); - - const { push } = useFlow(); - - const handleCreditSelect = ({ - type, - selectedCredit, - }: { - type: Classification; - selectedCredit: number; - }) => { - if (type === '전공선택') { - const majorElectiveDiff = selectedCredit - majorElective; - - setMajorElective(selectedCredit); - setDesiredCredit((prev) => prev + majorElectiveDiff); - setAvailableGeneralElective( - getAvailableCredits(desiredCredit + majorElectiveDiff - generalElective), - ); - - setShowMajorElectiveDropdown(false); - } else if (type === '교양선택') { - const generalElectiveDiff = selectedCredit - generalElective; - const majorElectiveDiff = majorElective - params.majorElective; - - setGeneralElective(selectedCredit); - setDesiredCredit((prev) => prev + generalElectiveDiff); - setAvailableMajorElective( - getAvailableCredits( - desiredCredit + generalElectiveDiff - majorElectiveDiff, - params.majorElective, - ), - ); - - setShowGeneralElectiveDropdown(false); - } - }; - - const handleNextClick = () => { - // 시간표 추천 API 요청 - postTimetableMutation.mutate({ - schoolId: context.admissionYear, - department: context.department, - grade: context.grade, - isChapel: context.chapel, - majorRequiredCourses: params.majorRequiredCourses, - majorElectiveCourses: params.majorElectiveCourses, - generalRequiredCourses: params.generalRequiredCourses, - majorElectiveCredit: majorElective, - generalElectiveCredit: generalElective, - }); - - // Mixpanel 이벤트 추적 - Mixpanel.trackDesiredCreditClick({ - majorRequiredCourses: params.majorRequiredCourses, - majorElectiveCourses: params.majorElectiveCourses, - generalRequiredCourses: params.generalRequiredCourses, - majorElectiveCredit: majorElective, - generalElectiveCredit: generalElective, - }); - - push('TimetableSelectionActivity', {}); - }; - return (
    -
    -

    - 사용자님의 이번학기
    - 희망 학점은 - 학점이군요! -

    - 희망 학점에 맞추어 선택과목을 추천해드릴게요. -
    -
    - - -
    - -
    - - - - - - - - {showMajorElectiveDropdown && ( - - - {availableMajorElective.map((availableCredit) => ( -
  • - -
  • - ))} -
    -
    - )} -
    -
    -
    - -
    - - -
    - -
    - - - - - - - - - {showGeneralElectiveDropdown && ( - - - {availableGeneralElective.map((availableCredit) => ( -
  • - -
  • - ))} -
    -
    - )} -
    -
    -
    -
    - - - - 이수 가능한 최대 학점은 22학점이에요. - - - - 네 맞아요 - -
    + + +
    ); diff --git a/src/pages/TimetableSelectionActivity.tsx b/src/pages/TimetableSelectionActivity.tsx index 6ddd4ca..fb2c7f8 100644 --- a/src/pages/TimetableSelectionActivity.tsx +++ b/src/pages/TimetableSelectionActivity.tsx @@ -1,174 +1,21 @@ import { AppScreen } from '@stackflow/plugin-basic-ui'; import { ActivityComponentType } from '@stackflow/react'; - -import { MutationState, MutationStatus, useMutationState } from '@tanstack/react-query'; -import { motion } from 'motion/react'; -import { ReactElement, useEffect, useRef, useState } from 'react'; -import Warning from '../assets/warning.svg'; import AppBar from '../components/AppBar'; -import Timetable from '../components/Timetable'; -import { TimetableSkeleton } from '../components/TimetableSkeleton'; -import { SoongptError } from '../schemas/errorSchema.ts'; -import { TimetableArrayResponse } from '../schemas/timetableSchema'; -import { useFlow } from '../stackflow'; -import { Mixpanel } from '../utils/mixpanel.ts'; - -interface TimetableSelection { - title: string; - buttonText: string; - element: () => ReactElement; -} +import TimetableSelection from '../components/TimetableSelection/TimetableSelection.tsx'; +import SoongptErrorBoundary from '../components/SoongptErrorBoundary.tsx'; +import TimetableSelectionFallback from '../components/TimetableSelection/TimetableSelectionFallback.tsx'; +import { Suspense } from 'react'; const TimetableSelectionActivity: ActivityComponentType = () => { - const timetableMutation = useMutationState>({ - filters: { mutationKey: ['timetables'] }, - }); - - const latestMutation = timetableMutation[timetableMutation.length - 1]; - - const [selectedIndex, setSelectedIndex] = useState(0); - - const { push, replace, pop } = useFlow(); - - const timetableRefs = useRef<(HTMLDivElement | null)[]>([]); - - const handleTimetableClick = (index: number) => { - setSelectedIndex(index); - timetableRefs.current[index]?.scrollIntoView({ - behavior: 'smooth', - block: 'center', - }); - }; - - const handleNextClick = () => { - if (latestMutation.status === 'error') { - pop(2); - } - - if (latestMutation.data) { - const selectedTimetable = latestMutation.data.result.timetables[selectedIndex]; - const unSelectedTimetable = latestMutation.data.result.timetables.filter( - (timetable) => timetable.timetableId !== selectedTimetable.timetableId, - ); - - // Mixpanel 이벤트 추적 - Mixpanel.trackTimetableSelectionClick(selectedTimetable, unSelectedTimetable); - - push('TimetableSharingActivity', { - timetableId: selectedTimetable.timetableId, - }); - } - }; - - useEffect(() => { - if (timetableMutation.length === 0) replace('OnboardingActivity', {}, { animate: false }); - }, [timetableMutation, replace]); - - // Mixpanel 이벤트 추적 - useEffect(() => { - if (latestMutation.status === 'error') { - if (latestMutation.error) { - Mixpanel.trackTimetableSelectionError(latestMutation.error); - } - } - }, [latestMutation]); - - const timetableSelection: Record = { - pending: { - title: '가져오는 중이에요!', - buttonText: '이 시간표가 좋아요', - element: () => ( - - - - ), - }, - success: { - title: '가져왔어요!', - buttonText: '이 시간표가 좋아요', - element: () => ( - <> - {latestMutation.data && - latestMutation.data.result.timetables.map((timetable, index) => ( -
    { - { - /* div 요소가 마운트 될 때 실행*/ - } - timetableRefs.current[index] = element; - }} - onClick={() => handleTimetableClick(index)} - > - - - -
    - ))} - - ), - }, - error: { - title: '찾지 못했어요..', - buttonText: '다시 만들기', - element: () => ( -
    - Warning -
    - ), - }, - idle: { - title: '가져오는 중이에요!', - buttonText: '이 시간표가 좋아요', - element: () => <>, - }, - }; - - if (!latestMutation) { - return null; - } - return (
    - -

    - {`사용자님을 위한\n시간표를 ${timetableSelection[latestMutation.status].title}`} -

    -
    - {timetableSelection[latestMutation.status].element()} -
    -
    - -
    -
    + }> + }> + + +
    ); From ad38c38e02a209bab122091983ae3e8fa991d420 Mon Sep 17 00:00:00 2001 From: owl1753 Date: Fri, 14 Feb 2025 15:46:23 +0900 Subject: [PATCH 5/6] =?UTF-8?q?fix:=20preview=EC=97=90=EC=84=9C=20?= =?UTF-8?q?=EB=B9=88=20=EC=8B=9C=EA=B0=84=ED=91=9C=20=EB=B3=B4=EC=9D=B4?= =?UTF-8?q?=EB=8A=94=20=EB=AC=B8=EC=A0=9C=20=ED=95=B4=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/CourseListItem.tsx | 2 +- .../CourseSelectionFallback.tsx | 4 +- .../CourseSelection/CourseSelectionView.tsx | 2 +- src/data/courseSelectionInfo.ts | 6 +-- src/hooks/useTimetables.ts | 50 ++++++++----------- 5 files changed, 27 insertions(+), 37 deletions(-) diff --git a/src/components/CourseListItem.tsx b/src/components/CourseListItem.tsx index b940370..1239233 100644 --- a/src/components/CourseListItem.tsx +++ b/src/components/CourseListItem.tsx @@ -43,7 +43,7 @@ const CourseListItem = ({ onClickCourseItem, course, isSelected }: CourseListIte
    {course.courseName}
    {course.professorName}
    - {course.credit > 0 && ( + {course.courseName.length !== 0 && (
    {course.credit}학점
    diff --git a/src/components/CourseSelection/CourseSelectionFallback.tsx b/src/components/CourseSelection/CourseSelectionFallback.tsx index 1ed2711..ba84870 100644 --- a/src/components/CourseSelection/CourseSelectionFallback.tsx +++ b/src/components/CourseSelection/CourseSelectionFallback.tsx @@ -1,5 +1,5 @@ import CourseSelectionView from './CourseSelectionView.tsx'; -import { emptyCourse } from '../../data/courseSelectionInfo.ts'; +import { emptyCourses } from '../../data/courseSelectionInfo.ts'; import Warning from '../../assets/warning.svg'; type CourseSelectionFallbackType = 'pending' | 'error'; @@ -32,7 +32,7 @@ interface CourseSelectionFallbackProps { const CourseSelectionFallback = ({ type }: CourseSelectionFallbackProps) => { return ( isSameCourse(course, selectedCourse), )} - key={course.courseName} + key={`${course.courseName} ${course.credit}`} course={course} /> ))} diff --git a/src/data/courseSelectionInfo.ts b/src/data/courseSelectionInfo.ts index 4d996f7..09f45e4 100644 --- a/src/data/courseSelectionInfo.ts +++ b/src/data/courseSelectionInfo.ts @@ -56,11 +56,11 @@ export const courseSelectionInfo: Record = { export const gradeSelection: Grade[][] = [[1], [2], [3], [4, 5]]; -export const emptyCourse: Course = { +export const emptyCourses: Course[] = [1, 2, 3].map((credit) => ({ courseName: '', professorName: '', courseTime: [], classification: 'MAJOR_REQUIRED', - credit: 0, + credit: credit, target: [], -}; +})); diff --git a/src/hooks/useTimetables.ts b/src/hooks/useTimetables.ts index dbbffd9..5376caf 100644 --- a/src/hooks/useTimetables.ts +++ b/src/hooks/useTimetables.ts @@ -1,8 +1,6 @@ import { MutationState, useMutationState } from '@tanstack/react-query'; import { TimetableArrayResponse } from '../schemas/timetableSchema.ts'; import { SoongptError } from '../schemas/errorSchema.ts'; -import { use, useMemo } from 'react'; -import { Timetable } from '../schemas/timetableSchema.ts'; export const useTimetables = () => { const timetableMutation = useMutationState>({ @@ -11,36 +9,28 @@ export const useTimetables = () => { const latestMutation = timetableMutation[timetableMutation.length - 1]; - const promise = useMemo(() => { - if (!latestMutation) { - return Promise.resolve([]); - } + if (!latestMutation) { + throw new Error('No timetables mutation found'); + } - const { status, data, error } = latestMutation; + const { status, data, error } = latestMutation; - switch (status) { - case 'success': { - if (!data) { - return Promise.resolve([]); - } - return Promise.resolve(data.result.timetables); + switch (status) { + case 'success': { + if (!data) { + return []; } - case 'error': - return Promise.reject(error); - case 'pending': - return new Promise((resolve) => { - queueMicrotask(() => { - if (!data) { - resolve([]); - return; - } - resolve(data.result.timetables); - }); - }); - default: - return Promise.resolve([]); + return data.result.timetables; } - }, [latestMutation]); - - return use(promise); + case 'error': + throw error; + case 'pending': + throw new Promise((resolve) => { + requestAnimationFrame(() => { + resolve(); + }); + }); + default: + return []; + } }; From cddbe7a891e1177e62126551598400b4ef4b8c94 Mon Sep 17 00:00:00 2001 From: owl1753 Date: Fri, 14 Feb 2025 16:05:00 +0900 Subject: [PATCH 6/6] fix: react downgrade --- package.json | 8 +- pnpm-lock.yaml | 578 +++++++++++++++++++++++++------------------------ 2 files changed, 297 insertions(+), 289 deletions(-) diff --git a/package.json b/package.json index 6f8a2dd..1b85de3 100644 --- a/package.json +++ b/package.json @@ -31,8 +31,8 @@ "lucide-react": "^0.473.0", "mixpanel-browser": "^2.60.0", "motion": "^12.0.6", - "react": "^19.0.0", - "react-dom": "^19.0.0", + "react": "^18.3.0", + "react-dom": "^18.3.0", "react-use-measure": "^2.1.7", "tailwind-merge": "^3.0.1", "tailwindcss": "^4.0.0", @@ -43,8 +43,8 @@ "@eslint/js": "^9.17.0", "@types/lodash": "^4.17.15", "@types/mixpanel-browser": "^2.51.0", - "@types/react": "^19.0.0", - "@types/react-dom": "^19.0.0", + "@types/react": "^18.3.0", + "@types/react-dom": "^18.3.0", "@vitejs/plugin-react": "^4.3.4", "eslint": "^9.17.0", "eslint-config-prettier": "^10.0.1", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 3890947..604496b 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -13,13 +13,13 @@ importers: version: 2.0.0 '@radix-ui/react-popover': specifier: ^1.1.5 - version: 1.1.5(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + version: 1.1.5(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@radix-ui/react-toast': specifier: ^1.2.6 - version: 1.2.6(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + version: 1.2.6(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@sentry/react': specifier: ^9.0.1 - version: 9.0.1(react@19.0.0) + version: 9.0.1(react@18.3.1) '@sentry/vite-plugin': specifier: ^3.1.2 version: 3.1.2 @@ -28,28 +28,28 @@ importers: version: 1.1.1 '@stackflow/plugin-basic-ui': specifier: ^1.11.1 - version: 1.11.1(@stackflow/core@1.1.1)(@stackflow/react@1.4.2(@stackflow/config@1.2.1)(@stackflow/core@1.1.1)(@types/react@19.0.0)(react@19.0.0))(@types/react@19.0.0)(react@19.0.0) + version: 1.11.1(@stackflow/core@1.1.1)(@stackflow/react@1.4.2(@stackflow/config@1.2.1)(@stackflow/core@1.1.1)(@types/react@18.3.18)(react@18.3.1))(@types/react@18.3.18)(react@18.3.1) '@stackflow/plugin-history-sync': specifier: ^1.7.1 - version: 1.7.1(@stackflow/config@1.2.1)(@stackflow/core@1.1.1)(@stackflow/react@1.4.2(@stackflow/config@1.2.1)(@stackflow/core@1.1.1)(@types/react@19.0.0)(react@19.0.0))(@types/react@19.0.0)(react@19.0.0) + version: 1.7.1(@stackflow/config@1.2.1)(@stackflow/core@1.1.1)(@stackflow/react@1.4.2(@stackflow/config@1.2.1)(@stackflow/core@1.1.1)(@types/react@18.3.18)(react@18.3.1))(@types/react@18.3.18)(react@18.3.1) '@stackflow/plugin-renderer-basic': specifier: ^1.1.13 - version: 1.1.13(@stackflow/core@1.1.1)(@stackflow/react@1.4.2(@stackflow/config@1.2.1)(@stackflow/core@1.1.1)(@types/react@19.0.0)(react@19.0.0))(@types/react@19.0.0)(react@19.0.0) + version: 1.1.13(@stackflow/core@1.1.1)(@stackflow/react@1.4.2(@stackflow/config@1.2.1)(@stackflow/core@1.1.1)(@types/react@18.3.18)(react@18.3.1))(@types/react@18.3.18)(react@18.3.1) '@stackflow/react': specifier: ^1.4.2 - version: 1.4.2(@stackflow/config@1.2.1)(@stackflow/core@1.1.1)(@types/react@19.0.0)(react@19.0.0) + version: 1.4.2(@stackflow/config@1.2.1)(@stackflow/core@1.1.1)(@types/react@18.3.18)(react@18.3.1) '@tailwindcss/vite': specifier: ^4.0.0 version: 4.0.0(vite@6.0.11(jiti@2.4.2)(lightningcss@1.29.1)(yaml@2.6.1)) '@tanstack/react-query': specifier: ^5.64.2 - version: 5.64.2(react@19.0.0) + version: 5.64.2(react@18.3.1) '@xstate/react': specifier: ^5.0.2 - version: 5.0.2(@types/react@19.0.0)(react@19.0.0)(xstate@5.19.2) + version: 5.0.2(@types/react@18.3.18)(react@18.3.1)(xstate@5.19.2) embla-carousel-react: specifier: ^8.5.2 - version: 8.5.2(react@19.0.0) + version: 8.5.2(react@18.3.1) html2canvas: specifier: ^1.4.1 version: 1.4.1 @@ -61,22 +61,22 @@ importers: version: 4.17.21 lucide-react: specifier: ^0.473.0 - version: 0.473.0(react@19.0.0) + version: 0.473.0(react@18.3.1) mixpanel-browser: specifier: ^2.60.0 version: 2.60.0 motion: specifier: ^12.0.6 - version: 12.0.6(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + version: 12.0.6(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: - specifier: ^19.0.0 - version: 19.0.0 + specifier: ^18.3.0 + version: 18.3.1 react-dom: - specifier: ^19.0.0 - version: 19.0.0(react@19.0.0) + specifier: ^18.3.0 + version: 18.3.1(react@18.3.1) react-use-measure: specifier: ^2.1.7 - version: 2.1.7(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + version: 2.1.7(react-dom@18.3.1(react@18.3.1))(react@18.3.1) tailwind-merge: specifier: ^3.0.1 version: 3.0.1 @@ -100,11 +100,11 @@ importers: specifier: ^2.51.0 version: 2.51.0 '@types/react': - specifier: ^19.0.0 - version: 19.0.0 + specifier: ^18.3.0 + version: 18.3.18 '@types/react-dom': - specifier: ^19.0.0 - version: 19.0.0 + specifier: ^18.3.0 + version: 18.3.5(@types/react@18.3.18) '@vitejs/plugin-react': specifier: ^4.3.4 version: 4.3.4(vite@6.0.11(jiti@2.4.2)(lightningcss@1.29.1)(yaml@2.6.1)) @@ -1134,15 +1134,14 @@ packages: '@types/prop-types@15.7.14': resolution: {integrity: sha512-gNMvNH49DJ7OJYv+KAKn0Xp45p8PLl6zo2YnvDIbTd4J6MER2BmWN49TG7n9LvkyihINxeKW8+3bfS2yDC9dzQ==} - '@types/react-dom@19.0.0': - resolution: {integrity: sha512-1KfiQKsH1o00p9m5ag12axHQSb3FOU9H20UTrujVSkNhuCrRHiQWFqgEnTNK5ZNfnzZv8UWrnXVqCmCF9fgY3w==} + '@types/react-dom@18.3.5': + resolution: {integrity: sha512-P4t6saawp+b/dFrUr2cvkVsfvPguwsxtH6dNIYRllMsefqFzkZk5UIjzyDOv5g1dXIPdG4Sp1yCR4Z6RCUsG/Q==} + peerDependencies: + '@types/react': ^18.0.0 '@types/react@18.3.18': resolution: {integrity: sha512-t4yC+vtgnkYjNSKlFx1jkAhH8LgTo2N/7Qvi83kdEaUtMDiwpbLAktKDaAMlRcJ5eSxZkH74eEGt1ky31d7kfQ==} - '@types/react@19.0.0': - resolution: {integrity: sha512-MY3oPudxvMYyesqs/kW1Bh8y9VqSmf+tzqw3ae8a9DZW68pUe3zAdHeI1jc6iAysuRdACnVknHP8AhwD4/dxtg==} - '@typescript-eslint/eslint-plugin@8.21.0': resolution: {integrity: sha512-eTH+UOR4I7WbdQnG4Z48ebIA6Bgi7WO8HvFEneeYBxG8qCOYgTOFPSg6ek9ITIDvGjDQzWHcoWHCDO2biByNzA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -1811,6 +1810,10 @@ packages: resolution: {integrity: sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w==} engines: {node: '>=18'} + loose-envify@1.4.0: + resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} + hasBin: true + lru-cache@10.4.3: resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} @@ -2061,10 +2064,10 @@ packages: queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} - react-dom@19.0.0: - resolution: {integrity: sha512-4GV5sHFG0e/0AD4X+ySy6UJd3jVl1iNsNHdpad0qhABJ11twS3TTBnseqsKurKcsNqCEFeGL3uLpVChpIO3QfQ==} + react-dom@18.3.1: + resolution: {integrity: sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==} peerDependencies: - react: ^19.0.0 + react: ^18.3.1 react-fast-compare@3.2.2: resolution: {integrity: sha512-nsO+KSNgo1SbJqJEYRE9ERzo7YtYbou/OqjSQKxV7jcKox7+usiUVZOAC+XnDOABXggQTno0Y1CpVnuWEc1boQ==} @@ -2115,8 +2118,8 @@ packages: react-dom: optional: true - react@19.0.0: - resolution: {integrity: sha512-V8AVnmPIICiWpGfm6GLzCR/W5FXLchHop40W4nXBmdlEceh16rCN8O8LNWm5bh5XUX91fh7KpA+W0TgMKmgTpQ==} + react@18.3.1: + resolution: {integrity: sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==} engines: {node: '>=0.10.0'} readdirp@3.6.0: @@ -2158,8 +2161,8 @@ packages: run-parallel@1.2.0: resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} - scheduler@0.25.0: - resolution: {integrity: sha512-xFVuu11jh+xcO7JOAGJNOXld8/TcEHK/4CituBUeUb5hqxJLj9YuemAEuvm9gQ/+pgXYfbQuqAkiYu+u7YEsNA==} + scheduler@0.23.2: + resolution: {integrity: sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==} semver@6.3.1: resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} @@ -2651,11 +2654,11 @@ snapshots: '@floating-ui/core': 1.6.9 '@floating-ui/utils': 0.2.9 - '@floating-ui/react-dom@2.1.2(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + '@floating-ui/react-dom@2.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@floating-ui/dom': 1.6.13 - react: 19.0.0 - react-dom: 19.0.0(react@19.0.0) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) '@floating-ui/utils@0.2.9': {} @@ -2703,260 +2706,260 @@ snapshots: '@radix-ui/primitive@1.1.1': {} - '@radix-ui/react-arrow@1.1.1(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + '@radix-ui/react-arrow@1.1.1(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@radix-ui/react-primitive': 2.0.1(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - react: 19.0.0 - react-dom: 19.0.0(react@19.0.0) + '@radix-ui/react-primitive': 2.0.1(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) optionalDependencies: - '@types/react': 19.0.0 - '@types/react-dom': 19.0.0 + '@types/react': 18.3.18 + '@types/react-dom': 18.3.5(@types/react@18.3.18) - '@radix-ui/react-collection@1.1.2(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + '@radix-ui/react-collection@1.1.2(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@radix-ui/react-compose-refs': 1.1.1(@types/react@19.0.0)(react@19.0.0) - '@radix-ui/react-context': 1.1.1(@types/react@19.0.0)(react@19.0.0) - '@radix-ui/react-primitive': 2.0.2(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@radix-ui/react-slot': 1.1.2(@types/react@19.0.0)(react@19.0.0) - react: 19.0.0 - react-dom: 19.0.0(react@19.0.0) + '@radix-ui/react-compose-refs': 1.1.1(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-context': 1.1.1(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-primitive': 2.0.2(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-slot': 1.1.2(@types/react@18.3.18)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) optionalDependencies: - '@types/react': 19.0.0 - '@types/react-dom': 19.0.0 + '@types/react': 18.3.18 + '@types/react-dom': 18.3.5(@types/react@18.3.18) - '@radix-ui/react-compose-refs@1.1.1(@types/react@19.0.0)(react@19.0.0)': + '@radix-ui/react-compose-refs@1.1.1(@types/react@18.3.18)(react@18.3.1)': dependencies: - react: 19.0.0 + react: 18.3.1 optionalDependencies: - '@types/react': 19.0.0 + '@types/react': 18.3.18 - '@radix-ui/react-context@1.1.1(@types/react@19.0.0)(react@19.0.0)': + '@radix-ui/react-context@1.1.1(@types/react@18.3.18)(react@18.3.1)': dependencies: - react: 19.0.0 + react: 18.3.1 optionalDependencies: - '@types/react': 19.0.0 + '@types/react': 18.3.18 - '@radix-ui/react-dismissable-layer@1.1.4(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + '@radix-ui/react-dismissable-layer@1.1.4(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@radix-ui/primitive': 1.1.1 - '@radix-ui/react-compose-refs': 1.1.1(@types/react@19.0.0)(react@19.0.0) - '@radix-ui/react-primitive': 2.0.1(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@19.0.0)(react@19.0.0) - '@radix-ui/react-use-escape-keydown': 1.1.0(@types/react@19.0.0)(react@19.0.0) - react: 19.0.0 - react-dom: 19.0.0(react@19.0.0) + '@radix-ui/react-compose-refs': 1.1.1(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-primitive': 2.0.1(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-use-escape-keydown': 1.1.0(@types/react@18.3.18)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) optionalDependencies: - '@types/react': 19.0.0 - '@types/react-dom': 19.0.0 + '@types/react': 18.3.18 + '@types/react-dom': 18.3.5(@types/react@18.3.18) - '@radix-ui/react-dismissable-layer@1.1.5(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + '@radix-ui/react-dismissable-layer@1.1.5(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@radix-ui/primitive': 1.1.1 - '@radix-ui/react-compose-refs': 1.1.1(@types/react@19.0.0)(react@19.0.0) - '@radix-ui/react-primitive': 2.0.2(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@19.0.0)(react@19.0.0) - '@radix-ui/react-use-escape-keydown': 1.1.0(@types/react@19.0.0)(react@19.0.0) - react: 19.0.0 - react-dom: 19.0.0(react@19.0.0) + '@radix-ui/react-compose-refs': 1.1.1(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-primitive': 2.0.2(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-use-escape-keydown': 1.1.0(@types/react@18.3.18)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) optionalDependencies: - '@types/react': 19.0.0 - '@types/react-dom': 19.0.0 + '@types/react': 18.3.18 + '@types/react-dom': 18.3.5(@types/react@18.3.18) - '@radix-ui/react-focus-guards@1.1.1(@types/react@19.0.0)(react@19.0.0)': + '@radix-ui/react-focus-guards@1.1.1(@types/react@18.3.18)(react@18.3.1)': dependencies: - react: 19.0.0 + react: 18.3.1 optionalDependencies: - '@types/react': 19.0.0 + '@types/react': 18.3.18 - '@radix-ui/react-focus-scope@1.1.1(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + '@radix-ui/react-focus-scope@1.1.1(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@radix-ui/react-compose-refs': 1.1.1(@types/react@19.0.0)(react@19.0.0) - '@radix-ui/react-primitive': 2.0.1(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@19.0.0)(react@19.0.0) - react: 19.0.0 - react-dom: 19.0.0(react@19.0.0) + '@radix-ui/react-compose-refs': 1.1.1(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-primitive': 2.0.1(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.18)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) optionalDependencies: - '@types/react': 19.0.0 - '@types/react-dom': 19.0.0 + '@types/react': 18.3.18 + '@types/react-dom': 18.3.5(@types/react@18.3.18) - '@radix-ui/react-id@1.1.0(@types/react@19.0.0)(react@19.0.0)': + '@radix-ui/react-id@1.1.0(@types/react@18.3.18)(react@18.3.1)': dependencies: - '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@19.0.0)(react@19.0.0) - react: 19.0.0 + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.18)(react@18.3.1) + react: 18.3.1 optionalDependencies: - '@types/react': 19.0.0 + '@types/react': 18.3.18 - '@radix-ui/react-popover@1.1.5(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + '@radix-ui/react-popover@1.1.5(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@radix-ui/primitive': 1.1.1 - '@radix-ui/react-compose-refs': 1.1.1(@types/react@19.0.0)(react@19.0.0) - '@radix-ui/react-context': 1.1.1(@types/react@19.0.0)(react@19.0.0) - '@radix-ui/react-dismissable-layer': 1.1.4(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@radix-ui/react-focus-guards': 1.1.1(@types/react@19.0.0)(react@19.0.0) - '@radix-ui/react-focus-scope': 1.1.1(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@radix-ui/react-id': 1.1.0(@types/react@19.0.0)(react@19.0.0) - '@radix-ui/react-popper': 1.2.1(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@radix-ui/react-portal': 1.1.3(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@radix-ui/react-presence': 1.1.2(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@radix-ui/react-primitive': 2.0.1(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@radix-ui/react-slot': 1.1.1(@types/react@19.0.0)(react@19.0.0) - '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@19.0.0)(react@19.0.0) + '@radix-ui/react-compose-refs': 1.1.1(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-context': 1.1.1(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-dismissable-layer': 1.1.4(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-focus-guards': 1.1.1(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-focus-scope': 1.1.1(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-id': 1.1.0(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-popper': 1.2.1(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-portal': 1.1.3(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-presence': 1.1.2(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.0.1(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-slot': 1.1.1(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.18)(react@18.3.1) aria-hidden: 1.2.4 - react: 19.0.0 - react-dom: 19.0.0(react@19.0.0) - react-remove-scroll: 2.6.3(@types/react@19.0.0)(react@19.0.0) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + react-remove-scroll: 2.6.3(@types/react@18.3.18)(react@18.3.1) optionalDependencies: - '@types/react': 19.0.0 - '@types/react-dom': 19.0.0 - - '@radix-ui/react-popper@1.2.1(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': - dependencies: - '@floating-ui/react-dom': 2.1.2(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@radix-ui/react-arrow': 1.1.1(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@radix-ui/react-compose-refs': 1.1.1(@types/react@19.0.0)(react@19.0.0) - '@radix-ui/react-context': 1.1.1(@types/react@19.0.0)(react@19.0.0) - '@radix-ui/react-primitive': 2.0.1(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@19.0.0)(react@19.0.0) - '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@19.0.0)(react@19.0.0) - '@radix-ui/react-use-rect': 1.1.0(@types/react@19.0.0)(react@19.0.0) - '@radix-ui/react-use-size': 1.1.0(@types/react@19.0.0)(react@19.0.0) + '@types/react': 18.3.18 + '@types/react-dom': 18.3.5(@types/react@18.3.18) + + '@radix-ui/react-popper@1.2.1(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@floating-ui/react-dom': 2.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-arrow': 1.1.1(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-compose-refs': 1.1.1(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-context': 1.1.1(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-primitive': 2.0.1(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-use-rect': 1.1.0(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-use-size': 1.1.0(@types/react@18.3.18)(react@18.3.1) '@radix-ui/rect': 1.1.0 - react: 19.0.0 - react-dom: 19.0.0(react@19.0.0) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) optionalDependencies: - '@types/react': 19.0.0 - '@types/react-dom': 19.0.0 + '@types/react': 18.3.18 + '@types/react-dom': 18.3.5(@types/react@18.3.18) - '@radix-ui/react-portal@1.1.3(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + '@radix-ui/react-portal@1.1.3(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@radix-ui/react-primitive': 2.0.1(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@19.0.0)(react@19.0.0) - react: 19.0.0 - react-dom: 19.0.0(react@19.0.0) + '@radix-ui/react-primitive': 2.0.1(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.18)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) optionalDependencies: - '@types/react': 19.0.0 - '@types/react-dom': 19.0.0 + '@types/react': 18.3.18 + '@types/react-dom': 18.3.5(@types/react@18.3.18) - '@radix-ui/react-portal@1.1.4(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + '@radix-ui/react-portal@1.1.4(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@radix-ui/react-primitive': 2.0.2(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@19.0.0)(react@19.0.0) - react: 19.0.0 - react-dom: 19.0.0(react@19.0.0) + '@radix-ui/react-primitive': 2.0.2(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.18)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) optionalDependencies: - '@types/react': 19.0.0 - '@types/react-dom': 19.0.0 + '@types/react': 18.3.18 + '@types/react-dom': 18.3.5(@types/react@18.3.18) - '@radix-ui/react-presence@1.1.2(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + '@radix-ui/react-presence@1.1.2(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@radix-ui/react-compose-refs': 1.1.1(@types/react@19.0.0)(react@19.0.0) - '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@19.0.0)(react@19.0.0) - react: 19.0.0 - react-dom: 19.0.0(react@19.0.0) + '@radix-ui/react-compose-refs': 1.1.1(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.18)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) optionalDependencies: - '@types/react': 19.0.0 - '@types/react-dom': 19.0.0 + '@types/react': 18.3.18 + '@types/react-dom': 18.3.5(@types/react@18.3.18) - '@radix-ui/react-primitive@2.0.1(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + '@radix-ui/react-primitive@2.0.1(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@radix-ui/react-slot': 1.1.1(@types/react@19.0.0)(react@19.0.0) - react: 19.0.0 - react-dom: 19.0.0(react@19.0.0) + '@radix-ui/react-slot': 1.1.1(@types/react@18.3.18)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) optionalDependencies: - '@types/react': 19.0.0 - '@types/react-dom': 19.0.0 + '@types/react': 18.3.18 + '@types/react-dom': 18.3.5(@types/react@18.3.18) - '@radix-ui/react-primitive@2.0.2(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + '@radix-ui/react-primitive@2.0.2(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@radix-ui/react-slot': 1.1.2(@types/react@19.0.0)(react@19.0.0) - react: 19.0.0 - react-dom: 19.0.0(react@19.0.0) + '@radix-ui/react-slot': 1.1.2(@types/react@18.3.18)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) optionalDependencies: - '@types/react': 19.0.0 - '@types/react-dom': 19.0.0 + '@types/react': 18.3.18 + '@types/react-dom': 18.3.5(@types/react@18.3.18) - '@radix-ui/react-slot@1.1.1(@types/react@19.0.0)(react@19.0.0)': + '@radix-ui/react-slot@1.1.1(@types/react@18.3.18)(react@18.3.1)': dependencies: - '@radix-ui/react-compose-refs': 1.1.1(@types/react@19.0.0)(react@19.0.0) - react: 19.0.0 + '@radix-ui/react-compose-refs': 1.1.1(@types/react@18.3.18)(react@18.3.1) + react: 18.3.1 optionalDependencies: - '@types/react': 19.0.0 + '@types/react': 18.3.18 - '@radix-ui/react-slot@1.1.2(@types/react@19.0.0)(react@19.0.0)': + '@radix-ui/react-slot@1.1.2(@types/react@18.3.18)(react@18.3.1)': dependencies: - '@radix-ui/react-compose-refs': 1.1.1(@types/react@19.0.0)(react@19.0.0) - react: 19.0.0 + '@radix-ui/react-compose-refs': 1.1.1(@types/react@18.3.18)(react@18.3.1) + react: 18.3.1 optionalDependencies: - '@types/react': 19.0.0 + '@types/react': 18.3.18 - '@radix-ui/react-toast@1.2.6(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + '@radix-ui/react-toast@1.2.6(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@radix-ui/primitive': 1.1.1 - '@radix-ui/react-collection': 1.1.2(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@radix-ui/react-compose-refs': 1.1.1(@types/react@19.0.0)(react@19.0.0) - '@radix-ui/react-context': 1.1.1(@types/react@19.0.0)(react@19.0.0) - '@radix-ui/react-dismissable-layer': 1.1.5(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@radix-ui/react-portal': 1.1.4(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@radix-ui/react-presence': 1.1.2(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@radix-ui/react-primitive': 2.0.2(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@19.0.0)(react@19.0.0) - '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@19.0.0)(react@19.0.0) - '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@19.0.0)(react@19.0.0) - '@radix-ui/react-visually-hidden': 1.1.2(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - react: 19.0.0 - react-dom: 19.0.0(react@19.0.0) + '@radix-ui/react-collection': 1.1.2(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-compose-refs': 1.1.1(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-context': 1.1.1(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-dismissable-layer': 1.1.5(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-portal': 1.1.4(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-presence': 1.1.2(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.0.2(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-visually-hidden': 1.1.2(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) optionalDependencies: - '@types/react': 19.0.0 - '@types/react-dom': 19.0.0 + '@types/react': 18.3.18 + '@types/react-dom': 18.3.5(@types/react@18.3.18) - '@radix-ui/react-use-callback-ref@1.1.0(@types/react@19.0.0)(react@19.0.0)': + '@radix-ui/react-use-callback-ref@1.1.0(@types/react@18.3.18)(react@18.3.1)': dependencies: - react: 19.0.0 + react: 18.3.1 optionalDependencies: - '@types/react': 19.0.0 + '@types/react': 18.3.18 - '@radix-ui/react-use-controllable-state@1.1.0(@types/react@19.0.0)(react@19.0.0)': + '@radix-ui/react-use-controllable-state@1.1.0(@types/react@18.3.18)(react@18.3.1)': dependencies: - '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@19.0.0)(react@19.0.0) - react: 19.0.0 + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.18)(react@18.3.1) + react: 18.3.1 optionalDependencies: - '@types/react': 19.0.0 + '@types/react': 18.3.18 - '@radix-ui/react-use-escape-keydown@1.1.0(@types/react@19.0.0)(react@19.0.0)': + '@radix-ui/react-use-escape-keydown@1.1.0(@types/react@18.3.18)(react@18.3.1)': dependencies: - '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@19.0.0)(react@19.0.0) - react: 19.0.0 + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.18)(react@18.3.1) + react: 18.3.1 optionalDependencies: - '@types/react': 19.0.0 + '@types/react': 18.3.18 - '@radix-ui/react-use-layout-effect@1.1.0(@types/react@19.0.0)(react@19.0.0)': + '@radix-ui/react-use-layout-effect@1.1.0(@types/react@18.3.18)(react@18.3.1)': dependencies: - react: 19.0.0 + react: 18.3.1 optionalDependencies: - '@types/react': 19.0.0 + '@types/react': 18.3.18 - '@radix-ui/react-use-rect@1.1.0(@types/react@19.0.0)(react@19.0.0)': + '@radix-ui/react-use-rect@1.1.0(@types/react@18.3.18)(react@18.3.1)': dependencies: '@radix-ui/rect': 1.1.0 - react: 19.0.0 + react: 18.3.1 optionalDependencies: - '@types/react': 19.0.0 + '@types/react': 18.3.18 - '@radix-ui/react-use-size@1.1.0(@types/react@19.0.0)(react@19.0.0)': + '@radix-ui/react-use-size@1.1.0(@types/react@18.3.18)(react@18.3.1)': dependencies: - '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@19.0.0)(react@19.0.0) - react: 19.0.0 + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.18)(react@18.3.1) + react: 18.3.1 optionalDependencies: - '@types/react': 19.0.0 + '@types/react': 18.3.18 - '@radix-ui/react-visually-hidden@1.1.2(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + '@radix-ui/react-visually-hidden@1.1.2(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@radix-ui/react-primitive': 2.0.2(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - react: 19.0.0 - react-dom: 19.0.0(react@19.0.0) + '@radix-ui/react-primitive': 2.0.2(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) optionalDependencies: - '@types/react': 19.0.0 - '@types/react-dom': 19.0.0 + '@types/react': 18.3.18 + '@types/react-dom': 18.3.5(@types/react@18.3.18) '@radix-ui/rect@1.1.0': {} @@ -3103,12 +3106,12 @@ snapshots: '@sentry/core@9.0.1': {} - '@sentry/react@9.0.1(react@19.0.0)': + '@sentry/react@9.0.1(react@18.3.1)': dependencies: '@sentry/browser': 9.0.1 '@sentry/core': 9.0.1 hoist-non-react-statics: 3.3.2 - react: 19.0.0 + react: 18.3.1 '@sentry/vite-plugin@3.1.2': dependencies: @@ -3124,52 +3127,52 @@ snapshots: dependencies: react-fast-compare: 3.2.2 - '@stackflow/plugin-basic-ui@1.11.1(@stackflow/core@1.1.1)(@stackflow/react@1.4.2(@stackflow/config@1.2.1)(@stackflow/core@1.1.1)(@types/react@19.0.0)(react@19.0.0))(@types/react@19.0.0)(react@19.0.0)': + '@stackflow/plugin-basic-ui@1.11.1(@stackflow/core@1.1.1)(@stackflow/react@1.4.2(@stackflow/config@1.2.1)(@stackflow/core@1.1.1)(@types/react@18.3.18)(react@18.3.1))(@types/react@18.3.18)(react@18.3.1)': dependencies: '@stackflow/core': 1.1.1 - '@stackflow/react': 1.4.2(@stackflow/config@1.2.1)(@stackflow/core@1.1.1)(@types/react@19.0.0)(react@19.0.0) - '@stackflow/react-ui-core': 1.2.1(@stackflow/core@1.1.1)(@stackflow/react@1.4.2(@stackflow/config@1.2.1)(@stackflow/core@1.1.1)(@types/react@19.0.0)(react@19.0.0))(@types/react@19.0.0)(react@19.0.0) - '@types/react': 19.0.0 + '@stackflow/react': 1.4.2(@stackflow/config@1.2.1)(@stackflow/core@1.1.1)(@types/react@18.3.18)(react@18.3.1) + '@stackflow/react-ui-core': 1.2.1(@stackflow/core@1.1.1)(@stackflow/react@1.4.2(@stackflow/config@1.2.1)(@stackflow/core@1.1.1)(@types/react@18.3.18)(react@18.3.1))(@types/react@18.3.18)(react@18.3.1) + '@types/react': 18.3.18 '@vanilla-extract/css': 1.17.0 '@vanilla-extract/dynamic': 2.1.2 '@vanilla-extract/private': 1.0.6 '@vanilla-extract/recipes': 0.5.5(@vanilla-extract/css@1.17.0) - react: 19.0.0 + react: 18.3.1 transitivePeerDependencies: - babel-plugin-macros - '@stackflow/plugin-history-sync@1.7.1(@stackflow/config@1.2.1)(@stackflow/core@1.1.1)(@stackflow/react@1.4.2(@stackflow/config@1.2.1)(@stackflow/core@1.1.1)(@types/react@19.0.0)(react@19.0.0))(@types/react@19.0.0)(react@19.0.0)': + '@stackflow/plugin-history-sync@1.7.1(@stackflow/config@1.2.1)(@stackflow/core@1.1.1)(@stackflow/react@1.4.2(@stackflow/config@1.2.1)(@stackflow/core@1.1.1)(@types/react@18.3.18)(react@18.3.1))(@types/react@18.3.18)(react@18.3.1)': dependencies: '@stackflow/config': 1.2.1 '@stackflow/core': 1.1.1 - '@stackflow/react': 1.4.2(@stackflow/config@1.2.1)(@stackflow/core@1.1.1)(@types/react@19.0.0)(react@19.0.0) - '@types/react': 19.0.0 + '@stackflow/react': 1.4.2(@stackflow/config@1.2.1)(@stackflow/core@1.1.1)(@types/react@18.3.18)(react@18.3.1) + '@types/react': 18.3.18 flatted: 3.3.2 history: 5.3.0 - react: 19.0.0 + react: 18.3.1 url-pattern: 1.0.3 - '@stackflow/plugin-renderer-basic@1.1.13(@stackflow/core@1.1.1)(@stackflow/react@1.4.2(@stackflow/config@1.2.1)(@stackflow/core@1.1.1)(@types/react@19.0.0)(react@19.0.0))(@types/react@19.0.0)(react@19.0.0)': + '@stackflow/plugin-renderer-basic@1.1.13(@stackflow/core@1.1.1)(@stackflow/react@1.4.2(@stackflow/config@1.2.1)(@stackflow/core@1.1.1)(@types/react@18.3.18)(react@18.3.1))(@types/react@18.3.18)(react@18.3.1)': dependencies: '@stackflow/core': 1.1.1 - '@stackflow/react': 1.4.2(@stackflow/config@1.2.1)(@stackflow/core@1.1.1)(@types/react@19.0.0)(react@19.0.0) - '@types/react': 19.0.0 - react: 19.0.0 + '@stackflow/react': 1.4.2(@stackflow/config@1.2.1)(@stackflow/core@1.1.1)(@types/react@18.3.18)(react@18.3.1) + '@types/react': 18.3.18 + react: 18.3.1 - '@stackflow/react-ui-core@1.2.1(@stackflow/core@1.1.1)(@stackflow/react@1.4.2(@stackflow/config@1.2.1)(@stackflow/core@1.1.1)(@types/react@19.0.0)(react@19.0.0))(@types/react@19.0.0)(react@19.0.0)': + '@stackflow/react-ui-core@1.2.1(@stackflow/core@1.1.1)(@stackflow/react@1.4.2(@stackflow/config@1.2.1)(@stackflow/core@1.1.1)(@types/react@18.3.18)(react@18.3.1))(@types/react@18.3.18)(react@18.3.1)': dependencies: '@stackflow/core': 1.1.1 - '@stackflow/react': 1.4.2(@stackflow/config@1.2.1)(@stackflow/core@1.1.1)(@types/react@19.0.0)(react@19.0.0) - '@types/react': 19.0.0 - react: 19.0.0 + '@stackflow/react': 1.4.2(@stackflow/config@1.2.1)(@stackflow/core@1.1.1)(@types/react@18.3.18)(react@18.3.1) + '@types/react': 18.3.18 + react: 18.3.1 - '@stackflow/react@1.4.2(@stackflow/config@1.2.1)(@stackflow/core@1.1.1)(@types/react@19.0.0)(react@19.0.0)': + '@stackflow/react@1.4.2(@stackflow/config@1.2.1)(@stackflow/core@1.1.1)(@types/react@18.3.18)(react@18.3.1)': dependencies: '@stackflow/config': 1.2.1 '@stackflow/core': 1.1.1 - '@types/react': 19.0.0 + '@types/react': 18.3.18 history: 5.3.0 - react: 19.0.0 + react: 18.3.1 react-fast-compare: 3.2.2 url-pattern: 1.0.3 @@ -3236,10 +3239,10 @@ snapshots: '@tanstack/query-core@5.64.2': {} - '@tanstack/react-query@5.64.2(react@19.0.0)': + '@tanstack/react-query@5.64.2(react@18.3.1)': dependencies: '@tanstack/query-core': 5.64.2 - react: 19.0.0 + react: 18.3.1 '@types/babel__core@7.20.5': dependencies: @@ -3274,7 +3277,7 @@ snapshots: '@types/prop-types@15.7.14': {} - '@types/react-dom@19.0.0': + '@types/react-dom@18.3.5(@types/react@18.3.18)': dependencies: '@types/react': 18.3.18 @@ -3283,10 +3286,6 @@ snapshots: '@types/prop-types': 15.7.14 csstype: 3.1.3 - '@types/react@19.0.0': - dependencies: - csstype: 3.1.3 - '@typescript-eslint/eslint-plugin@8.21.0(@typescript-eslint/parser@8.21.0(eslint@9.18.0(jiti@2.4.2))(typescript@5.6.3))(eslint@9.18.0(jiti@2.4.2))(typescript@5.6.3)': dependencies: '@eslint-community/regexpp': 4.12.1 @@ -3404,11 +3403,11 @@ snapshots: '@xstate/fsm@1.6.5': {} - '@xstate/react@5.0.2(@types/react@19.0.0)(react@19.0.0)(xstate@5.19.2)': + '@xstate/react@5.0.2(@types/react@18.3.18)(react@18.3.1)(xstate@5.19.2)': dependencies: - react: 19.0.0 - use-isomorphic-layout-effect: 1.2.0(@types/react@19.0.0)(react@19.0.0) - use-sync-external-store: 1.4.0(react@19.0.0) + react: 18.3.1 + use-isomorphic-layout-effect: 1.2.0(@types/react@18.3.18)(react@18.3.1) + use-sync-external-store: 1.4.0(react@18.3.1) optionalDependencies: xstate: 5.19.2 transitivePeerDependencies: @@ -3564,11 +3563,11 @@ snapshots: electron-to-chromium@1.5.86: {} - embla-carousel-react@8.5.2(react@19.0.0): + embla-carousel-react@8.5.2(react@18.3.1): dependencies: embla-carousel: 8.5.2 embla-carousel-reactive-utils: 8.5.2(embla-carousel@8.5.2) - react: 19.0.0 + react: 18.3.1 embla-carousel-reactive-utils@8.5.2(embla-carousel@8.5.2): dependencies: @@ -3751,14 +3750,14 @@ snapshots: flatted@3.3.2: {} - framer-motion@12.0.6(react-dom@19.0.0(react@19.0.0))(react@19.0.0): + framer-motion@12.0.6(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: motion-dom: 12.0.0 motion-utils: 12.0.0 tslib: 2.8.1 optionalDependencies: - react: 19.0.0 - react-dom: 19.0.0(react@19.0.0) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) fs.realpath@1.0.0: {} @@ -3971,15 +3970,19 @@ snapshots: strip-ansi: 7.1.0 wrap-ansi: 9.0.0 + loose-envify@1.4.0: + dependencies: + js-tokens: 4.0.0 + lru-cache@10.4.3: {} lru-cache@5.1.1: dependencies: yallist: 3.1.1 - lucide-react@0.473.0(react@19.0.0): + lucide-react@0.473.0(react@18.3.1): dependencies: - react: 19.0.0 + react: 18.3.1 magic-string@0.30.8: dependencies: @@ -4032,13 +4035,13 @@ snapshots: motion-utils@12.0.0: {} - motion@12.0.6(react-dom@19.0.0(react@19.0.0))(react@19.0.0): + motion@12.0.6(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: - framer-motion: 12.0.6(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + framer-motion: 12.0.6(react-dom@18.3.1(react@18.3.1))(react@18.3.1) tslib: 2.8.1 optionalDependencies: - react: 19.0.0 - react-dom: 19.0.0(react@19.0.0) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) ms@2.1.3: {} @@ -4126,10 +4129,11 @@ snapshots: queue-microtask@1.2.3: {} - react-dom@19.0.0(react@19.0.0): + react-dom@18.3.1(react@18.3.1): dependencies: - react: 19.0.0 - scheduler: 0.25.0 + loose-envify: 1.4.0 + react: 18.3.1 + scheduler: 0.23.2 react-fast-compare@3.2.2: {} @@ -4137,40 +4141,42 @@ snapshots: react-refresh@0.14.2: {} - react-remove-scroll-bar@2.3.8(@types/react@19.0.0)(react@19.0.0): + react-remove-scroll-bar@2.3.8(@types/react@18.3.18)(react@18.3.1): dependencies: - react: 19.0.0 - react-style-singleton: 2.2.3(@types/react@19.0.0)(react@19.0.0) + react: 18.3.1 + react-style-singleton: 2.2.3(@types/react@18.3.18)(react@18.3.1) tslib: 2.8.1 optionalDependencies: - '@types/react': 19.0.0 + '@types/react': 18.3.18 - react-remove-scroll@2.6.3(@types/react@19.0.0)(react@19.0.0): + react-remove-scroll@2.6.3(@types/react@18.3.18)(react@18.3.1): dependencies: - react: 19.0.0 - react-remove-scroll-bar: 2.3.8(@types/react@19.0.0)(react@19.0.0) - react-style-singleton: 2.2.3(@types/react@19.0.0)(react@19.0.0) + react: 18.3.1 + react-remove-scroll-bar: 2.3.8(@types/react@18.3.18)(react@18.3.1) + react-style-singleton: 2.2.3(@types/react@18.3.18)(react@18.3.1) tslib: 2.8.1 - use-callback-ref: 1.3.3(@types/react@19.0.0)(react@19.0.0) - use-sidecar: 1.1.3(@types/react@19.0.0)(react@19.0.0) + use-callback-ref: 1.3.3(@types/react@18.3.18)(react@18.3.1) + use-sidecar: 1.1.3(@types/react@18.3.18)(react@18.3.1) optionalDependencies: - '@types/react': 19.0.0 + '@types/react': 18.3.18 - react-style-singleton@2.2.3(@types/react@19.0.0)(react@19.0.0): + react-style-singleton@2.2.3(@types/react@18.3.18)(react@18.3.1): dependencies: get-nonce: 1.0.1 - react: 19.0.0 + react: 18.3.1 tslib: 2.8.1 optionalDependencies: - '@types/react': 19.0.0 + '@types/react': 18.3.18 - react-use-measure@2.1.7(react-dom@19.0.0(react@19.0.0))(react@19.0.0): + react-use-measure@2.1.7(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: - react: 19.0.0 + react: 18.3.1 optionalDependencies: - react-dom: 19.0.0(react@19.0.0) + react-dom: 18.3.1(react@18.3.1) - react@19.0.0: {} + react@18.3.1: + dependencies: + loose-envify: 1.4.0 readdirp@3.6.0: dependencies: @@ -4237,7 +4243,9 @@ snapshots: dependencies: queue-microtask: 1.2.3 - scheduler@0.25.0: {} + scheduler@0.23.2: + dependencies: + loose-envify: 1.4.0 semver@6.3.1: {} @@ -4340,30 +4348,30 @@ snapshots: url-pattern@1.0.3: {} - use-callback-ref@1.3.3(@types/react@19.0.0)(react@19.0.0): + use-callback-ref@1.3.3(@types/react@18.3.18)(react@18.3.1): dependencies: - react: 19.0.0 + react: 18.3.1 tslib: 2.8.1 optionalDependencies: - '@types/react': 19.0.0 + '@types/react': 18.3.18 - use-isomorphic-layout-effect@1.2.0(@types/react@19.0.0)(react@19.0.0): + use-isomorphic-layout-effect@1.2.0(@types/react@18.3.18)(react@18.3.1): dependencies: - react: 19.0.0 + react: 18.3.1 optionalDependencies: - '@types/react': 19.0.0 + '@types/react': 18.3.18 - use-sidecar@1.1.3(@types/react@19.0.0)(react@19.0.0): + use-sidecar@1.1.3(@types/react@18.3.18)(react@18.3.1): dependencies: detect-node-es: 1.1.0 - react: 19.0.0 + react: 18.3.1 tslib: 2.8.1 optionalDependencies: - '@types/react': 19.0.0 + '@types/react': 18.3.18 - use-sync-external-store@1.4.0(react@19.0.0): + use-sync-external-store@1.4.0(react@18.3.1): dependencies: - react: 19.0.0 + react: 18.3.1 utrie@1.0.2: dependencies: