{"version":3,"file":"Album-D2qXs_Kw.js","sources":["../../../app/javascript/entrypoints/Album/Album.jsx"],"sourcesContent":["import React, { useState, useEffect, useRef, useCallback } from \"react\";\nimport { Helmet } from \"react-helmet\";\nimport {\n doc,\n getDoc,\n onSnapshot,\n updateDoc,\n} from \"firebase/firestore\";\nimport {\n getStorage,\n ref,\n uploadBytes,\n deleteObject,\n getDownloadURL\n} from \"firebase/storage\";\nimport { Box, CircularProgress, Grid, Typography } from \"@mui/material\";\nimport { useNavigate } from \"react-router-dom\";\nimport { colors } from \"../lib/theme\";\nimport { db } from \"../../shared/firebase\";\nimport { useAuth } from \"../../shared/useAuth\";\nimport AlbumHeader from \"./AlbumHeader\";\nimport AlbumCover from \"./AlbumCover\";\nimport TrackList from \"./TrackList\";\nimport ConfirmDialog from '../../shared/ConfirmDialog';\nimport AlertDialog from '../../shared/AlertDialog';\nimport AlbumSettings from './AlbumSettings';\nimport useAudioPlayer from '../../shared/useAudioPlayer';\n\nconst reactRootDataset = document.getElementById(\"react-root\").dataset;\n\nconst Album = () => {\n const maxRecordingTime = 2700; // 45 minutes\n\n // State variables\n const [title, setTitle] = useState(\"\");\n const [subtitle, setSubTitle] = useState(\"\");\n const [imageUrl, setImageUrl] = useState(\"\");\n const [creatorName, setCreatorName] = useState(\"\");\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState(null);\n const [tracks, setTracks] = useState([]);\n const { user } = useAuth();\n const albumId = reactRootDataset.albumId;\n const [userId, setUserId] = useState(\"\");\n const [privacyLevel, setPrivacyLevel] = useState(null);\n const [sharedWith, setSharedWith] = useState([]);\n const navigate = useNavigate();\n const [editingTrackId, setEditingTrackId] = useState(null);\n const [editingTrackTitle, setEditingTrackTitle] = useState(\"\");\n const [newTrackTitle, setNewTrackTitle] = useState(\"\");\n const [isAddingTrack, setIsAddingTrack] = useState(false);\n const [confirmDialogOpen, setConfirmDialogOpen] = useState(false);\n const [dialogAction, setDialogAction] = useState(null);\n const [invitedTo, setInvitedTo] = useState([]);\n const [subscriptionLevel, setSubscriptionLevel] = useState(0);\n\n const {\n isPlaying,\n playingTrackId,\n playingSegmentIndex,\n selectedTrackId,\n currentTime,\n duration,\n handlePause,\n handlePlayPause,\n handleSeek,\n handleDeleteSegment,\n startRecording,\n stopRecording,\n isRecording,\n recordingTrackId,\n remainingTime,\n browserNotSupported,\n alertDialogOpen,\n dialogTitle,\n dialogContent,\n setAlertDialogOpen,\n setDialogTitle,\n setDialogContent,\n } = useAudioPlayer(albumId, userId, user, sharedWith, setTracks);\n\n // Fetch album data\n useEffect(() => {\n const fetchAlbum = async () => {\n console.log(\"Fetching album with ID:\", albumId);\n setLoading(true);\n setError(null);\n\n if (!albumId) {\n console.error(\"No albumId provided\");\n setError(\"No album ID provided\");\n setLoading(false);\n return;\n }\n\n try {\n const albumDoc = doc(db, \"albums\", albumId);\n console.log(\"Fetching album document...\");\n const albumSnapshot = await getDoc(albumDoc);\n\n if (albumSnapshot.exists()) {\n console.log(\"Album document found\");\n const albumData = albumSnapshot.data();\n console.log(\"Album data:\", albumData);\n\n setTitle(albumData.title || \"\");\n setSubTitle(albumData.subtitle || \"\");\n setImageUrl(albumData.imageUrl || \"\");\n\n const tracksWithIds = (albumData.tracks || []).map(\n (track, index) => ({\n ...track,\n id: track.id || `track-${index}`,\n })\n );\n setTracks(tracksWithIds);\n\n if (albumData.userId) {\n console.log(\"Fetching creator info for userId:\", albumData.userId);\n const creatorDoc = await getDoc(doc(db, \"users\", albumData.userId));\n if (creatorDoc.exists()) {\n const { firstName, lastName } = creatorDoc.data();\n setCreatorName(`${firstName} ${lastName}`);\n setSubscriptionLevel(creatorDoc.data().subscriptionLevel || 0);\n } else {\n console.log(\"Creator document not found\");\n }\n }\n setUserId(albumData.userId || \"\");\n\n // Set privacy level and sharedWith\n setPrivacyLevel(albumData.privacyLevel);\n setSharedWith(albumData.sharedWith || []);\n setInvitedTo(albumData.invitedTo || []);\n\n // Check privacy settings\n if (user) {\n if (albumData.privacyLevel === 0 && albumData.userId !== user.uid) {\n navigate(\"/login\");\n return;\n }\n if (\n albumData.privacyLevel === 1 &&\n albumData.userId !== user.uid &&\n !albumData.sharedWith.includes(user.uid)\n ) {\n navigate(\"/login\");\n return;\n }\n } else {\n return;\n }\n } else {\n console.log(\"Album document not found\");\n setError(\"Album not found\");\n }\n } catch (error) {\n navigate(`/login?redirect_to=/album/${albumId}`);\n } finally {\n setLoading(false);\n }\n };\n\n fetchAlbum();\n\n // Real-time listener\n if (albumId) {\n const albumRef = doc(db, \"albums\", albumId);\n const unsubscribe = onSnapshot(albumRef, (doc) => {\n if (doc.exists()) {\n const albumData = doc.data();\n setTitle(albumData.title || \"\");\n setSubTitle(albumData.subtitle || \"\");\n setImageUrl(albumData.imageUrl || \"\");\n\n const tracksWithIds = (albumData.tracks || []).map(\n (track, index) => ({\n ...track,\n id: track.id || `track-${index}`,\n })\n );\n setTracks(tracksWithIds);\n\n setPrivacyLevel(albumData.privacyLevel);\n setSharedWith(albumData.sharedWith || []);\n setInvitedTo(albumData.invitedTo || []);\n }\n });\n\n // Clean up listener\n return () => unsubscribe();\n }\n }, [albumId, user, navigate]);\n\n const handleImageClick = (fileInputRef) => {\n if (user && (user.uid === userId || sharedWith.includes(user.uid))) {\n fileInputRef.current.click();\n }\n };\n\n const handleImageUpload = async (event) => {\n const file = event.target.files[0];\n if (!file) return;\n\n try {\n const storage = getStorage();\n const imageRef = ref(storage, `album_photos/${albumId}/cover.jpg`);\n await uploadBytes(imageRef, file);\n const newImageUrl = await getDownloadURL(imageRef);\n\n const albumRef = doc(db, \"albums\", albumId);\n await updateDoc(albumRef, { imageUrl: newImageUrl });\n\n setImageUrl(newImageUrl);\n } catch (error) {\n console.error(\"Error uploading image:\", error);\n setDialogTitle('Error');\n setDialogContent('Failed to upload image. Please try again.');\n setAlertDialogOpen(true);\n }\n };\n\n const handleEditTrack = (trackId, currentTitle) => {\n setEditingTrackId(trackId);\n setEditingTrackTitle(currentTitle);\n };\n\n const handleSaveTrackTitle = async () => {\n if (!editingTrackId) return;\n\n try {\n const updatedTracks = tracks.map((track) =>\n track.id === editingTrackId\n ? { ...track, title: editingTrackTitle }\n : track\n );\n\n const albumRef = doc(db, \"albums\", albumId);\n await updateDoc(albumRef, {\n tracks: updatedTracks,\n updatedAt: new Date()\n });\n\n setTracks(updatedTracks);\n setEditingTrackId(null);\n } catch (error) {\n console.error(\"Error updating track title:\", error);\n setDialogTitle('Error');\n setDialogContent('Failed to update track title. Please try again.');\n setAlertDialogOpen(true);\n }\n };\n\n const handleCancelEdit = () => {\n setEditingTrackId(null);\n setEditingTrackTitle(\"\");\n };\n\n const handleDeleteTrack = useCallback(\n async (trackId) => {\n if (!user || (user.uid !== userId && !sharedWith.includes(user.uid))) {\n setDialogTitle('Permission Denied');\n setDialogContent(\"You don't have permission to delete tracks from this album.\");\n setAlertDialogOpen(true);\n return;\n }\n\n setDialogTitle('Confirm Delete');\n setDialogContent('Are you sure you want to delete this track? It will remove all of the recordings associated with it. This action cannot be undone.');\n setDialogAction(() => async () => {\n try {\n const trackIndex = tracks.findIndex((track) => track.id === trackId);\n if (trackIndex === -1) throw new Error(\"Track not found\");\n\n const track = tracks[trackIndex];\n const updatedTracks = tracks.filter((t) => t.id !== trackId);\n\n const storage = getStorage();\n if (track.audioSegments) {\n for (const segment of track.audioSegments) {\n const m4aPath = `audio_segments/${userId}/${albumId}/segment-${segment.id}.m4a`;\n\n try {\n await deleteObject(ref(storage, m4aPath));\n } catch (error) {\n console.log(\"M4A file not found or already deleted\");\n }\n }\n }\n\n const albumRef = doc(db, \"albums\", albumId);\n await updateDoc(albumRef, {\n tracks: updatedTracks,\n updatedAt: new Date()\n });\n\n setTracks(updatedTracks);\n console.log(\"Track deleted successfully\");\n } catch (error) {\n console.error(\"Error deleting track:\", error);\n setDialogTitle('Error');\n setDialogContent('Failed to delete track. Please try again.');\n setAlertDialogOpen(true);\n }\n });\n setConfirmDialogOpen(true);\n },\n [tracks, user, userId, sharedWith, albumId]\n );\n\n const handleAddTrack = async () => {\n if (!newTrackTitle.trim()) {\n setDialogTitle('Error');\n setDialogContent('Please enter a track title.');\n setAlertDialogOpen(true);\n return;\n }\n\n try {\n const newTrack = {\n id: `track-${Date.now()}`,\n title: newTrackTitle.trim(),\n audioSegments: [],\n updatedAt: new Date(),\n };\n\n const updatedTracks = [...tracks, newTrack];\n\n const albumRef = doc(db, \"albums\", albumId);\n await updateDoc(albumRef, {\n tracks: updatedTracks,\n updatedAt: new Date()\n });\n\n setTracks(updatedTracks);\n setNewTrackTitle(\"\");\n setIsAddingTrack(false);\n } catch (error) {\n console.error(\"Error adding new track:\", error);\n setDialogTitle('Error');\n setDialogContent('Failed to add new track. Please try again.');\n setAlertDialogOpen(true);\n }\n };\n\n const handlePrivacyChange = async (newLevel) => {\n try {\n const albumRef = doc(db, \"albums\", albumId);\n await updateDoc(albumRef, {\n privacyLevel: newLevel,\n updatedAt: new Date()\n });\n setPrivacyLevel(newLevel);\n } catch (error) {\n console.error(\"Error updating privacy level:\", error);\n setDialogTitle('Error');\n setDialogContent('Failed to update privacy level. Please try again.');\n setAlertDialogOpen(true);\n }\n };\n\n const handleStopRecording = async () => {\n await stopRecording();\n };\n\n console.log(\"Creator Name:\", creatorName);\n\n if (loading) {\n return (\n \n \n \n );\n }\n\n if (error) {\n return {error};\n }\n\n return (\n <>\n \n {title} - Golden Record\n \n \n \n \n \n \n \n {browserNotSupported && (\n setAlertDialogOpen(false)}\n okText=\"OK\"\n okButtonProps={{ color: 'primary' }}\n />\n )}\n \n \n \n \n \n \n \n \n \n \n setConfirmDialogOpen(false)}\n onConfirm={() => {\n if (dialogAction) {\n dialogAction();\n }\n setConfirmDialogOpen(false);\n }}\n confirmText=\"Confirm\"\n cancelText=\"Cancel\"\n confirmButtonProps={{ color: 'error' }}\n cancelButtonProps={{ color: 'primary' }}\n />\n setAlertDialogOpen(false)}\n okText=\"OK\"\n okButtonProps={{ color: 'primary' }}\n />\n >\n );\n};\n\nexport default Album;\n"],"names":["reactRootDataset","Album","title","setTitle","useState","subtitle","setSubTitle","imageUrl","setImageUrl","creatorName","setCreatorName","loading","setLoading","error","setError","tracks","setTracks","user","useAuth","albumId","userId","setUserId","privacyLevel","setPrivacyLevel","sharedWith","setSharedWith","navigate","useNavigate","editingTrackId","setEditingTrackId","editingTrackTitle","setEditingTrackTitle","newTrackTitle","setNewTrackTitle","isAddingTrack","setIsAddingTrack","confirmDialogOpen","setConfirmDialogOpen","dialogAction","setDialogAction","invitedTo","setInvitedTo","subscriptionLevel","setSubscriptionLevel","isPlaying","playingTrackId","playingSegmentIndex","selectedTrackId","currentTime","duration","handlePause","handlePlayPause","handleSeek","handleDeleteSegment","startRecording","stopRecording","isRecording","recordingTrackId","remainingTime","browserNotSupported","alertDialogOpen","dialogTitle","dialogContent","setAlertDialogOpen","setDialogTitle","setDialogContent","useAudioPlayer","useEffect","albumDoc","doc","db","albumSnapshot","getDoc","albumData","tracksWithIds","track","index","creatorDoc","firstName","lastName","albumRef","unsubscribe","onSnapshot","handleImageClick","fileInputRef","handleImageUpload","event","file","storage","getStorage","imageRef","ref","uploadBytes","newImageUrl","getDownloadURL","updateDoc","handleEditTrack","trackId","currentTitle","handleSaveTrackTitle","updatedTracks","handleCancelEdit","handleDeleteTrack","useCallback","trackIndex","t","segment","m4aPath","deleteObject","handleAddTrack","newTrack","handlePrivacyChange","newLevel","handleStopRecording","React","Box","CircularProgress","colors","Typography","Helmet","AlertDialog","AlbumHeader","Grid","AlbumCover","AlbumSettings","TrackList","ConfirmDialog"],"mappings":"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"}