Skip to content

Commit

Permalink
fix(react): adding multiple subscriptions to lifecycle events, fixes #…
Browse files Browse the repository at this point in the history
  • Loading branch information
elylucas committed Nov 7, 2019
1 parent 628e766 commit 0a3014d
Show file tree
Hide file tree
Showing 2 changed files with 35 additions and 33 deletions.
42 changes: 18 additions & 24 deletions packages/react/src/contexts/IonLifeCycleContext.tsx
Expand Up @@ -22,52 +22,46 @@ export const IonLifeCycleContext = /*@__PURE__*/React.createContext<IonLifeCycle
ionViewDidLeave: () => { return; },
});

type LifeCycleCallback = () => void;

export const DefaultIonLifeCycleContext = class implements IonLifeCycleContextInterface {

ionViewWillEnterCallback?: () => void;
ionViewDidEnterCallback?: () => void;
ionViewWillLeaveCallback?: () => void;
ionViewDidLeaveCallback?: () => void;
ionViewWillEnterCallbacks: LifeCycleCallback[] = [];
ionViewDidEnterCallbacks: LifeCycleCallback[] = [];
ionViewWillLeaveCallbacks: LifeCycleCallback[] = [];
ionViewDidLeaveCallbacks: LifeCycleCallback[] = [];
componentCanBeDestroyedCallback?: () => void;

onIonViewWillEnter(callback: () => void) {
this.ionViewWillEnterCallback = callback;
onIonViewWillEnter(callback: LifeCycleCallback) {
this.ionViewWillEnterCallbacks.push(callback);
}

ionViewWillEnter() {
if (this.ionViewWillEnterCallback) {
this.ionViewWillEnterCallback();
}
this.ionViewWillEnterCallbacks.forEach(cb => cb());
}

onIonViewDidEnter(callback: () => void) {
this.ionViewDidEnterCallback = callback;
onIonViewDidEnter(callback: LifeCycleCallback) {
this.ionViewDidEnterCallbacks.push(callback);
}

ionViewDidEnter() {
if (this.ionViewDidEnterCallback) {
this.ionViewDidEnterCallback();
}
this.ionViewDidEnterCallbacks.forEach(cb => cb());
}

onIonViewWillLeave(callback: () => void) {
this.ionViewWillLeaveCallback = callback;
onIonViewWillLeave(callback: LifeCycleCallback) {
this.ionViewWillLeaveCallbacks.push(callback);
}

ionViewWillLeave() {
if (this.ionViewWillLeaveCallback) {
this.ionViewWillLeaveCallback();
}
this.ionViewWillLeaveCallbacks.forEach(cb => cb());
}

onIonViewDidLeave(callback: () => void) {
this.ionViewDidLeaveCallback = callback;
onIonViewDidLeave(callback: LifeCycleCallback) {
this.ionViewDidLeaveCallbacks.push(callback);
}

ionViewDidLeave() {
if (this.ionViewDidLeaveCallback) {
this.ionViewDidLeaveCallback();
}
this.ionViewDidLeaveCallbacks.forEach(cb => cb());
this.componentCanBeDestroyed();
}

Expand Down
26 changes: 17 additions & 9 deletions packages/react/src/lifecycle/hooks.ts
@@ -1,23 +1,31 @@
import { useContext } from 'react';
import { useContext, useEffect } from 'react';

import { IonLifeCycleContext } from '../contexts/IonLifeCycleContext';

export const useIonViewWillEnter = (callback: () => void) => {
const value = useContext(IonLifeCycleContext);
value.onIonViewWillEnter(callback);
const context = useContext(IonLifeCycleContext);
useEffect(() => {
context.onIonViewWillEnter(callback);
}, []);
};

export const useIonViewDidEnter = (callback: () => void) => {
const value = useContext(IonLifeCycleContext);
value.onIonViewDidEnter(callback);
const context = useContext(IonLifeCycleContext);
useEffect(() => {
context.onIonViewDidEnter(callback);
}, []);
};

export const useIonViewWillLeave = (callback: () => void) => {
const value = useContext(IonLifeCycleContext);
value.onIonViewWillLeave(callback);
const context = useContext(IonLifeCycleContext);
useEffect(() => {
context.onIonViewWillLeave(callback);
}, []);
};

export const useIonViewDidLeave = (callback: () => void) => {
const value = useContext(IonLifeCycleContext);
value.onIonViewDidLeave(callback);
const context = useContext(IonLifeCycleContext);
useEffect(() => {
context.onIonViewDidLeave(callback);
}, []);
};

0 comments on commit 0a3014d

Please sign in to comment.