@applicaster/zapp-react-native-utils
Version:
Applicaster Zapp React Native utilities package
72 lines (60 loc) • 2.04 kB
text/typescript
import {
ISeekController,
ISeekControllerDelegate,
SeekIncrementalBaseStrategy,
} from "./ISeekController";
import { SEEK_TYPE } from "../const";
import { log_debug, log_error, log_verbose } from "./TVSeekController";
import { interval, Subscription } from "rxjs";
import { tap } from "rxjs/operators";
interface LongPressConfig {
TIMER_INTERVAL_MS: number;
}
export class LongPressSeekController implements ISeekController {
private subscription: Subscription | null = null;
readonly title = "LongPressSeek";
constructor(
private seekControllerDelegate: ISeekControllerDelegate,
private seekIncrementalStrategy: SeekIncrementalBaseStrategy,
private config: LongPressConfig
) {}
onStartSeek(seekType: SEEK_TYPE) {
this.cleanUpSubscription();
log_debug(`${this.title}: start long press seek type: ${seekType}.`);
this.seekControllerDelegate.handlePlayerPause();
this.subscription = interval(this.config.TIMER_INTERVAL_MS)
.pipe(
tap(() => {
this.seekControllerDelegate.handleDelayedSeek(
this.seekIncrementalStrategy.getSkipTime()
);
log_debug(
`${
this.title
}: handle delayed seek type: ${seekType} - multiplier: ${this.seekIncrementalStrategy.getSkipMultiplier()}, currentSkipAmount: ${this.seekIncrementalStrategy.getSkipTime()}.`
);
this.seekIncrementalStrategy.increment();
})
)
.subscribe({
complete: () =>
log_verbose(`${this.title}: Long press subscription complete`),
error: (err) =>
log_error(`${this.title}: Long press subscription error`, err),
});
}
onSeekEnd() {
this.cleanUpSubscription();
this.seekControllerDelegate.handleSeekComplete();
}
reset() {
this.seekIncrementalStrategy.reset();
this.cleanUpSubscription();
}
private cleanUpSubscription() {
if (this.subscription) {
this.subscription.unsubscribe();
this.subscription = null;
}
}
}