Skip to content

Commit 94b3ea8

Browse files
Pintoradoluwes
andauthored
feat: persist muted enabled state (#1088)
Closes #1072 ## Changes - `MEDIA_UNMUTE_REQUEST`: When unmuting, if the preferred volume is too low (<= 0.25), set the volume to 0.25. Otherwise, restore the preferred volume. - `mediaMuted` set behavior: When muting, set `media-chrome-pref-muted` to `true` in localStorage and when unmuting set it to `false`. - `stateOwnersUpdateHandlers` behavior: calls `mediaMuted`'s set with the `mutedPref` value. I replicated the same user experience as yt when muting and unmuting (restoring the previously selected volume), with the exception that if the preferred volume is too low (<=0.25), it is set to 0.25 to ensure the audio is clearly perceptible. I'm open to any other suggestions for doing this :) --------- Co-authored-by: Wesley Luyten <[email protected]>
1 parent 0577561 commit 94b3ea8

File tree

1 file changed

+37
-2
lines changed

1 file changed

+37
-2
lines changed

src/js/media-store/state-mediator.ts

Lines changed: 37 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,7 @@ export type StateOption = {
8686
defaultDuration?: number;
8787
liveEdgeOffset?: number;
8888
noVolumePref?: boolean;
89+
noMutedPref?: boolean;
8990
noSubtitlesLangPref?: boolean;
9091
};
9192

@@ -389,9 +390,39 @@ export const stateMediator: StateMediator = {
389390
set(value, stateOwners) {
390391
const { media } = stateOwners;
391392
if (!media) return;
393+
394+
try {
395+
globalThis.localStorage.setItem(
396+
'media-chrome-pref-muted',
397+
value ? 'true' : 'false'
398+
);
399+
} catch (e) {
400+
console.debug('Error setting muted pref', e);
401+
}
402+
392403
media.muted = value;
393404
},
394405
mediaEvents: ['volumechange'],
406+
stateOwnersUpdateHandlers: [
407+
(handler, stateOwners) => {
408+
const {
409+
options: { noMutedPref },
410+
} = stateOwners;
411+
const { media } = stateOwners;
412+
// The muted enabled attribute should still override the preference.
413+
if (!media || media.muted || noMutedPref) return;
414+
try {
415+
const mutedPref =
416+
globalThis.localStorage.getItem('media-chrome-pref-muted') ===
417+
'true';
418+
419+
stateMediator.mediaMuted.set(mutedPref, stateOwners);
420+
handler(mutedPref);
421+
} catch (e) {
422+
console.debug('Error getting muted pref', e);
423+
}
424+
},
425+
],
395426
},
396427
mediaVolume: {
397428
get(stateOwners) {
@@ -413,8 +444,8 @@ export const stateMediator: StateMediator = {
413444
value.toString()
414445
);
415446
}
416-
} catch (err) {
417-
// ignore
447+
} catch (e) {
448+
console.debug('Error setting volume pref', e);
418449
}
419450
if (!Number.isFinite(+value)) return;
420451
media.volume = +value;
@@ -428,9 +459,13 @@ export const stateMediator: StateMediator = {
428459
if (noVolumePref) return;
429460
/** @TODO How should we handle globalThis dependencies/"state ownership"? (CJP) */
430461
try {
462+
const { media } = stateOwners;
463+
if (!media) return;
464+
431465
const volumePref = globalThis.localStorage.getItem(
432466
'media-chrome-pref-volume'
433467
);
468+
434469
if (volumePref == null) return;
435470
stateMediator.mediaVolume.set(+volumePref, stateOwners);
436471
handler(+volumePref);

0 commit comments

Comments
 (0)