From d4369d2503fb961dc4cb593b3fea79daff9edc47 Mon Sep 17 00:00:00 2001 From: diced Date: Sat, 1 Oct 2022 11:08:51 -0700 Subject: [PATCH] refactor: redux -> recoil --- package.json | 4 +- src/components/Layout.tsx | 14 +-- src/components/Theming.tsx | 5 +- src/components/pages/Dashboard/index.tsx | 5 +- src/components/pages/Manage/index.tsx | 11 +- src/components/pages/Upload.tsx | 5 +- src/components/pages/UploadText.tsx | 5 +- src/components/pages/Urls/index.tsx | 5 +- src/components/pages/Users.tsx | 5 +- src/lib/hooks/useLogin.ts | 14 +-- src/lib/recoil/user.ts | 24 ++++ src/lib/redux/reducers.ts | 4 - src/lib/redux/reducers/user.ts | 29 ----- src/lib/redux/store.ts | 13 --- src/pages/_app.tsx | 7 +- src/pages/auth/logout.tsx | 8 +- src/pages/dashboard/files.tsx | 3 +- src/pages/dashboard/index.tsx | 3 +- src/pages/dashboard/invites.tsx | 3 +- src/pages/dashboard/manage.tsx | 3 +- src/pages/dashboard/stats.tsx | 3 +- src/pages/dashboard/text.tsx | 3 +- src/pages/dashboard/upload.tsx | 3 +- src/pages/dashboard/urls.tsx | 3 +- src/pages/dashboard/users.tsx | 3 +- src/pages/invite/[code].tsx | 8 +- yarn.lock | 137 ++++------------------- 27 files changed, 103 insertions(+), 227 deletions(-) create mode 100644 src/lib/recoil/user.ts delete mode 100644 src/lib/redux/reducers.ts delete mode 100644 src/lib/redux/reducers/user.ts delete mode 100644 src/lib/redux/store.ts diff --git a/package.json b/package.json index 10d53c5..17ca99c 100644 --- a/package.json +++ b/package.json @@ -31,7 +31,6 @@ "@prisma/client": "^4.1.0", "@prisma/internals": "^4.1.0", "@prisma/migrate": "^4.1.0", - "@reduxjs/toolkit": "^1.8.2", "@tanstack/react-query": "^4.2.3", "argon2": "^0.28.5", "chart.js": "^3.9.1", @@ -53,8 +52,7 @@ "react-chartjs-2": "^4.3.1", "react-dom": "^18.2.0", "react-feather": "^2.0.10", - "react-redux": "^8.0.2", - "redux": "^4.2.0", + "recoil": "^0.7.5", "sharp": "^0.30.7", "yup": "^0.32.11" }, diff --git a/src/components/Layout.tsx b/src/components/Layout.tsx index 8d4131f..ac94cde 100644 --- a/src/components/Layout.tsx +++ b/src/components/Layout.tsx @@ -4,11 +4,11 @@ import { useModals } from '@mantine/modals'; import { showNotification } from '@mantine/notifications'; import useFetch from 'hooks/useFetch'; import { useVersion } from 'lib/queries/version'; -import { updateUser } from 'lib/redux/reducers/user'; -import { useStoreDispatch } from 'lib/redux/store'; +import { userSelector } from 'lib/recoil/user'; +import { useRecoilState } from 'recoil'; import Link from 'next/link'; import { useRouter } from 'next/router'; -import { useEffect, useState } from 'react'; +import { useState } from 'react'; import { ExternalLinkIcon, ActivityIcon, CheckIcon, CopyIcon, CrossIcon, DeleteIcon, FileIcon, HomeIcon, LinkIcon, LogoutIcon, PencilIcon, SettingsIcon, TagIcon, TypeIcon, UploadIcon, UserIcon } from './icons'; import { friendlyThemeName, themes } from './Theming'; @@ -109,20 +109,20 @@ const admin_items = [ }, ]; -export default function Layout({ children, user, props }) { +export default function Layout({ children, props }) { + const [user, setUser] = useRecoilState(userSelector); + const { title } = props; const external_links = JSON.parse(props.external_links ?? '[]'); const [token, setToken] = useState(user?.token); const [systemTheme, setSystemTheme] = useState(user.systemTheme ?? 'system'); - // const [version, setVersion] = useState<{ local: string, upstream: string }>(null); const version = useVersion(); const [opened, setOpened] = useState(false); // navigation open const [open, setOpen] = useState(false); // manage acc dropdown const avatar = user?.avatar ?? null; const router = useRouter(); - const dispatch = useStoreDispatch(); const theme = useMantineTheme(); const modals = useModals(); const clipboard = useClipboard(); @@ -133,7 +133,7 @@ export default function Layout({ children, user, props }) { }); setSystemTheme(newUser.systemTheme); - dispatch(updateUser(newUser)); + setUser(newUser); router.replace(router.pathname); showNotification({ diff --git a/src/components/Theming.tsx b/src/components/Theming.tsx index 1b07f18..3deeb56 100644 --- a/src/components/Theming.tsx +++ b/src/components/Theming.tsx @@ -16,7 +16,8 @@ import { MantineProvider, MantineThemeOverride } from '@mantine/core'; import { useColorScheme } from '@mantine/hooks'; import { ModalsProvider } from '@mantine/modals'; import { NotificationsProvider } from '@mantine/notifications'; -import { useStoreSelector } from 'lib/redux/store'; +import { useRecoilValue } from 'recoil'; +import { userSelector } from 'lib/recoil/user'; export const themes = { system: (colorScheme: 'dark' | 'light') => colorScheme === 'dark' ? dark_blue : light_blue, @@ -47,7 +48,7 @@ export const friendlyThemeName = { }; export default function ZiplineTheming({ Component, pageProps, ...props }) { - const user = useStoreSelector(state => state.user); + const user = useRecoilValue(userSelector); const colorScheme = useColorScheme(); let theme: MantineThemeOverride; diff --git a/src/components/pages/Dashboard/index.tsx b/src/components/pages/Dashboard/index.tsx index 6421cd0..7d65ecc 100644 --- a/src/components/pages/Dashboard/index.tsx +++ b/src/components/pages/Dashboard/index.tsx @@ -8,12 +8,13 @@ import MutedText from 'components/MutedText'; import useFetch from 'lib/hooks/useFetch'; import { useFiles, useRecent } from 'lib/queries/files'; import { useStats } from 'lib/queries/stats'; -import { useStoreSelector } from 'lib/redux/store'; +import { userSelector } from 'lib/recoil/user'; +import { useRecoilValue } from 'recoil'; import RecentFiles from './RecentFiles'; import { StatCards } from './StatCards'; export default function Dashboard() { - const user = useStoreSelector(state => state.user); + const user = useRecoilValue(userSelector); const theme = useMantineTheme(); const images = useFiles(); diff --git a/src/components/pages/Manage/index.tsx b/src/components/pages/Manage/index.tsx index 59e37df..efad863 100644 --- a/src/components/pages/Manage/index.tsx +++ b/src/components/pages/Manage/index.tsx @@ -9,10 +9,10 @@ import Link from 'components/Link'; import MutedText from 'components/MutedText'; import { SmallTable } from 'components/SmallTable'; import useFetch from 'hooks/useFetch'; +import { userSelector } from 'lib/recoil/user'; import { bytesToRead } from 'lib/utils/client'; -import { updateUser } from 'lib/redux/reducers/user'; -import { useStoreDispatch, useStoreSelector } from 'lib/redux/store'; import { useEffect, useState } from 'react'; +import { useRecoilState } from 'recoil'; import Flameshot from './Flameshot'; import ShareX from './ShareX'; @@ -21,8 +21,7 @@ function ExportDataTooltip({ children }) { } export default function Manage() { - const user = useStoreSelector(state => state.user); - const dispatch = useStoreDispatch(); + const [user, setUser] = useRecoilState(userSelector); const modals = useModals(); const [shareXOpen, setShareXOpen] = useState(false); @@ -77,7 +76,7 @@ export default function Manage() { icon: , }); } else { - dispatch(updateUser(newUser)); + setUser(newUser); updateNotification({ id: 'update-user', title: 'Saved User', @@ -150,7 +149,7 @@ export default function Manage() { icon: , }); } else { - dispatch(updateUser(newUser)); + setUser(newUser); updateNotification({ id: 'update-user', title: 'Saved User', diff --git a/src/components/pages/Upload.tsx b/src/components/pages/Upload.tsx index 4ad73d9..eea4da2 100644 --- a/src/components/pages/Upload.tsx +++ b/src/components/pages/Upload.tsx @@ -6,8 +6,9 @@ import FileDropzone from 'components/dropzone/DropzoneFile'; import { ClockIcon, CrossIcon, UploadIcon } from 'components/icons'; import Link from 'components/Link'; import { invalidateFiles } from 'lib/queries/files'; -import { useStoreSelector } from 'lib/redux/store'; +import { userSelector } from 'lib/recoil/user'; import { useEffect, useState } from 'react'; +import { useRecoilValue } from 'recoil'; const expires = [ '5min', @@ -42,7 +43,7 @@ const expires = [ export default function Upload() { const clipboard = useClipboard(); - const user = useStoreSelector(state => state.user); + const user = useRecoilValue(userSelector); const [files, setFiles] = useState([]); const [progress, setProgress] = useState(0); diff --git a/src/components/pages/UploadText.tsx b/src/components/pages/UploadText.tsx index 86f097f..157c75b 100644 --- a/src/components/pages/UploadText.tsx +++ b/src/components/pages/UploadText.tsx @@ -4,11 +4,12 @@ import CodeInput from 'components/CodeInput'; import { TypeIcon, UploadIcon } from 'components/icons'; import Link from 'components/Link'; import exts from 'lib/exts'; -import { useStoreSelector } from 'lib/redux/store'; +import { userSelector } from 'lib/recoil/user'; import { useState } from 'react'; +import { useRecoilValue } from 'recoil'; export default function Upload() { - const user = useStoreSelector(state => state.user); + const user = useRecoilValue(userSelector); const [value, setValue] = useState(''); const [lang, setLang] = useState('txt'); diff --git a/src/components/pages/Urls/index.tsx b/src/components/pages/Urls/index.tsx index 6cf808d..5bf89a2 100644 --- a/src/components/pages/Urls/index.tsx +++ b/src/components/pages/Urls/index.tsx @@ -2,14 +2,15 @@ import { ActionIcon, Button, Group, Modal, SimpleGrid, Skeleton, TextInput, Titl import { useForm } from '@mantine/form'; import { showNotification } from '@mantine/notifications'; import { CrossIcon, LinkIcon, PlusIcon } from 'components/icons'; -import { useStoreSelector } from 'lib/redux/store'; import { useEffect, useState } from 'react'; import { useURLs } from 'lib/queries/url'; import URLCard from './URLCard'; import MutedText from 'components/MutedText'; +import { useRecoilValue } from 'recoil'; +import { userSelector } from 'lib/recoil/user'; export default function Urls() { - const user = useStoreSelector(state => state.user); + const user = useRecoilValue(userSelector); const urls = useURLs(); const [createOpen, setCreateOpen] = useState(false); diff --git a/src/components/pages/Users.tsx b/src/components/pages/Users.tsx index 48d8d15..e080c02 100644 --- a/src/components/pages/Users.tsx +++ b/src/components/pages/Users.tsx @@ -5,9 +5,10 @@ import { showNotification } from '@mantine/notifications'; import { CrossIcon, DeleteIcon, PlusIcon } from 'components/icons'; import MutedText from 'components/MutedText'; import useFetch from 'hooks/useFetch'; -import { useStoreSelector } from 'lib/redux/store'; +import { userSelector } from 'lib/recoil/user'; import { useRouter } from 'next/router'; import { useEffect, useState } from 'react'; +import { useRecoilValue } from 'recoil'; function CreateUserModal({ open, setOpen, updateUsers }) { @@ -73,7 +74,7 @@ function CreateUserModal({ open, setOpen, updateUsers }) { } export default function Users() { - const user = useStoreSelector(state => state.user); + const user = useRecoilValue(userSelector); const router = useRouter(); const modals = useModals(); diff --git a/src/lib/hooks/useLogin.ts b/src/lib/hooks/useLogin.ts index 0df2605..2d42cf2 100644 --- a/src/lib/hooks/useLogin.ts +++ b/src/lib/hooks/useLogin.ts @@ -1,16 +1,13 @@ import { useRouter } from 'next/router'; import { useEffect, useState } from 'react'; -import { updateUser, User } from 'lib/redux/reducers/user'; -import { useStoreDispatch, useStoreSelector } from 'lib/redux/store'; +import { User, userState } from 'lib/recoil/user'; +import { useRecoilState, useRecoilValue, useSetRecoilState } from 'recoil'; import useFetch from './useFetch'; export default function login() { const router = useRouter(); - const dispatch = useStoreDispatch(); - const userState = useStoreSelector(s => s.user); - - const [user, setUser] = useState(userState); - const [loading, setLoading] = useState(!userState); + const [user, setUser] = useRecoilState(userState); + const [loading, setLoading] = useState(!user); async function load() { setLoading(true); @@ -18,7 +15,6 @@ export default function login() { const res = await useFetch('/api/user'); if (res.error) return router.push('/auth/login?url=' + router.route); - dispatch(updateUser(res)); setUser(res); setLoading(false); } @@ -28,5 +24,5 @@ export default function login() { load(); }, []); - return { loading, user }; + return { loading }; } \ No newline at end of file diff --git a/src/lib/recoil/user.ts b/src/lib/recoil/user.ts new file mode 100644 index 0000000..c9f45cd --- /dev/null +++ b/src/lib/recoil/user.ts @@ -0,0 +1,24 @@ +import { atom, selector } from 'recoil'; + +export interface User { + username: string; + token: string; + embedTitle: string; + embedColor: string; + embedSiteName: string; + systemTheme: string; + domains: string[]; + avatar?: string; + administrator: boolean; +} + +export const userState = atom({ + key: 'userState', + default: null as User, +}); + +export const userSelector = selector({ + key: 'userSelector', + get: ({ get }) => get(userState), + set: ({ set }, newValue) => set(userState, newValue), +}); \ No newline at end of file diff --git a/src/lib/redux/reducers.ts b/src/lib/redux/reducers.ts deleted file mode 100644 index 9ec2c82..0000000 --- a/src/lib/redux/reducers.ts +++ /dev/null @@ -1,4 +0,0 @@ -import { combineReducers } from 'redux'; -import user from './reducers/user'; - -export default combineReducers({ user }); \ No newline at end of file diff --git a/src/lib/redux/reducers/user.ts b/src/lib/redux/reducers/user.ts deleted file mode 100644 index db44d8e..0000000 --- a/src/lib/redux/reducers/user.ts +++ /dev/null @@ -1,29 +0,0 @@ -import { createSlice, PayloadAction } from '@reduxjs/toolkit'; - -export interface User { - username: string; - token: string; - embedTitle: string; - embedColor: string; - embedSiteName: string; - systemTheme: string; - domains: string[]; - avatar?: string; -} - -const initialState: User = null; - -const user = createSlice({ - name: 'user', - initialState, - reducers: { - updateUser(state, action: PayloadAction) { - state = action.payload; - return state; - }, - }, -}); - -export const { updateUser } = user.actions; - -export default user.reducer; \ No newline at end of file diff --git a/src/lib/redux/store.ts b/src/lib/redux/store.ts deleted file mode 100644 index 6a60b49..0000000 --- a/src/lib/redux/store.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { configureStore } from '@reduxjs/toolkit'; -import rootReducer from './reducers'; -import { useDispatch, TypedUseSelectorHook, useSelector } from 'react-redux'; - -export const store = configureStore({ - reducer: rootReducer, -}); - -export type AppState = ReturnType -export type AppDispatch = typeof store.dispatch - -export const useStoreDispatch = () => useDispatch(); -export const useStoreSelector: TypedUseSelectorHook = useSelector; \ No newline at end of file diff --git a/src/pages/_app.tsx b/src/pages/_app.tsx index 4dbdc8d..0617150 100644 --- a/src/pages/_app.tsx +++ b/src/pages/_app.tsx @@ -1,14 +1,13 @@ import React from 'react'; -import { Provider } from 'react-redux'; import Head from 'next/head'; -import { store } from 'lib/redux/store'; import ZiplineTheming from 'components/Theming'; import { QueryClientProvider } from '@tanstack/react-query'; import queryClient from 'lib/queries/client'; +import { RecoilRoot } from 'recoil'; export default function MyApp({ Component, pageProps }) { return ( - + @@ -17,6 +16,6 @@ export default function MyApp({ Component, pageProps }) { > - + ); } \ No newline at end of file diff --git a/src/pages/auth/logout.tsx b/src/pages/auth/logout.tsx index b7e3c8b..053fb55 100644 --- a/src/pages/auth/logout.tsx +++ b/src/pages/auth/logout.tsx @@ -1,11 +1,11 @@ import React, { useEffect } from 'react'; import { useRouter } from 'next/router'; import { LoadingOverlay } from '@mantine/core'; -import { useStoreDispatch } from 'lib/redux/store'; -import { updateUser } from 'lib/redux/reducers/user'; +import { useSetRecoilState } from 'recoil'; +import { userSelector } from 'lib/recoil/user'; export default function Logout() { - const dispatch = useStoreDispatch(); + const setUser = useSetRecoilState(userSelector); const router = useRouter(); useEffect(() => { @@ -14,7 +14,7 @@ export default function Logout() { if (userRes.ok) { const res = await fetch('/api/auth/logout'); if (res.ok) { - dispatch(updateUser(null)); + setUser(null); router.push('/auth/login'); } } else { diff --git a/src/pages/dashboard/files.tsx b/src/pages/dashboard/files.tsx index f928e7b..ce9ae02 100644 --- a/src/pages/dashboard/files.tsx +++ b/src/pages/dashboard/files.tsx @@ -7,7 +7,7 @@ import Head from 'next/head'; export { getServerSideProps } from 'middleware/getServerSideProps'; export default function FilesPage(props) { - const { user, loading } = useLogin(); + const { loading } = useLogin(); if (loading) return ; @@ -18,7 +18,6 @@ export default function FilesPage(props) { diff --git a/src/pages/dashboard/index.tsx b/src/pages/dashboard/index.tsx index d2d720f..8904de8 100644 --- a/src/pages/dashboard/index.tsx +++ b/src/pages/dashboard/index.tsx @@ -7,7 +7,7 @@ import Head from 'next/head'; export { getServerSideProps } from 'middleware/getServerSideProps'; export default function DashboardPage(props) { - const { user, loading } = useLogin(); + const { loading } = useLogin(); if (loading) return ; @@ -17,7 +17,6 @@ export default function DashboardPage(props) { {props.title} diff --git a/src/pages/dashboard/invites.tsx b/src/pages/dashboard/invites.tsx index 9262bea..84e82d9 100644 --- a/src/pages/dashboard/invites.tsx +++ b/src/pages/dashboard/invites.tsx @@ -7,7 +7,7 @@ import Head from 'next/head'; export { getServerSideProps } from 'middleware/getServerSideProps'; export default function InvitesPage(props) { - const { user, loading } = useLogin(); + const { loading } = useLogin(); if (loading) return ; @@ -17,7 +17,6 @@ export default function InvitesPage(props) { {props.title} - Invites diff --git a/src/pages/dashboard/manage.tsx b/src/pages/dashboard/manage.tsx index 984b3d8..d278450 100644 --- a/src/pages/dashboard/manage.tsx +++ b/src/pages/dashboard/manage.tsx @@ -7,7 +7,7 @@ import Head from 'next/head'; export { getServerSideProps } from 'middleware/getServerSideProps'; export default function ManagePage(props) { - const { user, loading } = useLogin(); + const { loading } = useLogin(); if (loading) return ; @@ -17,7 +17,6 @@ export default function ManagePage(props) { {props.title} - Manage User diff --git a/src/pages/dashboard/stats.tsx b/src/pages/dashboard/stats.tsx index 4c7ea6b..10cffdf 100644 --- a/src/pages/dashboard/stats.tsx +++ b/src/pages/dashboard/stats.tsx @@ -7,7 +7,7 @@ import Head from 'next/head'; export { getServerSideProps } from 'middleware/getServerSideProps'; export default function StatsPage(props) { - const { user, loading } = useLogin(); + const { loading } = useLogin(); if (loading) return ; @@ -17,7 +17,6 @@ export default function StatsPage(props) { {props.title} - Stats diff --git a/src/pages/dashboard/text.tsx b/src/pages/dashboard/text.tsx index c55a227..de0f518 100644 --- a/src/pages/dashboard/text.tsx +++ b/src/pages/dashboard/text.tsx @@ -7,7 +7,7 @@ import Head from 'next/head'; export { getServerSideProps } from 'middleware/getServerSideProps'; export default function UploadTextPage(props) { - const { user, loading } = useLogin(); + const { loading } = useLogin(); if (loading) return ; @@ -17,7 +17,6 @@ export default function UploadTextPage(props) { {props.title} - Upload Text diff --git a/src/pages/dashboard/upload.tsx b/src/pages/dashboard/upload.tsx index f008137..95c91ba 100644 --- a/src/pages/dashboard/upload.tsx +++ b/src/pages/dashboard/upload.tsx @@ -7,7 +7,7 @@ import Head from 'next/head'; export { getServerSideProps } from 'middleware/getServerSideProps'; export default function UploadPage(props) { - const { user, loading } = useLogin(); + const { loading } = useLogin(); if (loading) return ; @@ -17,7 +17,6 @@ export default function UploadPage(props) { {props.title} - Upload diff --git a/src/pages/dashboard/urls.tsx b/src/pages/dashboard/urls.tsx index 86578e8..5bb2f4b 100644 --- a/src/pages/dashboard/urls.tsx +++ b/src/pages/dashboard/urls.tsx @@ -7,7 +7,7 @@ import Head from 'next/head'; export { getServerSideProps } from 'middleware/getServerSideProps'; export default function UrlsPage(props) { - const { user, loading } = useLogin(); + const { loading } = useLogin(); if (loading) return ; @@ -17,7 +17,6 @@ export default function UrlsPage(props) { {props.title} - URLs diff --git a/src/pages/dashboard/users.tsx b/src/pages/dashboard/users.tsx index d63a55a..b27bfbc 100644 --- a/src/pages/dashboard/users.tsx +++ b/src/pages/dashboard/users.tsx @@ -7,7 +7,7 @@ import Head from 'next/head'; export { getServerSideProps } from 'middleware/getServerSideProps'; export default function UsersPage(props) { - const { user, loading } = useLogin(); + const { loading } = useLogin(); if (loading) return ; @@ -17,7 +17,6 @@ export default function UsersPage(props) { {props.title} - Users diff --git a/src/pages/invite/[code].tsx b/src/pages/invite/[code].tsx index 0389316..bdfa513 100644 --- a/src/pages/invite/[code].tsx +++ b/src/pages/invite/[code].tsx @@ -6,11 +6,11 @@ import useFetch from 'hooks/useFetch'; import PasswordStrength from 'components/PasswordStrength'; import { showNotification } from '@mantine/notifications'; import { CrossIcon, UserIcon } from 'components/icons'; -import { useStoreDispatch } from 'lib/redux/store'; -import { updateUser } from 'lib/redux/reducers/user'; import { useRouter } from 'next/router'; import Head from 'next/head'; import config from 'lib/config'; +import { useSetRecoilState } from 'recoil'; +import { userSelector } from 'lib/recoil/user'; export default function Invite({ code, title }) { const [active, setActive] = useState(0); @@ -21,7 +21,7 @@ export default function Invite({ code, title }) { const [verifyPasswordError, setVerifyPasswordError] = useState(''); const [strength, setStrength] = useState(0); - const dispatch = useStoreDispatch(); + const setUser = useSetRecoilState(userSelector); const router = useRouter(); const nextStep = () => setActive((current) => (current < 3 ? current + 1 : current)); @@ -67,7 +67,7 @@ export default function Invite({ code, title }) { icon: , }); - dispatch(updateUser(null)); + setUser(null); await useFetch('/api/auth/logout'); await useFetch('/api/auth/login', 'POST', { username, password, diff --git a/yarn.lock b/yarn.lock index df498d7..a59091b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -272,7 +272,7 @@ __metadata: languageName: node linkType: hard -"@babel/runtime@npm:^7.10.2, @babel/runtime@npm:^7.12.1, @babel/runtime@npm:^7.12.5, @babel/runtime@npm:^7.13.10, @babel/runtime@npm:^7.15.4, @babel/runtime@npm:^7.18.3, @babel/runtime@npm:^7.18.9, @babel/runtime@npm:^7.5.5, @babel/runtime@npm:^7.8.7, @babel/runtime@npm:^7.9.2": +"@babel/runtime@npm:^7.10.2, @babel/runtime@npm:^7.12.5, @babel/runtime@npm:^7.13.10, @babel/runtime@npm:^7.15.4, @babel/runtime@npm:^7.18.3, @babel/runtime@npm:^7.18.9, @babel/runtime@npm:^7.5.5, @babel/runtime@npm:^7.8.7": version: 7.18.9 resolution: "@babel/runtime@npm:7.18.9" dependencies: @@ -1394,26 +1394,6 @@ __metadata: languageName: node linkType: hard -"@reduxjs/toolkit@npm:^1.8.2": - version: 1.8.4 - resolution: "@reduxjs/toolkit@npm:1.8.4" - dependencies: - immer: ^9.0.7 - redux: ^4.1.2 - redux-thunk: ^2.4.1 - reselect: ^4.1.5 - peerDependencies: - react: ^16.9.0 || ^17.0.0 || ^18 - react-redux: ^7.2.1 || ^8.0.2 - peerDependenciesMeta: - react: - optional: true - react-redux: - optional: true - checksum: 2ed7ee22bc84f0a2370ca2746513ece4593b8310c16c89e1ccf43ce23dcb83d7c4f4773d78049b68b4e92b3c5bee641e8081faf3947371be6b004ebba8142a51 - languageName: node - linkType: hard - "@rushstack/eslint-patch@npm:^1.1.3": version: 1.1.4 resolution: "@rushstack/eslint-patch@npm:1.1.4" @@ -1621,16 +1601,6 @@ __metadata: languageName: node linkType: hard -"@types/hoist-non-react-statics@npm:^3.3.1": - version: 3.3.1 - resolution: "@types/hoist-non-react-statics@npm:3.3.1" - dependencies: - "@types/react": "*" - hoist-non-react-statics: ^3.3.0 - checksum: 2c0778570d9a01d05afabc781b32163f28409bb98f7245c38d5eaf082416fdb73034003f5825eb5e21313044e8d2d9e1f3fe2831e345d3d1b1d20bcd12270719 - languageName: node - linkType: hard - "@types/json5@npm:^0.0.29": version: 0.0.29 resolution: "@types/json5@npm:0.0.29" @@ -1733,17 +1703,6 @@ __metadata: languageName: node linkType: hard -"@types/react@npm:*": - version: 18.0.17 - resolution: "@types/react@npm:18.0.17" - dependencies: - "@types/prop-types": "*" - "@types/scheduler": "*" - csstype: ^3.0.2 - checksum: 18cae64f5bfd6bb58fbd8ee2ba52ec82de844f114254e26de7b513e4b86621f643f9b71d7066958cd571b0d78cb86cbceda449c5289f9349ca573df29ab69252 - languageName: node - linkType: hard - "@types/react@npm:^18.0.18": version: 18.0.18 resolution: "@types/react@npm:18.0.18" @@ -4728,6 +4687,13 @@ __metadata: languageName: node linkType: hard +"hamt_plus@npm:1.0.2": + version: 1.0.2 + resolution: "hamt_plus@npm:1.0.2" + checksum: af26ea32db03009019cc83dfa9411521a2fa16079443de1a502c9be46d8b3c975acda8ed93fc5750ef08d3186d35901e2d8cfe717dd54bea67b358601fa74e4c + languageName: node + linkType: hard + "has-bigints@npm:^1.0.1, has-bigints@npm:^1.0.2": version: 1.0.2 resolution: "has-bigints@npm:1.0.2" @@ -4839,7 +4805,7 @@ __metadata: languageName: node linkType: hard -"hoist-non-react-statics@npm:^3.3.0, hoist-non-react-statics@npm:^3.3.1, hoist-non-react-statics@npm:^3.3.2": +"hoist-non-react-statics@npm:^3.3.1": version: 3.3.2 resolution: "hoist-non-react-statics@npm:3.3.2" dependencies: @@ -4980,13 +4946,6 @@ __metadata: languageName: node linkType: hard -"immer@npm:^9.0.7": - version: 9.0.15 - resolution: "immer@npm:9.0.15" - checksum: 92e3d63e810e3c3c2bb61b70c45443e37ef983ad12924e3edaf03725ae5979618f5b473439bb3bb4a8c4769f25132f18dec10ea15c40f0b20da5691ff96ff611 - languageName: node - linkType: hard - "import-fresh@npm:^3.0.0, import-fresh@npm:^3.2.1": version: 3.3.0 resolution: "import-fresh@npm:3.3.0" @@ -7243,13 +7202,6 @@ __metadata: languageName: node linkType: hard -"react-is@npm:^18.0.0": - version: 18.2.0 - resolution: "react-is@npm:18.2.0" - checksum: e72d0ba81b5922759e4aff17e0252bd29988f9642ed817f56b25a3e217e13eea8a7f2322af99a06edb779da12d5d636e9fda473d620df9a3da0df2a74141d53e - languageName: node - linkType: hard - "react-property@npm:2.0.0": version: 2.0.0 resolution: "react-property@npm:2.0.0" @@ -7257,38 +7209,6 @@ __metadata: languageName: node linkType: hard -"react-redux@npm:^8.0.2": - version: 8.0.2 - resolution: "react-redux@npm:8.0.2" - dependencies: - "@babel/runtime": ^7.12.1 - "@types/hoist-non-react-statics": ^3.3.1 - "@types/use-sync-external-store": ^0.0.3 - hoist-non-react-statics: ^3.3.2 - react-is: ^18.0.0 - use-sync-external-store: ^1.0.0 - peerDependencies: - "@types/react": ^16.8 || ^17.0 || ^18.0 - "@types/react-dom": ^16.8 || ^17.0 || ^18.0 - react: ^16.8 || ^17.0 || ^18.0 - react-dom: ^16.8 || ^17.0 || ^18.0 - react-native: ">=0.59" - redux: ^4 - peerDependenciesMeta: - "@types/react": - optional: true - "@types/react-dom": - optional: true - react-dom: - optional: true - react-native: - optional: true - redux: - optional: true - checksum: 44c1739c45dad04ecc65a290897c73828ff0bf43f2b7618ed5ef6d4ceecedae38e76cecd189a5ecedf579c28ead05427bc000fb45ad30b9fcd5c2be27cd3ac73 - languageName: node - linkType: hard - "react-textarea-autosize@npm:8.3.4": version: 8.3.4 resolution: "react-textarea-autosize@npm:8.3.4" @@ -7407,21 +7327,19 @@ __metadata: languageName: node linkType: hard -"redux-thunk@npm:^2.4.1": - version: 2.4.1 - resolution: "redux-thunk@npm:2.4.1" - peerDependencies: - redux: ^4 - checksum: af5abb425fb9dccda02e5f387d6f3003997f62d906542a3d35fc9420088f550dc1a018bdc246c7d23ee852b4d4ab8b5c64c5be426e45a328d791c4586a3c6b6e - languageName: node - linkType: hard - -"redux@npm:^4.1.2, redux@npm:^4.2.0": - version: 4.2.0 - resolution: "redux@npm:4.2.0" +"recoil@npm:^0.7.5": + version: 0.7.5 + resolution: "recoil@npm:0.7.5" dependencies: - "@babel/runtime": ^7.9.2 - checksum: 75f3955c89b3f18edf5411e5fb482aa2e4f41a416183e8802a6bf6472c4fc3d47675b8b321d147f8af8e0f616436ac507bf5a25f1c4d6180e797b549c7db2c1d + hamt_plus: 1.0.2 + peerDependencies: + react: ">=16.13.1" + peerDependenciesMeta: + react-dom: + optional: true + react-native: + optional: true + checksum: 19b410cca6839c8b886b91378112e12de3e0393b547211dafcf7a272c1aa2d7af6c09a9ed39fb3e1997abe5f3d6583e3774dc9f9cdda8c36e4cb0be64a1b17ce languageName: node linkType: hard @@ -7464,13 +7382,6 @@ __metadata: languageName: node linkType: hard -"reselect@npm:^4.1.5": - version: 4.1.6 - resolution: "reselect@npm:4.1.6" - checksum: 3ea1058422904063ec93c8f4693fe33dcb2178bbf417ace8db5b2c797a5875cf357d9308d11ed3942ee22507dd34ecfbf1f3a21340a4f31c206cab1d36ceef31 - languageName: node - linkType: hard - "resolve-from@npm:^4.0.0": version: 4.0.0 resolution: "resolve-from@npm:4.0.0" @@ -8715,7 +8626,7 @@ __metadata: languageName: node linkType: hard -"use-sync-external-store@npm:1.2.0, use-sync-external-store@npm:^1.0.0, use-sync-external-store@npm:^1.2.0": +"use-sync-external-store@npm:1.2.0, use-sync-external-store@npm:^1.2.0": version: 1.2.0 resolution: "use-sync-external-store@npm:1.2.0" peerDependencies: @@ -9022,7 +8933,6 @@ __metadata: "@prisma/client": ^4.1.0 "@prisma/internals": ^4.1.0 "@prisma/migrate": ^4.1.0 - "@reduxjs/toolkit": ^1.8.2 "@tanstack/react-query": ^4.2.3 "@types/cookie": ^0.5.1 "@types/minio": ^7.0.13 @@ -9057,8 +8967,7 @@ __metadata: react-chartjs-2: ^4.3.1 react-dom: ^18.2.0 react-feather: ^2.0.10 - react-redux: ^8.0.2 - redux: ^4.2.0 + recoil: ^0.7.5 sharp: ^0.30.7 ts-node: ^10.8.1 tsx: ^3.8.0