Merge branch 'main' into feat/proxy-server

This commit is contained in:
YoVinchen
2025-12-04 22:39:50 +08:00
2 changed files with 51 additions and 5 deletions
+14 -5
View File
@@ -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) => {
+37
View File
@@ -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)}`;
}