diff --git a/src/screens/Library/AllMyPlaylist.web.js b/src/screens/Library/AllMyPlaylist.web.js index 33bb37e..40f58dc 100644 --- a/src/screens/Library/AllMyPlaylist.web.js +++ b/src/screens/Library/AllMyPlaylist.web.js @@ -10,7 +10,6 @@ import useDataFromArrayDocId from "../../hooks/useDataFromArrayId"; import useDataFromRef from "../../hooks/useDataFromRef"; import useNavigateToMusicDetails from "../../hooks/useNavigateToMusicDetails"; import Page from "../../layouts/Page"; -import { goBack } from "../../navigation/NavigationService"; import { useUser } from "../../providers/UserDataProvider"; import { gutters, Palette, Style } from "../../styles"; import { FONT_FAMILY } from "../../styles/Fonts"; @@ -62,8 +61,6 @@ const AllMyPlaylist = ({ route }) => { type: "error", text: e?.message || "Suppression impossible", }); - } finally { - goBack(); } }, }, diff --git a/src/screens/Writing/Lyrics.js b/src/screens/Writing/Lyrics.js index 4d65490..b881827 100644 --- a/src/screens/Writing/Lyrics.js +++ b/src/screens/Writing/Lyrics.js @@ -1,19 +1,19 @@ import React, { useCallback, useMemo, useRef, useState } from "react"; import { Alert, ScrollView, View } from "react-native"; import useMinuit from "react-native-minuit/src/hooks/useMinuit.js"; +import { background } from "../../assets"; import BorderGradientButton from "../../components/BorderGradientButton"; import GradientButton from "../../components/GradientButton"; import ItemContainer from "../../components/ItemContainer/ItemContainer"; import MusicLandHeader from "../../components/MusicLandHeader"; import firebase, { projectsRef } from "../../config/firebase"; +import { isWeb } from "../../hooks/useLayoutType"; import Page from "../../layouts/Page"; import { Routes } from "../../navigation"; import { navigate } from "../../navigation/NavigationService"; import { useUser } from "../../providers/UserDataProvider"; import { gutters } from "../../styles"; import CustomInput from "./components/CustomInput"; -import { background } from "../../assets"; -import { isWeb } from "../../hooks/useLayoutType"; const Lyrics = ({ navigation }) => { const scrollRef = useRef(null); @@ -96,17 +96,53 @@ const Lyrics = ({ navigation }) => { return obj; }; + const alertMessage = useCallback( + (title, message) => { + const text = [title, message].filter(Boolean).join("\n\n"); + if (isWeb && typeof window !== "undefined") { + window.alert(text); + return; + } + Alert.alert(title, message); + }, + [isWeb] + ); + + const confirmSensitiveContent = useCallback( + async (title, message) => { + const text = [title, message].filter(Boolean).join("\n\n"); + if (isWeb && typeof window !== "undefined") { + return window.confirm(text); + } + return new Promise((resolve) => { + Alert.alert(title, message, [ + { + text: "Annuler", + style: "cancel", + onPress: () => resolve(false), + }, + { + text: "Continuer", + style: "destructive", + onPress: () => resolve(true), + }, + ]); + }); + }, + [isWeb] + ); + const onValidate = useCallback(async () => { try { await setIsLoading(true); const titleTrimmed = (titleValue || "").trim(); if (!titleTrimmed) { - Alert.alert("Titre manquant", "Veuillez renseigner un titre."); + alertMessage("Titre manquant", "Veuillez renseigner un titre."); return; } const invalid = (sections || []).some((s) => !(s?.lyrics || "").trim()); if (invalid) { - Alert.alert( + alertMessage( "Champs incomplets", "Chaque couplet et refrain doit contenir du texte." ); @@ -151,7 +187,7 @@ const Lyrics = ({ navigation }) => { .map((e) => `• ${e.quote}`) .join("\n") : null; - Alert.alert( + alertMessage( "Contenu interdit", [data?.message, quotes].filter(Boolean).join("\n\n") ); @@ -159,7 +195,7 @@ const Lyrics = ({ navigation }) => { } // Erreur d'analyse: informer et arrêter if (data?.errorCode === "ANALYSE_FAILED") { - Alert.alert( + alertMessage( "Analyse indisponible", "Impossible de vérifier la toxicité pour le moment. Réessayez plus tard." ); @@ -177,20 +213,10 @@ const Lyrics = ({ navigation }) => { : null; const msg = [data?.message, quotes].filter(Boolean).join("\n\n"); - const proceed = await new Promise((resolve) => { - Alert.alert("Contenu potentiellement sensible", msg, [ - { - text: "Annuler", - style: "cancel", - onPress: () => resolve(false), - }, - { - text: "Continuer", - style: "destructive", - onPress: () => resolve(true), - }, - ]); - }); + const proceed = await confirmSensitiveContent( + "Contenu potentiellement sensible", + msg + ); if (!proceed) return; } } catch (moderationError) { @@ -198,7 +224,7 @@ const Lyrics = ({ navigation }) => { "Moderation call failed", moderationError?.message || moderationError ); - Alert.alert( + alertMessage( "Analyse indisponible", "Impossible de vérifier la toxicité pour le moment. Réessayez plus tard." ); @@ -225,7 +251,7 @@ const Lyrics = ({ navigation }) => { navigate(Routes.Home); } catch (e) { console.log(e); - Alert.alert("Erreur", "Échec de l'enregistrement dans le projet."); + alertMessage("Erreur", "Échec de l'enregistrement dans le projet."); } finally { await setIsLoading(false); } @@ -234,6 +260,9 @@ const Lyrics = ({ navigation }) => { sections, projectConfig, projectSelections, + alertMessage, + confirmSensitiveContent, + sanitize, setIsLoading, selectedProjectId, projectHasLyrics,