diff --git a/src/components/upload/PhotoManagementDialog.tsx b/src/components/upload/PhotoManagementDialog.tsx index 09871c18..fbae7ad9 100644 --- a/src/components/upload/PhotoManagementDialog.tsx +++ b/src/components/upload/PhotoManagementDialog.tsx @@ -111,10 +111,8 @@ export function PhotoManagementDialog({ user_id: user.id, submission_type: 'photo_delete', content: { - photo_id: photoToDelete.id, - entity_type: entityType, - entity_id: entityId, - reason: deleteReason + action: 'delete', + photo_id: photoToDelete.id } }]) .select() @@ -178,9 +176,8 @@ export function PhotoManagementDialog({ user_id: user.id, submission_type: 'photo_edit', content: { - photo_id: editingPhoto.id, - entity_type: entityType, - entity_id: entityId + action: 'edit', + photo_id: editingPhoto.id } }]) .select() diff --git a/src/components/upload/PhotoSubmissionUpload.tsx b/src/components/upload/PhotoSubmissionUpload.tsx deleted file mode 100644 index 85f8a871..00000000 --- a/src/components/upload/PhotoSubmissionUpload.tsx +++ /dev/null @@ -1,296 +0,0 @@ -/** - * @deprecated This component is deprecated. Use UppyPhotoSubmissionUpload instead. - * This file is kept for backwards compatibility only. - * - * For new implementations, use: - * - UppyPhotoSubmissionUpload for direct uploads - * - EntityPhotoGallery for entity-specific photo galleries - */ - -import { useState } from 'react'; -import { Upload, X, Camera } from 'lucide-react'; -import { Button } from '@/components/ui/button'; -import { Card, CardContent } from '@/components/ui/card'; -import { Input } from '@/components/ui/input'; -import { Label } from '@/components/ui/label'; -import { Textarea } from '@/components/ui/textarea'; -import { useToast } from '@/hooks/use-toast'; -import { supabase } from '@/integrations/supabase/client'; -import { useAuth } from '@/hooks/useAuth'; - -interface PhotoSubmissionUploadProps { - onSubmissionComplete?: () => void; - parkId?: string; - rideId?: string; -} - -export function PhotoSubmissionUpload({ onSubmissionComplete, parkId, rideId }: PhotoSubmissionUploadProps) { - const [selectedFiles, setSelectedFiles] = useState([]); - const [uploading, setUploading] = useState(false); - const [caption, setCaption] = useState(''); - const [title, setTitle] = useState(''); - const { toast } = useToast(); - const { user } = useAuth(); - - const handleFileSelect = (event: React.ChangeEvent) => { - const files = Array.from(event.target.files || []); - const imageFiles = files.filter(file => file.type.startsWith('image/')); - - if (imageFiles.length !== files.length) { - toast({ - title: "Invalid Files", - description: "Only image files are allowed", - variant: "destructive", - }); - } - - setSelectedFiles(prev => [...prev, ...imageFiles].slice(0, 5)); // Max 5 files - }; - - const removeFile = (index: number) => { - setSelectedFiles(prev => prev.filter((_, i) => i !== index)); - }; - - const uploadFileToCloudflare = async (file: File): Promise<{ id: string; url: string }> => { - try { - // Get upload URL from Supabase edge function - const { data: uploadData, error: uploadError } = await supabase.functions.invoke('upload-image', { - method: 'POST', - }); - - if (uploadError || !uploadData?.uploadURL) { - console.error('Failed to get upload URL:', uploadError); - throw new Error('Failed to get upload URL'); - } - - // Upload file directly to Cloudflare - const formData = new FormData(); - formData.append('file', file); - - const uploadResponse = await fetch(uploadData.uploadURL, { - method: 'POST', - body: formData, - }); - - if (!uploadResponse.ok) { - const errorText = await uploadResponse.text(); - console.error('Cloudflare upload failed:', errorText); - throw new Error('Failed to upload file to Cloudflare'); - } - - const result = await uploadResponse.json(); - const imageId = result.result?.id; - - if (!imageId) { - console.error('No image ID returned from Cloudflare:', result); - throw new Error('Invalid response from Cloudflare'); - } - - // Get the delivery URL using the edge function with URL parameters - const getImageUrl = new URL(`https://ydvtmnrszybqnbcqbdcy.supabase.co/functions/v1/upload-image`); - getImageUrl.searchParams.set('id', imageId); - - const response = await fetch(getImageUrl.toString(), { - method: 'GET', - headers: { - 'Authorization': `Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZSIsInJlZiI6InlkdnRtbnJzenlicW5iY3FiZGN5Iiwicm9sZSI6ImFub24iLCJpYXQiOjE3NTgzMjYzNTYsImV4cCI6MjA3MzkwMjM1Nn0.DM3oyapd_omP5ZzIlrT0H9qBsiQBxBRgw2tYuqgXKX4`, - 'apikey': 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZSIsInJlZiI6InlkdnRtbnJzenlicW5iY3FiZGN5Iiwicm9sZSI6ImFub24iLCJpYXQiOjE3NTgzMjYzNTYsImV4cCI6MjA3MzkwMjM1Nn0.DM3oyapd_omP5ZzIlrT0H9qBsiQBxBRgw2tYuqgXKX4', - }, - }); - - if (!response.ok) { - const errorText = await response.text(); - console.error('Failed to get image status:', errorText); - throw new Error('Failed to get image URL'); - } - - const statusData = await response.json(); - - if (!statusData?.urls?.public) { - console.error('No image URL returned:', statusData); - throw new Error('No image URL available'); - } - - return { - id: imageId, - url: statusData.urls.public, - }; - } catch (error) { - console.error('Upload error:', error); - throw error; - } - }; - - const handleSubmit = async () => { - if (!user) { - toast({ - title: "Authentication Required", - description: "Please log in to submit photos", - variant: "destructive", - }); - return; - } - - if (selectedFiles.length === 0) { - toast({ - title: "No Files Selected", - description: "Please select at least one image to submit", - variant: "destructive", - }); - return; - } - - setUploading(true); - try { - // Upload files to Cloudflare Images first - const photoSubmissions = await Promise.all( - selectedFiles.map(async (file, index) => { - const uploadResult = await uploadFileToCloudflare(file); - - return { - filename: file.name, - size: file.size, - type: file.type, - url: uploadResult.url, - imageId: uploadResult.id, - caption: index === 0 ? caption : '', // Only first image gets the caption - }; - }) - ); - - // Submit to content_submissions table - const { error } = await supabase - .from('content_submissions') - .insert({ - user_id: user.id, - submission_type: 'photo', - content: { - photos: photoSubmissions, - title: title.trim() || undefined, - caption: caption.trim() || undefined, - park_id: parkId, - ride_id: rideId, - context: parkId ? 'park' : rideId ? 'ride' : 'general', - }, - status: 'pending', - }); - - if (error) throw error; - - toast({ - title: "Photos Submitted", - description: "Your photos have been submitted for moderation review", - }); - - // Reset form - setSelectedFiles([]); - setCaption(''); - setTitle(''); - onSubmissionComplete?.(); - - } catch (error) { - console.error('Error submitting photos:', error); - toast({ - title: "Submission Failed", - description: "Failed to submit photos. Please try again.", - variant: "destructive", - }); - } finally { - setUploading(false); - } - }; - - return ( - - -
- -

Submit Photos

-
- -
-
- - setTitle(e.target.value)} - maxLength={100} - /> -
- -
- -