diff --git a/src/components/moderation/DependencyVisualizer.tsx b/src/components/moderation/DependencyVisualizer.tsx index 513f39d4..e518aba7 100644 --- a/src/components/moderation/DependencyVisualizer.tsx +++ b/src/components/moderation/DependencyVisualizer.tsx @@ -4,6 +4,7 @@ import { Badge } from '@/components/ui/badge'; import { ArrowDown, AlertCircle } from 'lucide-react'; import { type SubmissionItemWithDeps } from '@/lib/submissionItemsService'; import { Alert, AlertDescription } from '@/components/ui/alert'; +import { useIsMobile } from '@/hooks/use-mobile'; interface DependencyVisualizerProps { items: SubmissionItemWithDeps[]; @@ -11,6 +12,8 @@ interface DependencyVisualizerProps { } export function DependencyVisualizer({ items, selectedIds }: DependencyVisualizerProps) { + const isMobile = useIsMobile(); + const dependencyLevels = useMemo(() => { const levels: SubmissionItemWithDeps[][] = []; const visited = new Set(); @@ -62,13 +65,13 @@ export function DependencyVisualizer({ items, selectedIds }: DependencyVisualize {dependencyLevels.map((level, levelIdx) => (
-

+

Level {levelIdx + 1}

-
+
{level.map((item) => ( - -
- + +
+ {item.item_type.replace('_', ' ').toUpperCase()} - + {item.status}
- -

+ +

{item.item_data.name || 'Unnamed'}

{item.dependents && item.dependents.length > 0 && ( -

+

Has {item.dependents.length} dependent(s)

)} @@ -108,7 +114,7 @@ export function DependencyVisualizer({ items, selectedIds }: DependencyVisualize {levelIdx < dependencyLevels.length - 1 && (
- +
)}
diff --git a/src/components/moderation/ItemReviewCard.tsx b/src/components/moderation/ItemReviewCard.tsx index 18ffc7f5..f9bbd98c 100644 --- a/src/components/moderation/ItemReviewCard.tsx +++ b/src/components/moderation/ItemReviewCard.tsx @@ -3,6 +3,7 @@ import { Badge } from '@/components/ui/badge'; import { Button } from '@/components/ui/button'; import { Edit, MapPin, Zap, Building2, Image, Package } from 'lucide-react'; import { type SubmissionItemWithDeps } from '@/lib/submissionItemsService'; +import { useIsMobile } from '@/hooks/use-mobile'; interface ItemReviewCardProps { item: SubmissionItemWithDeps; @@ -11,6 +12,8 @@ interface ItemReviewCardProps { } export function ItemReviewCard({ item, onEdit, onStatusChange }: ItemReviewCardProps) { + const isMobile = useIsMobile(); + const getItemIcon = () => { switch (item.item_type) { case 'park': return ; @@ -91,19 +94,19 @@ export function ItemReviewCard({ item, onEdit, onStatusChange }: ItemReviewCardP case 'photo': return (
-
- {data.photos?.slice(0, 3).map((photo: any, idx: number) => ( +
+ {data.photos?.slice(0, isMobile ? 2 : 3).map((photo: any, idx: number) => ( {photo.caption ))}
- {data.photos?.length > 3 && ( + {data.photos?.length > (isMobile ? 2 : 3) && (

- +{data.photos.length - 3} more photo(s) + +{data.photos.length - (isMobile ? 2 : 3)} more photo(s)

)}
@@ -120,11 +123,11 @@ export function ItemReviewCard({ item, onEdit, onStatusChange }: ItemReviewCardP return ( - -
-
+ +
+
{getItemIcon()} - + {item.item_type.replace('_', ' ').toUpperCase()} {item.original_data && ( @@ -134,27 +137,29 @@ export function ItemReviewCard({ item, onEdit, onStatusChange }: ItemReviewCardP )}
- + {item.status} {item.status === 'pending' && ( )}
- + {renderItemPreview()} {item.depends_on && (
-

+

Depends on another item in this submission

@@ -162,10 +167,10 @@ export function ItemReviewCard({ item, onEdit, onStatusChange }: ItemReviewCardP {item.rejection_reason && (
-

+

Rejection Reason:

-

+

{item.rejection_reason}

diff --git a/src/components/moderation/ModerationQueue.tsx b/src/components/moderation/ModerationQueue.tsx index ff28d40c..660c3a5d 100644 --- a/src/components/moderation/ModerationQueue.tsx +++ b/src/components/moderation/ModerationQueue.tsx @@ -15,6 +15,7 @@ import { format } from 'date-fns'; import { PhotoModal } from './PhotoModal'; import { SubmissionReviewManager } from './SubmissionReviewManager'; import { useRealtimeSubmissions } from '@/hooks/useRealtimeSubmissions'; +import { useIsMobile } from '@/hooks/use-mobile'; interface ModerationItem { id: string; @@ -49,6 +50,7 @@ export interface ModerationQueueRef { } export const ModerationQueue = forwardRef((props, ref) => { + const isMobile = useIsMobile(); const [items, setItems] = useState([]); const [loading, setLoading] = useState(true); const [actionLoading, setActionLoading] = useState(null); @@ -821,10 +823,10 @@ export const ModerationQueue = forwardRef((props, ref) => { item.status === 'rejected' ? 'border-l-red-400' : 'border-l-amber-500' }`}> - -
-
- + +
+
+ {item.type === 'review' ? ( <> @@ -842,21 +844,21 @@ export const ModerationQueue = forwardRef((props, ref) => { )} - + {item.status.charAt(0).toUpperCase() + item.status.slice(1)}
-
- - {format(new Date(item.created_at), 'MMM d, yyyy HH:mm')} +
+ + {format(new Date(item.created_at), isMobile ? 'MMM d, yyyy' : 'MMM d, yyyy HH:mm')}
{item.user_profile && ( -
- +
+ - + {(item.user_profile.display_name || item.user_profile.username)?.slice(0, 2).toUpperCase()} @@ -865,7 +867,7 @@ export const ModerationQueue = forwardRef((props, ref) => { {item.user_profile.display_name || item.user_profile.username} {item.user_profile.display_name && ( - + @{item.user_profile.username} )} @@ -874,8 +876,8 @@ export const ModerationQueue = forwardRef((props, ref) => { )} - -
+ +
{item.type === 'review' ? (
{item.content.title && ( @@ -1236,7 +1238,7 @@ export const ModerationQueue = forwardRef((props, ref) => { />
-
+
{/* Show Review Items button for content submissions */} {item.type === 'content_submission' && ( )} @@ -1256,18 +1259,20 @@ export const ModerationQueue = forwardRef((props, ref) => {
@@ -1314,15 +1319,16 @@ export const ModerationQueue = forwardRef((props, ref) => { onChange={(e) => setNotes(prev => ({ ...prev, [`reverse-${item.id}`]: e.target.value }))} rows={2} /> -
+
{item.status === 'approved' && ( )} @@ -1330,9 +1336,10 @@ export const ModerationQueue = forwardRef((props, ref) => { )} @@ -1348,9 +1355,10 @@ export const ModerationQueue = forwardRef((props, ref) => { variant="destructive" onClick={() => handleDeleteSubmission(item)} disabled={actionLoading === item.id} - className="w-full" + className={`w-full ${isMobile ? 'h-11' : ''}`} + size={isMobile ? "default" : "default"} > - + Delete Submission
@@ -1379,12 +1387,12 @@ export const ModerationQueue = forwardRef((props, ref) => { return (
{/* Filter Bar */} -
-
-
- +
+
+
+
-
- +
+