import { GraniteEventDefinition } from '@granite-js/react-native'; import { MiniAppModule } from '../../../natives'; export interface VisibilityChangedByTransparentServiceWebOptions { callbackId: string; } export interface VisibilityChangedByTransparentServiceWebResult { callbackId: string; isVisible: boolean; } export class VisibilityChangedByTransparentServiceWebEvent extends GraniteEventDefinition< VisibilityChangedByTransparentServiceWebOptions, boolean > { name = 'onVisibilityChangedByTransparentServiceWeb' as const; unsubscribe: (() => void) | null = null; remove() { this.unsubscribe?.(); this.unsubscribe = null; } listener( options: VisibilityChangedByTransparentServiceWebOptions, onEvent: (isVisible: boolean) => void, onError: (error: unknown) => void ) { const subscription = MiniAppModule.onSendEvent(({ eventName, body }) => { if (eventName === 'visibilityChangedByTransparentServiceWeb') { if (this.isVisibilityChangedByTransparentServiceWebResult(body)) { if (body.callbackId === options.callbackId) { onEvent(body.isVisible); } } else { onError(new Error('Invalid visibility changed by transparent service web result')); } } }); this.unsubscribe = () => subscription.remove(); } private isVisibilityChangedByTransparentServiceWebResult( params: any ): params is VisibilityChangedByTransparentServiceWebResult { return typeof params === 'object' && typeof params.callbackId === 'string' && typeof params.isVisible === 'boolean'; } }