diff options
Diffstat (limited to 'src/plugins/voiceMessages/VoicePreview.tsx')
-rw-r--r-- | src/plugins/voiceMessages/VoicePreview.tsx | 57 |
1 files changed, 57 insertions, 0 deletions
diff --git a/src/plugins/voiceMessages/VoicePreview.tsx b/src/plugins/voiceMessages/VoicePreview.tsx new file mode 100644 index 0000000..70830a9 --- /dev/null +++ b/src/plugins/voiceMessages/VoicePreview.tsx @@ -0,0 +1,57 @@ +/* + * Vencord, a modification for Discord's desktop app + * Copyright (c) 2023 Vendicated and contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <https://www.gnu.org/licenses/>. +*/ + +import { LazyComponent, useTimer } from "@utils/react"; +import { findByCode } from "@webpack"; + +import { cl } from "./utils"; + +interface VoiceMessageProps { + src: string; + waveform: string; +} +const VoiceMessage = LazyComponent<VoiceMessageProps>(() => findByCode('["onVolumeChange","volume","onMute"]')); + +export type VoicePreviewOptions = { + src?: string; + waveform: string; + recording?: boolean; +}; +export const VoicePreview = ({ + src, + waveform, + recording, +}: VoicePreviewOptions) => { + const durationMs = useTimer({ + deps: [recording] + }); + + const durationSeconds = recording ? Math.floor(durationMs / 1000) : 0; + const durationDisplay = Math.floor(durationSeconds / 60) + ":" + (durationSeconds % 60).toString().padStart(2, "0"); + + if (src && !recording) + return <VoiceMessage key={src} src={src} waveform={waveform} />; + + return ( + <div className={cl("preview", recording ? "preview-recording" : [])}> + <div className={cl("preview-indicator")} /> + <div className={cl("preview-time")}>{durationDisplay}</div> + <div className={cl("preview-label")}>{recording ? "RECORDING" : "----"}</div> + </div> + ); +}; |