All files / components/accounts EditAccountDialog.tsx

95.65% Statements 22/23
80% Branches 12/15
100% Functions 5/5
100% Lines 21/21

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119                                                  71x 71x 71x   71x 27x 10x       71x 3x 3x   3x 3x   3x 3x 2x   1x 1x   3x       71x   28x                     1x                                                                         2x                              
/**
 * Edit account dialog component
 */
 
import { useState, useEffect } from 'react';
import { AppDialog } from '@/components/common/AppDialog';
import { Button } from '@/components/ui/button';
import { Input } from '@/components/ui/input';
import { Label } from '@/components/ui/label';
import { Loader2 } from 'lucide-react';
import type { AccountListItem } from '@/services/accounts.service';
 
interface EditAccountDialogProps {
    open: boolean;
    onOpenChange: (open: boolean) => void;
    account: AccountListItem | null;
    onSubmit: (accountId: string, data: { name: string }) => Promise<void>;
}
 
export default function EditAccountDialog({
    open,
    onOpenChange,
    account,
    onSubmit,
}: EditAccountDialogProps) {
    const [name, setName] = useState('');
    const [loading, setLoading] = useState(false);
    const [error, setError] = useState<string | null>(null);
 
    useEffect(() => {
        if (account) {
            setName(account.name);
        }
    }, [account]);
 
    const handleSubmit = async (e: React.FormEvent) => {
        e.preventDefault();
        Iif (!account) return;
 
        setLoading(true);
        setError(null);
 
        try {
            await onSubmit(account.id, { name });
            onOpenChange(false);
        } catch (err: unknown) {
            const error = err as { response?: { data?: { detail?: string } }; message?: string };
            setError(error.response?.data?.detail || error.message || 'Failed to update account');
        } finally {
            setLoading(false);
        }
    };
 
    if (!account) return null;
 
    return (
        <AppDialog
            open={open}
            onOpenChange={onOpenChange}
            title="Edit Account"
            description="Update the account name. ID and slug cannot be changed."
            footer={
                <>
                    <Button
                        type="button"
                        variant="outline"
                        onClick={() => onOpenChange(false)}
                        disabled={loading}
                    >
                        Cancel
                    </Button>
                    <Button type="submit" form="edit-account-form" disabled={loading || !name}>
                        {loading && <Loader2 className="mr-2 h-4 w-4 animate-spin" />}
                        Save Changes
                    </Button>
                </>
            }
        >
            <form id="edit-account-form" onSubmit={handleSubmit} className="space-y-4">
                <div className="space-y-2">
                    <Label htmlFor="edit-code">Account Code</Label>
                    <Input
                        id="edit-code"
                        value={account.account_code}
                        disabled
                        className="font-mono"
                    />
                </div>
 
                <div className="space-y-2">
                    <Label htmlFor="edit-slug">Slug</Label>
                    <Input
                        id="edit-slug"
                        value={account.slug}
                        disabled
                    />
                </div>
 
                <div className="space-y-2">
                    <Label htmlFor="edit-name">Name *</Label>
                    <Input
                        id="edit-name"
                        value={name}
                        onChange={(e) => setName(e.target.value)}
                        required
                        disabled={loading}
                    />
                </div>
 
                {error && (
                    <div className="text-sm text-destructive bg-destructive/10 p-3 rounded-md">
                        {error}
                    </div>
                )}
            </form>
        </AppDialog>
    );
}