From 3cc16d18ca970d8c8007d49b8bfcf9370b7deb5b Mon Sep 17 00:00:00 2001 From: SkateSpots Date: Sat, 3 Oct 2026 17:33:35 +0700 Subject: [PATCH] feat(crew): clearer, consistent crew-creation form MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Coordinator block: shorter copy, a Remove (✕) button, and an honest "pointer only — real Cordn MLS isn't wired yet" note (the old paragraph was a wall of jargon). - Save now blocks on a non-empty but unparseable coordinator (was silently dropped) instead of publishing a crew with no coordinator. - One consistent block order for create (wizard "Extras") and edit, grouped: core -> squad/places -> identity (NIP-05, links, band) -> agent -> showcase (video, sponsor) -> treasury -> integrations (Lab link, coordinator). --- src/components/CrewForm.tsx | 67 ++++++++++++++++++++++++------------- src/i18n/en.ts | 3 ++ src/i18n/es.ts | 3 ++ 3 files changed, 50 insertions(+), 23 deletions(-) diff --git a/src/components/CrewForm.tsx b/src/components/CrewForm.tsx index d722e72..9ace413 100644 --- a/src/components/CrewForm.tsx +++ b/src/components/CrewForm.tsx @@ -428,6 +428,12 @@ export function CrewForm({ existing }: CrewFormProps) { return; } + // An invalid coordinator would be silently dropped on save — tell the user. + if (coordinatorInput.trim() && !parsedCoordinator) { + toast({ title: t('socialUi.coordinator.invalid'), variant: 'destructive' }); + return; + } + try { const identifier = existing?.identifier ?? `crew-${Date.now().toString(36)}`; @@ -1091,8 +1097,7 @@ export function CrewForm({ existing }: CrewFormProps) { {t('socialUi.coordinator.customTitle')} {t('socialUi.coordinator.customBadge')}

- {t('socialUi.coordinator.customDescA')} {t('socialUi.coordinator.customDescB')}{' '} - {t('socialUi.coordinator.customRunOwn')}{' '} + {t('socialUi.coordinator.customDescShort')}{' '} {t('socialUi.coordinator.cordnCoordinator')} - {' '} - {t('socialUi.coordinator.customDescC')} + + .

- setCoordinatorInput(e.target.value)} - className="bg-gray-800 border-gray-700 font-mono text-xs" - spellCheck={false} - /> +
+ setCoordinatorInput(e.target.value)} + className="bg-gray-800 border-gray-700 font-mono text-xs" + spellCheck={false} + /> + {coordinatorInput.trim() !== '' && ( + + )} +
{coordinatorInput.trim() !== '' && (parsedCoordinator ? (

@@ -1134,6 +1154,7 @@ export function CrewForm({ existing }: CrewFormProps) { {t('socialUi.coordinator.useMine')} )} +

{t('socialUi.coordinator.pointerNote')}

); @@ -1281,19 +1302,19 @@ export function CrewForm({ existing }: CrewFormProps) { {bioBlock} {vibeBlock} {crewTypeBlock} - {agentBlock} {openCallBlock} - {treasuryBlock} {membersBlock} {spotsBlock} - {labLinkBlock} - {videoBlock} - {sponsorBlock} - {coordinatorBlock} {locationBlock} {nip05Block} {linksBlock} {bandBlock} + {agentBlock} + {videoBlock} + {sponsorBlock} + {treasuryBlock} + {labLinkBlock} + {coordinatorBlock}