From 0f1a523c2fd36c86a783b6225b1135a73384a225 Mon Sep 17 00:00:00 2001 From: Alexander Zinchuk Date: Wed, 8 Feb 2023 00:47:47 +0100 Subject: [PATCH] Audio Player & Media Viewer: Save last set playback rate (#2508) --- src/global/actions/ui/mediaViewer.ts | 10 +++++++++- src/global/actions/ui/messages.ts | 16 ++++++++++++++-- src/global/cache.ts | 10 ++++++++++ src/global/init.ts | 4 ++++ src/global/initialState.ts | 8 ++++++++ src/global/types.ts | 9 +++++++++ 6 files changed, 54 insertions(+), 3 deletions(-) diff --git a/src/global/actions/ui/mediaViewer.ts b/src/global/actions/ui/mediaViewer.ts index 8abdbf8e0..212c2f5ea 100644 --- a/src/global/actions/ui/mediaViewer.ts +++ b/src/global/actions/ui/mediaViewer.ts @@ -22,7 +22,7 @@ addActionHandler('openMediaViewer', (global, actions, payload): ActionReturnType origin, isHidden: false, volume: volume ?? tabState.mediaViewer.volume, - playbackRate: playbackRate || tabState.mediaViewer.playbackRate, + playbackRate: playbackRate || tabState.mediaViewer.playbackRate || global.mediaViewer.lastPlaybackRate, isMuted: isMuted || tabState.mediaViewer.isMuted, }, forwardMessages: {}, @@ -66,6 +66,14 @@ addActionHandler('setMediaViewerPlaybackRate', (global, actions, payload): Actio tabId = getCurrentTabId(), } = payload; + global = { + ...global, + mediaViewer: { + ...global.mediaViewer, + lastPlaybackRate: playbackRate, + }, + }; + return updateTabState(global, { mediaViewer: { ...selectTabState(global, tabId).mediaViewer, diff --git a/src/global/actions/ui/messages.ts b/src/global/actions/ui/messages.ts index 53b3cc7dd..5b094baff 100644 --- a/src/global/actions/ui/messages.ts +++ b/src/global/actions/ui/messages.ts @@ -190,7 +190,10 @@ addActionHandler('openAudioPlayer', (global, actions, payload): ActionReturnType messageId, origin: origin ?? tabState.audioPlayer.origin, volume: volume ?? tabState.audioPlayer.volume, - playbackRate: playbackRate || tabState.audioPlayer.playbackRate, + playbackRate: playbackRate || tabState.audioPlayer.playbackRate || global.audioPlayer.lastPlaybackRate, + isPlaybackRateActive: (tabState.audioPlayer.isPlaybackRateActive === undefined + ? global.audioPlayer.isLastPlaybackRateActive + : tabState.audioPlayer.isPlaybackRateActive), isMuted: isMuted || tabState.audioPlayer.isMuted, }, }, tabId); @@ -215,6 +218,15 @@ addActionHandler('setAudioPlayerPlaybackRate', (global, actions, payload): Actio playbackRate, isPlaybackRateActive, tabId = getCurrentTabId(), } = payload; + global = { + ...global, + audioPlayer: { + ...global.audioPlayer, + lastPlaybackRate: playbackRate, + isLastPlaybackRateActive: isPlaybackRateActive, + }, + }; + return updateTabState(global, { audioPlayer: { ...selectTabState(global, tabId).audioPlayer, @@ -257,7 +269,7 @@ addActionHandler('closeAudioPlayer', (global, actions, payload): ActionReturnTyp audioPlayer: { volume: tabState.audioPlayer.volume, playbackRate: tabState.audioPlayer.playbackRate, - isPlaybackRateActive: undefined, + isPlaybackRateActive: tabState.audioPlayer.isPlaybackRateActive, isMuted: tabState.audioPlayer.isMuted, }, }, tabId); diff --git a/src/global/cache.ts b/src/global/cache.ts index c6fba4a8f..3c03b5b75 100644 --- a/src/global/cache.ts +++ b/src/global/cache.ts @@ -270,6 +270,14 @@ function unsafeMigrateCache(cached: GlobalState, initialState: GlobalState) { cached.customEmojis.forEmoji = {}; } + if (!cached.audioPlayer) { + cached.audioPlayer = initialState.audioPlayer; + } + + if (!cached.mediaViewer) { + cached.mediaViewer = initialState.mediaViewer; + } + // TODO Remove in Jan 2023 (this was re-designed but can be hardcoded in cache) const { light: lightTheme } = cached.settings.themes; if (lightTheme?.patternColor === 'rgba(90, 110, 70, 0.6)' || !lightTheme?.patternColor) { @@ -386,6 +394,8 @@ export function serializeGlobal(global: T) { 'leftColumnWidth', 'lastIsChatInfoShown', ]), + audioPlayer: global.audioPlayer, + mediaViewer: global.mediaViewer, customEmojis: reduceCustomEmojis(global), users: reduceUsers(global), chats: reduceChats(global), diff --git a/src/global/init.ts b/src/global/init.ts index a9d61b4cc..8b501155a 100644 --- a/src/global/init.ts +++ b/src/global/init.ts @@ -50,6 +50,10 @@ addActionHandler('init', (global, actions, payload): ActionReturnType => { const initialTabState = cloneDeep(INITIAL_TAB_STATE); initialTabState.id = tabId; initialTabState.isChatInfoShown = Boolean(global.lastIsChatInfoShown); + initialTabState.audioPlayer.playbackRate = global.audioPlayer.lastPlaybackRate; + initialTabState.audioPlayer.isPlaybackRateActive = global.audioPlayer.isLastPlaybackRateActive; + initialTabState.mediaViewer.playbackRate = global.mediaViewer.lastPlaybackRate; + global = { ...global, byTabId: { diff --git a/src/global/initialState.ts b/src/global/initialState.ts index f47d5536a..a5bc4fb32 100644 --- a/src/global/initialState.ts +++ b/src/global/initialState.ts @@ -17,6 +17,14 @@ export const INITIAL_GLOBAL_STATE: GlobalState = { serverTimeOffset: 0, isUpdateAvailable: false, + audioPlayer: { + lastPlaybackRate: DEFAULT_PLAYBACK_RATE, + }, + + mediaViewer: { + lastPlaybackRate: DEFAULT_PLAYBACK_RATE, + }, + authRememberMe: true, countryList: { phoneCodes: [], diff --git a/src/global/types.ts b/src/global/types.ts index a1eda39cc..dc07404e2 100644 --- a/src/global/types.ts +++ b/src/global/types.ts @@ -540,6 +540,15 @@ export type GlobalState = { notificationIndex?: number; allNotificationsCount?: number; + audioPlayer: { + lastPlaybackRate: number; + isLastPlaybackRateActive?: boolean; + }; + + mediaViewer: { + lastPlaybackRate: number; + }; + recentlyFoundChatIds?: string[]; twoFaSettings: {