Rename tenant fields to tenant_pubkey and plan to plan_id
This commit is contained in:
@@ -32,7 +32,7 @@ export default function PaymentDialog(props: PaymentDialogProps) {
|
||||
const billedRelays = createMemo(() => {
|
||||
const planById = new Map(plans().map((p) => [p.id, p]))
|
||||
return (relays() ?? [])
|
||||
.map((relay) => ({ relay, plan: planById.get(relay.plan) }))
|
||||
.map((relay) => ({ relay, plan: planById.get(relay.plan_id) }))
|
||||
.filter((entry) => Boolean(entry.plan?.amount))
|
||||
})
|
||||
|
||||
@@ -147,7 +147,7 @@ export default function PaymentDialog(props: PaymentDialogProps) {
|
||||
<li class="flex items-center justify-between gap-3 text-sm">
|
||||
<span class="truncate text-gray-900">{relay.info_name || relay.subdomain}</span>
|
||||
<span class="flex-shrink-0 text-xs text-gray-500">
|
||||
{plan?.name ?? relay.plan}
|
||||
{plan?.name ?? relay.plan_id}
|
||||
<Show when={plan}> · ${(plan!.amount / 100).toFixed(2)}/mo</Show>
|
||||
</span>
|
||||
</li>
|
||||
|
||||
@@ -32,9 +32,9 @@ function memberLabel(members: number | null) {
|
||||
|
||||
type PricingTableProps = {
|
||||
selectable?: boolean
|
||||
selectedPlan?: PlanId
|
||||
onSelect?: (plan: PlanId) => void
|
||||
onCta?: (plan: PlanId) => void
|
||||
selectedPlanId?: PlanId
|
||||
onSelect?: (planId: PlanId) => void
|
||||
onCta?: (planId: PlanId) => void
|
||||
}
|
||||
|
||||
export default function PricingTable(props: PricingTableProps) {
|
||||
@@ -43,7 +43,7 @@ export default function PricingTable(props: PricingTableProps) {
|
||||
<For each={plans()}>
|
||||
{(plan) => {
|
||||
const isPopular = plan.id === "basic"
|
||||
const isSelected = () => props.selectable && props.selectedPlan === plan.id
|
||||
const isSelected = () => props.selectable && props.selectedPlanId === plan.id
|
||||
|
||||
const card = (
|
||||
<>
|
||||
|
||||
@@ -63,7 +63,7 @@ type RelayDetailCardProps = {
|
||||
onToggleMediaStorage?: () => void
|
||||
onToggleLivekitSupport?: () => void
|
||||
onTogglePushNotifications?: () => void
|
||||
onUpdatePlan?: (plan: PlanId) => Promise<void>
|
||||
onUpdatePlan?: (planId: PlanId) => Promise<void>
|
||||
enforcePlanLimits?: boolean
|
||||
showPlanActions?: boolean
|
||||
}
|
||||
@@ -76,17 +76,17 @@ export default function RelayDetailCard(props: RelayDetailCardProps) {
|
||||
return fallback
|
||||
}
|
||||
const [menuOpen, setMenuOpen] = createSignal(false)
|
||||
const [plan, setPlan] = createSignal<PlanId>(props.relay.plan)
|
||||
const [planId, setPlanId] = createSignal<PlanId>(props.relay.plan_id)
|
||||
const [pendingAction, setPendingAction] = createSignal<"deactivate" | "reactivate" | null>(null)
|
||||
|
||||
let menuContainerRef: HTMLDivElement | undefined
|
||||
|
||||
const memberLimitLabel = () => {
|
||||
const p = plans().find(p => p.id === r().plan)
|
||||
const p = plans().find(p => p.id === r().plan_id)
|
||||
if (!p) return "?"
|
||||
return p.members === null ? "∞" : String(p.members)
|
||||
}
|
||||
const planLimited = () => (props.enforcePlanLimits ?? true) && r().plan === "free"
|
||||
const planLimited = () => (props.enforcePlanLimits ?? true) && r().plan_id === "free"
|
||||
const showPlanActions = () => props.showPlanActions ?? true
|
||||
const actionBusy = () => pendingAction() === "deactivate" ? !!props.deactivating : pendingAction() === "reactivate" ? !!props.reactivating : false
|
||||
const relayLabel = () => r().info_name || r().subdomain
|
||||
@@ -107,11 +107,11 @@ export default function RelayDetailCard(props: RelayDetailCardProps) {
|
||||
const confirmBusyLabel = () => pendingAction() === "deactivate" ? "Deactivating..." : "Reactivating..."
|
||||
const confirmTone = () => pendingAction() === "deactivate" ? "danger" : "primary"
|
||||
|
||||
async function changePlan(plan: PlanId) {
|
||||
setPlan(plan)
|
||||
async function changePlanId(planId: PlanId) {
|
||||
setPlanId(planId)
|
||||
try {
|
||||
await props.onUpdatePlan?.(plan)
|
||||
setToastMessage(`Plan updated to ${plan}`, "success")
|
||||
await props.onUpdatePlan?.(planId)
|
||||
setToastMessage(`Plan updated to ${planId}`, "success")
|
||||
} catch {
|
||||
// error is handled by the caller
|
||||
}
|
||||
@@ -360,7 +360,7 @@ export default function RelayDetailCard(props: RelayDetailCardProps) {
|
||||
</Field>
|
||||
<Show when={props.showTenant}>
|
||||
<Field label="Tenant">
|
||||
<span class="font-mono text-xs break-all">{r().tenant}</span>
|
||||
<span class="font-mono text-xs break-all">{r().tenant_pubkey}</span>
|
||||
</Field>
|
||||
</Show>
|
||||
</MembershipSection>
|
||||
@@ -373,15 +373,15 @@ export default function RelayDetailCard(props: RelayDetailCardProps) {
|
||||
when={props.onUpdatePlan}
|
||||
fallback={
|
||||
<Field label="Current plan">
|
||||
<span class="capitalize text-gray-900">{r().plan}</span>
|
||||
<span class="capitalize text-gray-900">{r().plan_id}</span>
|
||||
</Field>
|
||||
}
|
||||
>
|
||||
<div class="lg:col-span-2 space-y-4">
|
||||
<PricingTable
|
||||
selectable
|
||||
selectedPlan={plan()}
|
||||
onSelect={changePlan}
|
||||
selectedPlanId={planId()}
|
||||
onSelect={changePlanId}
|
||||
/>
|
||||
</div>
|
||||
</Show>
|
||||
|
||||
@@ -5,7 +5,7 @@ import { validateSubdomainLabel } from "@/lib/subdomain"
|
||||
import { setToastMessage } from "@/components/Toast"
|
||||
import { plans } from "@/lib/state"
|
||||
|
||||
export type RelayFormValues = Pick<Relay, "info_name" | "subdomain" | "info_icon" | "info_description" | "plan">
|
||||
export type RelayFormValues = Pick<Relay, "info_name" | "subdomain" | "info_icon" | "info_description" | "plan_id">
|
||||
|
||||
type RelayFormProps = {
|
||||
initialValues?: Partial<RelayFormValues>
|
||||
@@ -16,8 +16,8 @@ type RelayFormProps = {
|
||||
}
|
||||
|
||||
export default function RelayForm(props: RelayFormProps) {
|
||||
const defaultPlanId = createMemo(() => props.initialValues?.plan ?? plans()[0]?.id ?? "free")
|
||||
const [plan, setPlan] = createSignal(defaultPlanId())
|
||||
const defaultPlanId = createMemo(() => props.initialValues?.plan_id ?? plans()[0]?.id ?? "free")
|
||||
const [planId, setPlanId] = createSignal(defaultPlanId())
|
||||
const [name, setName] = createSignal(props.initialValues?.info_name ?? "")
|
||||
const [subdomain, setSubdomain] = createSignal(props.initialValues?.subdomain ?? "")
|
||||
const [icon, setIcon] = createSignal(props.initialValues?.info_icon ?? "")
|
||||
@@ -27,7 +27,7 @@ export default function RelayForm(props: RelayFormProps) {
|
||||
async function handleSubmit(e: Event) {
|
||||
e.preventDefault()
|
||||
|
||||
if (!plan()) {
|
||||
if (!planId()) {
|
||||
setToastMessage("Please select a plan")
|
||||
return
|
||||
}
|
||||
@@ -43,7 +43,7 @@ export default function RelayForm(props: RelayFormProps) {
|
||||
|
||||
try {
|
||||
await props.onSubmit({
|
||||
plan: plan(),
|
||||
plan_id: planId(),
|
||||
info_name: name(),
|
||||
subdomain: subdomain(),
|
||||
info_icon: icon(),
|
||||
@@ -56,7 +56,7 @@ export default function RelayForm(props: RelayFormProps) {
|
||||
}
|
||||
}
|
||||
|
||||
createEffect(() => setPlan(defaultPlanId()))
|
||||
createEffect(() => setPlanId(defaultPlanId()))
|
||||
|
||||
createEffect(() => {
|
||||
if (props.syncSubdomainWithName) {
|
||||
@@ -112,8 +112,8 @@ export default function RelayForm(props: RelayFormProps) {
|
||||
{(p) => (
|
||||
<button
|
||||
type="button"
|
||||
onClick={() => setPlan(p.id)}
|
||||
class={`border-2 rounded-xl p-4 text-left transition-colors ${plan() === p.id ? "border-blue-600 bg-blue-50" : "border-gray-200 hover:border-gray-300"}`}
|
||||
onClick={() => setPlanId(p.id)}
|
||||
class={`border-2 rounded-xl p-4 text-left transition-colors ${planId() === p.id ? "border-blue-600 bg-blue-50" : "border-gray-200 hover:border-gray-300"}`}
|
||||
>
|
||||
<div class="font-bold text-gray-900">{p.name}</div>
|
||||
<div class="text-sm text-gray-500 mt-1">
|
||||
|
||||
@@ -17,7 +17,7 @@ export default function RelayListItem(props: RelayListItemProps) {
|
||||
<p class="font-medium text-gray-900">{props.relay.info_name || props.relay.subdomain}</p>
|
||||
<p class="text-xs text-gray-500">{props.relay.subdomain}.spaces.coracle.social</p>
|
||||
{props.showTenant && (
|
||||
<p class="text-xs text-gray-500 break-all mt-1">Tenant: {props.relay.tenant}</p>
|
||||
<p class="text-xs text-gray-500 break-all mt-1">Tenant: {props.relay.tenant_pubkey}</p>
|
||||
)}
|
||||
</div>
|
||||
<Show
|
||||
|
||||
@@ -44,9 +44,9 @@ export type PlanId = string
|
||||
|
||||
export type Relay = {
|
||||
id: string
|
||||
tenant: string
|
||||
tenant_pubkey: string
|
||||
subdomain: string
|
||||
plan: PlanId
|
||||
plan_id: PlanId
|
||||
status: string
|
||||
sync_error: string
|
||||
synced: number
|
||||
@@ -63,9 +63,9 @@ export type Relay = {
|
||||
}
|
||||
|
||||
export type CreateRelayInput = {
|
||||
tenant?: string
|
||||
tenant_pubkey?: string
|
||||
subdomain: string
|
||||
plan: string
|
||||
plan_id: string
|
||||
info_name?: string
|
||||
info_icon?: string
|
||||
info_description?: string
|
||||
@@ -80,7 +80,7 @@ export type CreateRelayInput = {
|
||||
|
||||
export type UpdateRelayInput = {
|
||||
subdomain?: string
|
||||
plan?: string
|
||||
plan_id?: string
|
||||
info_name?: string
|
||||
info_icon?: string
|
||||
info_description?: string
|
||||
@@ -115,7 +115,7 @@ export type Invoice = {
|
||||
|
||||
export type Activity = {
|
||||
id: string
|
||||
tenant: string
|
||||
tenant_pubkey: string
|
||||
created_at: number
|
||||
activity_type: string
|
||||
resource_type: string
|
||||
|
||||
@@ -116,8 +116,8 @@ export const createRelayForActiveTenant = (input: CreateRelayInput) => {
|
||||
|
||||
const overrides = {
|
||||
tenant: account()!.pubkey,
|
||||
blossom_enabled: input.plan === "free" ? 0 : 1,
|
||||
livekit_enabled: input.plan === "free" ? 0 : 1,
|
||||
blossom_enabled: input.plan_id === "free" ? 0 : 1,
|
||||
livekit_enabled: input.plan_id === "free" ? 0 : 1,
|
||||
}
|
||||
|
||||
return createRelay({...defaults, ...input, ...overrides})
|
||||
@@ -127,7 +127,7 @@ export const updateActiveTenant = (input: { nwc_url?: string }) => updateTenant(
|
||||
|
||||
export const updateRelayById = (id: string, input: UpdateRelayInput) => updateRelay(id, input)
|
||||
|
||||
export const updateRelayPlanById = (id: string, plan: string) => updateRelay(id, { plan })
|
||||
export const updateRelayPlanById = (id: string, plan_id: string) => updateRelay(id, { plan_id })
|
||||
|
||||
export const deactivateRelayById = (id: string) => deactivateRelay(id)
|
||||
|
||||
|
||||
@@ -77,14 +77,14 @@ export default function useRelayToggles(
|
||||
}
|
||||
}
|
||||
|
||||
async function handleUpdatePlan(plan: PlanId) {
|
||||
async function handleUpdatePlan(plan_id: PlanId) {
|
||||
const current = relay()
|
||||
if (!current) return
|
||||
|
||||
const previous = current
|
||||
const next = { ...current, plan }
|
||||
const update: Record<string, unknown> = { plan }
|
||||
if (plan === "free") {
|
||||
const next = { ...current, plan_id }
|
||||
const update: Record<string, unknown> = { plan_id }
|
||||
if (plan_id === "free") {
|
||||
next.blossom_enabled = 0
|
||||
next.livekit_enabled = 0
|
||||
update.blossom_enabled = 0
|
||||
@@ -101,7 +101,7 @@ export default function useRelayToggles(
|
||||
throw e
|
||||
}
|
||||
|
||||
if (plan !== "free") {
|
||||
if (plan_id !== "free") {
|
||||
const needsSetup = await tenantNeedsPaymentSetup()
|
||||
if (needsSetup) {
|
||||
const invoice = await getLatestOpenInvoice()
|
||||
@@ -116,9 +116,9 @@ export default function useRelayToggles(
|
||||
onToggleStripSignatures: () => toggle("policy_strip_signatures", false),
|
||||
onToggleGroups: () => toggle("groups_enabled", true),
|
||||
onToggleManagement: () => toggle("management_enabled", true),
|
||||
onToggleMediaStorage: () => toggle("blossom_enabled", relay()?.plan !== "free"),
|
||||
onToggleMediaStorage: () => toggle("blossom_enabled", relay()?.plan_id !== "free"),
|
||||
onTogglePushNotifications: () => toggle("push_enabled", true),
|
||||
onToggleLivekitSupport: () => toggle("livekit_enabled", relay()?.plan !== "free"),
|
||||
onToggleLivekitSupport: () => toggle("livekit_enabled", relay()?.plan_id !== "free"),
|
||||
}
|
||||
|
||||
return { busy, handleDeactivate, handleReactivate, handleUpdatePlan, pendingInvoice, clearPendingInvoice: () => setPendingInvoice(undefined), pendingPaymentSetup, clearPendingPaymentSetup: () => setPendingPaymentSetup(false), toggles }
|
||||
|
||||
@@ -17,10 +17,10 @@ export default function Home() {
|
||||
const [showRelayModal, setShowRelayModal] = createSignal(false)
|
||||
const [showLoginModal, setShowLoginModal] = createSignal(false)
|
||||
const [draftRelay, setDraftRelay] = createSignal<RelayFormValues>()
|
||||
const [initialPlan, setInitialPlan] = createSignal<RelayFormValues["plan"]>("free")
|
||||
const [initialPlanId, setInitialPlanId] = createSignal<RelayFormValues["plan_id"]>("free")
|
||||
|
||||
function openRelayModal(plan: RelayFormValues["plan"] = "free") {
|
||||
setInitialPlan(plan)
|
||||
function openRelayModal(planId: RelayFormValues["plan_id"] = "free") {
|
||||
setInitialPlanId(planId)
|
||||
setShowRelayModal(true)
|
||||
}
|
||||
|
||||
@@ -404,7 +404,7 @@ export default function Home() {
|
||||
|
||||
<RelayForm
|
||||
syncSubdomainWithName
|
||||
initialValues={{ plan: initialPlan() }}
|
||||
initialValues={{ plan_id: initialPlanId() }}
|
||||
onSubmit={onRelayFormSubmit}
|
||||
submitLabel="Continue"
|
||||
submittingLabel="Creating..."
|
||||
|
||||
@@ -45,7 +45,7 @@ export default function RelayDetail() {
|
||||
const isPaidRelay = createMemo(() => {
|
||||
const r = relay()
|
||||
if (!r) return false
|
||||
const plan = plans().find(p => p.id === r.plan)
|
||||
const plan = plans().find(p => p.id === r.plan_id)
|
||||
return !!(plan && plan.amount > 0)
|
||||
})
|
||||
|
||||
|
||||
@@ -18,7 +18,7 @@ export default function RelayNew() {
|
||||
const relay = await createRelayForActiveTenant(values)
|
||||
createdRelayId = relay.id
|
||||
|
||||
if (values.plan !== "free") {
|
||||
if (values.plan_id !== "free") {
|
||||
const needsSetup = await tenantNeedsPaymentSetup()
|
||||
if (needsSetup) {
|
||||
const invoice = await getLatestOpenInvoice()
|
||||
|
||||
Reference in New Issue
Block a user