TanStackIntermediate
Dialog Modal — Create ও Edit
shadcn Dialog দিয়ে state management — এক dialog-ই দুই মোড — বাংলায়।
6টি অংশবাংলা ভাষায়
আমরা create ও edit-এর জন্য একটি Dialog-ই রাখব এবং mode-নির্বাহ করব state দিয়ে। অথবা দুইটি আলাদা dialog-ও চলবে — দুটিই ঠিক। এক dialog-এর পদ্ধতি দেখি।
state managementtsx
tsx
const [dialogOpen, setDialogOpen] = useState(false);
const [editingProduct, setEditingProduct] = useState<Product | null>(null);
// create button
<Button onClick={() => {
setEditingProduct(null); // create mode
setDialogOpen(true);
}}>
<Plus className="size-4" /> নতুন Product
</Button>
// row-এর edit
const openEdit = (product: Product) => {
setEditingProduct(product); // edit mode
setDialogOpen(true);
};এক Dialog-এ দুই মোডtsx
tsx
<Dialog open={dialogOpen} onOpenChange={setDialogOpen}>
<DialogContent onPointerDownOutside={(e) => e.preventDefault()}>
<DialogHeader>
<DialogTitle>
{editingProduct ? "সম্পাদনা" : "নতুন"} Product
</DialogTitle>
<DialogDescription>
{editingProduct
? "তথ্য বদলে Save করুন"
: "নতুন product-এর তথ্য দিন"}
</DialogDescription>
</DialogHeader>
<ProductForm
key={editingProduct?.id ?? "create"}
defaultValues={editingProduct
? {
name: editingProduct.name,
description: editingProduct.description ?? "",
price: editingProduct.price,
category: editingProduct.category,
stock: editingProduct.stock,
status: editingProduct.status,
}
: undefined}
isSubmitting={editingProduct
? updateProduct.isPending
: createProduct.isPending}
onSubmit={editingProduct
? (values) => {
updateProduct.mutate(
{ id: editingProduct!.id, input: values },
{ onSuccess: () => setDialogOpen(false) },
);
}
: (values) => {
createProduct.mutate(values, {
onSuccess: () => setDialogOpen(false),
});
}}
/>
</DialogContent>
</Dialog>কেন একটি Dialog
- দুই code-path মিলে যাওয়ায় duplicate কম
editingProduct === nullমানেই create — সুস্পষ্ট- Dialog component loop-height একবারই mount হয়
- নতুন feature দরকার হলে (যেমন duplicate) সহজে মোড বাড়ানো যায়
loading state দুই দিক
isSubmitting আলাদা-আলাদা mutation-এর pending — dialog একটিই, কিন্তু নিশ্চিত রাখুন: create-চলাকালীন edit dialog নিজে-নিজে খুললে যেন ভুল pending না লাগে। editingProduct ? updateProduct.isPending : createProduct.isPending — এমন যুক্তি ঠিক।
শেষ প্যারায় নিজে practice করুন — কোড কপি করে নিজের এডিটরে চালিয়ে দেখুন।