import { IonLifeCycleContext, NavContext } from '@ionic/react'; import React from 'react'; import { isDevMode } from '../utils'; import { ViewItem } from './ViewItem'; interface ViewProps extends React.HTMLAttributes { onViewSync: (page: HTMLElement, viewId: string) => void; onHideView: (viewId: string) => void; view: ViewItem; route: any; } /** * The View component helps manage the IonPage's lifecycle and registration */ export class View extends React.Component { context!: React.ContextType; ionPage?: HTMLElement; componentWillUnmount() { if (this.ionPage) { this.ionPage.removeEventListener('ionViewWillEnter', this.ionViewWillEnterHandler.bind(this)); this.ionPage.removeEventListener('ionViewDidEnter', this.ionViewDidEnterHandler.bind(this)); this.ionPage.removeEventListener('ionViewWillLeave', this.ionViewWillLeaveHandler.bind(this)); this.ionPage.removeEventListener('ionViewDidLeave', this.ionViewDidLeaveHandler.bind(this)); } } ionViewWillEnterHandler() { this.context.ionViewWillEnter(); } ionViewDidEnterHandler() { this.context.ionViewDidEnter(); } ionViewWillLeaveHandler() { this.context.ionViewWillLeave(); } ionViewDidLeaveHandler() { this.context.ionViewDidLeave(); } registerIonPage(page: HTMLElement) { this.ionPage = page; this.ionPage.addEventListener('ionViewWillEnter', this.ionViewWillEnterHandler.bind(this)); this.ionPage.addEventListener('ionViewDidEnter', this.ionViewDidEnterHandler.bind(this)); this.ionPage.addEventListener('ionViewWillLeave', this.ionViewWillLeaveHandler.bind(this)); this.ionPage.addEventListener('ionViewDidLeave', this.ionViewDidLeaveHandler.bind(this)); this.ionPage.classList.add('ion-page-invisible'); if (isDevMode()) { this.ionPage.setAttribute('data-view-id', this.props.view.id); } this.props.onViewSync(page, this.props.view.id); } render() { return ( {value => { const newProvider = { ...value, registerIonPage: this.registerIonPage.bind(this) }; return ( {this.props.children} ); }} ); } static get contextType() { return IonLifeCycleContext; } }