|
@@ -1,4 +1,4 @@
|
|
-import React, { useState } from "react";
|
|
|
|
|
|
+import React, { useRef, useState } from "react";
|
|
import dayjs from "dayjs";
|
|
import dayjs from "dayjs";
|
|
import {
|
|
import {
|
|
alpha,
|
|
alpha,
|
|
@@ -15,6 +15,7 @@ import { useSWRConfig } from "swr";
|
|
import { RefreshRounded } from "@mui/icons-material";
|
|
import { RefreshRounded } from "@mui/icons-material";
|
|
import { CmdType } from "../services/types";
|
|
import { CmdType } from "../services/types";
|
|
import { updateProfile, deleteProfile } from "../services/cmds";
|
|
import { updateProfile, deleteProfile } from "../services/cmds";
|
|
|
|
+import Notice from "./notice";
|
|
import parseTraffic from "../utils/parse-traffic";
|
|
import parseTraffic from "../utils/parse-traffic";
|
|
import relativeTime from "dayjs/plugin/relativeTime";
|
|
import relativeTime from "dayjs/plugin/relativeTime";
|
|
|
|
|
|
@@ -32,8 +33,8 @@ const Wrapper = styled(Box)(({ theme }) => ({
|
|
}));
|
|
}));
|
|
|
|
|
|
const round = keyframes`
|
|
const round = keyframes`
|
|
-from { transform: rotate(0deg); }
|
|
|
|
-to { transform: rotate(360deg); }
|
|
|
|
|
|
+ from { transform: rotate(0deg); }
|
|
|
|
+ to { transform: rotate(360deg); }
|
|
`;
|
|
`;
|
|
|
|
|
|
interface Props {
|
|
interface Props {
|
|
@@ -43,7 +44,7 @@ interface Props {
|
|
onClick: () => void;
|
|
onClick: () => void;
|
|
}
|
|
}
|
|
|
|
|
|
-const ProfileItemComp: React.FC<Props> = (props) => {
|
|
|
|
|
|
+const ProfileItem: React.FC<Props> = (props) => {
|
|
const { index, selected, itemData, onClick } = props;
|
|
const { index, selected, itemData, onClick } = props;
|
|
|
|
|
|
const { mutate } = useSWRConfig();
|
|
const { mutate } = useSWRConfig();
|
|
@@ -65,20 +66,25 @@ const ProfileItemComp: React.FC<Props> = (props) => {
|
|
try {
|
|
try {
|
|
await updateProfile(index);
|
|
await updateProfile(index);
|
|
mutate("getProfiles");
|
|
mutate("getProfiles");
|
|
- } catch (err) {
|
|
|
|
- console.error(err);
|
|
|
|
|
|
+ } catch (err: any) {
|
|
|
|
+ Notice.error(err.toString());
|
|
} finally {
|
|
} finally {
|
|
setLoading(false);
|
|
setLoading(false);
|
|
}
|
|
}
|
|
};
|
|
};
|
|
|
|
|
|
|
|
+ const deleteRef = useRef(false);
|
|
const onDelete = async () => {
|
|
const onDelete = async () => {
|
|
setAnchorEl(null);
|
|
setAnchorEl(null);
|
|
|
|
+ if (deleteRef.current) return;
|
|
|
|
+ deleteRef.current = true;
|
|
try {
|
|
try {
|
|
await deleteProfile(index);
|
|
await deleteProfile(index);
|
|
mutate("getProfiles");
|
|
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={onUpdate}>Update</MenuItem>
|
|
<MenuItem onClick={onDelete}>Delete</MenuItem>
|
|
<MenuItem onClick={onDelete}>Delete</MenuItem>
|
|
- {/* <MenuItem>Update(proxy)</MenuItem> */}
|
|
|
|
</Menu>
|
|
</Menu>
|
|
</>
|
|
</>
|
|
);
|
|
);
|
|
@@ -216,4 +221,4 @@ function parseExpire(expire?: number) {
|
|
return dayjs(expire * 1000).format("YYYY-MM-DD");
|
|
return dayjs(expire * 1000).format("YYYY-MM-DD");
|
|
}
|
|
}
|
|
|
|
|
|
-export default ProfileItemComp;
|
|
|
|
|
|
+export default ProfileItem;
|