'use client'; import React, { useState } from 'react'; import Link from 'next/link'; import { Club, UserPortalPermissions } from './types'; import { updateClubProfile, sanitizePortalError } from '../../lib/club-data'; interface FounderProfileEditorProps { club: Club; permissions: UserPortalPermissions; callerUid?: string; isDemoFixture?: boolean; onProfileUpdated?: (updated: Partial) => void; } export function FounderProfileEditor({ club, permissions, callerUid, isDemoFixture = false, onProfileUpdated, }: FounderProfileEditorProps) { // Form fields matching Section 1 & 2 const [name, setName] = useState(club.name || ''); const [description, setDescription] = useState(club.description || ''); const [homeRegion, setHomeRegion] = useState(club.homeRegion || ''); const [motorcycleFocus, setMotorcycleFocus] = useState(club.motorcycleFocus || ''); // Save states const [isSaving, setIsSaving] = useState(false); const [saveStatus, setSaveStatus] = useState<'idle' | 'success' | 'error'>('idle'); const [errorMessage, setErrorMessage] = useState(null); // Validation const trimmedName = name.trim(); const isNameValid = trimmedName.length >= 3 && trimmedName.length <= 50; const isDescValid = description.trim().length <= 500; const isRegionValid = homeRegion.trim().length <= 100; const isFocusValid = motorcycleFocus.trim().length <= 100; const canSave = isNameValid && isDescValid && isRegionValid && isFocusValid && !isSaving && permissions.canManageSettings; const isDirty = trimmedName !== (club.name || '').trim() || description.trim() !== (club.description || '').trim() || homeRegion.trim() !== (club.homeRegion || '').trim() || motorcycleFocus.trim() !== (club.motorcycleFocus || '').trim(); // Short initials for preview emblem const initials = name .split(/\s+/) .filter(Boolean) .map((w) => w[0].toUpperCase()) .slice(0, 3) .join('') || 'MSR'; async function handleSave(e: React.FormEvent) { e.preventDefault(); if (!canSave) return; setIsSaving(true); setSaveStatus('idle'); setErrorMessage(null); try { if (isDemoFixture) { // Simulated latency in development demo preview mode await new Promise((resolve) => setTimeout(resolve, 600)); setSaveStatus('success'); onProfileUpdated?.({ name: trimmedName, description: description.trim(), homeRegion: homeRegion.trim(), motorcycleFocus: motorcycleFocus.trim(), }); } else { if (!callerUid) { throw new Error('Authentication required to save profile.'); } await updateClubProfile(club.id, callerUid, { name: trimmedName, description: description.trim(), homeRegion: homeRegion.trim(), motorcycleFocus: motorcycleFocus.trim(), }); setSaveStatus('success'); onProfileUpdated?.({ name: trimmedName, description: description.trim(), homeRegion: homeRegion.trim(), motorcycleFocus: motorcycleFocus.trim(), }); } } catch (err) { setSaveStatus('error'); setErrorMessage(sanitizePortalError(err, 'Failed to update club profile. Please try again.')); } finally { setIsSaving(false); } } return (
{/* 3. PAGE HEADER */}
PRECISION, NOT AGGRESSION // {homeRegion ? `${homeRegion.toUpperCase()} ZONE` : 'REGIONAL SQUADRON'}

CLUB PROFILE

Manage public-facing club identity, branding presentation, and discovery presence.

{/* 4. TOP 4 METRIC CARDS */}
{/* Card 1: Club Name */}
CLUB NAME
{name || club.name}
3-50 chars validated
{/* Card 2: Home Region */}
HOME REGION location_on
{homeRegion || 'Not specified'}
Home Region
{/* Card 3: Motorcycle Focus */}
MOTORCYCLE FOCUS sports_motorsports
{motorcycleFocus || 'General'}
Motorcycle Focus
{/* Card 4: Discovery Presence */}
DISCOVERY PRESENCE
{club.visibility}
{club.visibility === 'public' ? 'Listed in public club index & directory' : club.visibility === 'unlisted' ? 'Accessible via direct handle only' : 'Restricted private club'}
{/* 5. MAIN WORKSPACE (12-Column Grid) */}
{/* LEFT MAIN (8 cols) */}
{/* Status Feedback Banner */} {saveStatus === 'success' && (
check_circle
Club profile changes have been saved successfully.
)} {saveStatus === 'error' && errorMessage && (
error
{errorMessage}
)} {/* SECTION 1: PUBLIC CLUB IDENTITY */}
badge

SECTION 1: PUBLIC CLUB IDENTITY

{/* Club Name */}
setName(e.target.value)} disabled={!permissions.canManageSettings || isSaving} placeholder="e.g. MotorSignal Riders Atlanta" className="w-full bg-surface-dim border border-outline-variant rounded px-3 py-2 text-sm font-body text-on-surface focus:border-primary focus:ring-0 outline-none transition-colors" /> {isNameValid ? 'VALID' : `${trimmedName.length}/50`}

3-50 characters. Displayed on public discovery, ride manifests, and club roster.

{/* Club Handle / Identifier (Locked) */}
IMMUTABLE
lock

Club handles are permanently reserved and cannot be renamed or reassigned.

{/* Club Description */}
{description.length}/500