mirror of
https://github.com/farion1231/cc-switch.git
synced 2026-07-24 12:44:18 +08:00
Merge branch 'main' into feat/proxy-server
This commit is contained in:
@@ -4,6 +4,7 @@ import { toast } from "sonner";
|
||||
import { providersApi, settingsApi, type AppId } from "@/lib/api";
|
||||
import type { Provider, Settings } from "@/types";
|
||||
import { extractErrorMessage } from "@/utils/errorUtils";
|
||||
import { generateUUID } from "@/utils/uuid";
|
||||
|
||||
export const useAddProviderMutation = (appId: AppId) => {
|
||||
const queryClient = useQueryClient();
|
||||
@@ -13,7 +14,7 @@ export const useAddProviderMutation = (appId: AppId) => {
|
||||
mutationFn: async (providerInput: Omit<Provider, "id">) => {
|
||||
const newProvider: Provider = {
|
||||
...providerInput,
|
||||
id: crypto.randomUUID(),
|
||||
id: generateUUID(),
|
||||
createdAt: Date.now(),
|
||||
};
|
||||
await providersApi.add(newProvider, appId);
|
||||
@@ -35,7 +36,9 @@ export const useAddProviderMutation = (appId: AppId) => {
|
||||
toast.success(
|
||||
t("notifications.providerAdded", {
|
||||
defaultValue: "供应商已添加",
|
||||
}),
|
||||
}), {
|
||||
closeButton: true
|
||||
}
|
||||
);
|
||||
},
|
||||
onError: (error: Error) => {
|
||||
@@ -63,7 +66,9 @@ export const useUpdateProviderMutation = (appId: AppId) => {
|
||||
toast.success(
|
||||
t("notifications.updateSuccess", {
|
||||
defaultValue: "供应商更新成功",
|
||||
}),
|
||||
}), {
|
||||
closeButton: true
|
||||
}
|
||||
);
|
||||
},
|
||||
onError: (error: Error) => {
|
||||
@@ -101,7 +106,9 @@ export const useDeleteProviderMutation = (appId: AppId) => {
|
||||
toast.success(
|
||||
t("notifications.deleteSuccess", {
|
||||
defaultValue: "供应商已删除",
|
||||
}),
|
||||
}), {
|
||||
closeButton: true
|
||||
}
|
||||
);
|
||||
},
|
||||
onError: (error: Error) => {
|
||||
@@ -140,7 +147,9 @@ export const useSwitchProviderMutation = (appId: AppId) => {
|
||||
t("notifications.switchSuccess", {
|
||||
defaultValue: "切换供应商成功",
|
||||
appName: t(`apps.${appId}`, { defaultValue: appId }),
|
||||
}),
|
||||
}), {
|
||||
closeButton: true
|
||||
}
|
||||
);
|
||||
},
|
||||
onError: (error: Error) => {
|
||||
|
||||
@@ -0,0 +1,37 @@
|
||||
/**
|
||||
* 生成 UUID v4
|
||||
*
|
||||
* 优先使用 crypto.randomUUID(),不可用时使用 crypto.getRandomValues() 实现
|
||||
*
|
||||
* 兼容性:
|
||||
* - crypto.randomUUID(): Chrome 92+, Safari 15.4+, Firefox 95+
|
||||
* - crypto.getRandomValues(): Chrome 11+, Safari 5+, Firefox 21+
|
||||
*/
|
||||
export function generateUUID(): string {
|
||||
const cryptoApi = globalThis.crypto;
|
||||
|
||||
// 优先使用原生 API
|
||||
if (typeof cryptoApi?.randomUUID === "function") {
|
||||
return cryptoApi.randomUUID();
|
||||
}
|
||||
|
||||
// Fallback: 使用 crypto.getRandomValues 实现 UUID v4
|
||||
if (!cryptoApi?.getRandomValues) {
|
||||
throw new Error(
|
||||
"crypto API not available - please update your operating system",
|
||||
);
|
||||
}
|
||||
|
||||
const bytes = new Uint8Array(16);
|
||||
cryptoApi.getRandomValues(bytes);
|
||||
|
||||
// 设置版本 (4) 和变体 (RFC 4122)
|
||||
bytes[6] = (bytes[6] & 0x0f) | 0x40;
|
||||
bytes[8] = (bytes[8] & 0x3f) | 0x80;
|
||||
|
||||
const hex = Array.from(bytes)
|
||||
.map((b) => b.toString(16).padStart(2, "0"))
|
||||
.join("");
|
||||
|
||||
return `${hex.slice(0, 8)}-${hex.slice(8, 12)}-${hex.slice(12, 16)}-${hex.slice(16, 20)}-${hex.slice(20)}`;
|
||||
}
|
||||
Reference in New Issue
Block a user