增加翻译器自动保存到文件夹功能
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 { folder } from "../../../../generated/prisma/browser";
import { getFoldersByOwner } from "@/lib/services/folderService"; import { getFoldersByOwner } from "@/lib/services/folderService";
import LightButton from "@/components/buttons/LightButton"; import LightButton from "@/components/buttons/LightButton";
import { Folder } from "lucide-react";
interface FolderSelectorProps { interface FolderSelectorProps {
setSelectedFolderId: (id: number) => void; setSelectedFolderId: (id: number) => void;
@@ -31,11 +32,21 @@ const FolderSelector: React.FC<FolderSelectorProps> = ({
<Container className="p-6"> <Container className="p-6">
{(loading && <p>Loading...</p>) || {(loading && <p>Loading...</p>) ||
(folders.length > 0 && ( (folders.length > 0 && (
<ul> <>
{folders.map((folder) => ( <h1>Select a Folder</h1>
<li key={folder.id}>{folder.name}</li> <div className="m-2 border-gray-200 border rounded-2xl max-h-96 overflow-y-auto">
))} {folders.map((folder) => (
</ul> <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>
))}
</div>
</>
)) || <p>No folders found</p>} )) || <p>No folders found</p>}
<LightButton onClick={cancel}>Cancel</LightButton> <LightButton onClick={cancel}>Cancel</LightButton>
</Container> </Container>

View File

@@ -22,6 +22,7 @@ import {
import { toast } from "sonner"; import { toast } from "sonner";
import FolderSelector from "./FolderSelector"; import FolderSelector from "./FolderSelector";
import { useSession } from "next-auth/react"; import { useSession } from "next-auth/react";
import { createTextPair } from "@/lib/services/textPairService";
export default function TranslatorPage() { export default function TranslatorPage() {
const t = useTranslations("translator"); const t = useTranslations("translator");
@@ -106,6 +107,33 @@ export default function TranslatorPage() {
locale2: llmres.locale2, 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; historyUpdated = true;
} }
}; };
@@ -281,11 +309,13 @@ export default function TranslatorPage() {
toast.warning("Please login to enable auto-save"); toast.warning("Please login to enable auto-save");
return; return;
} }
if (checked === false) setAutoSaveFolderId(null);
setAutoSave(checked); setAutoSave(checked);
}} }}
className="mr-2" className="mr-2"
/> />
{t("autoSave")} {t("autoSave")}
{autoSaveFolderId ? ` (${autoSaveFolderId})` : ""}
</label> </label>
</div> </div>

View File

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