import { useEffect, useState } from "react"; import { CaretDownIcon } from "@phosphor-icons/react/CaretDown"; import { CheckIcon } from "@phosphor-icons/react/Check"; import { defineRenderer } from "@nativepi/extension-api"; import type { RendererContext } from "@nativepi/extension-api"; import { Menu, MenuContent, MenuGroup, MenuItem, MenuLabel, MenuTrigger, } from "@nativepi/extension-api/ui"; import { serviceTierProtocol, type ServiceTier, type TierState } from "../types.ts"; const CHOICES: { tier: ServiceTier; label: string; description: string }[] = [ { tier: "standard", label: "Standard", description: "Balanced response speed and usage", }, { tier: "fast", label: "Fast", description: "Prioritizes speed and uses more subscription usage", }, ]; function ServiceTierControl({ context }: { context: RendererContext }) { const { call, on } = context.channel; const [state, setState] = useState(null); const [open, setOpen] = useState(false); const [saving, setSaving] = useState(null); const [error, setError] = useState(null); useEffect(() => { let cancelled = false; const apply = (value: TierState) => { if (!cancelled) setState(value); }; void call("state") .then(apply) .catch(() => {}); return on("changed", apply); }, [call, on]); if (!state?.supported) return null; const selected = CHOICES.find((choice) => choice.tier === state.tier) ?? CHOICES[0]; const choose = (tier: ServiceTier) => { if (tier === state.tier || saving) return; setSaving(tier); setError(null); void call("set", { tier }) .then((value) => { setState(value); setOpen(false); }) .catch(() => { setError("Unable to change response speed. Try again."); setOpen(true); }) .finally(() => setSaving(null)); }; return ( { setOpen(next); if (next) setError(null); }} > {selected.label} Response speed {CHOICES.map((choice) => { const active = state.tier === choice.tier; const pending = saving === choice.tier; return ( choose(choice.tier)} className="items-start gap-2 rounded-md" >
{choice.label} {pending ? "Updating response speed…" : choice.description}
{active ? : null}
); })}
{error ? (

{error}

) : null}
); } export default defineRenderer({ apiVersion: 1, protocol: serviceTierProtocol, composerControls: [ { id: "service-tier", render: (context) => , }, ], });