|
|
|
@@ -1,5 +1,5 @@
|
|
|
|
|
import { useParams } from "@solidjs/router"
|
|
|
|
|
import { createMemo, createResource, Show } from "solid-js"
|
|
|
|
|
import { createMemo, createResource, createSignal, Show } from "solid-js"
|
|
|
|
|
import BackLink from "@/components/BackLink"
|
|
|
|
|
import PageContainer from "@/components/PageContainer"
|
|
|
|
|
import PaymentSetup from "@/components/PaymentSetup"
|
|
|
|
@@ -7,8 +7,9 @@ import RelayDetailCard from "@/components/RelayDetailCard"
|
|
|
|
|
import ResourceState from "@/components/ResourceState"
|
|
|
|
|
import useMinLoading from "@/components/useMinLoading"
|
|
|
|
|
import ActivityFeed from "@/components/ActivityFeed"
|
|
|
|
|
import { getRelayMembers, useRelay, useRelayActivity } from "@/lib/hooks"
|
|
|
|
|
import { getRelayMembers, useRelay, useRelayActivity, useTenant } from "@/lib/hooks"
|
|
|
|
|
import useRelayToggles from "@/lib/useRelayToggles"
|
|
|
|
|
import { plans } from "@/lib/state"
|
|
|
|
|
|
|
|
|
|
export default function RelayDetail() {
|
|
|
|
|
const params = useParams()
|
|
|
|
@@ -23,6 +24,21 @@ export default function RelayDetail() {
|
|
|
|
|
const [activity] = useRelayActivity(relayId)
|
|
|
|
|
const { busy, handleDeactivate, handleReactivate, handleUpdatePlan, needsPaymentSetup, clearNeedsPaymentSetup, toggles } = useRelayToggles(relayId, relay, { refetch, mutate })
|
|
|
|
|
|
|
|
|
|
const [tenant, { refetch: refetchTenant }] = useTenant()
|
|
|
|
|
const [paymentSetupOpen, setPaymentSetupOpen] = createSignal(false)
|
|
|
|
|
const [paymentBannerDismissed, setPaymentBannerDismissed] = createSignal(false)
|
|
|
|
|
|
|
|
|
|
const showPaymentNudge = createMemo(() => {
|
|
|
|
|
if (paymentBannerDismissed()) return false
|
|
|
|
|
const r = relay()
|
|
|
|
|
if (!r) return false
|
|
|
|
|
const plan = plans().find(p => p.id === r.plan)
|
|
|
|
|
if (!plan || plan.amount === 0) return false
|
|
|
|
|
const t = tenant()
|
|
|
|
|
if (!t) return false
|
|
|
|
|
return !t.nwc_url && !t.stripe_subscription_id
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
return (
|
|
|
|
|
<PageContainer>
|
|
|
|
|
<BackLink href="/relays" label="Relays" />
|
|
|
|
@@ -30,6 +46,35 @@ export default function RelayDetail() {
|
|
|
|
|
<Show when={!loading() && relay()}>
|
|
|
|
|
{(r) => (
|
|
|
|
|
<div class="space-y-6 mb-6">
|
|
|
|
|
<Show when={showPaymentNudge()}>
|
|
|
|
|
<div class="rounded-lg border border-amber-200 bg-amber-50 p-4 flex items-start justify-between gap-4">
|
|
|
|
|
<div class="min-w-0">
|
|
|
|
|
<p class="text-sm font-medium text-amber-800">Payment setup recommended</p>
|
|
|
|
|
<p class="text-sm text-amber-700 mt-1">
|
|
|
|
|
This relay is on a paid plan. Invoices are generated at the end of the billing period, so you cannot pay in advance. You can set up NWC or Stripe now to be ready when an invoice is issued.
|
|
|
|
|
</p>
|
|
|
|
|
</div>
|
|
|
|
|
<div class="flex items-center gap-3 shrink-0">
|
|
|
|
|
<button
|
|
|
|
|
type="button"
|
|
|
|
|
onClick={() => setPaymentSetupOpen(true)}
|
|
|
|
|
class="text-sm font-medium text-amber-800 underline hover:text-amber-900 whitespace-nowrap"
|
|
|
|
|
>
|
|
|
|
|
Set up NWC or Stripe
|
|
|
|
|
</button>
|
|
|
|
|
<button
|
|
|
|
|
type="button"
|
|
|
|
|
onClick={() => setPaymentBannerDismissed(true)}
|
|
|
|
|
aria-label="Dismiss"
|
|
|
|
|
class="text-amber-500 hover:text-amber-800 shrink-0"
|
|
|
|
|
>
|
|
|
|
|
<svg class="w-4 h-4" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
|
|
|
|
|
<path d="M18 6L6 18M6 6l12 12" />
|
|
|
|
|
</svg>
|
|
|
|
|
</button>
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
</Show>
|
|
|
|
|
<RelayDetailCard
|
|
|
|
|
relay={r()}
|
|
|
|
|
currentMembers={members.length}
|
|
|
|
@@ -46,8 +91,12 @@ export default function RelayDetail() {
|
|
|
|
|
)}
|
|
|
|
|
</Show>
|
|
|
|
|
<PaymentSetup
|
|
|
|
|
open={needsPaymentSetup()}
|
|
|
|
|
onClose={clearNeedsPaymentSetup}
|
|
|
|
|
open={needsPaymentSetup() || paymentSetupOpen()}
|
|
|
|
|
onClose={() => {
|
|
|
|
|
clearNeedsPaymentSetup()
|
|
|
|
|
setPaymentSetupOpen(false)
|
|
|
|
|
void refetchTenant()
|
|
|
|
|
}}
|
|
|
|
|
/>
|
|
|
|
|
</PageContainer>
|
|
|
|
|
)
|
|
|
|
|