SkateSpots/src/lib/craftFields.ts
SkateSpots 681eab9592 Add craft-specific detail fields with matching display sections
Per-craft freeform fields, each wired end-to-end (form + detail display) so
none are stored invisibly:

- Artist: deliverables, turnaround
- Graffiti: surfaces, max_size
- Musician: set_length, tech_rider
- Judge: travel, certifications
- Organizer: insurance, permits
- Tattoo: deposit, minimum
- Trainer: modalities
- Barber: duration
- Filmer/Editor/Photographer: turnaround, deliverables (filmer adds drone)
- Builder: lead_time, warranty

Data-driven crafts declare them via CraftProfileForm's extraFields (now with
labelKey); the bespoke pages add matching state/inputs/prefill/save.
src/lib/craftFields.ts (CRAFT_DETAIL_FIELDS) maps each tag to a display label,
rendered on the shared detail page; toggle tags render as a localized Yes.
Labels are translated (EN/ES); placeholders stay as examples.
2026-10-04 10:53:57 +07:00

64 lines
2.3 KiB
TypeScript

import type { LabProfileType } from '@/hooks/useLabProfiles';
/** One craft-specific freeform field shown on the Lab detail page. */
export interface CraftDetailField {
tag: string;
labelKey: string;
}
/**
* Craft-specific freeform fields to surface on a provider's detail page.
*
* Keep this in sync with the `extraFields` declared in `becomeRoles.tsx` (and
* the bespoke become pages): a field with no entry here is stored but invisible.
* Toggle tags (value `"true"`) render as a localized "Yes".
*/
export const CRAFT_DETAIL_FIELDS: Partial<Record<LabProfileType, CraftDetailField[]>> = {
artist: [
{ tag: 'deliverables', labelKey: 'labUi.craftFields.deliverables' },
{ tag: 'turnaround', labelKey: 'labUi.craftFields.turnaround' },
],
graffiti: [
{ tag: 'surfaces', labelKey: 'labUi.craftFields.surfaces' },
{ tag: 'max_size', labelKey: 'labUi.craftFields.maxSize' },
],
musician: [
{ tag: 'set_length', labelKey: 'labUi.craftFields.setLength' },
{ tag: 'tech_rider', labelKey: 'labUi.craftFields.techRider' },
],
judge: [
{ tag: 'travel', labelKey: 'labUi.craftFields.travel' },
{ tag: 'certifications', labelKey: 'labUi.craftFields.certifications' },
],
organizer: [
{ tag: 'insurance', labelKey: 'labUi.craftFields.insurance' },
{ tag: 'permits', labelKey: 'labUi.craftFields.permits' },
],
tattoo: [
{ tag: 'deposit', labelKey: 'labUi.craftFields.deposit' },
{ tag: 'minimum', labelKey: 'labUi.craftFields.minimum' },
],
trainer: [
{ tag: 'modalities', labelKey: 'labUi.craftFields.modalities' },
],
barber: [
{ tag: 'duration', labelKey: 'labUi.craftFields.duration' },
],
filmer: [
{ tag: 'turnaround', labelKey: 'labUi.craftFields.turnaround' },
{ tag: 'deliverables', labelKey: 'labUi.craftFields.deliverables' },
{ tag: 'drone', labelKey: 'labUi.craftFields.drone' },
],
editor: [
{ tag: 'turnaround', labelKey: 'labUi.craftFields.turnaround' },
{ tag: 'deliverables', labelKey: 'labUi.craftFields.deliverables' },
],
photographer: [
{ tag: 'turnaround', labelKey: 'labUi.craftFields.turnaround' },
{ tag: 'deliverables', labelKey: 'labUi.craftFields.deliverables' },
],
builder: [
{ tag: 'lead_time', labelKey: 'labUi.craftFields.leadTime' },
{ tag: 'warranty', labelKey: 'labUi.craftFields.warranty' },
],
};