"use client"; import { zodResolver } from "@hookform/resolvers/zod"; import { Loader2, Plus, UserPlus } from "lucide-react"; import { useEffect, useState } from "react"; import { Controller, useForm } from "react-hook-form"; import { toast } from "sonner"; import { ResponsiveDialog } from "@/components/responsive-dialog"; import { Badge } from "@/components/ui/badge"; import { Button } from "@/components/ui/button"; import { Card, CardAction, CardContent, CardDescription, CardHeader, CardTitle, } from "@/components/ui/card"; import { Field, FieldDescription, FieldError, FieldGroup, FieldLabel } from "@/components/ui/field"; import { Input } from "@/components/ui/input"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from "@/components/ui/select"; import { MembersList } from "@/features/households/components/members-list"; import type { AdminHouseholdRow, UserOption } from "@/features/households/service"; import { HOUSEHOLD_ROLES } from "@/features/households/types"; import { tr } from "@/i18n/tr"; import { addMemberSchema, householdCreateSchema, type AddMemberInput, type HouseholdCreateInput, } from "@/shared/schemas/household"; import { addMemberAction, adminRemoveMemberAction, adminSetMemberRoleAction, createHouseholdAction, } from "../actions"; import { UserSelect } from "./user-select"; const t = tr.adminHouseholds; function CreateHouseholdDialog({ open, onOpenChange, users, }: { open: boolean; onOpenChange: (o: boolean) => void; users: UserOption[]; }) { const form = useForm({ resolver: zodResolver(householdCreateSchema), defaultValues: { name: "", ownerUserId: "" }, }); useEffect(() => { if (open) form.reset({ name: "", ownerUserId: "" }); }, [open, form]); async function onSubmit(values: HouseholdCreateInput) { const result = await createHouseholdAction(values); if (result.ok) { toast.success(t.created(values.name)); onOpenChange(false); } else { form.setError("root", { message: result.error }); } } return ( } >
( {t.name} {fieldState.invalid ? : null} )} /> ( {t.owner} {fieldState.invalid ? : null} )} /> {form.formState.errors.root ? ( {form.formState.errors.root.message} ) : null}
); } function AddMemberDialog({ household, users, onOpenChange, }: { household: AdminHouseholdRow | null; users: UserOption[]; onOpenChange: (o: boolean) => void; }) { const form = useForm({ resolver: zodResolver(addMemberSchema), defaultValues: { userId: "", role: "member" }, }); useEffect(() => { if (household) form.reset({ userId: "", role: "member" }); }, [household, form]); async function onSubmit(values: AddMemberInput) { if (!household) return; const result = await addMemberAction(household.id, values); if (result.ok) { toast.success(t.memberAdded(users.find((u) => u.id === values.userId)?.name ?? "")); onOpenChange(false); } else { form.setError("root", { message: result.error }); } } return ( } >
( {t.user} {fieldState.invalid ? : null} )} /> ( {t.role} {tr.household.roleHints[field.value]} )} /> {form.formState.errors.root ? ( {form.formState.errors.root.message} ) : null}
); } export function HouseholdsAdmin({ households, users, currentUserId, }: { households: AdminHouseholdRow[]; users: UserOption[]; currentUserId: string; }) { const [creating, setCreating] = useState(false); const [addingTo, setAddingTo] = useState(null); return (

{t.privacyNote}

{households.length === 0 ? (

{t.empty}

) : (
{households.map((h) => ( {h.name} {t.members(h.memberCount)} {h.owners.length ? ( ยท {t.owners}: {h.owners.join(", ")} ) : ( {t.noOwner} )} adminSetMemberRoleAction(h.id, userId, role)} onRemove={(userId) => adminRemoveMemberAction(h.id, userId)} /> ))}
)} !o && setAddingTo(null)} />
); }