diff --git a/app/(app)/settings/page.tsx b/app/(app)/settings/page.tsx index 0c370bb..15add88 100644 --- a/app/(app)/settings/page.tsx +++ b/app/(app)/settings/page.tsx @@ -1,7 +1,5 @@ import { createClient } from '@/lib/supabase/server' import SettingsClient from './settings-client' -import { StripeBillingPanel } from '@/components/settings/stripe-billing-panel' -import { DuesPaymentMethodsPanel } from '@/components/settings/dues-payment-methods-panel' import { redirect } from 'next/navigation' export default async function SettingsPage() { @@ -27,15 +25,11 @@ export default async function SettingsPage() { .from('integrations').select('*').eq('space_id', member.space_id) return ( - <> - - - - + ) } diff --git a/app/(app)/settings/settings-client.tsx b/app/(app)/settings/settings-client.tsx index c91ddc6..e65176a 100644 --- a/app/(app)/settings/settings-client.tsx +++ b/app/(app)/settings/settings-client.tsx @@ -9,6 +9,8 @@ import { financialVisibilities, directoryVisibilities } from '@/lib/validations' import type { Tables } from '@/types/database' import { PageTitle } from '@/components/ui/page-title' import { Dialog, DialogContent, DialogHeader, DialogTitle } from '@/components/ui/dialog' +import { StripeBillingPanel } from '@/components/settings/stripe-billing-panel' +import { DuesPaymentMethodsPanel } from '@/components/settings/dues-payment-methods-panel' type Space = Tables<'spaces'> type Integration = Tables<'integrations'> @@ -88,7 +90,7 @@ const INTEGRATIONS_CONFIG = [ ] export default function SettingsClient({ space, isAdmin, integrations, currentRole }: Props) { - const [activeTab, setActiveTab] = useState<'space' | 'integrations' | 'webhooks'>('space') + const [activeTab, setActiveTab] = useState<'space' | 'integrations' | 'dues' | 'webhooks'>('space') const [saving, setSaving] = useState(false) const [message, setMessage] = useState<{ type: 'success' | 'error'; text: string } | null>(null) @@ -223,7 +225,7 @@ export default function SettingsClient({ space, isAdmin, integrations, currentRo
{/* Tabs */}
- {(['space', 'integrations', 'webhooks'] as const).map(tab => ( + {(['space', 'integrations', 'dues', 'webhooks'] as const).map(tab => (
)} + {/* Dues Tab: how members pay dues (Stripe recurring + external links) */} + {activeTab === 'dues' && ( +
+ + +
+ )} + {/* Webhooks Tab */} {activeTab === 'webhooks' && (
diff --git a/components/settings/dues-payment-methods-panel.tsx b/components/settings/dues-payment-methods-panel.tsx index 3226d22..775e1fd 100644 --- a/components/settings/dues-payment-methods-panel.tsx +++ b/components/settings/dues-payment-methods-panel.tsx @@ -78,7 +78,7 @@ export function DuesPaymentMethodsPanel() { } return ( -
+

Other ways to pay dues diff --git a/components/settings/stripe-billing-panel.tsx b/components/settings/stripe-billing-panel.tsx index b05c80d..da91bdb 100644 --- a/components/settings/stripe-billing-panel.tsx +++ b/components/settings/stripe-billing-panel.tsx @@ -56,7 +56,7 @@ export function StripeBillingPanel({ spaceId }: { spaceId: string }) { } return ( -
+

diff --git a/docs/HANDOFF.md b/docs/HANDOFF.md index 4411ff4..f61d4e0 100644 --- a/docs/HANDOFF.md +++ b/docs/HANDOFF.md @@ -4,6 +4,12 @@ Append-only. Newest entries on top. Keep each entry to one screen. --- +## 2026-05-20 (pass 60): /settings "Dues" tab (LOCAL, NOT deployed) + +Branch `main`. The Stripe-dues config + external-payment-links panels were floating below the settings tab bar (rendered by page.tsx outside SettingsClient, shown regardless of the active tab). Moved both into a new **Dues** tab inside SettingsClient (tabs are now Space / Integrations / Dues / Webhooks); the panels render as standard `bg-card rounded border` tab cards instead of `border-t` page sections. page.tsx now renders only SettingsClient. UI-only, no schema/actions change. Build + 594 unit green. NOT deployed. + +--- + ## 2026-05-20 (pass 59): PROD OUTAGE fix + in-app inbox + /me consolidation + style Branch `main`. Suite 594 unit, 40 integration, build clean.