diff options
Diffstat (limited to 'lib/payment-terms/table/payment-terms-edit-sheet.tsx')
| -rw-r--r-- | lib/payment-terms/table/payment-terms-edit-sheet.tsx | 59 |
1 files changed, 41 insertions, 18 deletions
diff --git a/lib/payment-terms/table/payment-terms-edit-sheet.tsx b/lib/payment-terms/table/payment-terms-edit-sheet.tsx index b0d105bc..48d79c21 100644 --- a/lib/payment-terms/table/payment-terms-edit-sheet.tsx +++ b/lib/payment-terms/table/payment-terms-edit-sheet.tsx @@ -5,6 +5,7 @@ import { zodResolver } from "@hookform/resolvers/zod" import { useForm } from "react-hook-form" import { toast } from "sonner" import * as z from "zod" +import { Loader } from "lucide-react" import { Button } from "@/components/ui/button" import { @@ -17,8 +18,10 @@ import { } from "@/components/ui/form" import { Sheet, + SheetClose, SheetContent, SheetDescription, + SheetFooter, SheetHeader, SheetTitle, } from "@/components/ui/sheet" @@ -38,7 +41,7 @@ type UpdatePaymentTermSchema = z.infer<typeof updatePaymentTermSchema> interface PaymentTermsEditSheetProps { open: boolean onOpenChange: (open: boolean) => void - data: typeof paymentTerms.$inferSelect + data: typeof paymentTerms.$inferSelect | null onSuccess: () => void } @@ -48,12 +51,14 @@ export function PaymentTermsEditSheet({ data, onSuccess, }: PaymentTermsEditSheetProps) { + const [isUpdatePending, startUpdateTransition] = React.useTransition() + const form = useForm<UpdatePaymentTermSchema>({ resolver: zodResolver(updatePaymentTermSchema), defaultValues: { - code: data.code, - description: data.description, - isActive: data.isActive, + code: data?.code ?? "", + description: data?.description ?? "", + isActive: data?.isActive ?? true, }, mode: "onChange" }) @@ -69,14 +74,19 @@ export function PaymentTermsEditSheet({ }, [data, form]) async function onSubmit(input: UpdatePaymentTermSchema) { - try { - await updatePaymentTerm(data.code, input) - toast.success("수정이 완료되었습니다.") - onSuccess() - onOpenChange(false) - } catch { - toast.error("수정 중 오류가 발생했습니다.") - } + if (!data) return + + startUpdateTransition(async () => { + try { + await updatePaymentTerm(data.code, input) + toast.success("결제 조건이 성공적으로 수정되었습니다.") + onSuccess() + onOpenChange(false) + } catch (error) { + console.error("Update error:", error) + toast.error("결제 조건 수정 중 오류가 발생했습니다.") + } + }) } return ( @@ -97,7 +107,7 @@ export function PaymentTermsEditSheet({ <FormItem> <FormLabel>코드</FormLabel> <FormControl> - <Input {...field} disabled /> + <Input {...field} /> </FormControl> <FormMessage /> </FormItem> @@ -133,12 +143,25 @@ export function PaymentTermsEditSheet({ </FormItem> )} /> - <div className="flex justify-end space-x-2"> - <Button type="button" variant="outline" onClick={() => onOpenChange(false)}> - 취소 + <SheetFooter className="gap-2 pt-2 sm:space-x-0"> + <SheetClose asChild> + <Button type="button" variant="outline"> + 취소 + </Button> + </SheetClose> + <Button + type="submit" + disabled={isUpdatePending || !form.formState.isValid} + > + {isUpdatePending && ( + <Loader + className="mr-2 size-4 animate-spin" + aria-hidden="true" + /> + )} + 저장 </Button> - <Button type="submit">저장</Button> - </div> + </SheetFooter> </form> </Form> </SheetContent> |
