增加翻译器自动保存到文件夹功能
All checks were successful
continuous-integration/drone/push Build is passing

This commit is contained in:
2025-11-17 09:00:24 +08:00
parent 98c771cab4
commit 22a0cf46fb
3 changed files with 49 additions and 9 deletions

View File

@@ -3,6 +3,7 @@ import { useEffect, useState } from "react";
import { folder } from "../../../../generated/prisma/browser";
import { getFoldersByOwner } from "@/lib/services/folderService";
import LightButton from "@/components/buttons/LightButton";
import { Folder } from "lucide-react";
interface FolderSelectorProps {
setSelectedFolderId: (id: number) => void;
@@ -31,11 +32,21 @@ const FolderSelector: React.FC<FolderSelectorProps> = ({
<Container className="p-6">
{(loading && <p>Loading...</p>) ||
(folders.length > 0 && (
<ul>
<>
<h1>Select a Folder</h1>
<div className="m-2 border-gray-200 border rounded-2xl max-h-96 overflow-y-auto">
{folders.map((folder) => (
<li key={folder.id}>{folder.name}</li>
<button
className="p-2 w-full flex hover:bg-gray-50 gap-2"
key={folder.id}
onClick={() => setSelectedFolderId(folder.id)}
>
<Folder />
{folder.id}. {folder.name}
</button>
))}
</ul>
</div>
</>
)) || <p>No folders found</p>}
<LightButton onClick={cancel}>Cancel</LightButton>
</Container>

View File

@@ -22,6 +22,7 @@ import {
import { toast } from "sonner";
import FolderSelector from "./FolderSelector";
import { useSession } from "next-auth/react";
import { createTextPair } from "@/lib/services/textPairService";
export default function TranslatorPage() {
const t = useTranslations("translator");
@@ -106,6 +107,33 @@ export default function TranslatorPage() {
locale2: llmres.locale2,
}),
);
if (autoSave && autoSaveFolderId) {
createTextPair({
text1: llmres.text1,
text2: llmres.text2,
locale1: llmres.locale1,
locale2: llmres.locale2,
folders: {
connect: {
id: autoSaveFolderId,
},
},
})
.then(() => {
toast.success(
llmres.text1 + "保存到文件夹" + autoSaveFolderId + "成功",
);
})
.catch((error) => {
toast.error(
llmres.text1 +
"保存到文件夹" +
autoSaveFolderId +
"失败:" +
error.message,
);
});
}
historyUpdated = true;
}
};
@@ -281,11 +309,13 @@ export default function TranslatorPage() {
toast.warning("Please login to enable auto-save");
return;
}
if (checked === false) setAutoSaveFolderId(null);
setAutoSave(checked);
}}
className="mr-2"
/>
{t("autoSave")}
{autoSaveFolderId ? ` (${autoSaveFolderId})` : ""}
</label>
</div>

View File

@@ -67,8 +67,7 @@ export const getLocalStorageOperator = <T extends z.ZodTypeAny>(
return {
get: (): z.infer<T> => {
try {
if (!localStorage) return [];
const item = localStorage.getItem(key);
const item = globalThis.localStorage.getItem(key);
if (!item) return [];
@@ -90,8 +89,8 @@ export const getLocalStorageOperator = <T extends z.ZodTypeAny>(
}
},
set: (data: z.infer<T>) => {
if (!localStorage) return;
localStorage.setItem(key, JSON.stringify(data));
if (!globalThis.localStorage) return;
globalThis.localStorage.setItem(key, JSON.stringify(data));
return data;
},
};