'use client'; import { useCallback, useEffect, useMemo, useState } from 'react'; import { ChevronRight, Home, MapPin } from 'lucide-react'; import { AddressFormDialog } from '@/components/addresses/address-form-dialog'; import { ActionTile, SectionTitle } from '@/components/id/action-tile'; import { useAuth } from '@/components/id/auth-provider'; import { useToast } from '@/components/id/toast-provider'; import { ADDRESS_LABELS, formatAddressLine, getOtherAddresses, getPrimaryAddress, type AddressLabel } from '@/lib/address-catalog'; import { fetchUserAddresses, getApiErrorMessage, UserAddress } from '@/lib/api'; function AddressRow({ title, text, onClick }: { title: string; text: string; onClick: () => void }) { return ( ); } export function AddressQuickSection({ layout, isPinLocked = false, isReady = true }: { layout: 'home' | 'data'; isPinLocked?: boolean; isReady?: boolean; }) { const { user, token } = useAuth(); const { showToast } = useToast(); const [addresses, setAddresses] = useState([]); const [formOpen, setFormOpen] = useState(false); const [activeLabel, setActiveLabel] = useState('HOME'); const [editingAddress, setEditingAddress] = useState(null); const loadAddresses = useCallback(async () => { if (!user || !token || isPinLocked) return; try { const response = await fetchUserAddresses(user.id, token); setAddresses(response.addresses ?? []); } catch (error) { const message = getApiErrorMessage(error, 'Не удалось загрузить адреса'); if (message) showToast(message); } }, [isPinLocked, showToast, token, user]); useEffect(() => { if (isReady && user && !isPinLocked) void loadAddresses(); }, [isPinLocked, isReady, loadAddresses, user]); const homeAddress = useMemo(() => getPrimaryAddress(addresses, 'HOME') as UserAddress | null, [addresses]); const workAddress = useMemo(() => getPrimaryAddress(addresses, 'WORK') as UserAddress | null, [addresses]); const otherAddresses = useMemo(() => getOtherAddresses(addresses), [addresses]); function openAddress(label: AddressLabel, existing: UserAddress | null = null) { setActiveLabel(label); if (label === 'HOME') setEditingAddress(existing ?? homeAddress); else if (label === 'WORK') setEditingAddress(existing ?? workAddress); else setEditingAddress(existing); setFormOpen(true); } const tiles = (
openAddress('HOME')} /> openAddress('WORK')} /> 0 ? `${otherAddresses.length} ${otherAddresses.length === 1 ? 'адрес' : otherAddresses.length < 5 ? 'адреса' : 'адресов'}` : layout === 'data' ? 'Добавить' : undefined } className="min-h-[76px]" onClick={() => openAddress('OTHER')} />
); return ( <> {layout === 'home' ? ( <> Адреса {tiles} ) : (

Адреса

Укажите адреса на карте или введите их вручную.

{tiles}
{addresses.length === 0 ? (

Адреса пока не добавлены

) : ( addresses.map((address) => ( openAddress(address.label as AddressLabel, address)} /> )) )}
)} {user ? ( ) : null} ); }