= {
system: ,
diff --git a/frontend/src/components/VersionIndicator.tsx b/frontend/src/components/VersionIndicator.tsx
index e219aa65..5b22d689 100644
--- a/frontend/src/components/VersionIndicator.tsx
+++ b/frontend/src/components/VersionIndicator.tsx
@@ -1,9 +1,9 @@
import { Chip } from '@mui/material'
-import { useRecoilValue } from 'recoil'
import { ytdlpRpcVersionState } from '../atoms/status'
+import { useAtomValue } from 'jotai'
const VersionIndicator: React.FC = () => {
- const version = useRecoilValue(ytdlpRpcVersionState)
+ const version = useAtomValue(ytdlpRpcVersionState)
return (
diff --git a/frontend/src/hooks/toast.ts b/frontend/src/hooks/toast.ts
index d42b6015..8688248b 100644
--- a/frontend/src/hooks/toast.ts
+++ b/frontend/src/hooks/toast.ts
@@ -1,9 +1,9 @@
import { AlertColor } from '@mui/material'
-import { useRecoilState } from 'recoil'
import { toastListState } from '../atoms/toast'
+import { useSetAtom } from 'jotai'
export const useToast = () => {
- const [, setToasts] = useRecoilState(toastListState)
+ const setToasts = useSetAtom(toastListState)
return {
pushMessage: (message: string, severity?: AlertColor) => {
diff --git a/frontend/src/hooks/useI18n.ts b/frontend/src/hooks/useI18n.ts
index bba98025..3f1864e7 100644
--- a/frontend/src/hooks/useI18n.ts
+++ b/frontend/src/hooks/useI18n.ts
@@ -1,8 +1,8 @@
-import { useRecoilValue } from 'recoil'
+import { useAtomValue } from 'jotai'
import { i18nBuilderState } from '../atoms/i18n'
export const useI18n = () => {
- const instance = useRecoilValue(i18nBuilderState)
+ const instance = useAtomValue(i18nBuilderState)
return {
i18n: instance
diff --git a/frontend/src/hooks/useRPC.ts b/frontend/src/hooks/useRPC.ts
index fbb94229..d47044c0 100644
--- a/frontend/src/hooks/useRPC.ts
+++ b/frontend/src/hooks/useRPC.ts
@@ -1,8 +1,8 @@
-import { useRecoilValue } from 'recoil'
+import { useAtomValue } from 'jotai'
import { rpcClientState } from '../atoms/rpc'
export const useRPC = () => {
- const client = useRecoilValue(rpcClientState)
+ const client = useAtomValue(rpcClientState)
return {
client
diff --git a/frontend/src/providers/ToasterProvider.tsx b/frontend/src/providers/ToasterProvider.tsx
index 09191d28..9af9cea7 100644
--- a/frontend/src/providers/ToasterProvider.tsx
+++ b/frontend/src/providers/ToasterProvider.tsx
@@ -1,10 +1,10 @@
import { Alert, Snackbar } from "@mui/material"
-import { useRecoilState } from 'recoil'
import { Toast, toastListState } from '../atoms/toast'
import { useEffect } from 'react'
+import { useAtom } from 'jotai'
const Toaster: React.FC = () => {
- const [toasts, setToasts] = useRecoilState(toastListState)
+ const [toasts, setToasts] = useAtom(toastListState)
const deletePredicate = (t: Toast) => (Date.now() - t.createdAt) < 2000
diff --git a/frontend/src/views/Archive.tsx b/frontend/src/views/Archive.tsx
index ba675bd8..751208f4 100644
--- a/frontend/src/views/Archive.tsx
+++ b/frontend/src/views/Archive.tsx
@@ -33,7 +33,6 @@ import { matchW } from 'fp-ts/lib/TaskEither'
import { pipe } from 'fp-ts/lib/function'
import { useEffect, useMemo, useState, useTransition } from 'react'
import { useNavigate } from 'react-router-dom'
-import { useRecoilValue } from 'recoil'
import { BehaviorSubject, Subject, combineLatestWith, map, share } from 'rxjs'
import { serverURL } from '../atoms/settings'
import { useObservable } from '../hooks/observable'
@@ -42,13 +41,14 @@ import { useI18n } from '../hooks/useI18n'
import { ffetch } from '../lib/httpClient'
import { DirectoryEntry } from '../types'
import { base64URLEncode, formatSize } from '../utils'
+import { useAtomValue } from 'jotai'
export default function Downloaded() {
const [menuPos, setMenuPos] = useState({ x: 0, y: 0 })
const [showMenu, setShowMenu] = useState(false)
const [currentFile, setCurrentFile] = useState()
- const serverAddr = useRecoilValue(serverURL)
+ const serverAddr = useAtomValue(serverURL)
const navigate = useNavigate()
const { i18n } = useI18n()
diff --git a/frontend/src/views/Home.tsx b/frontend/src/views/Home.tsx
index 9b4e7db2..80521b4e 100644
--- a/frontend/src/views/Home.tsx
+++ b/frontend/src/views/Home.tsx
@@ -1,15 +1,15 @@
import {
Container
} from '@mui/material'
-import { useRecoilValue } from 'recoil'
import { loadingAtom } from '../atoms/ui'
import Downloads from '../components/Downloads'
import HomeActions from '../components/HomeActions'
import LoadingBackdrop from '../components/LoadingBackdrop'
import Splash from '../components/Splash'
+import { useAtomValue } from 'jotai'
export default function Home() {
- const isLoading = useRecoilValue(loadingAtom)
+ const isLoading = useAtomValue(loadingAtom)
return (
diff --git a/frontend/src/views/Login.tsx b/frontend/src/views/Login.tsx
index 208bc184..8b761979 100644
--- a/frontend/src/views/Login.tsx
+++ b/frontend/src/views/Login.tsx
@@ -16,10 +16,10 @@ import { matchW } from 'fp-ts/lib/TaskEither'
import { pipe } from 'fp-ts/lib/function'
import { useState } from 'react'
import { useNavigate } from 'react-router-dom'
-import { useRecoilValue } from 'recoil'
import { serverURL } from '../atoms/settings'
import { useToast } from '../hooks/toast'
import { ffetch } from '../lib/httpClient'
+import { useAtomValue } from 'jotai'
const LoginContainer = styled(Container)({
display: 'flex',
@@ -43,7 +43,7 @@ export default function Login() {
const [formHasError, setFormHasError] = useState(false)
- const url = useRecoilValue(serverURL)
+ const url = useAtomValue(serverURL)
const navigate = useNavigate()
diff --git a/frontend/src/views/Settings.tsx b/frontend/src/views/Settings.tsx
index 269f3932..28cabf35 100644
--- a/frontend/src/views/Settings.tsx
+++ b/frontend/src/views/Settings.tsx
@@ -19,7 +19,6 @@ import {
capitalize
} from '@mui/material'
import { Suspense, useEffect, useMemo, useState } from 'react'
-import { useRecoilState } from 'recoil'
import {
Subject,
debounceTime,
@@ -49,25 +48,26 @@ import { useToast } from '../hooks/toast'
import { useI18n } from '../hooks/useI18n'
import { useRPC } from '../hooks/useRPC'
import { validateDomain, validateIP } from '../utils'
+import { useAtom } from 'jotai'
// NEED ABSOLUTELY TO BE SPLIT IN MULTIPLE COMPONENTS
export default function Settings() {
- const [reverseProxy, setReverseProxy] = useRecoilState(servedFromReverseProxyState)
- const [baseURL, setBaseURL] = useRecoilState(servedFromReverseProxySubDirState)
+ const [reverseProxy, setReverseProxy] = useAtom(servedFromReverseProxyState)
+ const [baseURL, setBaseURL] = useAtom(servedFromReverseProxySubDirState)
- const [formatSelection, setFormatSelection] = useRecoilState(formatSelectionState)
- const [pathOverriding, setPathOverriding] = useRecoilState(pathOverridingState)
- const [fileRenaming, setFileRenaming] = useRecoilState(fileRenamingState)
- const [enableArgs, setEnableArgs] = useRecoilState(enableCustomArgsState)
+ const [formatSelection, setFormatSelection] = useAtom(formatSelectionState)
+ const [pathOverriding, setPathOverriding] = useAtom(pathOverridingState)
+ const [fileRenaming, setFileRenaming] = useAtom(fileRenamingState)
+ const [enableArgs, setEnableArgs] = useAtom(enableCustomArgsState)
- const [serverAddr, setServerAddr] = useRecoilState(serverAddressState)
- const [serverPort, setServerPort] = useRecoilState(serverPortState)
+ const [serverAddr, setServerAddr] = useAtom(serverAddressState)
+ const [serverPort, setServerPort] = useAtom(serverPortState)
- const [pollingTime, setPollingTime] = useRecoilState(rpcPollingTimeState)
- const [language, setLanguage] = useRecoilState(languageState)
- const [appTitle, setApptitle] = useRecoilState(appTitleState)
+ const [pollingTime, setPollingTime] = useAtom(rpcPollingTimeState)
+ const [language, setLanguage] = useAtom(languageState)
+ const [appTitle, setApptitle] = useAtom(appTitleState)
- const [theme, setTheme] = useRecoilState(themeState)
+ const [theme, setTheme] = useAtom(themeState)
const [invalidIP, setInvalidIP] = useState(false)