diff --git a/functions/helpers/prompts.js b/functions/helpers/prompts.js index 1d7a7b8..286f479 100644 --- a/functions/helpers/prompts.js +++ b/functions/helpers/prompts.js @@ -68,13 +68,13 @@ exports.generatePicturePrompt = (project = {}) => { La composition doit être dynamique et remplir toute la surface, sans laisser de bordures ni de zones vides. Intègre de manière artistique et lisible le titre de la chanson ${title || "Sans titre"}. La typographie doit compléter le style abstrait et lumineux de la pochette. Priorise la lisibilité. - Réserve un espace net et dégagé en bas à droite, occupant environ 25% de la largeur totale. Cette zone doit être légèrement plus sombre ou avoir un contraste suffisant. + Crée un espace vide et propre en bas à droite (25% de la largeur), sans texte, logo ou marquage. Cet espace servira à insérer un logo plus tard manuellement. Personnes, visages ou silhouettes reconnaissables. Fonds blancs ou bordures délimitant l'image. - Tout autre logo, filigrane ou texte promotionnel que le titre, l'artiste et la zone réservée pour "MusicLand Production". + Tout texte promotionnel, filigrane ou logo (y compris "MusicLand Production"). Texte illisible ou trop petit. `.trim(); diff --git a/src/assets/UI/studioBG2.png b/src/assets/UI/studioBG2.png index 0c4590b..bb38233 100644 Binary files a/src/assets/UI/studioBG2.png and b/src/assets/UI/studioBG2.png differ diff --git a/src/components/MusicLandHeader.js b/src/components/MusicLandHeader.js index 5962480..940eb5a 100644 --- a/src/components/MusicLandHeader.js +++ b/src/components/MusicLandHeader.js @@ -73,7 +73,7 @@ const MusicLandHeader = ({ )} { { { navigate(Routes.Home)} progress={63} - logo={icons.musicLandStudio} + // logo={icons.musicLandStudio} /> { [extractValues] ); - const handleGrant = useCallback( - (itemId, event) => { - const rect = containerRef.current?.getBoundingClientRect(); - const scrollY = getScrollY(); - const nativeEvent = event.nativeEvent || {}; - const fallbackY = - typeof nativeEvent.pageY === "number" - ? nativeEvent.pageY - : typeof nativeEvent.clientY === "number" - ? nativeEvent.clientY + scrollY - : scrollY; - const containerTop = rect ? rect.top + scrollY : fallbackY; - dragStateRef.current = { - itemId, - containerTop, - }; - setActiveItemId(itemId); - if (typeof document !== "undefined") { - document.body.style.userSelect = "none"; - } - }, - [] - ); + const handleGrant = useCallback((itemId, event) => { + const rect = containerRef.current?.getBoundingClientRect(); + const scrollY = getScrollY(); + const nativeEvent = event.nativeEvent || {}; + const fallbackY = + typeof nativeEvent.pageY === "number" + ? nativeEvent.pageY + : typeof nativeEvent.clientY === "number" + ? nativeEvent.clientY + scrollY + : scrollY; + const containerTop = rect ? rect.top + scrollY : fallbackY; + dragStateRef.current = { + itemId, + containerTop, + }; + setActiveItemId(itemId); + if (typeof document !== "undefined") { + document.body.style.userSelect = "none"; + } + }, []); const handleMove = useCallback((event) => { const { itemId, containerTop } = dragStateRef.current; @@ -210,9 +207,7 @@ const CustomizeSongStructure = ({ baseStructure = [], onChange }) => { }, []); const handleRelease = useCallback(() => { - setSortableItems((prev) => - buildSortableItems(extractValues(prev)) - ); + setSortableItems((prev) => buildSortableItems(extractValues(prev))); dragStateRef.current = { itemId: null, containerTop: 0, diff --git a/src/screens/cover/PouchReady.js b/src/screens/cover/PouchReady.js index 6c4022e..87e7c4d 100644 --- a/src/screens/cover/PouchReady.js +++ b/src/screens/cover/PouchReady.js @@ -3,10 +3,10 @@ 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 alert from "../../components/Alert"; 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"; @@ -38,38 +38,41 @@ const PouchReady = () => { 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 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(); @@ -137,7 +140,8 @@ const PouchReady = () => { > {displayOptions.length > 0 ? ( displayOptions.map((option, index) => { - const optionUri = option?.finalUrl || option?.generatedUrl || ""; + const optionUri = + option?.finalUrl || option?.generatedUrl || ""; if (!optionUri) return null; return ( { > {!hasGeneratedOptions && (