mirror of
https://github.com/pacnpal/thrilltrack-explorer.git
synced 2025-12-22 10:51:12 -05:00
Refactor: Optimize validation in moderation
This commit is contained in:
@@ -7,7 +7,7 @@ import { useIsMobile } from '@/hooks/use-mobile';
|
|||||||
import { PhotoSubmissionDisplay } from './PhotoSubmissionDisplay';
|
import { PhotoSubmissionDisplay } from './PhotoSubmissionDisplay';
|
||||||
import { SubmissionChangesDisplay } from './SubmissionChangesDisplay';
|
import { SubmissionChangesDisplay } from './SubmissionChangesDisplay';
|
||||||
import { ValidationSummary } from './ValidationSummary';
|
import { ValidationSummary } from './ValidationSummary';
|
||||||
import { useState } from 'react';
|
import { useState, useCallback } from 'react';
|
||||||
import { ValidationResult } from '@/lib/entityValidationSchemas';
|
import { ValidationResult } from '@/lib/entityValidationSchemas';
|
||||||
|
|
||||||
interface ItemReviewCardProps {
|
interface ItemReviewCardProps {
|
||||||
@@ -21,6 +21,10 @@ export function ItemReviewCard({ item, onEdit, onStatusChange, submissionId }: I
|
|||||||
const isMobile = useIsMobile();
|
const isMobile = useIsMobile();
|
||||||
const [validationResult, setValidationResult] = useState<ValidationResult | null>(null);
|
const [validationResult, setValidationResult] = useState<ValidationResult | null>(null);
|
||||||
|
|
||||||
|
const handleValidationChange = useCallback((result: ValidationResult) => {
|
||||||
|
setValidationResult(result);
|
||||||
|
}, []);
|
||||||
|
|
||||||
const getItemIcon = () => {
|
const getItemIcon = () => {
|
||||||
switch (item.item_type) {
|
switch (item.item_type) {
|
||||||
case 'park': return <MapPin className="w-4 h-4" />;
|
case 'park': return <MapPin className="w-4 h-4" />;
|
||||||
@@ -117,7 +121,7 @@ export function ItemReviewCard({ item, onEdit, onStatusChange, submissionId }: I
|
|||||||
item_data: item.item_data,
|
item_data: item.item_data,
|
||||||
id: item.id,
|
id: item.id,
|
||||||
}}
|
}}
|
||||||
onValidationChange={setValidationResult}
|
onValidationChange={handleValidationChange}
|
||||||
compact={false}
|
compact={false}
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import { memo, useState } from 'react';
|
import { memo, useState, useCallback } from 'react';
|
||||||
import { CheckCircle, XCircle, Eye, Calendar, MessageSquare, FileText, Image, ListTree, RefreshCw, AlertCircle, Lock, Trash2, AlertTriangle } from 'lucide-react';
|
import { CheckCircle, XCircle, Eye, Calendar, MessageSquare, FileText, Image, ListTree, RefreshCw, AlertCircle, Lock, Trash2, AlertTriangle } from 'lucide-react';
|
||||||
import { Button } from '@/components/ui/button';
|
import { Button } from '@/components/ui/button';
|
||||||
import { Badge } from '@/components/ui/badge';
|
import { Badge } from '@/components/ui/badge';
|
||||||
@@ -99,6 +99,10 @@ export const QueueItem = memo(({
|
|||||||
}: QueueItemProps) => {
|
}: QueueItemProps) => {
|
||||||
const [validationResult, setValidationResult] = useState<ValidationResult | null>(null);
|
const [validationResult, setValidationResult] = useState<ValidationResult | null>(null);
|
||||||
|
|
||||||
|
const handleValidationChange = useCallback((result: ValidationResult) => {
|
||||||
|
setValidationResult(result);
|
||||||
|
}, []);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Card
|
<Card
|
||||||
key={item.id}
|
key={item.id}
|
||||||
@@ -166,7 +170,7 @@ export const QueueItem = memo(({
|
|||||||
id: item.id,
|
id: item.id,
|
||||||
}}
|
}}
|
||||||
compact={true}
|
compact={true}
|
||||||
onValidationChange={setValidationResult}
|
onValidationChange={handleValidationChange}
|
||||||
/>
|
/>
|
||||||
)}
|
)}
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import { useEffect, useState } from 'react';
|
import { useEffect, useState, useMemo } from 'react';
|
||||||
import { AlertCircle, CheckCircle, Info, AlertTriangle } from 'lucide-react';
|
import { AlertCircle, CheckCircle, Info, AlertTriangle } from 'lucide-react';
|
||||||
import { Badge } from '@/components/ui/badge';
|
import { Badge } from '@/components/ui/badge';
|
||||||
import { Alert, AlertDescription, AlertTitle } from '@/components/ui/alert';
|
import { Alert, AlertDescription, AlertTitle } from '@/components/ui/alert';
|
||||||
@@ -20,22 +20,21 @@ export function ValidationSummary({ item, onValidationChange, compact = false }:
|
|||||||
const [isLoading, setIsLoading] = useState(true);
|
const [isLoading, setIsLoading] = useState(true);
|
||||||
const [isExpanded, setIsExpanded] = useState(false);
|
const [isExpanded, setIsExpanded] = useState(false);
|
||||||
|
|
||||||
|
// Create stable reference for item_data to prevent unnecessary re-validations
|
||||||
|
const itemDataString = useMemo(
|
||||||
|
() => JSON.stringify(item.item_data),
|
||||||
|
[item.item_data]
|
||||||
|
);
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
async function validate() {
|
async function validate() {
|
||||||
setIsLoading(true);
|
setIsLoading(true);
|
||||||
try {
|
try {
|
||||||
console.log('Validating submission:', {
|
|
||||||
type: item.item_type,
|
|
||||||
data: item.item_data,
|
|
||||||
id: item.id
|
|
||||||
});
|
|
||||||
|
|
||||||
const result = await validateEntityData(
|
const result = await validateEntityData(
|
||||||
item.item_type as any,
|
item.item_type as any,
|
||||||
{ ...item.item_data, id: item.id }
|
{ ...item.item_data, id: item.id }
|
||||||
);
|
);
|
||||||
|
|
||||||
console.log('Validation result:', result);
|
|
||||||
setValidationResult(result);
|
setValidationResult(result);
|
||||||
onValidationChange?.(result);
|
onValidationChange?.(result);
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
@@ -53,7 +52,7 @@ export function ValidationSummary({ item, onValidationChange, compact = false }:
|
|||||||
}
|
}
|
||||||
|
|
||||||
validate();
|
validate();
|
||||||
}, [item.item_type, item.item_data, item.id, onValidationChange]);
|
}, [item.item_type, itemDataString, item.id]);
|
||||||
|
|
||||||
// Auto-expand when there are blocking errors or warnings
|
// Auto-expand when there are blocking errors or warnings
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
|
|||||||
Reference in New Issue
Block a user