import { useState } from 'react';
import { Loader2, Flag, Check } from 'lucide-react';
import { Button } from '@/components/ui/button';
import { Textarea } from '@/components/ui/textarea';
import {
Dialog,
DialogContent,
DialogDescription,
DialogHeader,
DialogTitle,
DialogTrigger,
} from '@/components/ui/dialog';
import { LoginArea } from '@/components/auth/LoginArea';
import { useCurrentUser } from '@/hooks/useCurrentUser';
import { useToast } from '@/hooks/useToast';
import { usePublishSpotStatus, useSpotStatus } from '@/hooks/useSpotStatus';
import { SpotStatusBadge } from '@/components/SpotStatusBadge';
import { SPOT_STATUS_META, SPOT_STATUS_ORDER, statusTimeAgo } from '@/lib/spotStatus';
import { useAuthor } from '@/hooks/useAuthor';
import { genUserName } from '@/lib/genUserName';
import type { SpotStatusValue, SpotStatusReport } from '@/lib/types';
import { cn } from '@/lib/utils';
interface ReportSpotStatusDialogProps {
spotPubkey: string;
spotIdentifier: string;
spotTitle: string;
trigger?: React.ReactNode;
}
function ReportRow({ report }: { report: SpotStatusReport }) {
const author = useAuthor(report.pubkey);
const name = author.data?.metadata?.name ?? genUserName(report.pubkey);
const meta = SPOT_STATUS_META[report.status];
return (
{meta.label}
by {name}
{statusTimeAgo(report.createdAt)}
{report.note && (
{report.note}
)}
);
}
export function ReportSpotStatusDialog({
spotPubkey,
spotIdentifier,
spotTitle,
trigger,
}: ReportSpotStatusDialogProps) {
const { user } = useCurrentUser();
const { toast } = useToast();
const [open, setOpen] = useState(false);
const [selected, setSelected] = useState(null);
const [note, setNote] = useState('');
const { aggregated, reports } = useSpotStatus(spotPubkey, spotIdentifier);
const { mutateAsync: publishStatus, isPending } = usePublishSpotStatus();
const handleSubmit = async () => {
if (!selected) return;
try {
await publishStatus({
spotPubkey,
spotIdentifier,
spotTitle,
status: selected,
note: note.trim() || undefined,
});
toast({
title: 'Status reported',
description: 'Thanks for keeping the map fresh. Your report is live.',
});
setSelected(null);
setNote('');
setOpen(false);
} catch (error) {
toast({
title: 'Could not submit',
description: error instanceof Error ? error.message : 'Something went wrong.',
variant: 'destructive',
});
}
};
return (
);
}