mirror of
https://github.com/khairul169/code-share.git
synced 2025-04-29 00:59:37 +07:00
100 lines
2.7 KiB
TypeScript
100 lines
2.7 KiB
TypeScript
import {
|
|
Dialog,
|
|
DialogContent,
|
|
DialogHeader,
|
|
DialogTitle,
|
|
} from "../../../../components/ui/dialog";
|
|
import { UseDiscloseReturn } from "~/hooks/useDisclose";
|
|
import { BaseInput } from "../../../../components/ui/input";
|
|
import { Button } from "../../../../components/ui/button";
|
|
import { useForm } from "~/hooks/useForm";
|
|
import { z } from "zod";
|
|
import FormErrorMessage from "../../../../components/ui/form-error-message";
|
|
import trpc from "~/lib/trpc";
|
|
import type { FileSchema } from "~/server/db/schema/file";
|
|
import { useWatch } from "react-hook-form";
|
|
|
|
type Props = {
|
|
disclose: UseDiscloseReturn<CreateFileSchema>;
|
|
onSuccess?: (file: FileSchema, type: "create" | "update") => void;
|
|
};
|
|
|
|
const fileSchema = z.object({
|
|
id: z.number().optional(),
|
|
parentId: z.number().optional().nullable(),
|
|
filename: z.string().min(1),
|
|
isDirectory: z.boolean().optional(),
|
|
});
|
|
|
|
export type CreateFileSchema = z.infer<typeof fileSchema>;
|
|
|
|
const defaultValues: z.infer<typeof fileSchema> = {
|
|
filename: "",
|
|
};
|
|
|
|
const CreateFileDialog = ({ disclose, onSuccess }: Props) => {
|
|
const form = useForm(fileSchema, disclose.data || defaultValues);
|
|
const isDir = useWatch({ name: "isDirectory", control: form.control });
|
|
|
|
const create = trpc.file.create.useMutation({
|
|
onSuccess(data) {
|
|
if (onSuccess) onSuccess(data, "create");
|
|
disclose.onClose();
|
|
},
|
|
});
|
|
const update = trpc.file.update.useMutation({
|
|
onSuccess(data) {
|
|
if (onSuccess) onSuccess(data, "update");
|
|
disclose.onClose();
|
|
},
|
|
});
|
|
|
|
const onSubmit = form.handleSubmit((values) => {
|
|
if (update.isPending || create.isPending) {
|
|
return;
|
|
}
|
|
|
|
if (values.id) {
|
|
update.mutate({ id: values.id!, ...values });
|
|
} else {
|
|
create.mutate(values);
|
|
}
|
|
});
|
|
|
|
return (
|
|
<Dialog open={disclose.isOpen} onOpenChange={disclose.onChange}>
|
|
<DialogContent>
|
|
<DialogHeader>
|
|
<DialogTitle>
|
|
{[
|
|
!disclose.data?.id ? "Create" : "Rename",
|
|
isDir ? "Directory" : "File",
|
|
].join(" ")}
|
|
</DialogTitle>
|
|
</DialogHeader>
|
|
|
|
<form onSubmit={onSubmit}>
|
|
<FormErrorMessage form={form} />
|
|
|
|
<BaseInput
|
|
placeholder={isDir ? "Directory Name" : "Filename"}
|
|
autoFocus
|
|
{...form.register("filename")}
|
|
/>
|
|
|
|
<div className="flex justify-end gap-4 mt-4">
|
|
<Button size="sm" variant="ghost" onClick={disclose.onClose}>
|
|
Cancel
|
|
</Button>
|
|
<Button type="submit" size="sm">
|
|
Submit
|
|
</Button>
|
|
</div>
|
|
</form>
|
|
</DialogContent>
|
|
</Dialog>
|
|
);
|
|
};
|
|
|
|
export default CreateFileDialog;
|