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 (
+
+ )
+}
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 (
-
-
+
+
-
- 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 (
-
-
+
+
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 (
-
-
+
+
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 (
-
-
+
+
-
- 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 (
-
-
+
+
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 (
-
+
-
- Loading relays...
-
-
-
- Failed to load relays.
-
+
0} fallback={No relays match your filters.
}>
@@ -83,6 +84,6 @@ export default function RelayList() {
-
+
)
}