From 1c924bcc89155e94366c27dbb450af9e9c4b8f02 Mon Sep 17 00:00:00 2001 From: pompurin404 Date: Thu, 29 Aug 2024 12:07:08 +0800 Subject: [PATCH] use context provider --- src/main/config/profile.ts | 2 - src/renderer/src/hooks/use-app-config.tsx | 29 +++++++---- .../src/hooks/use-controled-mihomo-config.tsx | 33 +++++++++---- .../src/hooks/use-override-config.tsx | 37 ++++++++++---- src/renderer/src/hooks/use-profile-config.tsx | 49 +++++++++++-------- src/renderer/src/main.tsx | 14 +++++- 6 files changed, 110 insertions(+), 54 deletions(-) diff --git a/src/main/config/profile.ts b/src/main/config/profile.ts index 279e2e4..f1b7c03 100644 --- a/src/main/config/profile.ts +++ b/src/main/config/profile.ts @@ -4,7 +4,6 @@ import { addProfileUpdater } from '../core/profileUpdater' import { readFile, rm, writeFile } from 'fs/promises' import { restartCore } from '../core/manager' import { getAppConfig } from './app' -import { mainWindow } from '..' import { existsSync } from 'fs' import axios from 'axios' import yaml from 'yaml' @@ -22,7 +21,6 @@ export async function getProfileConfig(force = false): Promise { export async function setProfileConfig(config: IProfileConfig): Promise { profileConfig = config - mainWindow?.webContents.send('profileConfigUpdated') await writeFile(profileConfigPath(), yaml.stringify(config), 'utf-8') } diff --git a/src/renderer/src/hooks/use-app-config.tsx b/src/renderer/src/hooks/use-app-config.tsx index d4eb56c..236ab2a 100644 --- a/src/renderer/src/hooks/use-app-config.tsx +++ b/src/renderer/src/hooks/use-app-config.tsx @@ -1,14 +1,16 @@ +import React, { createContext, useContext, ReactNode } from 'react' import useSWR from 'swr' import { getAppConfig, patchAppConfig as patch } from '@renderer/utils/ipc' -import { useEffect } from 'react' -interface RetuenType { +interface AppConfigContextType { appConfig: IAppConfig | undefined mutateAppConfig: () => void patchAppConfig: (value: Partial) => Promise } -export const useAppConfig = (listenUpdate = false): RetuenType => { +const AppConfigContext = createContext(undefined) + +export const AppConfigProvider: React.FC<{ children: ReactNode }> = ({ children }) => { const { data: appConfig, mutate: mutateAppConfig } = useSWR('getConfig', () => getAppConfig()) const patchAppConfig = async (value: Partial): Promise => { @@ -21,8 +23,7 @@ export const useAppConfig = (listenUpdate = false): RetuenType => { } } - useEffect(() => { - if (!listenUpdate) return + React.useEffect(() => { window.electron.ipcRenderer.on('appConfigUpdated', () => { mutateAppConfig() }) @@ -31,9 +32,17 @@ export const useAppConfig = (listenUpdate = false): RetuenType => { } }, []) - return { - appConfig, - mutateAppConfig, - patchAppConfig - } + return ( + + {children} + + ) +} + +export const useAppConfig = (): AppConfigContextType => { + const context = useContext(AppConfigContext) + if (context === undefined) { + throw new Error('useAppConfig must be used within an AppConfigProvider') + } + return context } diff --git a/src/renderer/src/hooks/use-controled-mihomo-config.tsx b/src/renderer/src/hooks/use-controled-mihomo-config.tsx index 88230fc..091941c 100644 --- a/src/renderer/src/hooks/use-controled-mihomo-config.tsx +++ b/src/renderer/src/hooks/use-controled-mihomo-config.tsx @@ -1,14 +1,18 @@ +import React, { createContext, useContext, ReactNode } from 'react' import useSWR from 'swr' import { getControledMihomoConfig, patchControledMihomoConfig as patch } from '@renderer/utils/ipc' -import { useEffect } from 'react' -interface RetuenType { +interface ControledMihomoConfigContextType { controledMihomoConfig: Partial | undefined mutateControledMihomoConfig: () => void patchControledMihomoConfig: (value: Partial) => Promise } -export const useControledMihomoConfig = (listenUpdate = false): RetuenType => { +const ControledMihomoConfigContext = createContext( + undefined +) + +export const ControledMihomoConfigProvider: React.FC<{ children: ReactNode }> = ({ children }) => { const { data: controledMihomoConfig, mutate: mutateControledMihomoConfig } = useSWR( 'getControledMihomoConfig', () => getControledMihomoConfig() @@ -24,8 +28,7 @@ export const useControledMihomoConfig = (listenUpdate = false): RetuenType => { } } - useEffect(() => { - if (!listenUpdate) return + React.useEffect(() => { window.electron.ipcRenderer.on('controledMihomoConfigUpdated', () => { mutateControledMihomoConfig() }) @@ -34,9 +37,19 @@ export const useControledMihomoConfig = (listenUpdate = false): RetuenType => { } }, []) - return { - controledMihomoConfig, - mutateControledMihomoConfig, - patchControledMihomoConfig - } + return ( + + {children} + + ) +} + +export const useControledMihomoConfig = (): ControledMihomoConfigContextType => { + const context = useContext(ControledMihomoConfigContext) + if (context === undefined) { + throw new Error('useControledMihomoConfig must be used within a ControledMihomoConfigProvider') + } + return context } diff --git a/src/renderer/src/hooks/use-override-config.tsx b/src/renderer/src/hooks/use-override-config.tsx index 587c822..82c094e 100644 --- a/src/renderer/src/hooks/use-override-config.tsx +++ b/src/renderer/src/hooks/use-override-config.tsx @@ -1,3 +1,4 @@ +import React, { createContext, useContext, ReactNode } from 'react' import useSWR from 'swr' import { getOverrideConfig, @@ -7,7 +8,7 @@ import { updateOverrideItem as update } from '@renderer/utils/ipc' -interface RetuenType { +interface OverrideConfigContextType { overrideConfig: IOverrideConfig | undefined setOverrideConfig: (config: IOverrideConfig) => Promise mutateOverrideConfig: () => void @@ -16,7 +17,9 @@ interface RetuenType { removeOverrideItem: (id: string) => Promise } -export const useOverrideConfig = (): RetuenType => { +const OverrideConfigContext = createContext(undefined) + +export const OverrideConfigProvider: React.FC<{ children: ReactNode }> = ({ children }) => { const { data: overrideConfig, mutate: mutateOverrideConfig } = useSWR('getOverrideConfig', () => getOverrideConfig() ) @@ -61,12 +64,26 @@ export const useOverrideConfig = (): RetuenType => { } } - return { - overrideConfig, - setOverrideConfig, - mutateOverrideConfig, - addOverrideItem, - removeOverrideItem, - updateOverrideItem - } + return ( + + {children} + + ) +} + +export const useOverrideConfig = (): OverrideConfigContextType => { + const context = useContext(OverrideConfigContext) + if (context === undefined) { + throw new Error('useOverrideConfig must be used within an OverrideConfigProvider') + } + return context } diff --git a/src/renderer/src/hooks/use-profile-config.tsx b/src/renderer/src/hooks/use-profile-config.tsx index 5b8ea70..4a30b82 100644 --- a/src/renderer/src/hooks/use-profile-config.tsx +++ b/src/renderer/src/hooks/use-profile-config.tsx @@ -1,3 +1,4 @@ +import React, { createContext, useContext, ReactNode } from 'react' import useSWR from 'swr' import { getProfileConfig, @@ -7,9 +8,8 @@ import { updateProfileItem as update, changeCurrentProfile as change } from '@renderer/utils/ipc' -import { useEffect } from 'react' -interface RetuenType { +interface ProfileConfigContextType { profileConfig: IProfileConfig | undefined setProfileConfig: (config: IProfileConfig) => Promise mutateProfileConfig: () => void @@ -19,7 +19,9 @@ interface RetuenType { changeCurrentProfile: (id: string) => Promise } -export const useProfileConfig = (): RetuenType => { +const ProfileConfigContext = createContext(undefined) + +export const ProfileConfigProvider: React.FC<{ children: ReactNode }> = ({ children }) => { const { data: profileConfig, mutate: mutateProfileConfig } = useSWR('getProfileConfig', () => getProfileConfig() ) @@ -74,22 +76,27 @@ export const useProfileConfig = (): RetuenType => { } } - useEffect(() => { - window.electron.ipcRenderer.on('profileConfigUpdated', () => { - mutateProfileConfig() - }) - return (): void => { - window.electron.ipcRenderer.removeAllListeners('profileConfigUpdated') - } - }, []) - - return { - profileConfig, - setProfileConfig, - mutateProfileConfig, - addProfileItem, - removeProfileItem, - updateProfileItem, - changeCurrentProfile - } + return ( + + {children} + + ) +} + +export const useProfileConfig = (): ProfileConfigContextType => { + const context = useContext(ProfileConfigContext) + if (context === undefined) { + throw new Error('useProfileConfig must be used within a ProfileConfigProvider') + } + return context } diff --git a/src/renderer/src/main.tsx b/src/renderer/src/main.tsx index 0447882..a34291e 100644 --- a/src/renderer/src/main.tsx +++ b/src/renderer/src/main.tsx @@ -8,6 +8,10 @@ import '@renderer/assets/main.css' import App from '@renderer/App' import BaseErrorBoundary from './components/base/base-error-boundary' import { quitApp } from './utils/ipc' +import { AppConfigProvider } from './hooks/use-app-config' +import { ControledMihomoConfigProvider } from './hooks/use-controled-mihomo-config' +import { OverrideConfigProvider } from './hooks/use-override-config' +import { ProfileConfigProvider } from './hooks/use-profile-config' init().then(() => { document.addEventListener('keydown', (e) => { @@ -45,7 +49,15 @@ init().then(() => { > - + + + + + + + + +