import { useState, type FormEvent } from 'react' import { Modal } from '@/components/ui/Modal' import { Alert } from '@/components/ui/Alert' import { Button } from '@/components/ui/Button' import { Select } from '@/components/ui/Select' import { TextField } from '@/components/ui/TextField' import { cn } from '@/lib/cn' import { fieldControlClass } from '@/components/ui/field' import { errorMessage } from '@/lib/api' import type { Garden } from '@/lib/gardens' import { useAddShare, useRemoveShare, useShares, useUpdateShareRole, type ShareRole } from '@/lib/shares' const roleOptions = [ { value: 'viewer', label: 'Viewer (read-only)' }, { value: 'editor', label: 'Editor (can edit)' }, ] /** * Owner-only dialog to manage a garden's shares: invite an existing user by * email as viewer/editor, change a share's role, or remove it. Targets existing * accounts only (v1 has no invitation emails) — an unknown email surfaces a * friendly "no account with that email". */ export function ShareGardenModal({ garden, onClose }: { garden: Garden; onClose: () => void }) { const shares = useShares(garden.id) const add = useAddShare(garden.id) const updateRole = useUpdateShareRole(garden.id) const remove = useRemoveShare(garden.id) const [email, setEmail] = useState('') const [role, setRole] = useState('viewer') const [error, setError] = useState(null) async function onInvite(e: FormEvent) { e.preventDefault() setError(null) if (!email.trim()) { setError('Enter an email address.') return } try { await add.mutateAsync({ email: email.trim(), role }) setEmail('') } catch (err) { setError(errorMessage(err, 'Could not share the garden.')) } } const onMutationError = (fallback: string) => (err: unknown) => setError(errorMessage(err, fallback)) return (
setEmail(e.target.value)} />
{ setError(null) updateRole.mutate( { userId: sh.userId, role: e.target.value as ShareRole }, { onError: onMutationError('Could not change that role.') }, ) }} aria-label={`Role for ${sh.displayName}`} className={cn(fieldControlClass, 'w-auto px-2 py-1 text-sm')} > ))}
) }