forked from coracle/caravel
Compare commits
1 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 0558408388 |
@@ -1,5 +1,5 @@
|
|||||||
import { useParams } from "@solidjs/router"
|
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 BackLink from "@/components/BackLink"
|
||||||
import PageContainer from "@/components/PageContainer"
|
import PageContainer from "@/components/PageContainer"
|
||||||
import PaymentSetup from "@/components/PaymentSetup"
|
import PaymentSetup from "@/components/PaymentSetup"
|
||||||
@@ -7,8 +7,9 @@ import RelayDetailCard from "@/components/RelayDetailCard"
|
|||||||
import ResourceState from "@/components/ResourceState"
|
import ResourceState from "@/components/ResourceState"
|
||||||
import useMinLoading from "@/components/useMinLoading"
|
import useMinLoading from "@/components/useMinLoading"
|
||||||
import ActivityFeed from "@/components/ActivityFeed"
|
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 useRelayToggles from "@/lib/useRelayToggles"
|
||||||
|
import { plans } from "@/lib/state"
|
||||||
|
|
||||||
export default function RelayDetail() {
|
export default function RelayDetail() {
|
||||||
const params = useParams()
|
const params = useParams()
|
||||||
@@ -23,6 +24,21 @@ export default function RelayDetail() {
|
|||||||
const [activity] = useRelayActivity(relayId)
|
const [activity] = useRelayActivity(relayId)
|
||||||
const { busy, handleDeactivate, handleReactivate, handleUpdatePlan, needsPaymentSetup, clearNeedsPaymentSetup, toggles } = useRelayToggles(relayId, relay, { refetch, mutate })
|
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 (
|
return (
|
||||||
<PageContainer>
|
<PageContainer>
|
||||||
<BackLink href="/relays" label="Relays" />
|
<BackLink href="/relays" label="Relays" />
|
||||||
@@ -30,6 +46,35 @@ export default function RelayDetail() {
|
|||||||
<Show when={!loading() && relay()}>
|
<Show when={!loading() && relay()}>
|
||||||
{(r) => (
|
{(r) => (
|
||||||
<div class="space-y-6 mb-6">
|
<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 method recommended</p>
|
||||||
|
<p class="text-sm text-amber-700 mt-1">
|
||||||
|
This relay is on a paid plan. Invoices are due at end of the billing period, you can pay manually or set up automatic payments now.
|
||||||
|
</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 payment
|
||||||
|
</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
|
<RelayDetailCard
|
||||||
relay={r()}
|
relay={r()}
|
||||||
currentMembers={members.length}
|
currentMembers={members.length}
|
||||||
@@ -46,8 +91,12 @@ export default function RelayDetail() {
|
|||||||
)}
|
)}
|
||||||
</Show>
|
</Show>
|
||||||
<PaymentSetup
|
<PaymentSetup
|
||||||
open={needsPaymentSetup()}
|
open={needsPaymentSetup() || paymentSetupOpen()}
|
||||||
onClose={clearNeedsPaymentSetup}
|
onClose={() => {
|
||||||
|
clearNeedsPaymentSetup()
|
||||||
|
setPaymentSetupOpen(false)
|
||||||
|
void refetchTenant()
|
||||||
|
}}
|
||||||
/>
|
/>
|
||||||
</PageContainer>
|
</PageContainer>
|
||||||
)
|
)
|
||||||
|
|||||||
Reference in New Issue
Block a user