code refactoring, removed react helmet

This commit is contained in:
2023-11-21 13:12:41 +01:00
parent c56e3a106b
commit ec3a5ad1ee
7 changed files with 26 additions and 57 deletions

View File

@@ -18,7 +18,6 @@
"fp-ts": "^2.16.1", "fp-ts": "^2.16.1",
"react": "^18.2.0", "react": "^18.2.0",
"react-dom": "^18.2.0", "react-dom": "^18.2.0",
"react-helmet": "^6.1.0",
"react-router-dom": "^6.17.0", "react-router-dom": "^6.17.0",
"recoil": "^0.7.7", "recoil": "^0.7.7",
"rxjs": "^7.8.1" "rxjs": "^7.8.1"

View File

@@ -29,9 +29,6 @@ dependencies:
react-dom: react-dom:
specifier: ^18.2.0 specifier: ^18.2.0
version: 18.2.0(react@18.2.0) version: 18.2.0(react@18.2.0)
react-helmet:
specifier: ^6.1.0
version: 6.1.0(react@18.2.0)
react-router-dom: react-router-dom:
specifier: ^6.17.0 specifier: ^6.17.0
version: 6.17.0(react-dom@18.2.0)(react@18.2.0) version: 6.17.0(react-dom@18.2.0)(react@18.2.0)
@@ -1138,22 +1135,6 @@ packages:
scheduler: 0.23.0 scheduler: 0.23.0
dev: false dev: false
/react-fast-compare@3.2.2:
resolution: {integrity: sha512-nsO+KSNgo1SbJqJEYRE9ERzo7YtYbou/OqjSQKxV7jcKox7+usiUVZOAC+XnDOABXggQTno0Y1CpVnuWEc1boQ==}
dev: false
/react-helmet@6.1.0(react@18.2.0):
resolution: {integrity: sha512-4uMzEY9nlDlgxr61NL3XbKRy1hEkXmKNXhjbAIOVw5vcFrsdYbH2FEwcNyWvWinl103nXgzYNlns9ca+8kFiWw==}
peerDependencies:
react: '>=16.3.0'
dependencies:
object-assign: 4.1.1
prop-types: 15.8.1
react: 18.2.0
react-fast-compare: 3.2.2
react-side-effect: 2.1.2(react@18.2.0)
dev: false
/react-is@16.13.1: /react-is@16.13.1:
resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==}
dev: false dev: false
@@ -1185,14 +1166,6 @@ packages:
react: 18.2.0 react: 18.2.0
dev: false dev: false
/react-side-effect@2.1.2(react@18.2.0):
resolution: {integrity: sha512-PVjOcvVOyIILrYoyGEpDN3vmYNLdy1CajSFNt4TDsVQC5KpTijDvWVoR+/7Rz2xT978D8/ZtFceXxzsPwZEDvw==}
peerDependencies:
react: ^16.3.0 || ^17.0.0 || ^18.0.0
dependencies:
react: 18.2.0
dev: false
/react-transition-group@4.4.5(react-dom@18.2.0)(react@18.2.0): /react-transition-group@4.4.5(react-dom@18.2.0)(react@18.2.0):
resolution: {integrity: sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==} resolution: {integrity: sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==}
peerDependencies: peerDependencies:

View File

@@ -17,7 +17,6 @@ import Toolbar from '@mui/material/Toolbar'
import Typography from '@mui/material/Typography' import Typography from '@mui/material/Typography'
import { grey } from '@mui/material/colors' import { grey } from '@mui/material/colors'
import { Suspense, useMemo, useState } from 'react' import { Suspense, useMemo, useState } from 'react'
import { Helmet } from 'react-helmet'
import { Link, Outlet } from 'react-router-dom' import { Link, Outlet } from 'react-router-dom'
import { useRecoilValue } from 'recoil' import { useRecoilValue } from 'recoil'
import { settingsState } from './atoms/settings' import { settingsState } from './atoms/settings'
@@ -56,11 +55,6 @@ export default function Layout() {
return ( return (
<ThemeProvider theme={theme}> <ThemeProvider theme={theme}>
<SocketSubscriber /> <SocketSubscriber />
<Helmet>
<title>
{settings.appTitle}
</title>
</Helmet>
<Box sx={{ display: 'flex' }}> <Box sx={{ display: 'flex' }}>
<CssBaseline /> <CssBaseline />
<AppBar position="absolute" open={open}> <AppBar position="absolute" open={open}>

View File

@@ -6,7 +6,5 @@ export const rpcClientState = selector({
key: 'rpcClientState', key: 'rpcClientState',
get: ({ get }) => get: ({ get }) =>
new RPCClient(get(rpcHTTPEndpoint), get(rpcWebSocketEndpoint)), new RPCClient(get(rpcHTTPEndpoint), get(rpcWebSocketEndpoint)),
set: ({ get }) =>
new RPCClient(get(rpcHTTPEndpoint), get(rpcWebSocketEndpoint)),
dangerouslyAllowMutability: true, dangerouslyAllowMutability: true,
}) })

View File

@@ -36,6 +36,7 @@ export const availableDownloadPathsState = selector({
key: 'availableDownloadPathsState', key: 'availableDownloadPathsState',
get: async ({ get }) => { get: async ({ get }) => {
const res = await get(rpcClientState).directoryTree() const res = await get(rpcClientState).directoryTree()
.catch(() => ({ result: [] }))
return res.result return res.result
} }
}) })

View File

@@ -1,7 +1,7 @@
import * as O from 'fp-ts/Option' import * as O from 'fp-ts/Option'
import { useEffect, useMemo } from 'react' import { useEffect, useMemo } from 'react'
import { useRecoilState, useRecoilValue } from 'recoil' import { useRecoilState, useRecoilValue } from 'recoil'
import { share, take, timer } from 'rxjs' import { take, timer } from 'rxjs'
import { downloadsState } from '../atoms/downloads' import { downloadsState } from '../atoms/downloads'
import { serverAddressAndPortState } from '../atoms/settings' import { serverAddressAndPortState } from '../atoms/settings'
import { connectedState } from '../atoms/status' import { connectedState } from '../atoms/status'
@@ -13,7 +13,7 @@ import { datetimeCompareFunc, isRPCResponse } from '../utils'
interface Props extends React.HTMLAttributes<HTMLBaseElement> { } interface Props extends React.HTMLAttributes<HTMLBaseElement> { }
const SocketSubscriber: React.FC<Props> = ({ children }) => { const SocketSubscriber: React.FC<Props> = () => {
const [connected, setIsConnected] = useRecoilState(connectedState) const [connected, setIsConnected] = useRecoilState(connectedState)
const [, setDownloads] = useRecoilState(downloadsState) const [, setDownloads] = useRecoilState(downloadsState)
@@ -23,19 +23,22 @@ const SocketSubscriber: React.FC<Props> = ({ children }) => {
const { client } = useRPC() const { client } = useRPC()
const { pushMessage } = useToast() const { pushMessage } = useToast()
const sharedSocket$ = useMemo(() => client.socket$.pipe(share()), []) const socketOnce$ = useMemo(() => client.socket$.pipe(take(1)), [])
const socketOnce$ = useMemo(() => sharedSocket$.pipe(take(1)), [])
useSubscription(socketOnce$, () => { useEffect(() => {
setIsConnected(true) if (!connected) {
pushMessage( socketOnce$.subscribe(() => {
`${i18n.t('toastConnected')} (${serverAddressAndPort})`, setIsConnected(true)
"success" pushMessage(
) `${i18n.t('toastConnected')} (${serverAddressAndPort})`,
}) "success"
)
})
}
}, [connected])
useSubscription( useSubscription(
sharedSocket$, client.socket$,
event => { event => {
if (!isRPCResponse(event)) { return } if (!isRPCResponse(event)) { return }
if (!Array.isArray(event.result)) { return } if (!Array.isArray(event.result)) { return }
@@ -50,7 +53,6 @@ const SocketSubscriber: React.FC<Props> = ({ children }) => {
) )
) )
} }
setDownloads(O.none) setDownloads(O.none)
}, },
err => { err => {
@@ -64,13 +66,13 @@ const SocketSubscriber: React.FC<Props> = ({ children }) => {
useEffect(() => { useEffect(() => {
if (connected) { if (connected) {
timer(0, 1000).subscribe(() => client.running()) const sub = timer(0, 1000).subscribe(() => client.running())
}
}, [connected])
return ( return () => sub.unsubscribe()
<>{children}</> }
) }, [connected, client])
return null
} }
export default SocketSubscriber export default SocketSubscriber

View File

@@ -19,11 +19,13 @@ export class RPCClient {
constructor(httpEndpoint: string, webSocketEndpoint: string) { constructor(httpEndpoint: string, webSocketEndpoint: string) {
this.seq = 0 this.seq = 0
this.httpEndpoint = httpEndpoint this.httpEndpoint = httpEndpoint
this._socket$ = webSocket<any>(webSocketEndpoint) this._socket$ = webSocket<any>({
url: webSocketEndpoint
})
} }
public get socket$(): Observable<RPCResponse<RPCResult[]>> { public get socket$(): Observable<RPCResponse<RPCResult[]>> {
return this._socket$.asObservable() return this._socket$
} }
private incrementSeq() { private incrementSeq() {