From 9027ece3956ef1d13335eedf94b95d3f173c975e Mon Sep 17 00:00:00 2001 From: TheNexter Date: Tue, 18 Nov 2025 18:13:29 +0100 Subject: [PATCH] Better design audio record button --- .../MemoEditor/ActionButton/InsertMenu.tsx | 112 +++++++++--------- .../InsertMenu/useAudioRecorder.ts | 22 +++- 2 files changed, 75 insertions(+), 59 deletions(-) diff --git a/web/src/components/MemoEditor/ActionButton/InsertMenu.tsx b/web/src/components/MemoEditor/ActionButton/InsertMenu.tsx index 234cddff3..949554ae8 100644 --- a/web/src/components/MemoEditor/ActionButton/InsertMenu.tsx +++ b/web/src/components/MemoEditor/ActionButton/InsertMenu.tsx @@ -142,67 +142,63 @@ const InsertMenu = observer((props: Props) => { return ( <> - - - {audioRecorder.isRecording ? ( - - ) : ( + {audioRecorder.isRecording ? ( +
+
+
+ {new Date(audioRecorder.recordingTime * 1000).toISOString().substr(14, 5)} +
+ + + +
+ ) : ( + + - )} - - - {audioRecorder.isRecording ? ( - <> - -
- Stop Recording - - - - Cancel Recording - - - ) : ( - <> - - - {t("common.upload")} - - setLinkDialogOpen(true)}> - - {t("tooltip.link-memo")} - - - - {t("tooltip.select-location")} - - - - Record Audio - - {/* View submenu with Focus Mode */} - - - - {t("common.more")} - - - - - {t("editor.focus-mode")} - ⌘⇧F - - - - - )} - - + + + + + {t("common.upload")} + + setLinkDialogOpen(true)}> + + {t("tooltip.link-memo")} + + + + {t("tooltip.select-location")} + + + + Record Audio + + {/* View submenu with Focus Mode */} + + + + {t("common.more")} + + + + + {t("editor.focus-mode")} + ⌘⇧F + + + + + + )} {/* Hidden file input */} { setState((prev: AudioRecorderState) => ({ ...prev, isRecording: true, mediaRecorder })); timerRef.current = window.setInterval(() => { - setState((prev: AudioRecorderState) => ({ ...prev, recordingTime: prev.recordingTime + 1 })); + setState((prev) => { + if (prev.isPaused) { + return prev; + } + return { ...prev, recordingTime: prev.recordingTime + 1 }; + }); }, 1000); } catch (error) { console.error("Error accessing microphone:", error); @@ -93,11 +98,26 @@ export const useAudioRecorder = () => { }); }; + const togglePause = () => { + const { mediaRecorder, isPaused } = state; + if (!mediaRecorder) return; + + if (isPaused) { + mediaRecorder.resume(); + } else { + mediaRecorder.pause(); + } + + setState((prev) => ({ ...prev, isPaused: !prev.isPaused })); + }; + return { isRecording: state.isRecording, + isPaused: state.isPaused, recordingTime: state.recordingTime, startRecording, stopRecording, cancelRecording, + togglePause, }; };