@livetv-app/tvguide
Version:
An Android TV Live Channels-like Electronic Programme Guide for React DOM and React Native applications.
116 lines (115 loc) • 4.12 kB
TypeScript
import React = require('react');
import { Channel, Programme } from '../types';
import { Selection } from './context';
import { KeypressResult, ProgrammeGuide as ProgrammeGuideRef } from './types';
import type { ProgrammeGuideProps } from './tvguide.js';
export { ProgrammeGuideProps };
interface ProgrammeGuideState {
channel: Channel | null;
programme: Programme | null;
time: Date;
leftPosition: Date;
width: number;
heightDebug: number;
heightHeader: number;
scrollTop: Channel | null;
scrollBottom: Channel | null;
internalScrollPosition: {
contentOffset: {
x: number;
y: number;
};
contentSize: {
height: number;
width: number;
};
layoutMeasurement: {
height: number;
width: number;
};
} | null;
}
declare type ChannelOrPlaceholderRow = {
index: number;
channel: Channel;
} | {
start: number;
end: number;
channels: Channel[];
height: number;
};
export default class ProgrammeGuide extends React.Component<ProgrammeGuideProps, ProgrammeGuideState> implements ProgrammeGuideRef {
state: ProgrammeGuideState;
programmes_by_channel: Record<string, Programme[] | undefined>;
setSelectedChannel: (channel: Channel | null) => void;
setSelectedProgramme: (programme: Programme | null) => void;
setSelectedTime: (time: Date) => void;
setLeftPosition: (leftPosition: Date) => void;
private setWidth;
readonly selection: Selection & {
c: ProgrammeGuide;
};
get leftPosition(): Date;
constructor(props: ProgrammeGuideProps);
componentDidUpdate(prevProps: ProgrammeGuideProps, prevState: ProgrammeGuideState): void;
protected setChannel(channel: Channel): void;
setChannelUp(): void;
setChannelDown(): void;
setPreviousProgramme(): void;
setNextProgramme(): void;
sendSelectKeypress(): KeypressResult.OK | KeypressResult.IGNORED_AS_CHANNEL_ALREADY_SELECTED;
sendLongSelectKeypress(): KeypressResult.OK | KeypressResult.IGNORED_AS_NO_PROGRAMME_SELECTED | KeypressResult.IGNORED_AS_PROGRAMME_HAS_NO_ACTIONS;
sendUpKeypress(wrap?: boolean): KeypressResult.OK | KeypressResult.IGNORED_DUE_TO_BOUNDARY;
sendDownKeypress(wrap?: boolean): KeypressResult.OK | KeypressResult.IGNORED_DUE_TO_BOUNDARY;
protected setSelectedChannelAndProgramme(channel: Channel): void;
protected setSelectedTimeAndProgramme(time: Date, scroll?: boolean): void;
protected scrollLeftRespectingBoundary(length: number): boolean;
protected scrollRightRespectingBoundary(length: number): boolean;
sendLeftKeypress(): KeypressResult.OK | KeypressResult.IGNORED_DUE_TO_BOUNDARY;
sendRightKeypress(): KeypressResult.OK | KeypressResult.IGNORED_DUE_TO_BOUNDARY;
protected shouldRenderChannelRow(total: number, index: number, channel: Channel): boolean;
protected calculateRenderedRows(): ChannelOrPlaceholderRow[];
protected calculateScrollPosition(): Pick<ProgrammeGuideState, 'scrollTop' | 'scrollBottom'>;
render(): JSX.Element;
renderDebugView(): JSX.Element;
private _handleKeypressFromDebug;
}
export declare const styles: {
container: {
flex: number;
maxHeight: string;
padding: number;
paddingRight: number;
paddingBottom: number;
borderRadius: number;
shadowColor: string;
shadowOpacity: number;
shadowRadius: number;
};
header: {
backgroundColor: string;
borderTopLeftRadius: number;
overflow: "visible";
};
channelRowContainer: {
overflow: "hidden";
};
channelRowContainerLastRow: {
marginBottom: number;
};
channelRowPlaceholder: {
backgroundColor: string;
};
channelRowPlaceholderNotFirstRow: {
borderTopColor: string;
borderTopWidth: number;
};
channelRowPlaceholderLastRow: {
borderBottomLeftRadius: number;
};
expandScroller: {
position: "absolute";
height: string;
top: number;
};
};