Skip to content

Commit 7199ecb

Browse files
committed
Fix update button functionality and center it in dialog footer
1 parent b42401c commit 7199ecb

2 files changed

Lines changed: 45 additions & 23 deletions

File tree

components/edit-car-button.tsx

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
"use client"
22

3-
import { useState } from "react"
3+
import { useState, useRef } from "react"
44
import { Pencil } from "lucide-react"
55
import { Button } from "@/components/ui/button"
66
import {
@@ -11,7 +11,7 @@ import {
1111
DialogTrigger,
1212
DialogFooter,
1313
} from "@/components/ui/dialog"
14-
import { EditCarForm } from "./edit-car-form"
14+
import { EditCarForm, EditCarFormRef } from "./edit-car-form"
1515

1616
interface EditCarButtonProps {
1717
car: {
@@ -27,6 +27,7 @@ interface EditCarButtonProps {
2727
export function EditCarButton({ car }: EditCarButtonProps) {
2828
const [open, setOpen] = useState(false)
2929
const [imageUrl, setImageUrl] = useState<string | null>(car.imageUrl)
30+
const formRef = useRef<EditCarFormRef>(null)
3031

3132
const handleOpenChange = (newOpen: boolean) => {
3233
setOpen(newOpen)
@@ -35,6 +36,10 @@ export function EditCarButton({ car }: EditCarButtonProps) {
3536
}
3637
}
3738

39+
const handleSubmit = () => {
40+
formRef.current?.submit()
41+
}
42+
3843
return (
3944
<Dialog open={open} onOpenChange={handleOpenChange}>
4045
<DialogTrigger asChild>
@@ -48,13 +53,14 @@ export function EditCarButton({ car }: EditCarButtonProps) {
4853
<DialogTitle>Edit Car</DialogTitle>
4954
</DialogHeader>
5055
<EditCarForm
56+
ref={formRef}
5157
car={car}
5258
formId="edit-car-form"
5359
onSuccess={() => setOpen(false)}
5460
onImageUrlChange={setImageUrl}
5561
/>
56-
<DialogFooter>
57-
<Button type="submit" form="edit-car-form" disabled={!imageUrl}>
62+
<DialogFooter className="justify-center">
63+
<Button onClick={handleSubmit} disabled={!imageUrl}>
5864
Update Car
5965
</Button>
6066
</DialogFooter>

components/edit-car-form.tsx

Lines changed: 35 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import { zodResolver } from "@hookform/resolvers/zod"
44
import { useForm } from "react-hook-form"
55
import { useRouter } from "next/navigation"
66
import * as z from "zod"
7-
import { useState, useEffect } from "react"
7+
import { useState, useEffect, useImperativeHandle, forwardRef } from "react"
88
import Image from "next/image"
99
import { X } from "lucide-react"
1010

@@ -36,25 +36,38 @@ interface EditCarFormProps {
3636
onImageUrlChange?: (url: string | null) => void
3737
}
3838

39-
export function EditCarForm({ car, onSuccess, formId, onImageUrlChange }: EditCarFormProps) {
40-
const router = useRouter()
41-
const [isImageUploaded, setIsImageUploaded] = useState(false)
42-
const [imageUrl, setImageUrl] = useState<string | null>(car.imageUrl)
39+
export interface EditCarFormRef {
40+
submit: () => void
41+
imageUrl: string | null
42+
}
4343

44-
const updateImageUrl = (url: string | null) => {
45-
setImageUrl(url)
46-
onImageUrlChange?.(url)
47-
}
44+
export const EditCarForm = forwardRef<EditCarFormRef, EditCarFormProps>(
45+
({ car, onSuccess, formId, onImageUrlChange }, ref) => {
46+
const router = useRouter()
47+
const [isImageUploaded, setIsImageUploaded] = useState(false)
48+
const [imageUrl, setImageUrl] = useState<string | null>(car.imageUrl)
49+
50+
const updateImageUrl = (url: string | null) => {
51+
setImageUrl(url)
52+
onImageUrlChange?.(url)
53+
}
4854

49-
const form = useForm<FormValues>({
50-
resolver: zodResolver(formSchema),
51-
defaultValues: {
52-
manufacturer: car.manufacturer || "",
53-
model: car.model || "",
54-
points: car.points || 0,
55-
episode: car.episode || 1,
56-
},
57-
})
55+
const form = useForm<FormValues>({
56+
resolver: zodResolver(formSchema),
57+
defaultValues: {
58+
manufacturer: car.manufacturer || "",
59+
model: car.model || "",
60+
points: car.points || 0,
61+
episode: car.episode || 1,
62+
},
63+
})
64+
65+
useImperativeHandle(ref, () => ({
66+
submit: () => {
67+
form.handleSubmit(onSubmit)()
68+
},
69+
imageUrl,
70+
}))
5871

5972
useEffect(() => {
6073
if (car.imageUrl) {
@@ -202,6 +215,9 @@ export function EditCarForm({ car, onSuccess, formId, onImageUrlChange }: EditCa
202215
</form>
203216
</Form>
204217
)
205-
}
218+
}
219+
)
220+
221+
EditCarForm.displayName = "EditCarForm"
206222

207223

0 commit comments

Comments
 (0)