mirror of
https://github.com/pacnpal/thrilltrack-explorer.git
synced 2025-12-22 13:11:16 -05:00
Refactor: Restore type safety in forms
This commit is contained in:
@@ -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();
|
||||||
|
|||||||
@@ -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();
|
||||||
|
|||||||
@@ -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();
|
||||||
|
|||||||
@@ -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();
|
||||||
|
|||||||
Reference in New Issue
Block a user