import {h, VNode} from 'preact';
import {Info} from './components/info';
import {PluginButton} from './components/plugin-button';
import {ui} from '@playkit-js/kaltura-player-js';
import {icons} from './components/icons';
import {OnClickEvent} from '@playkit-js/common/dist/hoc/a11y-wrapper';
import {UpperBarManager} from '@playkit-js/ui-managers';
import {InfoEvent} from './event';
import {InfoConfig} from './types/info-config';
const {ReservedPresetNames} = ui;
const {Text} = ui.preacti18n;
// @ts-ignore
export class PlaykitJsInfoPlugin extends KalturaPlayer.core.BasePlugin {
private _wasPlayed = false; // keep state of the player so we can resume if needed
private _removeActiveOverlay: null | Function = null;
private _iconId = -1;
private _pluginButtonRef: HTMLButtonElement | null = null;
public static defaultConfig: InfoConfig = {
useCreatorId: true,
showUser: true,
showCreatedAt: true,
showPlays: true
};
constructor(name: string, private _player: any, config: InfoConfig) {
super(name, _player, config);
}
get upperBarManager() {
return this.player.getService('upperBarManager') as UpperBarManager | undefined;
}
loadMedia(): void {
if (!this.upperBarManager) {
this.logger.warn('upperBarManager service not registered');
return;
}
this._addPluginIcon();
}
private _getCreationDate = (): VNode => {
if (this._player.isLive()) {
return Live now;
}
const createdAt: any = new Date((this._player.sources.metadata?.createdAt || 0) * 1000);
const now: any = new Date();
const millisecondsPerDay = 24 * 60 * 60 * 1000; // Number of milliseconds in a day
// Calculate the difference in days
const daysSince = Math.floor((now - createdAt) / millisecondsPerDay);
if (daysSince <= 1) {
return Today;
}
if (daysSince <= 30) {
return (
{`${daysSince} days ago`}
);
}
if (daysSince <= 360) {
const monthsSince = Math.floor(daysSince / 30);
return (
{`${monthsSince} Month${monthsSince > 1 ? 's' : ''} ago`}
);
}
return More than a year ago;
};
private _getPlays = (): string => {
const plays = this._player.sources.metadata?.plays;
if (!Number.isInteger(plays)) {
return '';
}
if (plays >= 1e3) {
return +(plays / 1e3).toFixed(0) + 'K';
}
return String(plays);
};
private _openInfo = () => {
if (!this.player.paused) {
this._player.pause();
this._wasPlayed = true;
}
const userData = this.config.useCreatorId ? this._player.sources.metadata?.creatorId : this._player.sources.metadata?.userId;
this._setOverlay(
this._player.ui.addComponent({
label: 'info-overlay',
area: 'GuiArea',
presets: [ReservedPresetNames.Playback, ReservedPresetNames.Live],
get: () => (
)
})
);
this.dispatchEvent(InfoEvent.INFO_SCREEN_OPEN);
};
private _closeInfo = (event?: OnClickEvent, byKeyboard?: boolean) => {
this._removeOverlay();
if (this._wasPlayed) {
this._player.play();
this._wasPlayed = false;
}
if (byKeyboard) {
// TODO: add focusElement to ts-typed
// @ts-ignore
KalturaPlayer.ui.utils.focusElement(this._pluginButtonRef, 100);
}
};
static isValid(): boolean {
return true;
}
private _setOverlay = (fn: Function) => {
this._removeOverlay();
this._removeActiveOverlay = fn;
};
private _removeOverlay = () => {
if (this._removeActiveOverlay) {
this._removeActiveOverlay();
this._removeActiveOverlay = null;
}
};
private _setPluginButtonRef = (ref: HTMLButtonElement | null) => {
this._pluginButtonRef = ref;
};
private _addPluginIcon = (): void => {
if (this._iconId > 0) {
return;
}
this.player.ready().then(() => {
this._iconId = this.upperBarManager!.add({
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
// @ts-ignore
ariaLabel: Info,
displayName: 'Info',
order: 80,
component: () => () as any,
svgIcon: {path: icons.PLUGIN_ICON, viewBox: `0 0 ${icons.BigSize} ${icons.BigSize}`},
onClick: this._openInfo
}) as number;
});
};
reset(): void {
this._closeInfo();
}
destroy(): void {
this._removeOverlay();
if (this._iconId > 0) {
this.upperBarManager!.remove(this._iconId);
this._iconId = -1;
}
}
}