Files
senmesh-zc/src/routes/(user)/my/-components/EditFileDialog.tsx

128 lines
3.0 KiB
TypeScript
Raw Normal View History

import { Button } from "@/components/ui/button";
import {
Dialog,
DialogClose,
DialogContent,
DialogFooter,
DialogHeader,
DialogTitle,
} from "@/components/ui/dialog";
import {
FormField,
FormItem,
FormControl,
FormMessage,
Form,
} from "@/components/ui/form";
import { Input } from "@/components/ui/input";
import { useForm } from "react-hook-form";
import { zodResolver } from "@hookform/resolvers/zod";
import { z } from "zod";
import { Spinner } from "@/components/ui/spinner";
import { useEffect } from "react";
import { useSaveFile } from "../-hooks/useSaveFile";
import { FileType } from "@/apis/file";
const formSchema = z.object({
fileName: z
.string()
.min(1, {
message: "目录至少1个字符",
})
.max(32, {
message: "目录最多32个字符",
})
.nonempty({
message: "目录不能为空",
}),
});
type EditFileDialogProps = {
open: boolean;
setOpen: (open: boolean) => void;
data?: any;
parentId?: number;
refetch?: () => void;
};
export function EditFileDialog({
open,
setOpen,
data,
parentId,
refetch,
}: EditFileDialogProps) {
const form = useForm<z.infer<typeof formSchema>>({
resolver: zodResolver(formSchema),
defaultValues: {
fileName: "",
},
});
const { save, saveIsPending } = useSaveFile({
onSuccess: () => {
refetch?.();
setOpen(false);
},
});
const onSubmit = (values: z.infer<typeof formSchema>) => {
save({
...(data || {}),
...values,
parentId,
});
};
useEffect(() => {
if (open) {
form.reset({ fileName: data?.fileName || "" });
}
}, [open, data]);
return (
<Dialog open={open} onOpenChange={setOpen}>
<DialogContent className="w-[400px]">
<DialogHeader>
<DialogTitle>
{data?.fileType === FileType.DIRECTORY && !data?.id
? "创建目录"
: "重命名"}
</DialogTitle>
</DialogHeader>
<Form {...form}>
<form onSubmit={form.handleSubmit(onSubmit)} className="space-y-4">
<FormField
control={form.control}
name="fileName"
render={({ field }) => (
<FormItem>
<FormControl>
<Input
placeholder={
data?.fileType === FileType.DIRECTORY
? "请输入目录名"
: "请输入文件名"
}
{...field}
/>
</FormControl>
<FormMessage />
</FormItem>
)}
/>
<DialogFooter>
<DialogClose asChild>
<Button variant="outline">取消</Button>
</DialogClose>
<Button type="submit" disabled={saveIsPending}>
{saveIsPending && <Spinner />}确定
</Button>
</DialogFooter>
</form>
</Form>
</DialogContent>
</Dialog>
);
}