'use client'; import { useCallback, useEffect, useState } from 'react'; import { Loader2, LocateFixed, MapPin, Send } from 'lucide-react'; import { AddressMapPicker } from '@/components/addresses/address-map-picker'; import { Button } from '@/components/ui/button'; import { Dialog, DialogContent, DialogHeader, DialogTitle } from '@/components/ui/dialog'; import { Input } from '@/components/ui/input'; import { reverseGeocode } from '@/lib/geocoding'; export interface ChatLocationSharePayload { latitude: number; longitude: number; address?: string; label?: string; } export function ChatLocationShareDialog({ open, sending, onOpenChange, onSend, onLocateError }: { open: boolean; sending?: boolean; onOpenChange: (open: boolean) => void; onSend: (payload: ChatLocationSharePayload) => Promise; onLocateError?: (message: string) => void; }) { const [latitude, setLatitude] = useState(); const [longitude, setLongitude] = useState(); const [address, setAddress] = useState(''); const [label, setLabel] = useState(''); const [locating, setLocating] = useState(false); const [resolvingAddress, setResolvingAddress] = useState(false); const resetState = useCallback(() => { setLatitude(undefined); setLongitude(undefined); setAddress(''); setLabel(''); setLocating(false); setResolvingAddress(false); }, []); useEffect(() => { if (!open) { resetState(); } }, [open, resetState]); const handlePick = useCallback(async (lat: number, lng: number) => { setLatitude(lat); setLongitude(lng); setResolvingAddress(true); try { const parsed = await reverseGeocode(lat, lng); if (parsed?.fullAddress) { setAddress(parsed.fullAddress); } } finally { setResolvingAddress(false); } }, []); async function handleUseCurrentLocation() { if (!navigator.geolocation) return; setLocating(true); try { const position = await new Promise((resolve, reject) => { navigator.geolocation.getCurrentPosition(resolve, reject, { enableHighAccuracy: true, timeout: 12_000, maximumAge: 30_000 }); }); await handlePick(position.coords.latitude, position.coords.longitude); } catch { // ошибка геолокации обрабатывается на уровне вызывающего через toast throw new Error('Не удалось определить текущее местоположение'); } finally { setLocating(false); } } async function handleSubmit(event: React.FormEvent) { event.preventDefault(); if (latitude == null || longitude == null) return; await onSend({ latitude, longitude, address: address.trim() || undefined, label: label.trim() || undefined }); } const canSend = latitude != null && longitude != null && !sending; return (
Отправить геопозицию

Выберите точку на карте или используйте текущее местоположение

void handleSubmit(event)} className="space-y-3">
void handlePick(lat, lng)} />
{resolvingAddress ? ( Определяем адрес... ) : null}
setLabel(event.target.value)} placeholder="Подпись (необязательно)" className="h-11 rounded-xl" disabled={sending} /> setAddress(event.target.value)} placeholder="Адрес" className="h-11 rounded-xl" disabled={sending || resolvingAddress} />
); }