Refactor: Restore type safety in forms

This commit is contained in:
gpt-engineer-app[bot]
2025-10-12 16:28:28 +00:00
parent dd079bd5a5
commit 3ba2077e0a
4 changed files with 109 additions and 28 deletions

View File

@@ -21,6 +21,26 @@ import { useAuth } from '@/hooks/useAuth';
import { toast } from 'sonner'; import { toast } from 'sonner';
import { useNavigate } from 'react-router-dom'; import { useNavigate } from 'react-router-dom';
// Raw form input state (before Zod transformation)
interface DesignerFormInput {
name: string;
slug: string;
company_type: 'designer' | 'manufacturer' | 'operator' | 'property_owner';
description?: string;
person_type: 'company' | 'individual' | 'firm' | 'organization';
founded_year?: string;
founded_date?: string;
founded_date_precision?: 'day' | 'month' | 'year';
headquarters_location?: string;
website_url?: string;
images?: {
uploaded: any[];
banner_assignment?: number | null;
card_assignment?: number | null;
};
}
// Zod output type (after transformation)
type DesignerFormData = z.infer<typeof entitySchemas.designer>; type DesignerFormData = z.infer<typeof entitySchemas.designer>;
interface DesignerFormProps { interface DesignerFormProps {
@@ -51,8 +71,9 @@ export function DesignerForm({ onSubmit, onCancel, initialData }: DesignerFormPr
defaultValues: { defaultValues: {
name: initialData?.name || '', name: initialData?.name || '',
slug: initialData?.slug || '', slug: initialData?.slug || '',
company_type: 'designer' as const,
description: initialData?.description || '', description: initialData?.description || '',
person_type: initialData?.person_type || 'company', person_type: initialData?.person_type || ('company' as const),
website_url: initialData?.website_url || '', website_url: initialData?.website_url || '',
founded_year: initialData?.founded_year ? String(initialData.founded_year) : '', founded_year: initialData?.founded_year ? String(initialData.founded_year) : '',
headquarters_location: initialData?.headquarters_location || '', headquarters_location: initialData?.headquarters_location || '',
@@ -79,10 +100,10 @@ export function DesignerForm({ onSubmit, onCancel, initialData }: DesignerFormPr
setIsSubmitting(true); setIsSubmitting(true);
try { try {
if (initialData?.id) { if (initialData?.id) {
await submitDesignerUpdate(initialData.id, data as unknown as DesignerFormData, user.id); await submitDesignerUpdate(initialData.id, data, user.id);
toast.success('Designer update submitted for review'); toast.success('Designer update submitted for review');
} else { } else {
await submitDesignerCreation(data as unknown as DesignerFormData, user.id); await submitDesignerCreation(data, user.id);
toast.success('Designer submitted for review'); toast.success('Designer submitted for review');
} }
onCancel(); onCancel();

View File

@@ -21,6 +21,26 @@ import { useAuth } from '@/hooks/useAuth';
import { toast } from 'sonner'; import { toast } from 'sonner';
import { useNavigate } from 'react-router-dom'; import { useNavigate } from 'react-router-dom';
// Raw form input state (before Zod transformation)
interface ManufacturerFormInput {
name: string;
slug: string;
company_type: 'designer' | 'manufacturer' | 'operator' | 'property_owner';
description?: string;
person_type: 'company' | 'individual' | 'firm' | 'organization';
founded_year?: string;
founded_date?: string;
founded_date_precision?: 'day' | 'month' | 'year';
headquarters_location?: string;
website_url?: string;
images?: {
uploaded: any[];
banner_assignment?: number | null;
card_assignment?: number | null;
};
}
// Zod output type (after transformation)
type ManufacturerFormData = z.infer<typeof entitySchemas.manufacturer>; type ManufacturerFormData = z.infer<typeof entitySchemas.manufacturer>;
interface ManufacturerFormProps { interface ManufacturerFormProps {
@@ -51,12 +71,13 @@ export function ManufacturerForm({ onSubmit, onCancel, initialData }: Manufactur
defaultValues: { defaultValues: {
name: initialData?.name || '', name: initialData?.name || '',
slug: initialData?.slug || '', slug: initialData?.slug || '',
company_type: 'manufacturer' as const,
description: initialData?.description || '', description: initialData?.description || '',
person_type: initialData?.person_type || 'company', person_type: initialData?.person_type || ('company' as const),
website_url: initialData?.website_url || '', website_url: initialData?.website_url || '',
founded_year: initialData?.founded_year ? String(initialData.founded_year) : '', founded_year: initialData?.founded_year ? String(initialData.founded_year) : '',
founded_date: initialData?.founded_date || (initialData?.founded_year ? `${initialData.founded_year}-01-01` : ''), founded_date: initialData?.founded_date || (initialData?.founded_year ? `${initialData.founded_year}-01-01` : ''),
founded_date_precision: initialData?.founded_date_precision || (initialData?.founded_year ? 'year' : 'day'), founded_date_precision: initialData?.founded_date_precision || (initialData?.founded_year ? ('year' as const) : ('day' as const)),
headquarters_location: initialData?.headquarters_location || '', headquarters_location: initialData?.headquarters_location || '',
images: initialData?.images || { uploaded: [] } images: initialData?.images || { uploaded: [] }
} }
@@ -81,10 +102,10 @@ export function ManufacturerForm({ onSubmit, onCancel, initialData }: Manufactur
setIsSubmitting(true); setIsSubmitting(true);
try { try {
if (initialData?.id) { if (initialData?.id) {
await submitManufacturerUpdate(initialData.id, data as unknown as ManufacturerFormData, user.id); await submitManufacturerUpdate(initialData.id, data, user.id);
toast.success('Manufacturer update submitted for review'); toast.success('Manufacturer update submitted for review');
} else { } else {
await submitManufacturerCreation(data as unknown as ManufacturerFormData, user.id); await submitManufacturerCreation(data, user.id);
toast.success('Manufacturer submitted for review'); toast.success('Manufacturer submitted for review');
} }
onCancel(); onCancel();

View File

@@ -21,6 +21,26 @@ import { useAuth } from '@/hooks/useAuth';
import { toast } from 'sonner'; import { toast } from 'sonner';
import { useNavigate } from 'react-router-dom'; import { useNavigate } from 'react-router-dom';
// Raw form input state (before Zod transformation)
interface OperatorFormInput {
name: string;
slug: string;
company_type: 'designer' | 'manufacturer' | 'operator' | 'property_owner';
description?: string;
person_type: 'company' | 'individual' | 'firm' | 'organization';
founded_year?: string;
founded_date?: string;
founded_date_precision?: 'day' | 'month' | 'year';
headquarters_location?: string;
website_url?: string;
images?: {
uploaded: any[];
banner_assignment?: number | null;
card_assignment?: number | null;
};
}
// Zod output type (after transformation)
type OperatorFormData = z.infer<typeof entitySchemas.operator>; type OperatorFormData = z.infer<typeof entitySchemas.operator>;
interface OperatorFormProps { interface OperatorFormProps {
@@ -51,8 +71,9 @@ export function OperatorForm({ onSubmit, onCancel, initialData }: OperatorFormPr
defaultValues: { defaultValues: {
name: initialData?.name || '', name: initialData?.name || '',
slug: initialData?.slug || '', slug: initialData?.slug || '',
company_type: 'operator' as const,
description: initialData?.description || '', description: initialData?.description || '',
person_type: initialData?.person_type || 'company', person_type: initialData?.person_type || ('company' as const),
website_url: initialData?.website_url || '', website_url: initialData?.website_url || '',
founded_year: initialData?.founded_year ? String(initialData.founded_year) : '', founded_year: initialData?.founded_year ? String(initialData.founded_year) : '',
headquarters_location: initialData?.headquarters_location || '', headquarters_location: initialData?.headquarters_location || '',
@@ -79,10 +100,10 @@ export function OperatorForm({ onSubmit, onCancel, initialData }: OperatorFormPr
setIsSubmitting(true); setIsSubmitting(true);
try { try {
if (initialData?.id) { if (initialData?.id) {
await submitOperatorUpdate(initialData.id, data as unknown as OperatorFormData, user.id); await submitOperatorUpdate(initialData.id, data, user.id);
toast.success('Operator update submitted for review'); toast.success('Operator update submitted for review');
} else { } else {
await submitOperatorCreation(data as unknown as OperatorFormData, user.id); await submitOperatorCreation(data, user.id);
toast.success('Operator submitted for review'); toast.success('Operator submitted for review');
} }
onCancel(); onCancel();

View File

@@ -20,6 +20,24 @@ import { useAuth } from '@/hooks/useAuth';
import { toast } from 'sonner'; import { toast } from 'sonner';
import { useNavigate } from 'react-router-dom'; import { useNavigate } from 'react-router-dom';
// Raw form input state (before Zod transformation)
interface PropertyOwnerFormInput {
name: string;
slug: string;
description?: string;
person_type: 'company' | 'individual' | 'firm' | 'organization';
founded_year?: string;
founded_date?: string;
founded_date_precision?: 'day' | 'month' | 'year';
headquarters_location?: string;
website_url?: string;
images?: {
uploaded: any[];
banner_assignment?: number | null;
card_assignment?: number | null;
};
}
const propertyOwnerSchema = z.object({ const propertyOwnerSchema = z.object({
name: z.string().min(1, 'Name is required'), name: z.string().min(1, 'Name is required'),
slug: z.string().min(1, 'Slug is required'), slug: z.string().min(1, 'Slug is required'),
@@ -81,7 +99,7 @@ export function PropertyOwnerForm({ onSubmit, onCancel, initialData }: PropertyO
name: initialData?.name || '', name: initialData?.name || '',
slug: initialData?.slug || '', slug: initialData?.slug || '',
description: initialData?.description || '', description: initialData?.description || '',
person_type: initialData?.person_type || 'company', person_type: initialData?.person_type || ('company' as const),
website_url: initialData?.website_url || '', website_url: initialData?.website_url || '',
founded_year: initialData?.founded_year ? String(initialData.founded_year) : '', founded_year: initialData?.founded_year ? String(initialData.founded_year) : '',
headquarters_location: initialData?.headquarters_location || '', headquarters_location: initialData?.headquarters_location || '',
@@ -108,10 +126,10 @@ export function PropertyOwnerForm({ onSubmit, onCancel, initialData }: PropertyO
setIsSubmitting(true); setIsSubmitting(true);
try { try {
if (initialData?.id) { if (initialData?.id) {
await submitPropertyOwnerUpdate(initialData.id, data as unknown as PropertyOwnerFormData, user.id); await submitPropertyOwnerUpdate(initialData.id, data, user.id);
toast.success('Property owner update submitted for review'); toast.success('Property owner update submitted for review');
} else { } else {
await submitPropertyOwnerCreation(data as unknown as PropertyOwnerFormData, user.id); await submitPropertyOwnerCreation(data, user.id);
toast.success('Property owner submitted for review'); toast.success('Property owner submitted for review');
} }
onCancel(); onCancel();