react-native-ohos-svgaplayer
Version:
这是一款加载harmonyOS Svga动画的react-native开源插件
141 lines (115 loc) • 3.82 kB
text/typescript
/**
* This code was generated by "react-native codegen-lib-harmony"
*/
import {
Descriptor as ComponentDescriptor,
ViewBaseProps,
ViewRawProps,
ViewDescriptorWrapperBase,
ColorValue,
Color,
RNInstance,
Tag,
RNComponentCommandReceiver,
ViewPropsSelector,
} from '@rnoh/react-native-openharmony/ts';
export namespace RNSvgaPlayer {
export const NAME = "RNSvgaPlayer" as const
export interface DirectRawProps {
source: string;
autoPlay?: boolean;
loops?: number;
clearsAfterStop?: boolean;
align?: 'top' | 'bottom' | 'center';
}
export interface Props extends ViewBaseProps {}
export interface State {}
export interface RawProps extends ViewRawProps, DirectRawProps {}
export class PropsSelector extends ViewPropsSelector<Props, RawProps> {
get source() {
return this.rawProps.source;
}
get autoPlay() {
return this.rawProps.autoPlay ?? false;
}
get loops() {
return this.rawProps.loops ?? 0;
}
get clearsAfterStop() {
return this.rawProps.clearsAfterStop ?? false;
}
get align() {
return this.rawProps.align ?? 'center';
}
}
export type Descriptor = ComponentDescriptor<
typeof NAME,
Props,
State,
RawProps
>;
export class DescriptorWrapper extends ViewDescriptorWrapperBase<
typeof NAME,
Props,
State,
RawProps,
PropsSelector
> {
protected createPropsSelector() {
return new PropsSelector(this.descriptor.props, this.descriptor.rawProps)
}
}
export interface EventPayloadByName {
"error": {error: string}
"finished": {finished: boolean}
"loaded": {}
"frameChanged": {value: number}
"percentageChanged": {value: number}
}
export class EventEmitter {
constructor(private rnInstance: RNInstance, private tag: Tag) {}
emit<TEventName extends keyof EventPayloadByName>(eventName: TEventName, payload: EventPayloadByName[TEventName]) {
this.rnInstance.emitComponentEvent(this.tag, eventName, payload)
}
}
export interface CommandArgvByName {
"startAnimation": []
"stopAnimation": []
"pauseAnimation": []
"stepToFrame": [number, boolean]
"stepToPercentage": [number, boolean]
"startAnimationWithRange": [number, number, boolean]
}
export class CommandReceiver {
private listenersByCommandName = new Map<string, Set<(...args: any[]) => void>>()
private cleanUp: (() => void) | undefined = undefined
constructor(private componentCommandReceiver: RNComponentCommandReceiver, private tag: Tag) {
}
subscribe<TCommandName extends keyof CommandArgvByName>(commandName: TCommandName, listener: (argv: CommandArgvByName[TCommandName]) => void) {
if (!this.listenersByCommandName.has(commandName)) {
this.listenersByCommandName.set(commandName, new Set())
}
this.listenersByCommandName.get(commandName)!.add(listener)
const hasRegisteredCommandReceiver = !!this.cleanUp
if (!hasRegisteredCommandReceiver) {
this.cleanUp = this.componentCommandReceiver.registerCommandCallback(this.tag, (commandName: string, argv: any[]) => {
if (this.listenersByCommandName.has(commandName)) {
const listeners = this.listenersByCommandName.get(commandName)!
listeners.forEach(listener => {
listener(argv)
})
}
})
}
return () => {
this.listenersByCommandName.get(commandName)?.delete(listener)
if (this.listenersByCommandName.get(commandName)?.size ?? 0 === 0) {
this.listenersByCommandName.delete(commandName)
}
if (this.listenersByCommandName.size === 0) {
this.cleanUp?.()
}
}
}
}
}