From 2d6e8f5fd04b6b9a614a64b658e11ddc6a99ef64 Mon Sep 17 00:00:00 2001 From: pompurin404 Date: Tue, 13 Aug 2024 17:34:36 +0800 Subject: [PATCH] improve error handling --- .../src/components/profiles/profile-item.tsx | 15 +++---- .../src/components/resources/geo-data.tsx | 18 ++++---- .../components/resources/proxy-provider.tsx | 12 +++-- .../components/resources/rule-provider.tsx | 12 +++-- .../src/components/sider/mihomo-core-card.tsx | 13 +++--- .../src/components/sider/profile-card.tsx | 7 ++- src/renderer/src/hooks/use-app-config.tsx | 11 +++-- .../src/hooks/use-controled-mihomo-config.tsx | 11 +++-- .../src/hooks/use-override-config.tsx | 36 +++++++++++---- src/renderer/src/hooks/use-profile-config.tsx | 45 ++++++++++++++----- src/renderer/src/pages/mihomo.tsx | 10 ++++- src/renderer/src/pages/profiles.tsx | 30 +++++-------- src/renderer/src/pages/proxies.tsx | 17 +++---- src/renderer/src/pages/settings.tsx | 38 ++++++++++------ src/renderer/src/pages/syspeoxy.tsx | 9 ++-- src/renderer/src/pages/tun.tsx | 16 ++++--- src/renderer/src/utils/ipc.ts | 4 ++ 17 files changed, 190 insertions(+), 114 deletions(-) diff --git a/src/renderer/src/components/profiles/profile-item.tsx b/src/renderer/src/components/profiles/profile-item.tsx index 7d2e8b6..436e4d9 100644 --- a/src/renderer/src/components/profiles/profile-item.tsx +++ b/src/renderer/src/components/profiles/profile-item.tsx @@ -94,7 +94,7 @@ const ProfileItem: React.FC = (props) => { return list }, [info]) - const onMenuAction = (key: Key): void => { + const onMenuAction = async (key: Key): Promise => { switch (key) { case 'edit-info': { setOpenInfo(true) @@ -105,7 +105,7 @@ const ProfileItem: React.FC = (props) => { break } case 'delete': { - removeProfileItem(info.id) + await removeProfileItem(info.id) mutateProfileConfig() break } @@ -177,15 +177,10 @@ const ProfileItem: React.FC = (props) => { variant="light" color="default" disabled={updating} - onPress={() => { + onPress={async () => { setUpdating(true) - addProfileItem(info) - .catch((e) => { - alert(e) - }) - .finally(() => { - setUpdating(false) - }) + await addProfileItem(info) + setUpdating(false) }} > { size="sm" isIconOnly variant="light" - onPress={() => { + onPress={async () => { setUpdating(true) - mihomoUpgradeGeo() - .catch((e) => { - new Notification('更新失败', { body: e.message }) - }) - .finally(() => { - new Notification('Geo 数据库更新成功') - setUpdating(false) - }) + try { + await mihomoUpgradeGeo() + new Notification('Geo 数据库更新成功') + } catch (e) { + alert(e) + } finally { + setUpdating(false) + } }} > diff --git a/src/renderer/src/components/resources/proxy-provider.tsx b/src/renderer/src/components/resources/proxy-provider.tsx index 5353379..42cf3e4 100644 --- a/src/renderer/src/components/resources/proxy-provider.tsx +++ b/src/renderer/src/components/resources/proxy-provider.tsx @@ -20,18 +20,22 @@ const ProxyProvider: React.FC = () => { }, [data]) const [updating, setUpdating] = useState(Array(providers.length).fill(false)) - const onUpdate = (name: string, index: number): void => { + const onUpdate = async (name: string, index: number): Promise => { setUpdating((prev) => { prev[index] = true return [...prev] }) - mihomoUpdateProxyProviders(name).finally(() => { + try { + await mihomoUpdateProxyProviders(name) + mutate() + } catch (e) { + alert(e) + } finally { setUpdating((prev) => { prev[index] = false return [...prev] }) - mutate() - }) + } } if (!providers.length) { diff --git a/src/renderer/src/components/resources/rule-provider.tsx b/src/renderer/src/components/resources/rule-provider.tsx index 12f7229..996bd3e 100644 --- a/src/renderer/src/components/resources/rule-provider.tsx +++ b/src/renderer/src/components/resources/rule-provider.tsx @@ -15,18 +15,22 @@ const RuleProvider: React.FC = () => { }, [data]) const [updating, setUpdating] = useState(Array(providers.length).fill(false)) - const onUpdate = (name: string, index: number): void => { + const onUpdate = async (name: string, index: number): Promise => { setUpdating((prev) => { prev[index] = true return [...prev] }) - mihomoUpdateRuleProviders(name).finally(() => { + try { + await mihomoUpdateRuleProviders(name) + mutate() + } catch (e) { + alert(e) + } finally { setUpdating((prev) => { prev[index] = false return [...prev] }) - mutate() - }) + } } if (!providers.length) { diff --git a/src/renderer/src/components/sider/mihomo-core-card.tsx b/src/renderer/src/components/sider/mihomo-core-card.tsx index 9b4e911..2727321 100644 --- a/src/renderer/src/components/sider/mihomo-core-card.tsx +++ b/src/renderer/src/components/sider/mihomo-core-card.tsx @@ -22,9 +22,6 @@ const MihomoCoreCard: React.FC = () => { useEffect(() => { const token = PubSub.subscribe('mihomo-core-changed', () => { mutate() - setTimeout(() => { - mutate() - }, 1000) }) window.electron.ipcRenderer.on('mihomoMemory', (_e, info: IMihomoMemoryInfo) => { setMem(info.inuse) @@ -70,11 +67,13 @@ const MihomoCoreCard: React.FC = () => { variant="light" color="default" onPress={async () => { - await restartCore() - mutate() - setTimeout(() => { + try { + await restartCore() + } catch (e) { + alert(e) + } finally { mutate() - }, 2000) + } }} > diff --git a/src/renderer/src/components/sider/profile-card.tsx b/src/renderer/src/components/sider/profile-card.tsx index 408d581..b2c48ac 100644 --- a/src/renderer/src/components/sider/profile-card.tsx +++ b/src/renderer/src/components/sider/profile-card.tsx @@ -87,11 +87,10 @@ const ProfileCard: React.FC = () => { disabled={updating} variant="light" color="default" - onPress={() => { + onPress={async () => { setUpdating(true) - addProfileItem(info).finally(() => { - setUpdating(false) - }) + await addProfileItem(info) + setUpdating(false) }} > { const { data: appConfig, mutate: mutateAppConfig } = useSWR('getConfig', () => getAppConfig()) const patchAppConfig = async (value: Partial): Promise => { - await patch(value) - mutateAppConfig() - window.electron.ipcRenderer.send('appConfigUpdated') + try { + await patch(value) + } catch (e) { + alert(e) + } finally { + mutateAppConfig() + window.electron.ipcRenderer.send('appConfigUpdated') + } } useEffect(() => { diff --git a/src/renderer/src/hooks/use-controled-mihomo-config.tsx b/src/renderer/src/hooks/use-controled-mihomo-config.tsx index 64715d1..bd754d2 100644 --- a/src/renderer/src/hooks/use-controled-mihomo-config.tsx +++ b/src/renderer/src/hooks/use-controled-mihomo-config.tsx @@ -15,9 +15,14 @@ export const useControledMihomoConfig = (listenUpdate = false): RetuenType => { ) const patchControledMihomoConfig = async (value: Partial): Promise => { - await patch(value) - mutateControledMihomoConfig() - window.electron.ipcRenderer.send('controledMihomoConfigUpdated') + try { + await patch(value) + } catch (e) { + alert(e) + } finally { + mutateControledMihomoConfig() + window.electron.ipcRenderer.send('controledMihomoConfigUpdated') + } } useEffect(() => { diff --git a/src/renderer/src/hooks/use-override-config.tsx b/src/renderer/src/hooks/use-override-config.tsx index 81239e9..587c822 100644 --- a/src/renderer/src/hooks/use-override-config.tsx +++ b/src/renderer/src/hooks/use-override-config.tsx @@ -22,23 +22,43 @@ export const useOverrideConfig = (): RetuenType => { ) const setOverrideConfig = async (config: IOverrideConfig): Promise => { - await set(config) - mutateOverrideConfig() + try { + await set(config) + } catch (e) { + alert(e) + } finally { + mutateOverrideConfig() + } } const addOverrideItem = async (item: Partial): Promise => { - await add(item) - mutateOverrideConfig() + try { + await add(item) + } catch (e) { + alert(e) + } finally { + mutateOverrideConfig() + } } const removeOverrideItem = async (id: string): Promise => { - await remove(id) - mutateOverrideConfig() + try { + await remove(id) + } catch (e) { + alert(e) + } finally { + mutateOverrideConfig() + } } const updateOverrideItem = async (item: IOverrideItem): Promise => { - await update(item) - mutateOverrideConfig() + try { + await update(item) + } catch (e) { + alert(e) + } finally { + mutateOverrideConfig() + } } return { diff --git a/src/renderer/src/hooks/use-profile-config.tsx b/src/renderer/src/hooks/use-profile-config.tsx index 62b851a..5b8ea70 100644 --- a/src/renderer/src/hooks/use-profile-config.tsx +++ b/src/renderer/src/hooks/use-profile-config.tsx @@ -25,28 +25,53 @@ export const useProfileConfig = (): RetuenType => { ) const setProfileConfig = async (config: IProfileConfig): Promise => { - await set(config) - mutateProfileConfig() + try { + await set(config) + } catch (e) { + alert(e) + } finally { + mutateProfileConfig() + } } const addProfileItem = async (item: Partial): Promise => { - await add(item) - mutateProfileConfig() + try { + await add(item) + } catch (e) { + alert(e) + } finally { + mutateProfileConfig() + } } const removeProfileItem = async (id: string): Promise => { - await remove(id) - mutateProfileConfig() + try { + await remove(id) + } catch (e) { + alert(e) + } finally { + mutateProfileConfig() + } } const updateProfileItem = async (item: IProfileItem): Promise => { - await update(item) - mutateProfileConfig() + try { + await update(item) + } catch (e) { + alert(e) + } finally { + mutateProfileConfig() + } } const changeCurrentProfile = async (id: string): Promise => { - await change(id) - mutateProfileConfig() + try { + await change(id) + } catch (e) { + alert(e) + } finally { + mutateProfileConfig() + } } useEffect(() => { diff --git a/src/renderer/src/pages/mihomo.tsx b/src/renderer/src/pages/mihomo.tsx index 309ecb2..7976b54 100644 --- a/src/renderer/src/pages/mihomo.tsx +++ b/src/renderer/src/pages/mihomo.tsx @@ -59,8 +59,14 @@ const Mihomo: React.FC = () => { size="sm" selectedKeys={new Set([core])} onSelectionChange={async (v) => { - await patchAppConfig({ core: v.currentKey as 'mihomo' | 'mihomo-alpha' }) - restartCore().then(() => PubSub.publish('mihomo-core-changed')) + try { + await patchAppConfig({ core: v.currentKey as 'mihomo' | 'mihomo-alpha' }) + await restartCore() + } catch (e) { + alert(e) + } finally { + PubSub.publish('mihomo-core-changed') + } }} > {CoreMap['mihomo']} diff --git a/src/renderer/src/pages/profiles.tsx b/src/renderer/src/pages/profiles.tsx index 766dc2c..9044095 100644 --- a/src/renderer/src/pages/profiles.tsx +++ b/src/renderer/src/pages/profiles.tsx @@ -33,13 +33,8 @@ const Profiles: React.FC = () => { const sensors = useSensors(useSensor(PointerSensor)) const handleImport = async (): Promise => { setImporting(true) - try { - await addProfileItem({ name: '', type: 'remote', url }) - } catch (e) { - alert(e) - } finally { - setImporting(false) - } + await addProfileItem({ name: '', type: 'remote', url }) + setImporting(false) } const pageRef = useRef(null) @@ -75,11 +70,11 @@ const Profiles: React.FC = () => { if (event.dataTransfer?.files) { const file = event.dataTransfer.files[0] if (file.name.endsWith('.yml') || file.name.endsWith('.yaml')) { - const content = await readTextFile(file.path) try { + const content = await readTextFile(file.path) await addProfileItem({ name: file.name, type: 'local', file: content }) - } finally { - setFileOver(false) + } catch (e) { + alert(e) } } else { alert('不支持的文件类型') @@ -135,14 +130,17 @@ const Profiles: React.FC = () => { size="sm" color="primary" className="ml-2" - onPress={() => { - getFilePath(['yml', 'yaml']).then(async (files) => { + onPress={async () => { + try { + const files = await getFilePath(['yml', 'yaml']) if (files?.length) { const content = await readTextFile(files[0]) const fileName = files[0].split('/').pop()?.split('\\').pop() await addProfileItem({ name: fileName, type: 'local', file: content }) } - }) + } catch (e) { + alert(e) + } }} > 打开 @@ -167,11 +165,7 @@ const Profiles: React.FC = () => { updateProfileItem={updateProfileItem} info={item} onClick={async () => { - try { - await changeCurrentProfile(item.id) - } catch (e) { - alert(e) - } + await changeCurrentProfile(item.id) }} /> ))} diff --git a/src/renderer/src/pages/proxies.tsx b/src/renderer/src/pages/proxies.tsx index 4ed8e09..6feb051 100644 --- a/src/renderer/src/pages/proxies.tsx +++ b/src/renderer/src/pages/proxies.tsx @@ -83,13 +83,12 @@ const Proxies: React.FC = () => { return { groupCounts, allProxies } }, [groups, isOpen, proxyDisplayOrder]) - const onChangeProxy = (group: string, proxy: string): void => { - mihomoChangeProxy(group, proxy).then(() => { - if (autoCloseConnection) { - mihomoCloseAllConnections() - } - mutate() - }) + const onChangeProxy = async (group: string, proxy: string): Promise => { + await mihomoChangeProxy(group, proxy) + if (autoCloseConnection) { + await mihomoCloseAllConnections() + } + mutate() } const onProxyDelay = async (proxy: string, url?: string): Promise => { @@ -152,7 +151,7 @@ const Proxies: React.FC = () => { style={{ height: 'calc(100vh - 50px)' }} groupCounts={groupCounts} groupContent={(index) => { - return ( + return groups[index] ? (
@@ -242,6 +241,8 @@ const Proxies: React.FC = () => {
+ ) : ( +
Never See This
) }} itemContent={(index, groupIndex) => { diff --git a/src/renderer/src/pages/settings.tsx b/src/renderer/src/pages/settings.tsx index 49d7929..9653730 100644 --- a/src/renderer/src/pages/settings.tsx +++ b/src/renderer/src/pages/settings.tsx @@ -86,13 +86,18 @@ const Settings: React.FC = () => { { - if (v) { - enableAutoRun() - } else { - disableAutoRun() + onValueChange={async (v) => { + try { + if (v) { + await enableAutoRun() + } else { + await disableAutoRun() + } + } catch (e) { + alert(e) + } finally { + mutate() } - mutate() }} /> @@ -196,17 +201,22 @@ const Settings: React.FC = () => {