diff --git a/src/routes/settings/ManageFederations.tsx b/src/routes/settings/ManageFederations.tsx index ddbe3709..9bbdc8bc 100644 --- a/src/routes/settings/ManageFederations.tsx +++ b/src/routes/settings/ManageFederations.tsx @@ -5,7 +5,7 @@ import { setValue, SubmitHandler } from "@modular-forms/solid"; -import { FederationBalance } from "@mutinywallet/mutiny-wasm"; +import { FederationBalance, TagItem } from "@mutinywallet/mutiny-wasm"; import { useSearchParams } from "@solidjs/router"; import { createResource, @@ -29,6 +29,7 @@ import { FancyCard, InfoBox, KeyValue, + LabelCircle, LargeHeader, MiniStringShower, MutinyWalletGuard, @@ -54,6 +55,22 @@ export type MutinyFederationIdentity = { invite_code: string; }; +export type Metadata = { + name: string; + picture?: string; + about?: string; +}; + +export type DiscoveredFederation = { + id: string; + invite_codes: string[]; + pubkey: string; + created_at: number; + event_id: string; + metadata: Metadata | undefined; + recommendations: TagItem[]; // fixme, not the best type to use here +}; + type RefetchType = ( info?: unknown ) => @@ -88,12 +105,27 @@ function AddFederationForm(props: { refetch?: RefetchType }) { const handleSubmit: SubmitHandler = async ( f: FederationForm ) => { + const federation_code = f.federation_code.trim(); + await onSelect(federation_code); + }; + + const [federations] = createResource(async () => { + try { + const federations: DiscoveredFederation[] = + await state.mutiny_wallet?.discover_federations(); + return federations; + } catch (e) { + console.error(e); + return []; + } + }); + + const onSelect = async (inviteCode: string) => { setSuccess(""); setError(undefined); try { - const federation_code = f.federation_code.trim(); const newFederation = - await state.mutiny_wallet?.new_federation(federation_code); + await state.mutiny_wallet?.new_federation(inviteCode); console.log("New federation added:", newFederation); setSuccess( i18n.t("settings.manage_federations.federation_added_success") @@ -110,47 +142,115 @@ function AddFederationForm(props: { refetch?: RefetchType }) { }; return ( -
- - + + + - {(field, props) => ( - + ]} + > + {(field, props) => ( + + )} + + + + {error()?.message} + + + {success()} + + + +
Discover a federation on Nostr!
+ + + {(fed) => ( + +
+ +
+
+ {fed.metadata?.name} +
+ +

{fed.metadata?.about}

+
+
+
+ + + + + {/* todo i18n */} + + + + {/* todo i18n, handle singular vs plural */} + + {(invite) => ( + + )} + + + 0}> + + {/* todo i18n */} + + {(contact) => ( + + )} + + + + {/* FIXME: do something smarter than just taking first code */} + +
)} -
- - - {error()?.message} - - - {success()} - -
- + + + ); }