big refacto change all flows
This commit is contained in:
@@ -17,13 +17,14 @@ import CustomizeSongStructure from "./CustomizeSongStructure";
|
||||
import Rhymes from "./Rhymes";
|
||||
import CreatingLyrics from "./CreatingLyrics";
|
||||
import { responsiveHeight } from "react-native-responsive-dimensions";
|
||||
import { useUser } from "../../providers/UserDataProvider";
|
||||
|
||||
const { width } = Dimensions.get("window");
|
||||
|
||||
const CreateLyricsWithAi = ({ route }) => {
|
||||
const { hasLyrics = false, regenerateKey } = route?.params || {};
|
||||
const CreateLyricsWithAi = () => {
|
||||
const { selectedProject, updateProjectData } = useUser();
|
||||
const hasLyrics = selectedProject?.hasLyrics === true;
|
||||
const scrollRef = useRef(null);
|
||||
// If user already has lyrics, start at SongStructure (index 5)
|
||||
const [selectedIndex, setSelectedIndex] = useState(hasLyrics ? 5 : 0);
|
||||
const [progress, setProgress] = useState(16);
|
||||
const [parentLayout, setparentLayout] = useState(null);
|
||||
@@ -40,6 +41,58 @@ const CreateLyricsWithAi = ({ route }) => {
|
||||
const [rhymes, setRhymes] = useState(null);
|
||||
const [customStructure, setCustomStructure] = useState(null); // array like ['couplet','refrain']
|
||||
|
||||
// Pré-remplir les états depuis le projet sélectionné si disponibles
|
||||
React.useEffect(() => {
|
||||
if (!selectedProject) return;
|
||||
const sel = selectedProject?.selections || {};
|
||||
const cfg = selectedProject?.config || {};
|
||||
|
||||
// Text inputs / choix simples
|
||||
if (objective == null && typeof sel.objective === "string" && sel.objective)
|
||||
setObjective(sel.objective);
|
||||
if (!otherObjective && typeof sel.otherObjective === "string")
|
||||
setOtherObjective(sel.otherObjective);
|
||||
if (!context && typeof sel.context === "string") setContext(sel.context);
|
||||
|
||||
// Emotion: accepter objet {title, description} ou string "Titre : description"
|
||||
if (emotion == null && sel.emotion) {
|
||||
if (typeof sel.emotion === "object" && sel.emotion.title) {
|
||||
setEmotion({
|
||||
title: sel.emotion.title,
|
||||
description: sel.emotion.description || "",
|
||||
});
|
||||
} else if (typeof sel.emotion === "string") {
|
||||
const [t, d] = sel.emotion.split(":");
|
||||
const title = (t || "").trim();
|
||||
const description = (d || "").trim();
|
||||
if (title) setEmotion({ title, description });
|
||||
}
|
||||
}
|
||||
|
||||
if (style == null && typeof sel.style === "string" && sel.style)
|
||||
setStyle(sel.style);
|
||||
if (!otherStyle && typeof sel.otherStyle === "string")
|
||||
setOtherStyle(sel.otherStyle);
|
||||
if (!audience && typeof sel.audience === "string") setAudience(sel.audience);
|
||||
|
||||
// Structure choisie (string) si déjà enregistrée dans selections
|
||||
if (structure == null && typeof sel.structure === "string" && sel.structure)
|
||||
setStructure(sel.structure);
|
||||
|
||||
// Rimes
|
||||
if (rhymes == null && typeof sel.rhymes === "string" && sel.rhymes)
|
||||
setRhymes(sel.rhymes);
|
||||
|
||||
// Structure personnalisée: prioriser selections.customStructure puis config.structure
|
||||
const savedCustom = Array.isArray(sel.customStructure)
|
||||
? sel.customStructure
|
||||
: null;
|
||||
const cfgStructure = Array.isArray(cfg.structure) ? cfg.structure : null;
|
||||
if (!Array.isArray(customStructure) && (savedCustom || cfgStructure)) {
|
||||
setCustomStructure(savedCustom || cfgStructure);
|
||||
}
|
||||
}, [selectedProject]);
|
||||
|
||||
const parsedStructure = useMemo(() => {
|
||||
// Parses strings like "1 couplet, 1 refrain, 1 couplet, 1 refrain"
|
||||
try {
|
||||
@@ -65,6 +118,13 @@ const CreateLyricsWithAi = ({ route }) => {
|
||||
}
|
||||
}, [structure]);
|
||||
|
||||
// Si déjà des paroles, forcer l'accès à partir de l'étape 5 et ignorer 0-4
|
||||
React.useEffect(() => {
|
||||
if (hasLyrics && selectedIndex < 5) {
|
||||
setSelectedIndex(5);
|
||||
}
|
||||
}, [hasLyrics]);
|
||||
|
||||
const lyricsConfig = useMemo(() => {
|
||||
return {
|
||||
objective: otherObjective?.trim()
|
||||
@@ -98,9 +158,9 @@ const CreateLyricsWithAi = ({ route }) => {
|
||||
customStructure,
|
||||
]);
|
||||
|
||||
const onPressNext = () => {
|
||||
// If user already has lyrics and just finished CustomizeSongStructure (index 6),
|
||||
// skip AI generation and go straight to Lyrics editor
|
||||
const onPressNext = async () => {
|
||||
// Si l'utilisateur a déjà des paroles et vient de finir CustomizeSongStructure (index 6),
|
||||
// sauter Rhymes et CreatingLyrics et aller directement sur Lyrics
|
||||
if (hasLyrics && selectedIndex === 6) {
|
||||
const chosenStructure =
|
||||
(customStructure &&
|
||||
@@ -108,7 +168,7 @@ const CreateLyricsWithAi = ({ route }) => {
|
||||
customStructure.length === parsedStructure.length
|
||||
? customStructure
|
||||
: parsedStructure) || [];
|
||||
navigate(Routes.Lyrics, {
|
||||
await updateProjectData({
|
||||
config: { structure: chosenStructure },
|
||||
selections: {
|
||||
objective,
|
||||
@@ -125,6 +185,7 @@ const CreateLyricsWithAi = ({ route }) => {
|
||||
},
|
||||
hasLyrics: true,
|
||||
});
|
||||
navigate(Routes.Lyrics);
|
||||
return;
|
||||
}
|
||||
setSelectedIndex((idx) => idx + 1);
|
||||
@@ -156,11 +217,7 @@ const CreateLyricsWithAi = ({ route }) => {
|
||||
|
||||
return (
|
||||
<Page headerType="NONE">
|
||||
<MusicLandHeader
|
||||
onPressBack={onPressBack}
|
||||
progress={progress}
|
||||
showSkip={selectedIndex === 4}
|
||||
/>
|
||||
<MusicLandHeader onPressBack={onPressBack} progress={progress} />
|
||||
<View
|
||||
style={{
|
||||
flex: 1,
|
||||
@@ -250,7 +307,14 @@ const CreateLyricsWithAi = ({ route }) => {
|
||||
}}
|
||||
>
|
||||
<CustomizeSongStructure
|
||||
baseStructure={parsedStructure || []}
|
||||
baseStructure={
|
||||
parsedStructure ||
|
||||
(Array.isArray(customStructure)
|
||||
? customStructure
|
||||
: Array.isArray(selectedProject?.config?.structure)
|
||||
? selectedProject.config.structure
|
||||
: [])
|
||||
}
|
||||
onChange={setCustomStructure}
|
||||
/>
|
||||
</View>
|
||||
@@ -273,7 +337,6 @@ const CreateLyricsWithAi = ({ route }) => {
|
||||
<CreatingLyrics
|
||||
active={selectedIndex === 8}
|
||||
config={lyricsConfig}
|
||||
regenerateKey={regenerateKey}
|
||||
selections={{
|
||||
objective,
|
||||
otherObjective,
|
||||
@@ -292,7 +355,10 @@ const CreateLyricsWithAi = ({ route }) => {
|
||||
</SwiperFlatList>
|
||||
</View>
|
||||
{selectedIndex !== 8 && (
|
||||
<GradientButton title="Suivant" onPress={onPressNext} />
|
||||
<GradientButton
|
||||
title={selectedIndex === 7 ? "Générer" : "Suivant"}
|
||||
onPress={onPressNext}
|
||||
/>
|
||||
)}
|
||||
</View>
|
||||
</Page>
|
||||
|
||||
Reference in New Issue
Block a user