Telegram Web K with changes to work inside I2P https://web.telegram.i2p/
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

103 lines
3.1 KiB

3 years ago
import noop from "../helpers/noop";
import { safeAssign } from "../helpers/object";
import { LottieAssetName } from "../lib/rlottie/lottieLoader";
import RLottieIcon, { RLottieIconItemPartOptions, RLottieIconItemPart } from "../lib/rlottie/rlottieIcon";
import { RLottieColor } from "../lib/rlottie/rlottiePlayer";
export type SuperRLottieIconAddItemOptions = {name: LottieAssetName, parts: RLottieIconItemPartOptions};
export type SuperRLottieIconGetInfoResult = RLottieIconItemPart;
export class SuperRLottieIcon<Options extends {
PartState: any,
ColorState?: any,
}> extends RLottieIcon {
protected getPart: (state: Options['PartState'], prevState?: Options['PartState']) => SuperRLottieIconGetInfoResult;
protected getColor?: (state: Options['ColorState'], prevState?: Options['ColorState']) => RLottieColor;
protected partState: Options['PartState'];
protected colorState: Options['ColorState'];
protected loaded: boolean;
constructor(options: {
width: number,
height: number,
getPart: (state: Options['PartState'], prevState?: Options['PartState']) => SuperRLottieIconGetInfoResult,
getColor?: (state: Options['ColorState'], prevState?: Options['ColorState']) => RLottieColor,
}) {
super({
width: options.width,
height: options.height
});
safeAssign(this, options);
// hook the first call
/* const originalFunction = this.setState.bind(this);
this.setState = (partState, colorState) => {
this.setState = originalFunction;
this.load(partState, colorState);
return originalFunction(partState, colorState);
}; */
}
public load(partState: Options['PartState'], colorState?: Options['ColorState']) {
if(this.loaded) {
return this.loadPromise;
}
this.loaded = true;
this.partState = partState;
this.colorState = colorState;
const part = this.getPart(partState);
const color = colorState !== undefined && this.getColor && this.getColor(colorState);
const item = part.item;
item.initFrame = part.endFrame;
item.color = color;
const promises = [...this.items.values()].map(item => item.load());
return Promise.all(promises).then(noop);
}
public setState(partState: Options['PartState'], colorState?: Options['ColorState']) {
if(!this.loaded) this.load(partState, colorState);
if(partState !== undefined) this.setPartState(partState);
if(colorState !== undefined && this.getColor) this.setColorState(colorState);
}
public setPartState(state: Options['PartState']) {
const {partState: prevState} = this;
if(prevState === state) {
return;
}
this.partState = state;
const part = this.getPart(state, prevState);
part.play();
}
public setColorState(state: Options['ColorState']) {
const {colorState: prevState} = this;
if(prevState === state) {
return;
}
this.colorState = state;
const item = this.getItem();
if(item.player) {
const color = this.getColor(state, prevState);
item.player.setColor(color);
}
}
public destroy() {
this.items.forEach(item => {
item.loadPromise.then(() => {
item.player.remove();
});
});
}
}