diff --git a/frontend/src/components/BackLink.tsx b/frontend/src/components/BackLink.tsx new file mode 100644 index 0000000..aa78953 --- /dev/null +++ b/frontend/src/components/BackLink.tsx @@ -0,0 +1,14 @@ +import { A } from "@solidjs/router" + +type BackLinkProps = { + href: string + label: string +} + +export default function BackLink(props: BackLinkProps) { + return ( +
+ ← {props.label} +
+ ) +} diff --git a/frontend/src/components/PageContainer.tsx b/frontend/src/components/PageContainer.tsx new file mode 100644 index 0000000..f02ee80 --- /dev/null +++ b/frontend/src/components/PageContainer.tsx @@ -0,0 +1,12 @@ +import type { JSX } from "solid-js" + +type PageContainerProps = { + children: JSX.Element + size?: "narrow" | "wide" +} + +export default function PageContainer(props: PageContainerProps) { + const maxWidthClass = () => (props.size === "narrow" ? "max-w-2xl" : "max-w-4xl") + + return
{props.children}
+} diff --git a/frontend/src/components/ResourceState.tsx b/frontend/src/components/ResourceState.tsx new file mode 100644 index 0000000..a496366 --- /dev/null +++ b/frontend/src/components/ResourceState.tsx @@ -0,0 +1,22 @@ +import { Show } from "solid-js" + +type ResourceStateProps = { + loading: boolean + error: unknown + loadingText: string + errorText: string + class?: string +} + +export default function ResourceState(props: ResourceStateProps) { + return ( + <> + +

{props.loadingText}

+
+ +

{props.errorText}

+
+ + ) +} diff --git a/frontend/src/pages/Account.tsx b/frontend/src/pages/Account.tsx index 1a3f2aa..1c7f503 100644 --- a/frontend/src/pages/Account.tsx +++ b/frontend/src/pages/Account.tsx @@ -1,5 +1,7 @@ import { createMemo, createResource, createSignal, For, Show } from "solid-js" import { getTenant, listTenantInvoices, updateTenantBilling } from "../lib/api" +import PageContainer from "../components/PageContainer" +import ResourceState from "../components/ResourceState" export default function Account() { const [tenant, { refetch: refetchTenant }] = createResource(getTenant) @@ -25,7 +27,7 @@ export default function Account() { } return ( -
+

My Account

@@ -40,9 +42,12 @@ export default function Account() { )}
- -

Loading account...

-
+
@@ -106,6 +111,6 @@ export default function Account() {
- + ) } diff --git a/frontend/src/pages/admin/AdminRelayDetail.tsx b/frontend/src/pages/admin/AdminRelayDetail.tsx index db086bf..1df0432 100644 --- a/frontend/src/pages/admin/AdminRelayDetail.tsx +++ b/frontend/src/pages/admin/AdminRelayDetail.tsx @@ -1,6 +1,9 @@ import { useParams, A } from "@solidjs/router" import { createResource, createSignal, Show } from "solid-js" import { adminDeactivateRelay, adminGetRelay } from "../../lib/api" +import BackLink from "../../components/BackLink" +import PageContainer from "../../components/PageContainer" +import ResourceState from "../../components/ResourceState" export default function AdminRelayDetail() { const params = useParams() @@ -24,17 +27,16 @@ export default function AdminRelayDetail() { } return ( -
-
- ← Relays -
+ + - -

Loading relay...

-
- -

Failed to load relay.

-
+ {(r) => ( @@ -69,6 +71,6 @@ export default function AdminRelayDetail() {

{error()}

-
+ ) } diff --git a/frontend/src/pages/admin/AdminRelayEdit.tsx b/frontend/src/pages/admin/AdminRelayEdit.tsx index c305613..af5f41f 100644 --- a/frontend/src/pages/admin/AdminRelayEdit.tsx +++ b/frontend/src/pages/admin/AdminRelayEdit.tsx @@ -1,9 +1,12 @@ -import { A, useNavigate, useParams } from "@solidjs/router" +import { useNavigate, useParams } from "@solidjs/router" import { Show, createEffect, createResource, createSignal } from "solid-js" import { adminGetRelay, adminUpdateRelay } from "../../lib/api" import RelayForm from "../../components/RelayForm" import { RELAY_PLAN_IDS, type RelayPlanId } from "../../lib/relayPlans" import { slugify } from "../../lib/slugify" +import BackLink from "../../components/BackLink" +import PageContainer from "../../components/PageContainer" +import ResourceState from "../../components/ResourceState" export default function AdminRelayEdit() { const navigate = useNavigate() @@ -50,18 +53,16 @@ export default function AdminRelayEdit() { } return ( -
-
- ← Back -
+ +

Edit Relay (Admin)

- -

Loading relay...

-
- -

Failed to load relay.

-
+ -
+ ) } diff --git a/frontend/src/pages/admin/AdminRelays.tsx b/frontend/src/pages/admin/AdminRelays.tsx index 77e5ca5..4c6c209 100644 --- a/frontend/src/pages/admin/AdminRelays.tsx +++ b/frontend/src/pages/admin/AdminRelays.tsx @@ -1,6 +1,8 @@ import { A } from "@solidjs/router" import { createMemo, createResource, createSignal, For, Show } from "solid-js" import { adminListRelays } from "../../lib/api" +import PageContainer from "../../components/PageContainer" +import ResourceState from "../../components/ResourceState" export default function AdminRelays() { const [query, setQuery] = createSignal("") @@ -19,7 +21,7 @@ export default function AdminRelays() { }) return ( -
+

All Relays

- -

Loading relays...

-
- -

Failed to load relays.

-
+ 0} fallback={

No relays found.

}>
    @@ -55,6 +57,6 @@ export default function AdminRelays() {
-
+ ) } diff --git a/frontend/src/pages/admin/AdminTenantDetail.tsx b/frontend/src/pages/admin/AdminTenantDetail.tsx index 71b052c..13c77ad 100644 --- a/frontend/src/pages/admin/AdminTenantDetail.tsx +++ b/frontend/src/pages/admin/AdminTenantDetail.tsx @@ -1,6 +1,9 @@ import { useParams, A } from "@solidjs/router" import { createResource, createSignal, For, Show } from "solid-js" import { adminGetTenant, adminUpdateTenantStatus } from "../../lib/api" +import BackLink from "../../components/BackLink" +import PageContainer from "../../components/PageContainer" +import ResourceState from "../../components/ResourceState" export default function AdminTenantDetail() { const params = useParams() @@ -24,18 +27,17 @@ export default function AdminTenantDetail() { } return ( -
-
- ← Tenants -
+ +

Tenant {params.id}

- -

Loading tenant...

-
- -

Failed to load tenant.

-
+
@@ -93,6 +95,6 @@ export default function AdminTenantDetail() {

{error()}

-
+ ) } diff --git a/frontend/src/pages/admin/AdminTenants.tsx b/frontend/src/pages/admin/AdminTenants.tsx index e1a8f61..4ae5b77 100644 --- a/frontend/src/pages/admin/AdminTenants.tsx +++ b/frontend/src/pages/admin/AdminTenants.tsx @@ -3,6 +3,8 @@ import { createEffect, createMemo, createResource, createSignal, For, onCleanup, import { getProfilePicture } from "applesauce-core/helpers/profile" import { adminListTenants } from "../../lib/api" import { eventStore, primeProfiles } from "../../lib/nostr" +import PageContainer from "../../components/PageContainer" +import ResourceState from "../../components/ResourceState" function shortenPubkey(pubkey: string) { if (pubkey.length <= 16) return pubkey @@ -48,7 +50,7 @@ export default function AdminTenants() { }) return ( -
+

Tenants

- -

Loading tenants...

-
- -

Failed to load tenants.

-
+ 0} fallback={

No tenants found.

}>
    @@ -96,6 +98,6 @@ export default function AdminTenants() {
-
+ ) } diff --git a/frontend/src/pages/relays/RelayDetail.tsx b/frontend/src/pages/relays/RelayDetail.tsx index 8036574..53823b1 100644 --- a/frontend/src/pages/relays/RelayDetail.tsx +++ b/frontend/src/pages/relays/RelayDetail.tsx @@ -1,6 +1,9 @@ import { useParams, A } from "@solidjs/router" import { createResource, createSignal, Show } from "solid-js" import { deactivateTenantRelay, getTenantRelay } from "../../lib/api" +import BackLink from "../../components/BackLink" +import PageContainer from "../../components/PageContainer" +import ResourceState from "../../components/ResourceState" export default function RelayDetail() { const params = useParams() @@ -24,18 +27,16 @@ export default function RelayDetail() { } return ( -
-
- ← Relays -
+ + - -

Loading relay...

-
- - -

Failed to load relay.

-
+ {(loadedRelay) => ( @@ -67,6 +68,6 @@ export default function RelayDetail() {

{error()}

-
+ ) } diff --git a/frontend/src/pages/relays/RelayEdit.tsx b/frontend/src/pages/relays/RelayEdit.tsx index 98071f7..847f2bc 100644 --- a/frontend/src/pages/relays/RelayEdit.tsx +++ b/frontend/src/pages/relays/RelayEdit.tsx @@ -1,9 +1,12 @@ -import { A, useNavigate, useParams } from "@solidjs/router" +import { useNavigate, useParams } from "@solidjs/router" import { Show, createEffect, createResource, createSignal } from "solid-js" import { getTenantRelay, updateTenantRelay } from "../../lib/api" import RelayForm from "../../components/RelayForm" import { RELAY_PLAN_IDS, type RelayPlanId } from "../../lib/relayPlans" import { slugify } from "../../lib/slugify" +import BackLink from "../../components/BackLink" +import PageContainer from "../../components/PageContainer" +import ResourceState from "../../components/ResourceState" export default function RelayEdit() { const navigate = useNavigate() @@ -50,18 +53,16 @@ export default function RelayEdit() { } return ( -
-
- ← Back -
+ +

Edit Relay

- -

Loading relay...

-
- -

Failed to load relay.

-
+ -
+ ) } diff --git a/frontend/src/pages/relays/RelayList.tsx b/frontend/src/pages/relays/RelayList.tsx index 75a21ff..2944ff3 100644 --- a/frontend/src/pages/relays/RelayList.tsx +++ b/frontend/src/pages/relays/RelayList.tsx @@ -1,6 +1,8 @@ import { A } from "@solidjs/router" import { createMemo, createResource, createSignal, For, Show } from "solid-js" import { listTenantRelays } from "../../lib/api" +import PageContainer from "../../components/PageContainer" +import ResourceState from "../../components/ResourceState" export default function RelayList() { const [relays] = createResource(listTenantRelays) @@ -20,7 +22,7 @@ export default function RelayList() { }) return ( -
+

My Relays

- -

Loading relays...

-
- - -

Failed to load relays.

-
+ 0} fallback={

No relays match your filters.

}>
    @@ -83,6 +84,6 @@ export default function RelayList() {
-
+ ) }