import { Image as ExpoImage } from "expo-image"; import React, { useCallback, useEffect, useState } from "react"; import { ActivityIndicator, Text, View } from "react-native"; import useMinuit from "react-native-minuit/src/hooks/useMinuit.js"; import { background, icons } from "../../assets"; import BorderGradientButton from "../../components/BorderGradientButton"; import GradientButton from "../../components/GradientButton"; import MusicLandHeader from "../../components/MusicLandHeader"; import alert from "../../components/Alert"; import firebase, { tasksRef } from "../../config/firebase"; import loaderMessages from "../../config/loaderMessages"; import { isWeb } from "../../hooks/useLayoutType"; import Page from "../../layouts/Page"; import { Routes } from "../../navigation"; import { goBack, navigate } from "../../navigation/NavigationService"; import { useUser } from "../../providers/UserDataProvider"; import { gutters, Palette, Style } from "../../styles"; import CreateLyricsHeader from "../Writing/components/CreateLyricsHeader"; import CustomInput from "../Writing/components/CustomInput"; const PouchReady = () => { const { selectedProjectId, selectedProject, updateProjectData } = useUser(); const { setIsLoading } = useMinuit(); const isGenerating = selectedProject?.coverStatus === "GENERATING"; const coverOptions = Array.isArray(selectedProject?.cover?.options) ? selectedProject.cover.options : []; const hasGeneratedOptions = coverOptions.length > 0; const coverBackgroundMessage = isWeb ? loaderMessages.pouchReadyGenerationWeb : ""; const [coverStyle, setCoverStyle] = useState( selectedProject?.coverStyle || "" ); useEffect(() => { setCoverStyle(selectedProject?.coverStyle || ""); }, [selectedProject?.coverStyle]); const generateCover = useCallback(async (styleValue) => { if (!selectedProjectId) return; if (hasGeneratedOptions) { return; } const trimmedStyle = String(styleValue || "").trim(); if (!trimmedStyle) { alert("Attention", "Merci de renseigner un style pour la pochette.", [ { text: "OK" }, ]); return; } try { await setIsLoading(true); await updateProjectData( { coverStyle: trimmedStyle, }, { merge: true } ); await tasksRef.add({ type: "cover", projectId: selectedProjectId, status: "PENDING", createdAt: firebase.firestore.FieldValue.serverTimestamp(), }); } catch (e) { console.log("Cover task error", e?.message); } finally { setIsLoading(false); } }, [hasGeneratedOptions, selectedProjectId, setIsLoading, updateProjectData]); const requestCoverGeneration = useCallback(() => { const trimmedStyle = (coverStyle || "").trim(); if (!trimmedStyle) { alert("Attention", "Merci de renseigner un style pour la pochette.", [ { text: "OK" }, ]); return; } alert("Attention", "Générer une pochette ?", [ { text: "Annuler", style: "cancel", }, { text: "Oui", onPress: () => generateCover(trimmedStyle), }, ]); }, [coverStyle, generateCover]); const validateCover = () => { navigate(Routes.ValidateCover); }; const coverPreviewUrl = selectedProject?.cover?.result || selectedProject?.cover?.generatedBackground || null; const displayOptions = hasGeneratedOptions ? coverOptions : coverPreviewUrl ? [ { id: "preview", finalUrl: selectedProject?.cover?.result || null, generatedUrl: coverPreviewUrl, }, ] : []; return ( {displayOptions.length > 0 ? ( displayOptions.map((option, index) => { const optionUri = option?.finalUrl || option?.generatedUrl || ""; if (!optionUri) return null; return ( {hasGeneratedOptions && ( Pochette {index + 1} )} ); }) ) : ( {isGenerating && ( {isWeb ? ( coverBackgroundMessage ? ( {coverBackgroundMessage} ) : null ) : ( Génération en cours. )} )} )} {!hasGeneratedOptions && ( )} validateCover()} /> ); }; export default PouchReady;