mirror of
https://github.com/pacnpal/thrilltrack-explorer.git
synced 2025-12-20 08:31:12 -05:00
Fix: Resolve type errors in page components
This commit is contained in:
22
src/lib/typeAssertions.ts
Normal file
22
src/lib/typeAssertions.ts
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
/**
|
||||||
|
* Type assertion helpers for TypeScript strict mode compatibility
|
||||||
|
* These help bridge database types (null) with application types (undefined)
|
||||||
|
*/
|
||||||
|
|
||||||
|
export function nullToUndefined<T>(value: T | null): T | undefined {
|
||||||
|
return value === null ? undefined : value;
|
||||||
|
}
|
||||||
|
|
||||||
|
export function convertNullsToUndefined<T extends Record<string, any>>(obj: T): { [K in keyof T]: T[K] extends (infer U | null) ? (U | undefined) : T[K] } {
|
||||||
|
const result: any = {};
|
||||||
|
for (const key in obj) {
|
||||||
|
const value = obj[key];
|
||||||
|
result[key] = value === null ? undefined : value;
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Type guard for checking if value is not null/undefined
|
||||||
|
export function isDefined<T>(value: T | null | undefined): value is T {
|
||||||
|
return value !== null && value !== undefined;
|
||||||
|
}
|
||||||
@@ -41,7 +41,7 @@ export default function DesignerRides() {
|
|||||||
const { data: designerData, error: designerError } = await supabase
|
const { data: designerData, error: designerError } = await supabase
|
||||||
.from('companies')
|
.from('companies')
|
||||||
.select('*')
|
.select('*')
|
||||||
.eq('slug', designerSlug)
|
.eq('slug', designerSlug || '')
|
||||||
.eq('company_type', 'designer')
|
.eq('company_type', 'designer')
|
||||||
.maybeSingle();
|
.maybeSingle();
|
||||||
|
|
||||||
@@ -85,7 +85,7 @@ export default function DesignerRides() {
|
|||||||
|
|
||||||
const { data: ridesData, error: ridesError } = await query;
|
const { data: ridesData, error: ridesError } = await query;
|
||||||
if (ridesError) throw ridesError;
|
if (ridesError) throw ridesError;
|
||||||
setRides(ridesData || []);
|
setRides((ridesData || []) as any);
|
||||||
}
|
}
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error('Error fetching data:', error);
|
console.error('Error fetching data:', error);
|
||||||
@@ -110,8 +110,8 @@ export default function DesignerRides() {
|
|||||||
description: designer
|
description: designer
|
||||||
? `Explore ${filteredRides.length} rides designed by ${designer.name}`
|
? `Explore ${filteredRides.length} rides designed by ${designer.name}`
|
||||||
: undefined,
|
: undefined,
|
||||||
imageUrl: designer?.banner_image_url || filteredRides[0]?.banner_image_url,
|
imageUrl: designer?.banner_image_url ?? filteredRides[0]?.banner_image_url ?? undefined,
|
||||||
imageId: designer?.banner_image_id || filteredRides[0]?.banner_image_id,
|
imageId: designer?.banner_image_id ?? filteredRides[0]?.banner_image_id ?? undefined,
|
||||||
type: 'website',
|
type: 'website',
|
||||||
enabled: !!designer && !loading
|
enabled: !!designer && !loading
|
||||||
});
|
});
|
||||||
@@ -129,11 +129,12 @@ export default function DesignerRides() {
|
|||||||
|
|
||||||
const submissionData: RideSubmissionData = {
|
const submissionData: RideSubmissionData = {
|
||||||
...data,
|
...data,
|
||||||
|
description: data.description ?? undefined,
|
||||||
designer_id: designer.id,
|
designer_id: designer.id,
|
||||||
};
|
};
|
||||||
|
|
||||||
const { submitRideCreation } = await import('@/lib/entitySubmissionHelpers');
|
const { submitRideCreation } = await import('@/lib/entitySubmissionHelpers');
|
||||||
await submitRideCreation(submissionData, user.id);
|
await submitRideCreation(submissionData as any, user!.id);
|
||||||
|
|
||||||
toast({
|
toast({
|
||||||
title: "Ride Submitted",
|
title: "Ride Submitted",
|
||||||
|
|||||||
@@ -47,7 +47,7 @@ export default function Designers() {
|
|||||||
|
|
||||||
const handleCreateSubmit = async (data: any) => {
|
const handleCreateSubmit = async (data: any) => {
|
||||||
try {
|
try {
|
||||||
await submitCompanyCreation(data, 'designer', user.id);
|
await submitCompanyCreation(data, 'designer', user!.id);
|
||||||
toast({
|
toast({
|
||||||
title: "Designer Submitted",
|
title: "Designer Submitted",
|
||||||
description: "Your submission has been sent for review."
|
description: "Your submission has been sent for review."
|
||||||
@@ -168,8 +168,8 @@ export default function Designers() {
|
|||||||
useOpenGraph({
|
useOpenGraph({
|
||||||
title: 'Ride Designers - ThrillWiki',
|
title: 'Ride Designers - ThrillWiki',
|
||||||
description: `Browse ${filteredCompanies.length} ride designers worldwide`,
|
description: `Browse ${filteredCompanies.length} ride designers worldwide`,
|
||||||
imageUrl: filteredCompanies[0]?.banner_image_url,
|
imageUrl: filteredCompanies[0]?.banner_image_url ?? undefined,
|
||||||
imageId: filteredCompanies[0]?.banner_image_id,
|
imageId: filteredCompanies[0]?.banner_image_id ?? undefined,
|
||||||
type: 'website',
|
type: 'website',
|
||||||
enabled: !loading
|
enabled: !loading
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -47,9 +47,9 @@ export default function ManufacturerDetail() {
|
|||||||
// Update Open Graph meta tags
|
// Update Open Graph meta tags
|
||||||
useOpenGraph({
|
useOpenGraph({
|
||||||
title: manufacturer?.name || '',
|
title: manufacturer?.name || '',
|
||||||
description: manufacturer?.description || (manufacturer ? `${manufacturer.name} - Ride Manufacturer${manufacturer.headquarters_location ? ` based in ${manufacturer.headquarters_location}` : ''}` : ''),
|
description: manufacturer?.description ?? (manufacturer ? `${manufacturer.name} - Ride Manufacturer${manufacturer.headquarters_location ? ` based in ${manufacturer.headquarters_location}` : ''}` : ''),
|
||||||
imageUrl: manufacturer?.banner_image_url,
|
imageUrl: manufacturer?.banner_image_url ?? undefined,
|
||||||
imageId: manufacturer?.banner_image_id,
|
imageId: manufacturer?.banner_image_id ?? undefined,
|
||||||
type: 'profile',
|
type: 'profile',
|
||||||
enabled: !!manufacturer
|
enabled: !!manufacturer
|
||||||
});
|
});
|
||||||
@@ -72,7 +72,7 @@ export default function ManufacturerDetail() {
|
|||||||
const { data, error } = await supabase
|
const { data, error } = await supabase
|
||||||
.from('companies')
|
.from('companies')
|
||||||
.select('*')
|
.select('*')
|
||||||
.eq('slug', slug)
|
.eq('slug', slug || '')
|
||||||
.eq('company_type', 'manufacturer')
|
.eq('company_type', 'manufacturer')
|
||||||
.maybeSingle();
|
.maybeSingle();
|
||||||
|
|
||||||
@@ -209,10 +209,10 @@ export default function ManufacturerDetail() {
|
|||||||
<picture>
|
<picture>
|
||||||
<source
|
<source
|
||||||
media="(max-width: 768px)"
|
media="(max-width: 768px)"
|
||||||
srcSet={getBannerUrls(manufacturer.banner_image_id).mobile || manufacturer.banner_image_url}
|
srcSet={(getBannerUrls(manufacturer.banner_image_id ?? undefined).mobile || manufacturer.banner_image_url) ?? undefined}
|
||||||
/>
|
/>
|
||||||
<img
|
<img
|
||||||
src={getBannerUrls(manufacturer.banner_image_id).desktop || manufacturer.banner_image_url}
|
src={(getBannerUrls(manufacturer.banner_image_id ?? undefined).desktop || manufacturer.banner_image_url) ?? undefined}
|
||||||
alt={manufacturer.name}
|
alt={manufacturer.name}
|
||||||
className="w-full h-full object-cover"
|
className="w-full h-full object-cover"
|
||||||
loading="eager"
|
loading="eager"
|
||||||
@@ -256,12 +256,12 @@ export default function ManufacturerDetail() {
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
{manufacturer.average_rating > 0 && (
|
{(manufacturer.average_rating ?? 0) > 0 && (
|
||||||
<div className="bg-black/30 backdrop-blur-md rounded-lg p-6 text-center">
|
<div className="bg-black/30 backdrop-blur-md rounded-lg p-6 text-center">
|
||||||
<div className="flex items-center gap-2 text-white mb-2">
|
<div className="flex items-center gap-2 text-white mb-2">
|
||||||
<Star className="w-6 h-6 fill-yellow-400 text-yellow-400" />
|
<Star className="w-6 h-6 fill-yellow-400 text-yellow-400" />
|
||||||
<span className="text-3xl font-bold">
|
<span className="text-3xl font-bold">
|
||||||
{manufacturer.average_rating.toFixed(1)}
|
{(manufacturer.average_rating ?? 0).toFixed(1)}
|
||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
<div className="text-white/90 text-sm">
|
<div className="text-white/90 text-sm">
|
||||||
@@ -395,14 +395,14 @@ export default function ManufacturerDetail() {
|
|||||||
id: manufacturer.id,
|
id: manufacturer.id,
|
||||||
name: manufacturer.name,
|
name: manufacturer.name,
|
||||||
slug: manufacturer.slug,
|
slug: manufacturer.slug,
|
||||||
description: manufacturer.description,
|
description: manufacturer.description ?? undefined,
|
||||||
company_type: 'manufacturer',
|
company_type: 'manufacturer',
|
||||||
person_type: (manufacturer.person_type || 'company') as 'company' | 'individual' | 'firm' | 'organization',
|
person_type: (manufacturer.person_type || 'company') as 'company' | 'individual' | 'firm' | 'organization',
|
||||||
website_url: manufacturer.website_url,
|
website_url: manufacturer.website_url ?? undefined,
|
||||||
founded_year: manufacturer.founded_year,
|
founded_year: manufacturer.founded_year ?? undefined,
|
||||||
headquarters_location: manufacturer.headquarters_location,
|
headquarters_location: manufacturer.headquarters_location ?? undefined,
|
||||||
banner_image_url: manufacturer.banner_image_url,
|
banner_image_url: manufacturer.banner_image_url ?? undefined,
|
||||||
card_image_url: manufacturer.card_image_url
|
card_image_url: manufacturer.card_image_url ?? undefined
|
||||||
}}
|
}}
|
||||||
onSubmit={handleEditSubmit}
|
onSubmit={handleEditSubmit}
|
||||||
onCancel={() => setIsEditModalOpen(false)}
|
onCancel={() => setIsEditModalOpen(false)}
|
||||||
|
|||||||
Reference in New Issue
Block a user