diff --git a/src/components/window-control.tsx b/src/components/layout-control.tsx similarity index 92% rename from src/components/window-control.tsx rename to src/components/layout-control.tsx index 4b5e470aa99987d95a1e277742812a95a9e1e944..7756906e60b453b365a00163cd2b3a97aababee7 100644 --- a/src/components/window-control.tsx +++ b/src/components/layout-control.tsx @@ -6,7 +6,7 @@ import { HorizontalRuleRounded, } from "@mui/icons-material"; -const WindowControl = () => { +const LayoutControl = () => { return ( <> <Button @@ -36,4 +36,4 @@ const WindowControl = () => { ); }; -export default WindowControl; +export default LayoutControl; diff --git a/src/components/notice.tsx b/src/components/notice.tsx index eedc7a549eaac7bc00e8582bc266d4f9f145112c..7729ba34d9b8b7fce9a90be66d26e178449fd753 100644 --- a/src/components/notice.tsx +++ b/src/components/notice.tsx @@ -30,7 +30,11 @@ const NoticeInner = (props: InnerProps) => { {type === "error" && <ErrorRounded color="error" />} {type === "success" && <CheckCircleRounded color="success" />} - <Typography sx={{ ml: 1 }}>{message}</Typography> + <Typography + sx={{ ml: 1, wordWrap: "break-word", wordBreak: "break-all" }} + > + {message} + </Typography> </Box> ); diff --git a/src/components/profile-item.tsx b/src/components/profile-item.tsx index 6f1f70f7bd999b3554837376cd2684b3ae61a2a1..c83dcc1b02683d885d94149db8c1ad9d54fef02c 100644 --- a/src/components/profile-item.tsx +++ b/src/components/profile-item.tsx @@ -1,4 +1,4 @@ -import React, { useState } from "react"; +import React, { useRef, useState } from "react"; import dayjs from "dayjs"; import { alpha, @@ -15,6 +15,7 @@ import { useSWRConfig } from "swr"; import { RefreshRounded } from "@mui/icons-material"; import { CmdType } from "../services/types"; import { updateProfile, deleteProfile } from "../services/cmds"; +import Notice from "./notice"; import parseTraffic from "../utils/parse-traffic"; import relativeTime from "dayjs/plugin/relativeTime"; @@ -32,8 +33,8 @@ const Wrapper = styled(Box)(({ theme }) => ({ })); const round = keyframes` -from { transform: rotate(0deg); } -to { transform: rotate(360deg); } + from { transform: rotate(0deg); } + to { transform: rotate(360deg); } `; interface Props { @@ -43,7 +44,7 @@ interface Props { onClick: () => void; } -const ProfileItemComp: React.FC<Props> = (props) => { +const ProfileItem: React.FC<Props> = (props) => { const { index, selected, itemData, onClick } = props; const { mutate } = useSWRConfig(); @@ -65,20 +66,25 @@ const ProfileItemComp: React.FC<Props> = (props) => { try { await updateProfile(index); mutate("getProfiles"); - } catch (err) { - console.error(err); + } catch (err: any) { + Notice.error(err.toString()); } finally { setLoading(false); } }; + const deleteRef = useRef(false); const onDelete = async () => { setAnchorEl(null); + if (deleteRef.current) return; + deleteRef.current = true; try { await deleteProfile(index); mutate("getProfiles"); - } catch (err) { - console.error(err); + } catch (err: any) { + Notice.error(err.toString()); + } finally { + deleteRef.current = false; } }; @@ -198,7 +204,6 @@ const ProfileItemComp: React.FC<Props> = (props) => { > <MenuItem onClick={onUpdate}>Update</MenuItem> <MenuItem onClick={onDelete}>Delete</MenuItem> - {/* <MenuItem>Update(proxy)</MenuItem> */} </Menu> </> ); @@ -216,4 +221,4 @@ function parseExpire(expire?: number) { return dayjs(expire * 1000).format("YYYY-MM-DD"); } -export default ProfileItemComp; +export default ProfileItem; diff --git a/src/components/guard-state.tsx b/src/components/setting/guard-state.tsx similarity index 97% rename from src/components/guard-state.tsx rename to src/components/setting/guard-state.tsx index f17fd51634af8d3b8f03718e7b8bd5551f54e2ca..b2cff75574acd8f6098dda9755751869daf33d20 100644 --- a/src/components/guard-state.tsx +++ b/src/components/setting/guard-state.tsx @@ -1,5 +1,5 @@ import { cloneElement, isValidElement, ReactNode, useRef } from "react"; -import noop from "../utils/noop"; +import noop from "../../utils/noop"; interface Props<Value> { value?: Value; diff --git a/src/components/palette-switch.tsx b/src/components/setting/palette-switch.tsx similarity index 100% rename from src/components/palette-switch.tsx rename to src/components/setting/palette-switch.tsx diff --git a/src/components/setting/setting-clash.tsx b/src/components/setting/setting-clash.tsx index 97d5b8b554d60c239384e520b6fa42b8a9855d68..766d3e355cf4db806e3173b021feffae59787a4d 100644 --- a/src/components/setting/setting-clash.tsx +++ b/src/components/setting/setting-clash.tsx @@ -10,7 +10,7 @@ import { getClashConfig, updateConfigs } from "../../services/api"; import { SettingList, SettingItem } from "./setting"; import { patchClashConfig } from "../../services/cmds"; import { ApiType } from "../../services/types"; -import GuardState from "../guard-state"; +import GuardState from "./guard-state"; interface Props { onError?: (err: Error) => void; diff --git a/src/components/setting/setting-verge.tsx b/src/components/setting/setting-verge.tsx index e3d51bb655094ca55d95d8d26463e873098ae27e..ceb621ae16177d1cd9e1db9944d57184f3ff2784 100644 --- a/src/components/setting/setting-verge.tsx +++ b/src/components/setting/setting-verge.tsx @@ -4,9 +4,9 @@ import { getVergeConfig, patchVergeConfig } from "../../services/cmds"; import { SettingList, SettingItem } from "./setting"; import { CmdType } from "../../services/types"; import { version } from "../../../package.json"; -import GuardState from "../guard-state"; -import PaletteSwitch from "../palette-switch"; -import SysproxyTooltip from "../sysproxy-tooltip"; +import GuardState from "./guard-state"; +import PaletteSwitch from "./palette-switch"; +import SysproxyTooltip from "./sysproxy-tooltip"; interface Props { onError?: (err: Error) => void; diff --git a/src/components/sysproxy-tooltip.tsx b/src/components/setting/sysproxy-tooltip.tsx similarity index 94% rename from src/components/sysproxy-tooltip.tsx rename to src/components/setting/sysproxy-tooltip.tsx index 8654a3d2f1dac10c1b06e7a9a4bf553f258f9877..08b56332b67362ae81c71388109129d2de28710c 100644 --- a/src/components/sysproxy-tooltip.tsx +++ b/src/components/setting/sysproxy-tooltip.tsx @@ -1,7 +1,7 @@ import { useEffect, useState } from "react"; import { InfoRounded } from "@mui/icons-material"; import { ClickAwayListener, Tooltip } from "@mui/material"; -import { getSystemProxy } from "../services/cmds"; +import { getSystemProxy } from "../../services/cmds"; const SysproxyTooltip = () => { const [open, setOpen] = useState(false); @@ -9,7 +9,6 @@ const SysproxyTooltip = () => { const onShow = async () => { const data = await getSystemProxy(); - console.log(data); setInfo(data ?? {}); setOpen(true); }; diff --git a/src/pages/_layout.tsx b/src/pages/_layout.tsx index 16e58395dd09ce5d6a15940f32c29c5b8e470b4c..ed9b2e79f026c44c2a09e3c32715f27462764368 100644 --- a/src/pages/_layout.tsx +++ b/src/pages/_layout.tsx @@ -11,7 +11,7 @@ import LogoSvg from "../assets/image/logo.svg"; import Traffic from "../components/traffic"; import LayoutItem from "../components/layout-item"; import UpdateButton from "../components/update-button"; -import WindowControl from "../components/window-control"; +import LayoutControl from "../components/layout-control"; const Layout = () => { const [mode, setMode] = useRecoilState(atomPaletteMode); @@ -92,7 +92,7 @@ const Layout = () => { <div className="layout__right" data-windrag> <div className="the-bar"> - <WindowControl /> + <LayoutControl /> </div> <div className="the-content" data-windrag> diff --git a/src/pages/profiles.tsx b/src/pages/profiles.tsx index cbf8a3f0fe87085758e59915471b793fd221776d..bef83145a58b3d31469a36c9c27b509aed6cdf0c 100644 --- a/src/pages/profiles.tsx +++ b/src/pages/profiles.tsx @@ -11,7 +11,7 @@ import { getProxies, updateProxy } from "../services/api"; import noop from "../utils/noop"; import Notice from "../components/notice"; import BasePage from "../components/base-page"; -import ProfileItemComp from "../components/profile-item"; +import ProfileItem from "../components/profile-item"; const ProfilePage = () => { const [url, setUrl] = useState(""); @@ -121,7 +121,7 @@ const ProfilePage = () => { <Grid container spacing={3}> {profiles?.items?.map((item, idx) => ( <Grid item xs={12} sm={6} key={item.file}> - <ProfileItemComp + <ProfileItem index={idx} selected={profiles.current === idx} itemData={item}