import BaseFoundation, { DefaultAdapter } from '../base/foundation';
export interface AudioPlayerAdapter
, S = Record> extends DefaultAdapter {
init: () => void;
resetAudioState: () => void;
handleStatusClick: () => void;
handleTimeUpdate: () => void;
handleTrackChange: (direction: 'next' | 'prev') => void;
getAudioRef: () => HTMLAudioElement;
handleTimeChange: (value: number) => void;
handleSpeedChange: (value: { label: string; value: number }) => void;
handleSeek: (direction: number) => void;
handleRefresh: () => void;
handleVolumeChange: (value: number) => void;
destroy: () => void
}
class AudioPlayerFoundation extends BaseFoundation {
constructor(adapter: AudioPlayerAdapter) {
super({ ...AudioPlayerFoundation, ...adapter });
}
initAudioState() {
const audioElement = this.getAudioRef();
const props = this.getProps();
this.setState({
totalTime: audioElement?.duration || 0,
isPlaying: props.autoPlay,
volume: audioElement?.volume * 100 || 100,
currentRate: { label: '1.0x', value: audioElement?.playbackRate || 1 },
});
}
endHandler() {
const props = this.getProps();
if (Array.isArray(props.audioUrl)) {
this.handleTrackChange('next');
} else {
this.setState({
isPlaying: false,
});
}
}
errorHandler() {
this.setState({
error: true,
});
}
init() {
this._adapter.init();
}
destroy() {
this._adapter.destroy();
}
resetAudioState() {
this._adapter.resetAudioState();
}
handleStatusClick() {
this._adapter.handleStatusClick();
}
handleTimeUpdate() {
this._adapter.handleTimeUpdate();
}
handleTrackChange(direction: 'next' | 'prev') {
this._adapter.handleTrackChange(direction);
}
getAudioRef() {
return this._adapter.getAudioRef();
}
handleTimeChange(value: number) {
this._adapter.handleTimeChange(value);
}
handleSpeedChange(value: { label: string; value: number }) {
this._adapter.handleSpeedChange(value);
}
handleSeek(direction: number) {
this._adapter.handleSeek(direction);
}
handleRefresh() {
this._adapter.handleRefresh();
}
handleVolumeChange(value: number) {
this._adapter.handleVolumeChange(value);
}
}
export default AudioPlayerFoundation;