covers with logo

This commit is contained in:
2025-10-22 17:06:49 +02:00
parent 40e10d1692
commit b4375d04be
9 changed files with 643 additions and 228 deletions
+48 -83
View File
@@ -1,15 +1,11 @@
import { Image as ExpoImage } from "expo-image";
import * as ImagePicker from "expo-image-picker";
import React from "react";
import { ActivityIndicator, Text, View } from "react-native";
import useMinuit from "react-native-minuit/src/hooks/useMinuit";
import { background } from "../../assets";
import BorderGradientButton from "../../components/BorderGradientButton";
import GradientButton from "../../components/GradientButton";
import MusicLandHeader from "../../components/MusicLandHeader";
import firebase, { tasksRef } from "../../config/firebase";
import loaderMessages from "../../config/loaderMessages";
import { uploadFileToFirebase } from "../../helpers/uploadToFirebase";
import { isWeb } from "../../hooks/useLayoutType";
import Page from "../../layouts/Page";
import { Routes } from "../../navigation";
@@ -19,69 +15,30 @@ import { gutters, Palette, Style } from "../../styles";
import CreateLyricsHeader from "../Writing/components/CreateLyricsHeader";
const PhotoCover = () => {
const { selectedProject, selectedProjectId, updateProjectData } =
useUserData();
const { setIsLoading } = useMinuit();
const { selectedProject } = useUserData();
const isGenerating = selectedProject?.coverStatus === "GENERATING";
const coverGenerationMessage = isWeb
? loaderMessages.photoCoverGenerationWeb
: "";
const onChooseForegroundImage = async () => {
try {
await setIsLoading(true);
const result = await ImagePicker.launchImageLibraryAsync({
mediaTypes: ["images"],
allowsEditing: true,
aspect: [1, 1],
quality: 1,
});
const uri = result?.assets?.[0]?.uri || null;
if (!uri) return;
const projectId = selectedProject?.id || selectedProjectId;
const path = `musics/${projectId}/userForeground.png`;
const { resultURI } = await uploadFileToFirebase({
uri,
path,
shouldCompress: true,
fileType: "IMAGE",
});
if (!resultURI) {
throw new Error("Erreur lors de l'upload");
}
await updateProjectData({
cover: {
...selectedProject.cover,
userForeground: resultURI,
},
});
await tasksRef.add({
type: "combine",
projectId: selectedProjectId,
status: "PENDING",
createdAt: firebase.firestore.FieldValue.serverTimestamp(),
});
} catch (e) {
console.log("onPickUserImage error", e?.message);
} finally {
await setIsLoading(false);
}
};
const coverUrl =
selectedProject?.cover?.result ||
selectedProject?.cover?.generatedBackground ||
null;
return (
<Page backgroundImg={background.studioBG2} headerType="NONE">
<MusicLandHeader onPressBack={goBack} progress={81} />
<View style={{ flex: 1, marginTop: 16 }}>
<CreateLyricsHeader title="Souhaites-tu rajouter une photo de toi sur la pochette?" />
<CreateLyricsHeader
title="Ta pochette MusicLand Production"
subTitle="Le logo est automatiquement ajouté en bas à droite."
/>
<View style={{ flex: 1, ...Style.containerCenter }}>
<View style={{ width: "80%", position: "relative" }}>
{selectedProject?.cover?.result && !isGenerating ? (
{coverUrl && !isGenerating ? (
<ExpoImage
source={{ uri: selectedProject?.cover?.result }}
source={{ uri: coverUrl }}
cachePolicy="memory-disk"
priority="high"
contentFit="cover"
@@ -103,11 +60,11 @@ const PhotoCover = () => {
...Style.containerCenter,
}}
>
{isGenerating && (
<View style={{ alignItems: "center", gap: 8 }}>
<ActivityIndicator color={Palette.white} />
{isWeb ? (
coverGenerationMessage ? (
<View style={{ alignItems: "center", gap: 8 }}>
{isGenerating ? (
<>
<ActivityIndicator color={Palette.white} />
{isWeb && coverGenerationMessage ? (
<Text
style={{
color: Palette.white,
@@ -118,21 +75,33 @@ const PhotoCover = () => {
>
{coverGenerationMessage}
</Text>
) : null
) : (
<Text
style={{
color: Palette.white,
marginTop: 6,
textAlign: "center",
opacity: 0.9,
}}
>
Génération en cours.
</Text>
)}
</View>
)}
) : (
<Text
style={{
color: Palette.white,
marginTop: 6,
textAlign: "center",
opacity: 0.9,
}}
>
Génération en cours.
</Text>
)}
</>
) : (
<Text
style={{
color: Palette.white,
marginTop: 6,
textAlign: "center",
opacity: 0.9,
}}
>
La pochette sera disponible une fois la génération
terminée.
</Text>
)}
</View>
</View>
)}
</View>
@@ -147,18 +116,14 @@ const PhotoCover = () => {
}}
>
<BorderGradientButton
onPress={() => navigate(Routes.ValidateCover)}
title={
isGenerating ? "Génération en cours..." : "Valider la pochette"
}
onPress={() => navigate(Routes.PouchReady)}
title="Regénérer la pochette"
disabled={isGenerating}
/>
<GradientButton
title={
isGenerating ? "Génération en cours..." : "Oui choisir une image"
}
onPress={() => onChooseForegroundImage()}
disabled={isGenerating}
title="Valider la pochette"
onPress={() => navigate(Routes.ValidateCover)}
disabled={isGenerating || !coverUrl}
/>
</View>
</Page>