'use client' import { useState } from 'react' import { Copy } from 'lucide-react' import { updateSpaceSettings, updateSpaceVisibility } from '@/lib/actions' import { financialVisibilities, directoryVisibilities } from '@/lib/validations' import type { SaveStatus, Space, SpaceExt } from '../types' interface Props extends SaveStatus { space: Space isAdmin: boolean } export function SpacePanel({ space, isAdmin, saving, setSaving, setMessage }: Props) { const spaceExt = space as SpaceExt // Space form (basic + mission statement) const [spaceForm, setSpaceForm] = useState({ name: space.name || '', slug: space.slug || '', city: space.city || '', require_approval: space.require_approval ?? true, public_member_directory: space.public_member_directory ?? false, mission_statement: spaceExt.mission_statement || '', }) // Visibility form (governance) — separate server action, separate save. const [visibilityForm, setVisibilityForm] = useState({ financial_visibility: (spaceExt.financial_visibility as string | undefined) || 'board_visible', member_directory_visibility: (spaceExt.member_directory_visibility as string | undefined) || 'members_visible', }) async function handleSaveSpace(e: React.FormEvent) { e.preventDefault() if (!isAdmin) return setSaving(true) setMessage(null) const result = await updateSpaceSettings(spaceForm) if (result.error) { setMessage({ type: 'error', text: result.error }) } else { setMessage({ type: 'success', text: 'Settings saved!' }) } setSaving(false) } async function handleSaveVisibility(e: React.FormEvent) { e.preventDefault() if (!isAdmin) return setSaving(true) setMessage(null) const result = await updateSpaceVisibility(visibilityForm) if ('error' in result && result.error) { setMessage({ type: 'error', text: result.error }) } else { setMessage({ type: 'success', text: 'Visibility updated.' }) } setSaving(false) } return ( <> {/* Space Settings */}
Space Settings
Visibility
Who sees financial data and the member directory. These flags propagate to the /financials page and (in a future pass) to the members directory.