{"version":3,"file":"Dashboard-Cj0jhJ7m.js","sources":["../../../app/javascript/entrypoints/Dashboard/Dashboard.jsx"],"sourcesContent":["import React, { useState, useEffect, useRef } from \"react\";\nimport { useNavigate, useLocation } from \"react-router-dom\";\nimport {\n Box,\n Button,\n CircularProgress,\n Typography,\n Menu,\n Alert,\n MenuItem,\n TextField,\n Avatar,\n} from \"@mui/material\";\nimport AddIcon from \"@mui/icons-material/Add\";\nimport { db } from \"../../shared/firebase\";\nimport { colors } from \"../lib/theme\";\nimport { useAuth } from \"../../shared/useAuth\";\nimport {\n collection,\n query,\n where,\n getDocs,\n getDoc,\n doc as firestoreDoc,\n deleteDoc,\n doc,\n updateDoc,\n arrayUnion,\n arrayRemove,\n} from \"firebase/firestore\";\nimport RefreshLink from \"../../shared/RefreshLink\";\nimport ConfirmDialog from \"../../shared/ConfirmDialog\";\nimport { Helmet } from \"react-helmet\";\nimport ContainerBox from \"../../shared/ContainerBox\";\nimport ImageUploader from \"../../shared/ImageUploader\";\nimport AlbumList from \"../../shared/AlbumList\"; // Import the shared component\nimport axios from 'axios';\n\nconst Dashboard = () => {\n const { user, loading } = useAuth();\n const navigate = useNavigate();\n const location = useLocation();\n const [albumsLoading, setAlbumsLoading] = useState(true);\n const [anchorEl, setAnchorEl] = useState(null);\n const [selectedAlbum, setSelectedAlbum] = useState(null);\n const [openDeleteDialog, setOpenDeleteDialog] = useState(false);\n const [firstName, setFirstName] = useState(\"\");\n const [lastName, setLastName] = useState(\"\");\n const [showNamePrompt, setShowNamePrompt] = useState(false);\n const [emailVerified, setEmailVerified] = useState(false);\n const [ownedAlbums, setOwnedAlbums] = useState([]);\n const [sharedAlbums, setSharedAlbums] = useState([]);\n const [subscriptionLevel, setSubscriptionLevel] = useState(null);\n const [profilePhotoURL, setProfilePhotoURL] = useState(\"\");\n const [jobScheduled, setJobScheduled] = useState(false);\n const [userIsDisabled, setUserIsDisabled] = useState(false);\n const [trialDaysRemaining, setTrialDaysRemaining] = useState(null);\n\n useEffect(() => {\n if (loading) return; // Add this line to prevent early navigation\n\n if (user && !user.emailVerified) {\n navigate(\"/verify-email\");\n } else if (user) {\n setEmailVerified(true);\n }\n }, [user, navigate, loading]); // Add loading to the dependency array\n\n useEffect(() => {\n const fetchAlbums = async () => {\n if (user) {\n setAlbumsLoading(true);\n const albumsRef = collection(db, \"albums\");\n const q = query(albumsRef, where(\"userId\", \"==\", user.uid));\n const sharedQ = query(\n albumsRef,\n where(\"sharedWith\", \"array-contains\", user.uid),\n where(\"privacyLevel\", \"==\", 1)\n );\n\n const [ownedSnapshot, sharedSnapshot] = await Promise.all([\n getDocs(q),\n getDocs(sharedQ),\n ]);\n\n const fetchAlbumWithCreator = async (albumDoc) => {\n const albumData = { id: albumDoc.id, ...albumDoc.data() };\n const creatorDoc = await getDoc(\n firestoreDoc(db, \"users\", albumData.userId)\n );\n const creatorData = creatorDoc.data();\n\n // Fetch shared users' data\n const sharedUsersData = await Promise.all(\n (albumData.sharedWith || []).map(async (userId) => {\n const userDoc = await getDoc(firestoreDoc(db, \"users\", userId));\n return userDoc.data();\n })\n );\n\n return {\n ...albumData,\n creatorName: creatorData\n ? `${creatorData.firstName} ${creatorData.lastName}`\n : \"Unknown\",\n updatedAt: albumData.updatedAt || albumData.createdAt, // Use updatedAt if available, otherwise fall back to createdAt\n sharedUsers: sharedUsersData,\n };\n };\n\n const ownedAlbums = await Promise.all(\n ownedSnapshot.docs.map(fetchAlbumWithCreator)\n );\n const sharedAlbums = await Promise.all(\n sharedSnapshot.docs.map(fetchAlbumWithCreator)\n );\n\n // Sort albums by updatedAt in descending order (most recent first)\n const sortedOwnedAlbums = ownedAlbums.sort(\n (a, b) => b.updatedAt - a.updatedAt\n );\n const sortedSharedAlbums = sharedAlbums.sort(\n (a, b) => b.updatedAt - a.updatedAt\n );\n\n setOwnedAlbums(sortedOwnedAlbums);\n setSharedAlbums(sortedSharedAlbums);\n setAlbumsLoading(false);\n }\n };\n\n fetchAlbums();\n }, [user]);\n\n useEffect(() => {\n const fetchUserData = async () => {\n if (user) {\n try {\n const userDoc = await getDoc(doc(db, \"users\", user.uid));\n const userData = userDoc.data();\n console.log(\"Fetched user data:\", userData); // Debug log\n setProfilePhotoURL(userData?.profilePhotoURL || \"\");\n\n const fetchedSubscriptionLevel = userData?.subscriptionLevel || 0;\n setSubscriptionLevel(fetchedSubscriptionLevel);\n\n // Calculate trial status and user disabled state\n if (userData?.createdAt) {\n const createdAtDate = userData.createdAt.toDate(); // Convert Firestore Timestamp to Date\n const trialEndDate = new Date(createdAtDate.getTime() + 30 * 24 * 60 * 60 * 1000); // Add 30 days\n const today = new Date();\n\n const daysRemaining = Math.ceil((trialEndDate - today) / (1000 * 60 * 60 * 24));\n setTrialDaysRemaining(Math.max(0, daysRemaining)); // Ensure it's not negative\n\n // Check if user should be disabled\n const isDisabled = userData?.disabled === 1 || (fetchedSubscriptionLevel === 0 && today > trialEndDate);\n setUserIsDisabled(isDisabled);\n } else {\n // If createdAt doesn't exist, consider the user disabled as a precaution\n setUserIsDisabled(true);\n }\n\n if (!userData?.firstName || !userData?.lastName) {\n setShowNamePrompt(true);\n }\n } catch (error) {\n console.error(\"Error fetching user data:\", error);\n }\n }\n };\n\n fetchUserData();\n }, [user]);\n\n useEffect(() => {\n const handleInvitations = async () => {\n if (user) {\n try {\n const albumsRef = collection(db, \"albums\");\n const albumsSnapshot = await getDocs(albumsRef);\n\n for (const albumDoc of albumsSnapshot.docs) {\n const albumData = albumDoc.data();\n if (albumData.invitedTo && albumData.invitedTo.includes(user.email.toLowerCase())) {\n console.log(`User invited to album: ${albumDoc.id}`);\n\n await updateDoc(albumDoc.ref, {\n sharedWith: arrayUnion(user.uid),\n invitedTo: arrayRemove(user.email.toLowerCase()),\n });\n\n console.log(`Updated sharedWith and removed email from invitedTo for album: ${albumDoc.id}`);\n }\n }\n } catch (error) {\n console.error(\"Error handling invitations:\", error);\n }\n }\n };\n\n handleInvitations();\n }, [user]);\n\n useEffect(() => {\n const scheduleAccountDisable = async () => {\n if (user && subscriptionLevel === 0 && !jobScheduled && ownedAlbums.length > 0) {\n try {\n const response = await axios.post('/api/jobs/create', { user_id: user.uid });\n console.log(\"Scheduled account disable job:\", response);\n setJobScheduled(true);\n } catch (error) {\n console.log(\"Did not schedule account disable job\");\n console.error('Failed to schedule account disable job:', error);\n }\n }\n };\n\n scheduleAccountDisable();\n }, [user, subscriptionLevel, jobScheduled, ownedAlbums.length]);\n\n const handleMenuOpen = (event, album) => {\n setAnchorEl(event.currentTarget);\n setSelectedAlbum(album);\n };\n\n const handleMenuClose = () => {\n setAnchorEl(null);\n setSelectedAlbum(null);\n };\n\n const handleDeleteAlbum = () => {\n if (selectedAlbum) {\n setOpenDeleteDialog(true);\n }\n };\n\n const handleCloseDeleteDialog = () => {\n setOpenDeleteDialog(false);\n handleMenuClose();\n };\n\n const handleConfirmDelete = async () => {\n try {\n await deleteDoc(doc(db, \"albums\", selectedAlbum.id));\n setOwnedAlbums(\n ownedAlbums.filter((album) => album.id !== selectedAlbum.id)\n );\n setSharedAlbums(\n sharedAlbums.filter((album) => album.id !== selectedAlbum.id)\n );\n handleCloseDeleteDialog();\n } catch (error) {\n console.error(\"Error deleting album: \", error);\n }\n };\n\n const handleSaveName = async () => {\n if (firstName.trim() && lastName.trim()) {\n try {\n await updateDoc(doc(db, \"users\", user.uid), {\n firstName: firstName.trim(),\n lastName: lastName.trim(),\n });\n setShowNamePrompt(false);\n } catch (error) {\n console.error(\"Error updating user profile:\", error);\n }\n }\n };\n\n const handleUploadSuccess = (downloadURL) => {\n setProfilePhotoURL(downloadURL);\n setShowSuccess(true);\n };\n\n const handleUploadError = (errorMessage) => {\n setError(errorMessage);\n };\n\n if (loading) {\n return (\n \n \n \n );\n }\n\n console.log(\"userIsDisabled:\", userIsDisabled);\n\n return (\n \n \n Dashboard - Golden Record\n \n \n \n {userIsDisabled ? (\n \n Your free trial has ended, so you currently don't have access to your albums.\n Please consider upgrading to a paid plan to continue.\n \n ) : user ? (\n <>\n \n \n \n \n \n \n \n Your Albums\n \n \n }\n onClick={() => navigate(\"/album/create\")}\n // disabled={\n // subscriptionLevel !== null &&\n // subscriptionLevel < 1 &&\n // ownedAlbums.length >= 1\n // }\n sx={{\n width: { xs: \"100%\", sm: \"auto\" },\n maxWidth: { xs: \"100%\", sm: \"auto\" },\n }}\n >\n {/* {subscriptionLevel !== null ? (\n <>\n Add Album\n {subscriptionLevel < 1 && \" (Limit 1 for free users)\"}\n \n ) : ( */}\n Create an Album\n {/* )} */}\n \n \n {/* {subscriptionLevel < 1 && ownedAlbums.length === 1 && (\n \n Free users can only create one album. Upgrade to add unlimited\n albums! Visit your{\" \"}\n \n profile\n {\" \"}\n to upgrade!\n \n )} */}\n {subscriptionLevel === 0 && trialDaysRemaining !== null && trialDaysRemaining > 0 && (\n \n Your free trial ends in {trialDaysRemaining} day{trialDaysRemaining !== 1 ? 's' : ''}.\n You can use the app freely until then with no restrictions. Once your trial ends, you'll lose access to your albums until you choose to subscribe.\n Visit your profile to upgrade!\n \n )}\n {showNamePrompt && (\n \n \n Please provide your name\n \n \n setFirstName(e.target.value)}\n size=\"small\"\n fullWidth\n />\n setLastName(e.target.value)}\n size=\"small\"\n fullWidth\n />\n \n Save\n \n \n \n )}\n {albumsLoading ? (\n \n \n \n ) : (\n \n \n \n \n \n \n \n \n )}\n \n \n Delete\n \n \n {/* \n \n Get the Golden Record iPhone App\n \n }\n href=\"https://apps.apple.com/app/golden-record/id6501951254\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n Download on the App Store\n \n */}\n {/* \n \n Invite a friend to create a Golden Record with you!\n \n }\n href=\"/questionnaire\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n Get started\n \n */}\n \n ) : (\n \n No session found. Please{\" \"}\n \n log in\n \n .\n \n )}\n \n );\n};\n\nexport default Dashboard;\n"],"names":["Dashboard","user","loading","useAuth","navigate","useNavigate","useLocation","albumsLoading","setAlbumsLoading","useState","anchorEl","setAnchorEl","selectedAlbum","setSelectedAlbum","openDeleteDialog","setOpenDeleteDialog","firstName","setFirstName","lastName","setLastName","showNamePrompt","setShowNamePrompt","emailVerified","setEmailVerified","ownedAlbums","setOwnedAlbums","sharedAlbums","setSharedAlbums","subscriptionLevel","setSubscriptionLevel","profilePhotoURL","setProfilePhotoURL","jobScheduled","setJobScheduled","userIsDisabled","setUserIsDisabled","trialDaysRemaining","setTrialDaysRemaining","useEffect","albumsRef","collection","db","q","query","where","sharedQ","ownedSnapshot","sharedSnapshot","getDocs","fetchAlbumWithCreator","albumDoc","albumData","creatorData","getDoc","firestoreDoc","sharedUsersData","userId","sortedOwnedAlbums","a","b","sortedSharedAlbums","userData","doc","fetchedSubscriptionLevel","createdAtDate","trialEndDate","today","daysRemaining","isDisabled","error","albumsSnapshot","updateDoc","arrayUnion","arrayRemove","response","axios","handleMenuOpen","event","album","handleMenuClose","handleDeleteAlbum","handleCloseDeleteDialog","handleConfirmDelete","deleteDoc","handleSaveName","handleUploadSuccess","downloadURL","handleUploadError","errorMessage","React","Box","CircularProgress","colors","ContainerBox","Helmet","Alert","RefreshLink","ImageUploader","Avatar","Typography","Button","AddIcon","TextField","e","AlbumList","Menu","MenuItem","ConfirmDialog"],"mappings":"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"}