From add6a707a2a8a9dbf93b6988ed3d125ac2520969 Mon Sep 17 00:00:00 2001 From: leon-morival Date: Mon, 17 Nov 2025 10:58:28 +0100 Subject: [PATCH] feat: restart on web --- src/assets/UI/RestartSpinnerIcon.js | 61 ++++++++++++++++++++++ src/screens/Playback/RecordPlayback.js | 57 +------------------- src/screens/Playback/RecordPlayback.web.js | 53 ++++++++++++++----- src/screens/Writing/Lyrics.js | 8 +-- 4 files changed, 106 insertions(+), 73 deletions(-) create mode 100644 src/assets/UI/RestartSpinnerIcon.js diff --git a/src/assets/UI/RestartSpinnerIcon.js b/src/assets/UI/RestartSpinnerIcon.js new file mode 100644 index 0000000..a84af69 --- /dev/null +++ b/src/assets/UI/RestartSpinnerIcon.js @@ -0,0 +1,61 @@ +import * as React from "react"; +import { View } from "react-native"; +import Svg, { ClipPath, Defs, G, Path, Rect } from "react-native-svg"; + +const RestartSpinnerIcon = ({ + size = 30, + color = "#F94697", + background = "transparent", + style, +}) => { + return ( + + + + + + + + + + + + + + + + ); +}; + +export default RestartSpinnerIcon; diff --git a/src/screens/Playback/RecordPlayback.js b/src/screens/Playback/RecordPlayback.js index 1ac0b4c..80f1b9c 100644 --- a/src/screens/Playback/RecordPlayback.js +++ b/src/screens/Playback/RecordPlayback.js @@ -10,12 +10,13 @@ import React, { } from "react"; import { Text, TouchableOpacity, View } from "react-native"; import { useSafeAreaInsets } from "react-native-safe-area-context"; -import Svg, { Circle, Path, G, Defs, Rect, ClipPath } from "react-native-svg"; +import Svg, { Circle } from "react-native-svg"; import alert from "../../components/Alert"; import GradientButton from "../../components/GradientButton"; import KaraokeLyrics from "../../components/KaraokeLyrics"; import MusicLandHeader from "../../components/MusicLandHeader"; import { increment, projectsRef } from "../../config/firebase"; +import RestartSpinnerIcon from "../../assets/UI/RestartSpinnerIcon"; import usePlayer from "../../hooks/usePlayer"; import useSharedAudioPlayer from "../../hooks/useSharedAudioPlayer"; import { Routes } from "../../navigation"; @@ -887,60 +888,6 @@ const ProgressRing = ({ size = 50, strokeWidth = 12, progress = 0 }) => { ); }; -const RestartSpinnerIcon = ({ - size = 30, - color = "#F94697", // couleur unie - background = "transparent", -}) => { - return ( - - - - {/* Cercle re-dessiné sans opacité */} - - - {/* Flèche */} - - - - - - - - - - - ); -}; - export default RecordPlayback; // Render previous/current/next line to reduce jumpiness diff --git a/src/screens/Playback/RecordPlayback.web.js b/src/screens/Playback/RecordPlayback.web.js index 4e2af91..3137e56 100644 --- a/src/screens/Playback/RecordPlayback.web.js +++ b/src/screens/Playback/RecordPlayback.web.js @@ -7,7 +7,7 @@ import React, { useRef, useState, } from "react"; -import { Text, View } from "react-native"; +import { Text, TouchableOpacity, View } from "react-native"; import { useSafeAreaInsets } from "react-native-safe-area-context"; import Svg, { Circle } from "react-native-svg"; import alert from "../../components/Alert"; @@ -26,6 +26,7 @@ import { FONT_FAMILY } from "../../styles/Fonts"; import CreateLyricsHeader from "../Writing/components/CreateLyricsHeader"; import { background } from "../../assets"; import playbackBG2 from "../../assets/UI/playbackBG2.png"; +import RestartSpinnerIcon from "../../assets/UI/RestartSpinnerIcon"; const TIME_BEFORE_INCREMENT_MS = 20000; const LOG_PREFIX = "[RecordPlayback.web]"; @@ -736,6 +737,23 @@ const RecordPlayback = ({ route }) => { }); }, 1000); }, [songUrl, canRecord, resetSession, startPlayback]); + + const handleRestartRecording = useCallback(async () => { + console.log(LOG_PREFIX, "restartButton:pressed", { + isPreparing, + isRecording, + }); + try { + await startCountdownThenRecord(); + } catch (e) { + console.log( + LOG_PREFIX, + "restartButton:error", + String(e?.message || e || ""), + ); + } + }, [isPreparing, isRecording, startCountdownThenRecord]); + const progressRatio = dur > 0 ? Math.min(1, pos / dur) : 0; return ( @@ -873,7 +891,7 @@ const RecordPlayback = ({ route }) => { /> )} - {/* Progress circulaire */} + {/* Progress circulaire + restart */} {permissionsGranted && (isRecording || isPreparing) && ( { > - + > + + )} @@ -981,7 +1010,7 @@ const ProgressRing = ({ size = 50, strokeWidth = 12, progress = 0 }) => { style={{ transform: [{ rotate: "-90deg" }], backgroundColor: "#ffffff3d", - borderRadius: 55, + borderRadius: size / 2, }} > { updateData.musicUrls = firebase.firestore.FieldValue.delete(); updateData.musicStatus = firebase.firestore.FieldValue.delete(); } - await projectsRef - .doc(selectedProjectId) - .set(updateData, { merge: true }); + await projectsRef.doc(selectedProjectId).set(updateData, { merge: true }); const projectForStage = { ...selectedProject, title: titleTrimmed, @@ -507,9 +505,7 @@ const Lyrics = ({ navigation }) => { - setIsSensitiveContentAcknowledged((prev) => !prev) - } + onPress={() => setIsSensitiveContentAcknowledged((prev) => !prev)} label={RESPONSIBILITY_CHECKBOX_LABEL} />