import { Check, Loader2, Search, X } from "lucide-react"; import { useEffect, useState } from "react"; import { api, errorMessage } from "../api"; import { useI18n } from "../i18n"; import { channelKind, displayName, displayPhone, displayUsername } from "../lib/format"; import type { AccountRow, ChannelRow } from "../types"; import { Badge } from "./ui"; export function UserPicker({ label, value, onChange }: { label: string; value: AccountRow | null; onChange: (row: AccountRow | null) => void; }) { const { t } = useI18n(); const [query, setQuery] = useState(""); const [rows, setRows] = useState([]); const [busy, setBusy] = useState(false); const [error, setError] = useState(""); async function search() { setBusy(true); setError(""); const params = new URLSearchParams({ limit: "20" }); if (query.trim()) { params.set("q", query.trim()); } try { const result = await api.accounts(params); setRows(result.rows); } catch (err) { setError(errorMessage(err)); } finally { setBusy(false); } } useEffect(() => { void search(); }, []); return (
{label} {value ? ( ) : null}
{value ? (
{displayName(value)} {value.ID}
{displayUsername(value.Username) || displayPhone(value.Phone) || "-"}
) : null}
setQuery(event.target.value)} onKeyDown={(event) => { if (event.key === "Enter") { event.preventDefault(); void search(); } }} placeholder={t("picker.userPlaceholder")} />
{error &&
{error}
}
{rows.map((row) => ( ))} {rows.length === 0 && !busy ?
{t("common.noResults")}
: null}
); } export function ChannelPicker({ label, value, onChange }: { label: string; value: ChannelRow | null; onChange: (row: ChannelRow | null) => void; }) { const { t } = useI18n(); const [query, setQuery] = useState(""); const [rows, setRows] = useState([]); const [busy, setBusy] = useState(false); const [error, setError] = useState(""); async function search() { setBusy(true); setError(""); const params = new URLSearchParams({ limit: "20" }); if (query.trim()) { params.set("q", query.trim()); } try { const result = await api.channels(params); setRows(result.rows); } catch (err) { setError(errorMessage(err)); } finally { setBusy(false); } } useEffect(() => { void search(); }, []); return (
{label} {value ? ( ) : null}
{value ? (
{value.Title || "-"} {value.ID}
{displayUsername(value.Username) || channelKind(value, t)}
) : null}
setQuery(event.target.value)} onKeyDown={(event) => { if (event.key === "Enter") { event.preventDefault(); void search(); } }} placeholder={t("picker.channelPlaceholder")} />
{error &&
{error}
}
{rows.map((row) => ( ))} {rows.length === 0 && !busy ?
{t("common.noResults")}
: null}
); }