Skip to content

Commit fe0ba60

Browse files
committed
Playback rate button and menu
1 parent e3e5829 commit fe0ba60

File tree

13 files changed

+936
-701
lines changed

13 files changed

+936
-701
lines changed

‎public/assets/fonts/tgico.svg

+221-207
Loading

‎public/assets/fonts/tgico.ttf

3.01 KB
Binary file not shown.

‎public/assets/fonts/tgico.woff

3.01 KB
Binary file not shown.

‎src/components/chat/audio.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ import Icon from '../icon';
2525
import {replaceButtonIcon} from '../button';
2626
import getFwdFromName from '../../lib/appManagers/utils/messages/getFwdFromName';
2727
import toHHMMSS from '../../helpers/string/toHHMMSS';
28-
import {PlaybackRateButton} from '../../lib/mediaPlayer';
28+
import {PlaybackRateButton} from '../../components/playbackRateButton';
2929

3030
export default class ChatAudio extends PinnedContainer {
3131
private toggleEl: HTMLElement;

‎src/components/playbackRateButton.ts

+72
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
2+
import appMediaPlaybackController from '../components/appMediaPlaybackController';
3+
import {ButtonMenuSync} from '../components/buttonMenu';
4+
import {ButtonMenuToggleHandler} from '../components/buttonMenuToggle';
5+
import ButtonIcon from '../components/buttonIcon';
6+
import Icon from '../components/icon';
7+
8+
export const PlaybackRateButton = (options: {
9+
onPlaybackRateMenuToggle?: (open: boolean) => void,
10+
direction: string
11+
}) => {
12+
const PLAYBACK_RATES = [0.5, 1, 1.5, 2];
13+
const PLAYBACK_RATES_ICONS: Icon[] = ['playback_05', 'playback_1x', 'playback_15', 'playback_2x'];
14+
const button = ButtonIcon(` btn-menu-toggle`, {noRipple: true});
15+
16+
const setIcon = () => {
17+
const playbackRateButton = button;
18+
19+
let idx = PLAYBACK_RATES.indexOf(appMediaPlaybackController.playbackRate);
20+
if(idx === -1) idx = PLAYBACK_RATES.indexOf(1);
21+
22+
const icon = Icon(PLAYBACK_RATES_ICONS[idx]);
23+
if(playbackRateButton.firstElementChild) {
24+
playbackRateButton.firstElementChild.replaceWith(icon);
25+
} else {
26+
playbackRateButton.append(icon);
27+
}
28+
};
29+
30+
const setBtnMenuToggle = () => {
31+
const buttons = PLAYBACK_RATES.map((rate, idx) => {
32+
const buttonOptions: Parameters<typeof ButtonMenuSync>[0]['buttons'][0] = {
33+
// icon: PLAYBACK_RATES_ICONS[idx],
34+
regularText: rate + 'x',
35+
onClick: () => {
36+
appMediaPlaybackController.playbackRate = rate;
37+
}
38+
};
39+
40+
return buttonOptions;
41+
});
42+
const btnMenu = ButtonMenuSync({buttons});
43+
btnMenu.classList.add(options.direction, 'playback-rate-menu');
44+
ButtonMenuToggleHandler({
45+
el: button,
46+
onOpen: options.onPlaybackRateMenuToggle ? () => {
47+
options.onPlaybackRateMenuToggle(true);
48+
} : undefined,
49+
onClose: options.onPlaybackRateMenuToggle ? () => {
50+
options.onPlaybackRateMenuToggle(false);
51+
} : undefined
52+
});
53+
setIcon();
54+
button.append(btnMenu);
55+
};
56+
57+
const addRate = (add: number) => {
58+
const playbackRate = appMediaPlaybackController.playbackRate;
59+
const idx = PLAYBACK_RATES.indexOf(playbackRate);
60+
const nextIdx = idx + add;
61+
if(nextIdx >= 0 && nextIdx < PLAYBACK_RATES.length) {
62+
appMediaPlaybackController.playbackRate = PLAYBACK_RATES[nextIdx];
63+
}
64+
};
65+
66+
const isMenuOpen = () => {
67+
return button.classList.contains('menu-open');
68+
};
69+
70+
setBtnMenuToggle();
71+
return {element: button, setIcon, addRate, isMenuOpen};
72+
};

0 commit comments

Comments
 (0)