mirror of
https://github.com/pacnpal/thrilltrack-explorer.git
synced 2025-12-22 15:11:13 -05:00
Implement strict type enforcement plan
This commit is contained in:
@@ -52,14 +52,14 @@ interface ImageAssignments {
|
||||
|
||||
interface SubmissionItemData {
|
||||
id: string;
|
||||
item_data: any;
|
||||
original_data?: any;
|
||||
item_data: Record<string, unknown>;
|
||||
original_data?: Record<string, unknown>;
|
||||
}
|
||||
|
||||
export const EntityEditPreview = ({ submissionId, entityType, entityName }: EntityEditPreviewProps) => {
|
||||
const [loading, setLoading] = useState(true);
|
||||
const [itemData, setItemData] = useState<any>(null);
|
||||
const [originalData, setOriginalData] = useState<any>(null);
|
||||
const [itemData, setItemData] = useState<Record<string, unknown> | null>(null);
|
||||
const [originalData, setOriginalData] = useState<Record<string, unknown> | null>(null);
|
||||
const [changedFields, setChangedFields] = useState<string[]>([]);
|
||||
const [bannerImageUrl, setBannerImageUrl] = useState<string | null>(null);
|
||||
const [cardImageUrl, setCardImageUrl] = useState<string | null>(null);
|
||||
@@ -88,8 +88,8 @@ export const EntityEditPreview = ({ submissionId, entityType, entityName }: Enti
|
||||
|
||||
if (items && items.length > 0) {
|
||||
const firstItem = items[0];
|
||||
setItemData(firstItem.item_data);
|
||||
setOriginalData(firstItem.original_data);
|
||||
setItemData(firstItem.item_data as Record<string, unknown>);
|
||||
setOriginalData(firstItem.original_data as Record<string, unknown> | null);
|
||||
|
||||
// Check for photo edit/delete operations
|
||||
if (firstItem.item_type === 'photo_edit' || firstItem.item_type === 'photo_delete') {
|
||||
@@ -102,11 +102,15 @@ export const EntityEditPreview = ({ submissionId, entityType, entityName }: Enti
|
||||
|
||||
// Parse changed fields
|
||||
const changed: string[] = [];
|
||||
const data = firstItem.item_data as any;
|
||||
const data = firstItem.item_data as Record<string, unknown>;
|
||||
|
||||
// Check for image changes
|
||||
if (data.images) {
|
||||
const images: ImageAssignments = data.images;
|
||||
if (data.images && typeof data.images === 'object') {
|
||||
const images = data.images as {
|
||||
uploaded?: Array<{ url: string; cloudflare_id: string }>;
|
||||
banner_assignment?: number | null;
|
||||
card_assignment?: number | null;
|
||||
};
|
||||
|
||||
// Safety check: verify uploaded array exists and is valid
|
||||
if (!images.uploaded || !Array.isArray(images.uploaded)) {
|
||||
@@ -143,7 +147,7 @@ export const EntityEditPreview = ({ submissionId, entityType, entityName }: Enti
|
||||
|
||||
// Check for other field changes by comparing with original_data
|
||||
if (firstItem.original_data) {
|
||||
const originalData = firstItem.original_data as any;
|
||||
const originalData = firstItem.original_data as Record<string, unknown>;
|
||||
const excludeFields = ['images', 'updated_at', 'created_at'];
|
||||
Object.keys(data).forEach(key => {
|
||||
if (!excludeFields.includes(key)) {
|
||||
@@ -195,7 +199,7 @@ export const EntityEditPreview = ({ submissionId, entityType, entityName }: Enti
|
||||
</Badge>
|
||||
</div>
|
||||
|
||||
{itemData?.cloudflare_image_url && (
|
||||
{itemData?.cloudflare_image_url && typeof itemData.cloudflare_image_url === 'string' && (
|
||||
<Card className="overflow-hidden">
|
||||
<CardContent className="p-2">
|
||||
<img
|
||||
@@ -212,19 +216,19 @@ export const EntityEditPreview = ({ submissionId, entityType, entityName }: Enti
|
||||
<div>
|
||||
<span className="font-medium">Old caption: </span>
|
||||
<span className="text-muted-foreground">
|
||||
{originalData?.caption || <em>No caption</em>}
|
||||
{(originalData?.caption as string) || <em>No caption</em>}
|
||||
</span>
|
||||
</div>
|
||||
<div>
|
||||
<span className="font-medium">New caption: </span>
|
||||
<span className="text-muted-foreground">
|
||||
{itemData?.new_caption || <em>No caption</em>}
|
||||
{(itemData?.new_caption as string) || <em>No caption</em>}
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
)}
|
||||
|
||||
{!isEdit && itemData?.reason && (
|
||||
{!isEdit && itemData?.reason && typeof itemData.reason === 'string' && (
|
||||
<div className="text-sm">
|
||||
<span className="font-medium">Reason: </span>
|
||||
<span className="text-muted-foreground">{itemData.reason}</span>
|
||||
|
||||
Reference in New Issue
Block a user