@ionic/react 7.5.3-dev.11698856380.18896dcd → 7.5.3-dev.11698858201.14165f23
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/CreateAnimation.js +107 -0
- package/dist/components/CreateAnimation.js.map +7 -0
- package/dist/components/IonActionSheet.js +8 -0
- package/dist/components/IonActionSheet.js.map +7 -0
- package/dist/components/IonAlert.js +8 -0
- package/dist/components/IonAlert.js.map +7 -0
- package/dist/components/IonApp.js +42 -0
- package/dist/components/IonApp.js.map +7 -0
- package/dist/components/IonIcon.js +39 -0
- package/dist/components/IonIcon.js.map +7 -0
- package/dist/components/IonLoading.js +8 -0
- package/dist/components/IonLoading.js.map +7 -0
- package/dist/components/IonModal.js +9 -0
- package/dist/components/IonModal.js.map +7 -0
- package/dist/components/IonOverlayManager.js +29 -0
- package/dist/components/IonOverlayManager.js.map +7 -0
- package/dist/components/IonPage.js +31 -0
- package/dist/components/IonPage.js.map +7 -0
- package/dist/components/IonPicker.js +8 -0
- package/dist/components/IonPicker.js.map +7 -0
- package/dist/components/IonPopover.js +8 -0
- package/dist/components/IonPopover.js.map +7 -0
- package/dist/components/IonRedirect.js +19 -0
- package/dist/components/IonRedirect.js.map +7 -0
- package/dist/components/IonRoute.js +17 -0
- package/dist/components/IonRoute.js.map +7 -0
- package/dist/components/IonRouterContext.js +32 -0
- package/dist/components/IonRouterContext.js.map +7 -0
- package/dist/components/IonRouterOutlet.js +24 -0
- package/dist/components/IonRouterOutlet.js.map +7 -0
- package/dist/components/IonToast.js +8 -0
- package/dist/components/IonToast.js.map +7 -0
- package/dist/components/IonicReactProps.js +2 -0
- package/dist/components/IonicReactProps.js.map +7 -0
- package/dist/components/__tests__/utils.spec.js +50 -0
- package/dist/components/__tests__/utils.spec.js.map +7 -0
- package/dist/components/createControllerComponent.js +80 -0
- package/dist/components/createControllerComponent.js.map +7 -0
- package/dist/components/createInlineOverlayComponent.js +114 -0
- package/dist/components/createInlineOverlayComponent.js.map +7 -0
- package/dist/components/createOverlayComponent.js +88 -0
- package/dist/components/createOverlayComponent.js.map +7 -0
- package/dist/components/createRoutingComponent.js +79 -0
- package/dist/components/createRoutingComponent.js.map +7 -0
- package/dist/components/hrefprops.js +2 -0
- package/dist/components/hrefprops.js.map +7 -0
- package/dist/components/index.js +126 -0
- package/dist/components/index.js.map +7 -0
- package/dist/components/inner-proxies.js +30 -0
- package/dist/components/inner-proxies.js.map +7 -0
- package/dist/components/navigation/IonBackButton.js +31 -0
- package/dist/components/navigation/IonBackButton.js.map +7 -0
- package/dist/components/navigation/IonNav.js +21 -0
- package/dist/components/navigation/IonNav.js.map +7 -0
- package/dist/components/navigation/IonTabBar.js +173 -0
- package/dist/components/navigation/IonTabBar.js.map +7 -0
- package/dist/components/navigation/IonTabButton.js +30 -0
- package/dist/components/navigation/IonTabButton.js.map +7 -0
- package/dist/components/navigation/IonTabs.js +103 -0
- package/dist/components/navigation/IonTabs.js.map +7 -0
- package/dist/components/navigation/IonTabsContext.js +7 -0
- package/dist/components/navigation/IonTabsContext.js.map +7 -0
- package/dist/components/proxies.js +131 -0
- package/dist/components/proxies.js.map +7 -0
- package/dist/components/react-component-lib/createComponent.js +58 -0
- package/dist/components/react-component-lib/createComponent.js.map +7 -0
- package/dist/components/react-component-lib/createOverlayComponent.js +86 -0
- package/dist/components/react-component-lib/createOverlayComponent.js.map +7 -0
- package/dist/components/react-component-lib/index.js +4 -0
- package/dist/components/react-component-lib/index.js.map +7 -0
- package/dist/components/react-component-lib/interfaces.js +2 -0
- package/dist/components/react-component-lib/interfaces.js.map +7 -0
- package/dist/components/react-component-lib/utils/attachProps.js +92 -0
- package/dist/components/react-component-lib/utils/attachProps.js.map +7 -0
- package/dist/components/react-component-lib/utils/case.js +4 -0
- package/dist/components/react-component-lib/utils/case.js.map +7 -0
- package/dist/components/react-component-lib/utils/dev.js +14 -0
- package/dist/components/react-component-lib/utils/dev.js.map +7 -0
- package/dist/components/react-component-lib/utils/index.js +31 -0
- package/dist/components/react-component-lib/utils/index.js.map +7 -0
- package/dist/components/routing-proxies.js +29 -0
- package/dist/components/routing-proxies.js.map +7 -0
- package/dist/components/utils/detachProps.js +24 -0
- package/dist/components/utils/detachProps.js.map +7 -0
- package/dist/components/utils/index.js +26 -0
- package/dist/components/utils/index.js.map +7 -0
- package/dist/components/utils/ionRenderToString.js +36 -0
- package/dist/components/utils/ionRenderToString.js.map +7 -0
- package/dist/contexts/IonContext.js +11 -0
- package/dist/contexts/IonContext.js.map +7 -0
- package/dist/contexts/IonLifeCycleContext.js +185 -0
- package/dist/contexts/IonLifeCycleContext.js.map +7 -0
- package/dist/contexts/NavContext.js +36 -0
- package/dist/contexts/NavContext.js.map +7 -0
- package/dist/framework-delegate.js +30 -0
- package/dist/framework-delegate.js.map +7 -0
- package/dist/hooks/HookOverlayOptions.js +2 -0
- package/dist/hooks/HookOverlayOptions.js.map +7 -0
- package/dist/hooks/__tests__/hooks.spec.js +6 -0
- package/dist/hooks/__tests__/hooks.spec.js.map +7 -0
- package/dist/hooks/useController.js +45 -0
- package/dist/hooks/useController.js.map +7 -0
- package/dist/hooks/useIonActionSheet.js +27 -0
- package/dist/hooks/useIonActionSheet.js.map +7 -0
- package/dist/hooks/useIonAlert.js +23 -0
- package/dist/hooks/useIonAlert.js.map +7 -0
- package/dist/hooks/useIonLoading.js +28 -0
- package/dist/hooks/useIonLoading.js.map +7 -0
- package/dist/hooks/useIonModal.js +22 -0
- package/dist/hooks/useIonModal.js.map +7 -0
- package/dist/hooks/useIonPicker.js +27 -0
- package/dist/hooks/useIonPicker.js.map +7 -0
- package/dist/hooks/useIonPopover.js +22 -0
- package/dist/hooks/useIonPopover.js.map +7 -0
- package/dist/hooks/useIonToast.js +23 -0
- package/dist/hooks/useIonToast.js.map +7 -0
- package/dist/hooks/useOverlay.js +67 -0
- package/dist/hooks/useOverlay.js.map +7 -0
- package/dist/index.js +8 -2443
- package/dist/index.js.map +7 -1
- package/dist/lifecycle/IonLifeCycleHOC.js +41 -0
- package/dist/lifecycle/IonLifeCycleHOC.js.map +7 -0
- package/dist/lifecycle/hooks.js +52 -0
- package/dist/lifecycle/hooks.js.map +7 -0
- package/dist/lifecycle/index.js +4 -0
- package/dist/lifecycle/index.js.map +7 -0
- package/dist/models/ReactComponentOrElement.js +2 -0
- package/dist/models/ReactComponentOrElement.js.map +7 -0
- package/dist/models/RouteAction.js +2 -0
- package/dist/models/RouteAction.js.map +7 -0
- package/dist/models/RouteInfo.js +2 -0
- package/dist/models/RouteInfo.js.map +7 -0
- package/dist/models/RouterDirection.js +2 -0
- package/dist/models/RouterDirection.js.map +7 -0
- package/dist/models/RouterOptions.js +2 -0
- package/dist/models/RouterOptions.js.map +7 -0
- package/dist/models/index.js +7 -0
- package/dist/models/index.js.map +7 -0
- package/dist/routing/LocationHistory.js +140 -0
- package/dist/routing/LocationHistory.js.map +7 -0
- package/dist/routing/NavManager.js +76 -0
- package/dist/routing/NavManager.js.map +7 -0
- package/dist/routing/OutletPageManager.js +69 -0
- package/dist/routing/OutletPageManager.js.map +7 -0
- package/dist/routing/PageManager.js +60 -0
- package/dist/routing/PageManager.js.map +7 -0
- package/dist/routing/RouteManagerContext.js +15 -0
- package/dist/routing/RouteManagerContext.js.map +7 -0
- package/dist/routing/StackContext.js +7 -0
- package/dist/routing/StackContext.js.map +7 -0
- package/dist/routing/ViewItem.js +2 -0
- package/dist/routing/ViewItem.js.map +7 -0
- package/dist/routing/ViewLifeCycleManager.js +36 -0
- package/dist/routing/ViewLifeCycleManager.js.map +7 -0
- package/dist/routing/ViewStacks.js +49 -0
- package/dist/routing/ViewStacks.js.map +7 -0
- package/dist/routing/__tests__/LocationHistory.spec.js +185 -0
- package/dist/routing/__tests__/LocationHistory.spec.js.map +7 -0
- package/dist/routing/index.js +9 -0
- package/dist/routing/index.js.map +7 -0
- package/dist/utils/HTMLElementSSR.js +4 -0
- package/dist/utils/HTMLElementSSR.js.map +7 -0
- package/dist/utils/generateId.js +8 -0
- package/dist/utils/generateId.js.map +7 -0
- package/package.json +5 -12
- package/dist/types/components/CreateAnimation.d.ts +0 -71
- package/dist/types/components/IonActionSheet.d.ts +0 -3
- package/dist/types/components/IonAlert.d.ts +0 -3
- package/dist/types/components/IonApp.d.ts +0 -41
- package/dist/types/components/IonIcon.d.ts +0 -16
- package/dist/types/components/IonLoading.d.ts +0 -3
- package/dist/types/components/IonModal.d.ts +0 -3
- package/dist/types/components/IonOverlayManager.d.ts +0 -15
- package/dist/types/components/IonPage.d.ts +0 -3
- package/dist/types/components/IonPicker.d.ts +0 -3
- package/dist/types/components/IonPopover.d.ts +0 -3
- package/dist/types/components/IonRedirect.d.ts +0 -16
- package/dist/types/components/IonRoute.d.ts +0 -17
- package/dist/types/components/IonRouterContext.d.ts +0 -42
- package/dist/types/components/IonRouterOutlet.d.ts +0 -8
- package/dist/types/components/IonToast.d.ts +0 -3
- package/dist/types/components/IonicReactProps.d.ts +0 -6
- package/dist/types/components/__tests__/utils.spec.d.ts +0 -1
- package/dist/types/components/createControllerComponent.d.ts +0 -19
- package/dist/types/components/createInlineOverlayComponent.d.ts +0 -2
- package/dist/types/components/createOverlayComponent.d.ts +0 -20
- package/dist/types/components/createRoutingComponent.d.ts +0 -2
- package/dist/types/components/hrefprops.d.ts +0 -9
- package/dist/types/components/index.d.ts +0 -35
- package/dist/types/components/inner-proxies.d.ts +0 -14
- package/dist/types/components/navigation/IonBackButton.d.ts +0 -68
- package/dist/types/components/navigation/IonNav.d.ts +0 -5
- package/dist/types/components/navigation/IonTabBar.d.ts +0 -15
- package/dist/types/components/navigation/IonTabButton.d.ts +0 -40
- package/dist/types/components/navigation/IonTabs.d.ts +0 -49
- package/dist/types/components/navigation/IonTabsContext.d.ts +0 -6
- package/dist/types/components/proxies.d.ts +0 -66
- package/dist/types/components/react-component-lib/createComponent.d.ts +0 -10
- package/dist/types/components/react-component-lib/createOverlayComponent.d.ts +0 -21
- package/dist/types/components/react-component-lib/index.d.ts +0 -2
- package/dist/types/components/react-component-lib/interfaces.d.ts +0 -29
- package/dist/types/components/react-component-lib/utils/attachProps.d.ts +0 -16
- package/dist/types/components/react-component-lib/utils/case.d.ts +0 -2
- package/dist/types/components/react-component-lib/utils/dev.d.ts +0 -2
- package/dist/types/components/react-component-lib/utils/index.d.ts +0 -10
- package/dist/types/components/routing-proxies.d.ts +0 -44
- package/dist/types/components/utils/detachProps.d.ts +0 -8
- package/dist/types/components/utils/index.d.ts +0 -8
- package/dist/types/components/utils/ionRenderToString.d.ts +0 -2
- package/dist/types/contexts/IonContext.d.ts +0 -7
- package/dist/types/contexts/IonLifeCycleContext.d.ts +0 -72
- package/dist/types/contexts/NavContext.d.ts +0 -17
- package/dist/types/framework-delegate.d.ts +0 -2
- package/dist/types/hooks/HookOverlayOptions.d.ts +0 -7
- package/dist/types/hooks/__tests__/hooks.spec.d.ts +0 -0
- package/dist/types/hooks/useController.d.ts +0 -12
- package/dist/types/hooks/useIonActionSheet.d.ts +0 -26
- package/dist/types/hooks/useIonAlert.d.ts +0 -26
- package/dist/types/hooks/useIonLoading.d.ts +0 -27
- package/dist/types/hooks/useIonModal.d.ts +0 -17
- package/dist/types/hooks/useIonPicker.d.ts +0 -26
- package/dist/types/hooks/useIonPopover.d.ts +0 -17
- package/dist/types/hooks/useIonToast.d.ts +0 -26
- package/dist/types/hooks/useOverlay.d.ts +0 -13
- package/dist/types/index.d.ts +0 -7
- package/dist/types/lifecycle/IonLifeCycleHOC.d.ts +0 -31
- package/dist/types/lifecycle/hooks.d.ts +0 -5
- package/dist/types/lifecycle/index.d.ts +0 -2
- package/dist/types/models/ReactComponentOrElement.d.ts +0 -2
- package/dist/types/models/RouteAction.d.ts +0 -1
- package/dist/types/models/RouteInfo.d.ts +0 -19
- package/dist/types/models/RouterDirection.d.ts +0 -1
- package/dist/types/models/RouterOptions.d.ts +0 -10
- package/dist/types/models/index.d.ts +0 -5
- package/dist/types/routing/LocationHistory.d.ts +0 -20
- package/dist/types/routing/NavManager.d.ts +0 -38
- package/dist/types/routing/OutletPageManager.d.ts +0 -26
- package/dist/types/routing/PageManager.d.ts +0 -25
- package/dist/types/routing/RouteManagerContext.d.ts +0 -16
- package/dist/types/routing/StackContext.d.ts +0 -7
- package/dist/types/routing/ViewItem.d.ts +0 -12
- package/dist/types/routing/ViewLifeCycleManager.d.ts +0 -42
- package/dist/types/routing/ViewStacks.d.ts +0 -19
- package/dist/types/routing/__tests__/LocationHistory.spec.d.ts +0 -1
- package/dist/types/routing/index.d.ts +0 -7
- package/dist/types/utils/HTMLElementSSR.d.ts +0 -4
- package/dist/types/utils/generateId.d.ts +0 -1
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
import * as utils from "../react-component-lib/utils";
|
|
3
|
+
import "@testing-library/jest-dom/extend-expect";
|
|
4
|
+
describe("isCoveredByReact", () => {
|
|
5
|
+
it("should identify standard events as covered by React", () => {
|
|
6
|
+
expect(utils.isCoveredByReact("click")).toEqual(true);
|
|
7
|
+
});
|
|
8
|
+
it("should identify custom events as not covered by React", () => {
|
|
9
|
+
expect(utils.isCoveredByReact("change")).toEqual(true);
|
|
10
|
+
expect(utils.isCoveredByReact("ionchange")).toEqual(false);
|
|
11
|
+
});
|
|
12
|
+
});
|
|
13
|
+
describe("syncEvent", () => {
|
|
14
|
+
it("should add event on sync and readd on additional syncs", () => {
|
|
15
|
+
var div = document.createElement("div");
|
|
16
|
+
const addEventListener = jest.spyOn(div, "addEventListener");
|
|
17
|
+
const removeEventListener = jest.spyOn(div, "removeEventListener");
|
|
18
|
+
const ionClickCallback = jest.fn();
|
|
19
|
+
utils.syncEvent(div, "ionClick", ionClickCallback);
|
|
20
|
+
expect(removeEventListener).not.toHaveBeenCalled();
|
|
21
|
+
expect(addEventListener).toHaveBeenCalledWith("ionClick", expect.any(Function));
|
|
22
|
+
utils.syncEvent(div, "ionClick", ionClickCallback);
|
|
23
|
+
expect(removeEventListener).toHaveBeenCalledWith("ionClick", expect.any(Function));
|
|
24
|
+
expect(addEventListener).toHaveBeenCalledWith("ionClick", expect.any(Function));
|
|
25
|
+
const event = new CustomEvent("ionClick", { detail: "test" });
|
|
26
|
+
div.dispatchEvent(event);
|
|
27
|
+
expect(ionClickCallback).toHaveBeenCalled();
|
|
28
|
+
});
|
|
29
|
+
});
|
|
30
|
+
describe("attachProps", () => {
|
|
31
|
+
it("should pass props to a dom node", () => {
|
|
32
|
+
const onIonClickCallback = () => {
|
|
33
|
+
};
|
|
34
|
+
var div = document.createElement("div");
|
|
35
|
+
utils.attachProps(div, {
|
|
36
|
+
children: [],
|
|
37
|
+
style: "color: red",
|
|
38
|
+
ref: () => {
|
|
39
|
+
},
|
|
40
|
+
onClick: () => {
|
|
41
|
+
},
|
|
42
|
+
onIonClick: onIonClickCallback,
|
|
43
|
+
testprop: ["red"]
|
|
44
|
+
});
|
|
45
|
+
expect(div.testprop).toEqual(["red"]);
|
|
46
|
+
expect(div).toHaveStyle(`display: block;`);
|
|
47
|
+
expect(Object.keys(div.__events)).toEqual(["ionClick"]);
|
|
48
|
+
});
|
|
49
|
+
});
|
|
50
|
+
//# sourceMappingURL=utils.spec.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/components/__tests__/utils.spec.ts"],
|
|
4
|
+
"sourcesContent": ["import * as utils from '../react-component-lib/utils';\nimport '@testing-library/jest-dom/extend-expect';\n\ndescribe('isCoveredByReact', () => {\n it('should identify standard events as covered by React', () => {\n expect(utils.isCoveredByReact('click')).toEqual(true);\n });\n it('should identify custom events as not covered by React', () => {\n expect(utils.isCoveredByReact('change')).toEqual(true);\n expect(utils.isCoveredByReact('ionchange')).toEqual(false);\n });\n});\n\ndescribe('syncEvent', () => {\n it('should add event on sync and readd on additional syncs', () => {\n var div = document.createElement('div');\n const addEventListener = jest.spyOn(div, 'addEventListener');\n const removeEventListener = jest.spyOn(div, 'removeEventListener');\n const ionClickCallback = jest.fn();\n\n utils.syncEvent(div, 'ionClick', ionClickCallback);\n expect(removeEventListener).not.toHaveBeenCalled();\n expect(addEventListener).toHaveBeenCalledWith('ionClick', expect.any(Function));\n\n utils.syncEvent(div, 'ionClick', ionClickCallback);\n expect(removeEventListener).toHaveBeenCalledWith('ionClick', expect.any(Function));\n expect(addEventListener).toHaveBeenCalledWith('ionClick', expect.any(Function));\n\n const event = new CustomEvent('ionClick', { detail: 'test' });\n div.dispatchEvent(event);\n expect(ionClickCallback).toHaveBeenCalled();\n });\n});\n\ndescribe('attachProps', () => {\n it('should pass props to a dom node', () => {\n const onIonClickCallback = () => {};\n\n var div = document.createElement('div');\n utils.attachProps(div, {\n children: [],\n style: 'color: red',\n ref: () => {},\n onClick: () => {},\n onIonClick: onIonClickCallback,\n testprop: ['red'],\n });\n\n expect((div as any).testprop).toEqual(['red']);\n expect(div).toHaveStyle(`display: block;`);\n expect(Object.keys((div as any).__events)).toEqual(['ionClick']);\n });\n});\n"],
|
|
5
|
+
"mappings": ";AAAA,YAAY,WAAW;AACvB,OAAO;AAEP,SAAS,oBAAoB,MAAM;AACjC,KAAG,uDAAuD,MAAM;AAC9D,WAAO,MAAM,iBAAiB,OAAO,CAAC,EAAE,QAAQ,IAAI;AAAA,EACtD,CAAC;AACD,KAAG,yDAAyD,MAAM;AAChE,WAAO,MAAM,iBAAiB,QAAQ,CAAC,EAAE,QAAQ,IAAI;AACrD,WAAO,MAAM,iBAAiB,WAAW,CAAC,EAAE,QAAQ,KAAK;AAAA,EAC3D,CAAC;AACH,CAAC;AAED,SAAS,aAAa,MAAM;AAC1B,KAAG,0DAA0D,MAAM;AACjE,QAAI,MAAM,SAAS,cAAc,KAAK;AACtC,UAAM,mBAAmB,KAAK,MAAM,KAAK,kBAAkB;AAC3D,UAAM,sBAAsB,KAAK,MAAM,KAAK,qBAAqB;AACjE,UAAM,mBAAmB,KAAK,GAAG;AAEjC,UAAM,UAAU,KAAK,YAAY,gBAAgB;AACjD,WAAO,mBAAmB,EAAE,IAAI,iBAAiB;AACjD,WAAO,gBAAgB,EAAE,qBAAqB,YAAY,OAAO,IAAI,QAAQ,CAAC;AAE9E,UAAM,UAAU,KAAK,YAAY,gBAAgB;AACjD,WAAO,mBAAmB,EAAE,qBAAqB,YAAY,OAAO,IAAI,QAAQ,CAAC;AACjF,WAAO,gBAAgB,EAAE,qBAAqB,YAAY,OAAO,IAAI,QAAQ,CAAC;AAE9E,UAAM,QAAQ,IAAI,YAAY,YAAY,EAAE,QAAQ,OAAO,CAAC;AAC5D,QAAI,cAAc,KAAK;AACvB,WAAO,gBAAgB,EAAE,iBAAiB;AAAA,EAC5C,CAAC;AACH,CAAC;AAED,SAAS,eAAe,MAAM;AAC5B,KAAG,mCAAmC,MAAM;AAC1C,UAAM,qBAAqB,MAAM;AAAA,IAAC;AAElC,QAAI,MAAM,SAAS,cAAc,KAAK;AACtC,UAAM,YAAY,KAAK;AAAA,MACrB,UAAU,CAAC;AAAA,MACX,OAAO;AAAA,MACP,KAAK,MAAM;AAAA,MAAC;AAAA,MACZ,SAAS,MAAM;AAAA,MAAC;AAAA,MAChB,YAAY;AAAA,MACZ,UAAU,CAAC,KAAK;AAAA,IAClB,CAAC;AAED,WAAQ,IAAY,QAAQ,EAAE,QAAQ,CAAC,KAAK,CAAC;AAC7C,WAAO,GAAG,EAAE,YAAY,iBAAiB;AACzC,WAAO,OAAO,KAAM,IAAY,QAAQ,CAAC,EAAE,QAAQ,CAAC,UAAU,CAAC;AAAA,EACjE,CAAC;AACH,CAAC;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
import React from "react";
|
|
3
|
+
import { attachProps, dashToPascalCase, setRef } from "./react-component-lib/utils";
|
|
4
|
+
export const createControllerComponent = (tagName, controller, defineCustomElement) => {
|
|
5
|
+
if (defineCustomElement) {
|
|
6
|
+
defineCustomElement();
|
|
7
|
+
}
|
|
8
|
+
const displayName = dashToPascalCase(tagName);
|
|
9
|
+
const didDismissEventName = `on${displayName}DidDismiss`;
|
|
10
|
+
const didPresentEventName = `on${displayName}DidPresent`;
|
|
11
|
+
const willDismissEventName = `on${displayName}WillDismiss`;
|
|
12
|
+
const willPresentEventName = `on${displayName}WillPresent`;
|
|
13
|
+
class Overlay extends React.Component {
|
|
14
|
+
constructor(props) {
|
|
15
|
+
super(props);
|
|
16
|
+
this.willUnmount = false;
|
|
17
|
+
this.handleDismiss = this.handleDismiss.bind(this);
|
|
18
|
+
}
|
|
19
|
+
static get displayName() {
|
|
20
|
+
return displayName;
|
|
21
|
+
}
|
|
22
|
+
async componentDidMount() {
|
|
23
|
+
this.willUnmount = false;
|
|
24
|
+
const { isOpen } = this.props;
|
|
25
|
+
if (isOpen) {
|
|
26
|
+
this.present();
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
componentWillUnmount() {
|
|
30
|
+
this.willUnmount = true;
|
|
31
|
+
if (this.overlay) {
|
|
32
|
+
this.overlay.dismiss();
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
async componentDidUpdate(prevProps) {
|
|
36
|
+
if (prevProps.isOpen !== this.props.isOpen && this.props.isOpen === true) {
|
|
37
|
+
this.present(prevProps);
|
|
38
|
+
}
|
|
39
|
+
if (this.overlay && prevProps.isOpen !== this.props.isOpen && this.props.isOpen === false) {
|
|
40
|
+
await this.overlay.dismiss();
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
handleDismiss(event) {
|
|
44
|
+
if (this.props.onDidDismiss) {
|
|
45
|
+
this.props.onDidDismiss(event);
|
|
46
|
+
}
|
|
47
|
+
setRef(this.props.forwardedRef, null);
|
|
48
|
+
}
|
|
49
|
+
async present(prevProps) {
|
|
50
|
+
const { isOpen, onDidDismiss, onDidPresent, onWillDismiss, onWillPresent, ...cProps } = this.props;
|
|
51
|
+
if (this.overlay) {
|
|
52
|
+
this.overlay.remove();
|
|
53
|
+
}
|
|
54
|
+
this.overlay = await controller.create({
|
|
55
|
+
...cProps
|
|
56
|
+
});
|
|
57
|
+
attachProps(
|
|
58
|
+
this.overlay,
|
|
59
|
+
{
|
|
60
|
+
[didDismissEventName]: this.handleDismiss,
|
|
61
|
+
[didPresentEventName]: (e) => this.props.onDidPresent && this.props.onDidPresent(e),
|
|
62
|
+
[willDismissEventName]: (e) => this.props.onWillDismiss && this.props.onWillDismiss(e),
|
|
63
|
+
[willPresentEventName]: (e) => this.props.onWillPresent && this.props.onWillPresent(e)
|
|
64
|
+
},
|
|
65
|
+
prevProps
|
|
66
|
+
);
|
|
67
|
+
if (this.props.isOpen === true && this.willUnmount === false) {
|
|
68
|
+
setRef(this.props.forwardedRef, this.overlay);
|
|
69
|
+
await this.overlay.present();
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
render() {
|
|
73
|
+
return null;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
return React.forwardRef((props, ref) => {
|
|
77
|
+
return /* @__PURE__ */ React.createElement(Overlay, { ...props, forwardedRef: ref });
|
|
78
|
+
});
|
|
79
|
+
};
|
|
80
|
+
//# sourceMappingURL=createControllerComponent.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/components/createControllerComponent.tsx"],
|
|
4
|
+
"sourcesContent": ["import type { OverlayEventDetail } from '@ionic/core/components';\nimport React from 'react';\n\nimport { attachProps, dashToPascalCase, setRef } from './react-component-lib/utils';\n\ninterface OverlayBase extends HTMLElement {\n present: () => Promise<void>;\n dismiss: (data?: any, role?: string | undefined) => Promise<boolean>;\n}\n\nexport interface ReactControllerProps {\n isOpen: boolean;\n onDidDismiss?: (event: CustomEvent<OverlayEventDetail>) => void;\n onDidPresent?: (event: CustomEvent<OverlayEventDetail>) => void;\n onWillDismiss?: (event: CustomEvent<OverlayEventDetail>) => void;\n onWillPresent?: (event: CustomEvent<OverlayEventDetail>) => void;\n}\n\nexport const createControllerComponent = <OptionsType extends object, OverlayType extends OverlayBase>(\n tagName: string,\n controller: { create: (options: OptionsType) => Promise<OverlayType> },\n defineCustomElement?: () => void\n) => {\n if (defineCustomElement) {\n defineCustomElement();\n }\n\n const displayName = dashToPascalCase(tagName);\n const didDismissEventName = `on${displayName}DidDismiss`;\n const didPresentEventName = `on${displayName}DidPresent`;\n const willDismissEventName = `on${displayName}WillDismiss`;\n const willPresentEventName = `on${displayName}WillPresent`;\n\n type Props = OptionsType &\n ReactControllerProps & {\n forwardedRef?: React.ForwardedRef<OverlayType>;\n };\n\n class Overlay extends React.Component<Props> {\n overlay?: OverlayType;\n willUnmount = false;\n\n constructor(props: Props) {\n super(props);\n this.handleDismiss = this.handleDismiss.bind(this);\n }\n\n static get displayName() {\n return displayName;\n }\n\n async componentDidMount() {\n /**\n * Starting in React v18, strict mode will unmount and remount a component.\n * See: https://reactjs.org/blog/2022/03/29/react-v18.html#new-strict-mode-behaviors\n *\n * We need to reset this flag when the component is re-mounted so that\n * overlay.present() will be called and the overlay will display.\n */\n this.willUnmount = false;\n const { isOpen } = this.props;\n if (isOpen as boolean) {\n this.present();\n }\n }\n\n componentWillUnmount() {\n this.willUnmount = true;\n if (this.overlay) {\n this.overlay.dismiss();\n }\n }\n\n async componentDidUpdate(prevProps: Props) {\n if (prevProps.isOpen !== this.props.isOpen && this.props.isOpen === true) {\n this.present(prevProps);\n }\n if (this.overlay && prevProps.isOpen !== this.props.isOpen && this.props.isOpen === false) {\n await this.overlay.dismiss();\n }\n }\n\n handleDismiss(event: CustomEvent<OverlayEventDetail<any>>) {\n if (this.props.onDidDismiss) {\n this.props.onDidDismiss(event);\n }\n setRef(this.props.forwardedRef, null);\n }\n\n async present(prevProps?: Props) {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { isOpen, onDidDismiss, onDidPresent, onWillDismiss, onWillPresent, ...cProps } = this.props;\n\n if (this.overlay) {\n this.overlay.remove();\n }\n\n this.overlay = await controller.create({\n ...(cProps as any),\n });\n attachProps(\n this.overlay,\n {\n [didDismissEventName]: this.handleDismiss,\n [didPresentEventName]: (e: CustomEvent) => this.props.onDidPresent && this.props.onDidPresent(e),\n [willDismissEventName]: (e: CustomEvent) => this.props.onWillDismiss && this.props.onWillDismiss(e),\n [willPresentEventName]: (e: CustomEvent) => this.props.onWillPresent && this.props.onWillPresent(e),\n },\n prevProps\n );\n // Check isOpen again since the value could have changed during the async call to controller.create\n // It's also possible for the component to have become unmounted.\n if (this.props.isOpen === true && this.willUnmount === false) {\n setRef(this.props.forwardedRef, this.overlay);\n await this.overlay.present();\n }\n }\n\n render(): null {\n return null;\n }\n }\n\n return React.forwardRef<OverlayType, Props>((props, ref) => {\n return <Overlay {...props} forwardedRef={ref} />;\n });\n};\n"],
|
|
5
|
+
"mappings": ";AACA,OAAO,WAAW;AAElB,SAAS,aAAa,kBAAkB,cAAc;AAe/C,aAAM,4BAA4B,CACvC,SACA,YACA,wBACG;AACH,MAAI,qBAAqB;AACvB,wBAAoB;AAAA,EACtB;AAEA,QAAM,cAAc,iBAAiB,OAAO;AAC5C,QAAM,sBAAsB,KAAK,WAAW;AAC5C,QAAM,sBAAsB,KAAK,WAAW;AAC5C,QAAM,uBAAuB,KAAK,WAAW;AAC7C,QAAM,uBAAuB,KAAK,WAAW;AAAA,EAO7C,MAAM,gBAAgB,MAAM,UAAiB;AAAA,IAI3C,YAAY,OAAc;AACxB,YAAM,KAAK;AAHb,yBAAc;AAIZ,WAAK,gBAAgB,KAAK,cAAc,KAAK,IAAI;AAAA,IACnD;AAAA,IAEA,WAAW,cAAc;AACvB,aAAO;AAAA,IACT;AAAA,IAEA,MAAM,oBAAoB;AAQxB,WAAK,cAAc;AACnB,YAAM,EAAE,OAAO,IAAI,KAAK;AACxB,UAAI,QAAmB;AACrB,aAAK,QAAQ;AAAA,MACf;AAAA,IACF;AAAA,IAEA,uBAAuB;AACrB,WAAK,cAAc;AACnB,UAAI,KAAK,SAAS;AAChB,aAAK,QAAQ,QAAQ;AAAA,MACvB;AAAA,IACF;AAAA,IAEA,MAAM,mBAAmB,WAAkB;AACzC,UAAI,UAAU,WAAW,KAAK,MAAM,UAAU,KAAK,MAAM,WAAW,MAAM;AACxE,aAAK,QAAQ,SAAS;AAAA,MACxB;AACA,UAAI,KAAK,WAAW,UAAU,WAAW,KAAK,MAAM,UAAU,KAAK,MAAM,WAAW,OAAO;AACzF,cAAM,KAAK,QAAQ,QAAQ;AAAA,MAC7B;AAAA,IACF;AAAA,IAEA,cAAc,OAA6C;AACzD,UAAI,KAAK,MAAM,cAAc;AAC3B,aAAK,MAAM,aAAa,KAAK;AAAA,MAC/B;AACA,aAAO,KAAK,MAAM,cAAc,IAAI;AAAA,IACtC;AAAA,IAEA,MAAM,QAAQ,WAAmB;AAE/B,YAAM,EAAE,QAAQ,cAAc,cAAc,eAAe,eAAe,GAAG,OAAO,IAAI,KAAK;AAE7F,UAAI,KAAK,SAAS;AAChB,aAAK,QAAQ,OAAO;AAAA,MACtB;AAEA,WAAK,UAAU,MAAM,WAAW,OAAO;AAAA,QACrC,GAAI;AAAA,MACN,CAAC;AACD;AAAA,QACE,KAAK;AAAA,QACL;AAAA,UACE,CAAC,mBAAmB,GAAG,KAAK;AAAA,UAC5B,CAAC,mBAAmB,GAAG,CAAC,MAAmB,KAAK,MAAM,gBAAgB,KAAK,MAAM,aAAa,CAAC;AAAA,UAC/F,CAAC,oBAAoB,GAAG,CAAC,MAAmB,KAAK,MAAM,iBAAiB,KAAK,MAAM,cAAc,CAAC;AAAA,UAClG,CAAC,oBAAoB,GAAG,CAAC,MAAmB,KAAK,MAAM,iBAAiB,KAAK,MAAM,cAAc,CAAC;AAAA,QACpG;AAAA,QACA;AAAA,MACF;AAGA,UAAI,KAAK,MAAM,WAAW,QAAQ,KAAK,gBAAgB,OAAO;AAC5D,eAAO,KAAK,MAAM,cAAc,KAAK,OAAO;AAC5C,cAAM,KAAK,QAAQ,QAAQ;AAAA,MAC7B;AAAA,IACF;AAAA,IAEA,SAAe;AACb,aAAO;AAAA,IACT;AAAA,EACF;AAEA,SAAO,MAAM,WAA+B,CAAC,OAAO,QAAQ;AAC1D,WAAO,oCAAC,WAAS,GAAG,OAAO,cAAc,KAAK;AAAA,EAChD,CAAC;AACH;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
import React, { createElement } from "react";
|
|
3
|
+
import {
|
|
4
|
+
attachProps,
|
|
5
|
+
camelToDashCase,
|
|
6
|
+
dashToPascalCase,
|
|
7
|
+
isCoveredByReact,
|
|
8
|
+
mergeRefs
|
|
9
|
+
} from "./react-component-lib/utils";
|
|
10
|
+
import { createForwardRef } from "./utils";
|
|
11
|
+
import { detachProps } from "./utils/detachProps";
|
|
12
|
+
export const createInlineOverlayComponent = (tagName, defineCustomElement, hasDelegateHost) => {
|
|
13
|
+
if (defineCustomElement) {
|
|
14
|
+
defineCustomElement();
|
|
15
|
+
}
|
|
16
|
+
const displayName = dashToPascalCase(tagName);
|
|
17
|
+
const ReactComponent = class extends React.Component {
|
|
18
|
+
constructor(props) {
|
|
19
|
+
super(props);
|
|
20
|
+
this.handleIonMount = () => {
|
|
21
|
+
this.setState({ isOpen: true });
|
|
22
|
+
};
|
|
23
|
+
this.handleWillPresent = (evt) => {
|
|
24
|
+
this.setState({ isOpen: true });
|
|
25
|
+
this.props.onWillPresent && this.props.onWillPresent(evt);
|
|
26
|
+
};
|
|
27
|
+
this.handleDidDismiss = (evt) => {
|
|
28
|
+
const wrapper = this.wrapperRef.current;
|
|
29
|
+
const el = this.ref.current;
|
|
30
|
+
if (wrapper && el) {
|
|
31
|
+
el.append(wrapper);
|
|
32
|
+
this.setState({ isOpen: false });
|
|
33
|
+
}
|
|
34
|
+
this.props.onDidDismiss && this.props.onDidDismiss(evt);
|
|
35
|
+
};
|
|
36
|
+
this.ref = React.createRef();
|
|
37
|
+
this.stableMergedRefs = mergeRefs(this.ref, this.props.forwardedRef);
|
|
38
|
+
this.state = { isOpen: false };
|
|
39
|
+
this.wrapperRef = React.createRef();
|
|
40
|
+
}
|
|
41
|
+
componentDidMount() {
|
|
42
|
+
this.componentDidUpdate(this.props);
|
|
43
|
+
this.ref.current?.addEventListener("ionMount", this.handleIonMount);
|
|
44
|
+
this.ref.current?.addEventListener("willPresent", this.handleWillPresent);
|
|
45
|
+
this.ref.current?.addEventListener("didDismiss", this.handleDidDismiss);
|
|
46
|
+
}
|
|
47
|
+
componentDidUpdate(prevProps) {
|
|
48
|
+
const node = this.ref.current;
|
|
49
|
+
const { onDidDismiss, onWillPresent, ...cProps } = this.props;
|
|
50
|
+
attachProps(node, cProps, prevProps);
|
|
51
|
+
}
|
|
52
|
+
componentWillUnmount() {
|
|
53
|
+
const node = this.ref.current;
|
|
54
|
+
if (node && this.state.isOpen) {
|
|
55
|
+
node.removeEventListener("didDismiss", this.handleDidDismiss);
|
|
56
|
+
node.remove();
|
|
57
|
+
detachProps(node, this.props);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
render() {
|
|
61
|
+
const { children, forwardedRef, style, className, ref, ...cProps } = this.props;
|
|
62
|
+
const propsToPass = Object.keys(cProps).reduce((acc, name) => {
|
|
63
|
+
if (name.indexOf("on") === 0 && name[2] === name[2].toUpperCase()) {
|
|
64
|
+
const eventName = name.substring(2).toLowerCase();
|
|
65
|
+
if (isCoveredByReact(eventName)) {
|
|
66
|
+
acc[name] = cProps[name];
|
|
67
|
+
}
|
|
68
|
+
} else if (["string", "boolean", "number"].includes(typeof cProps[name])) {
|
|
69
|
+
acc[camelToDashCase(name)] = cProps[name];
|
|
70
|
+
}
|
|
71
|
+
return acc;
|
|
72
|
+
}, {});
|
|
73
|
+
const newProps = {
|
|
74
|
+
...propsToPass,
|
|
75
|
+
ref: this.stableMergedRefs,
|
|
76
|
+
style
|
|
77
|
+
};
|
|
78
|
+
const getWrapperClasses = () => {
|
|
79
|
+
if (hasDelegateHost) {
|
|
80
|
+
return `${DELEGATE_HOST} ion-page`;
|
|
81
|
+
}
|
|
82
|
+
return DELEGATE_HOST;
|
|
83
|
+
};
|
|
84
|
+
return createElement(
|
|
85
|
+
"template",
|
|
86
|
+
{},
|
|
87
|
+
createElement(
|
|
88
|
+
tagName,
|
|
89
|
+
newProps,
|
|
90
|
+
/**
|
|
91
|
+
* We only want the inner component
|
|
92
|
+
* to be mounted if the overlay is open,
|
|
93
|
+
* so conditionally render the component
|
|
94
|
+
* based on the isOpen state.
|
|
95
|
+
*/
|
|
96
|
+
this.state.isOpen || this.props.keepContentsMounted ? createElement(
|
|
97
|
+
"div",
|
|
98
|
+
{
|
|
99
|
+
ref: this.wrapperRef,
|
|
100
|
+
className: getWrapperClasses()
|
|
101
|
+
},
|
|
102
|
+
children
|
|
103
|
+
) : null
|
|
104
|
+
)
|
|
105
|
+
);
|
|
106
|
+
}
|
|
107
|
+
static get displayName() {
|
|
108
|
+
return displayName;
|
|
109
|
+
}
|
|
110
|
+
};
|
|
111
|
+
return createForwardRef(ReactComponent, displayName);
|
|
112
|
+
};
|
|
113
|
+
const DELEGATE_HOST = "ion-delegate-host";
|
|
114
|
+
//# sourceMappingURL=createInlineOverlayComponent.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/components/createInlineOverlayComponent.tsx"],
|
|
4
|
+
"sourcesContent": ["import type { HTMLIonOverlayElement, OverlayEventDetail } from '@ionic/core/components';\nimport React, { createElement } from 'react';\n\nimport {\n attachProps,\n camelToDashCase,\n dashToPascalCase,\n isCoveredByReact,\n mergeRefs,\n} from './react-component-lib/utils';\nimport { createForwardRef } from './utils';\nimport { detachProps } from './utils/detachProps';\n\n// TODO(FW-2959): types\n\ntype InlineOverlayState = {\n isOpen: boolean;\n};\n\ninterface IonicReactInternalProps<ElementType> extends React.HTMLAttributes<ElementType> {\n forwardedRef?: React.ForwardedRef<ElementType>;\n ref?: React.Ref<any>;\n onDidDismiss?: (event: CustomEvent<OverlayEventDetail>) => void;\n onDidPresent?: (event: CustomEvent<OverlayEventDetail>) => void;\n onWillDismiss?: (event: CustomEvent<OverlayEventDetail>) => void;\n onWillPresent?: (event: CustomEvent<OverlayEventDetail>) => void;\n keepContentsMounted?: boolean;\n}\n\nexport const createInlineOverlayComponent = <PropType, ElementType>(\n tagName: string,\n defineCustomElement?: () => void,\n hasDelegateHost?: boolean\n) => {\n if (defineCustomElement) {\n defineCustomElement();\n }\n const displayName = dashToPascalCase(tagName);\n const ReactComponent = class extends React.Component<IonicReactInternalProps<PropType>, InlineOverlayState> {\n ref: React.RefObject<HTMLIonOverlayElement>;\n wrapperRef: React.RefObject<HTMLElement>;\n stableMergedRefs: React.RefCallback<HTMLElement>;\n\n constructor(props: IonicReactInternalProps<PropType>) {\n super(props);\n // Create a local ref to to attach props to the wrapped element.\n this.ref = React.createRef();\n // React refs must be stable (not created inline).\n this.stableMergedRefs = mergeRefs(this.ref, this.props.forwardedRef);\n // Component is hidden by default\n this.state = { isOpen: false };\n // Create a local ref to the inner child element.\n this.wrapperRef = React.createRef();\n }\n\n componentDidMount() {\n this.componentDidUpdate(this.props);\n\n this.ref.current?.addEventListener('ionMount', this.handleIonMount);\n this.ref.current?.addEventListener('willPresent', this.handleWillPresent);\n this.ref.current?.addEventListener('didDismiss', this.handleDidDismiss);\n }\n\n componentDidUpdate(prevProps: IonicReactInternalProps<PropType>) {\n const node = this.ref.current! as HTMLElement;\n /**\n * onDidDismiss and onWillPresent have manual implementations that\n * will invoke the original handler. We need to filter those out\n * so they don't get attached twice and called twice.\n */\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { onDidDismiss, onWillPresent, ...cProps } = this.props;\n attachProps(node, cProps, prevProps);\n }\n\n componentWillUnmount() {\n const node = this.ref.current;\n /**\n * If the overlay is being unmounted, but is still\n * open, this means the unmount was triggered outside\n * of the overlay being dismissed.\n *\n * This can happen with:\n * - The parent component being unmounted\n * - The overlay being conditionally rendered\n * - A route change (push/pop/replace)\n *\n * Unmounting the overlay at this stage should skip\n * the dismiss lifecycle, including skipping the transition.\n *\n */\n if (node && this.state.isOpen) {\n /**\n * Detach the local event listener that performs the state updates,\n * before dismissing the overlay, to prevent the callback handlers\n * executing after the component has been unmounted. This is to\n * avoid memory leaks.\n */\n node.removeEventListener('didDismiss', this.handleDidDismiss);\n node.remove();\n detachProps(node, this.props);\n }\n }\n\n render() {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { children, forwardedRef, style, className, ref, ...cProps } = this.props;\n\n const propsToPass = Object.keys(cProps).reduce((acc, name) => {\n if (name.indexOf('on') === 0 && name[2] === name[2].toUpperCase()) {\n const eventName = name.substring(2).toLowerCase();\n if (isCoveredByReact(eventName)) {\n (acc as any)[name] = (cProps as any)[name];\n }\n } else if (['string', 'boolean', 'number'].includes(typeof (cProps as any)[name])) {\n (acc as any)[camelToDashCase(name)] = (cProps as any)[name];\n }\n return acc;\n }, {});\n\n const newProps: IonicReactInternalProps<PropType> = {\n ...propsToPass,\n ref: this.stableMergedRefs,\n style,\n };\n\n /**\n * Some overlays need `.ion-page` so content\n * takes up the full size of the parent overlay.\n */\n const getWrapperClasses = () => {\n if (hasDelegateHost) {\n return `${DELEGATE_HOST} ion-page`;\n }\n\n return DELEGATE_HOST;\n };\n\n return createElement(\n 'template',\n {},\n createElement(\n tagName,\n newProps,\n /**\n * We only want the inner component\n * to be mounted if the overlay is open,\n * so conditionally render the component\n * based on the isOpen state.\n */\n this.state.isOpen || this.props.keepContentsMounted\n ? createElement(\n 'div',\n {\n ref: this.wrapperRef,\n className: getWrapperClasses(),\n },\n children\n )\n : null\n )\n );\n }\n\n static get displayName() {\n return displayName;\n }\n\n private handleIonMount = () => {\n /**\n * Mount the inner component when the\n * overlay is about to open.\n *\n * For ion-popover, this is when `ionMount` is emitted.\n * For other overlays, this is when `willPresent` is emitted.\n */\n this.setState({ isOpen: true });\n };\n\n private handleWillPresent = (evt: any) => {\n this.setState({ isOpen: true });\n /**\n * Manually call the onWillPresent\n * handler if present as setState will\n * cause the event handlers to be\n * destroyed and re-created.\n */\n this.props.onWillPresent && this.props.onWillPresent(evt);\n };\n\n private handleDidDismiss = (evt: any) => {\n const wrapper = this.wrapperRef.current;\n const el = this.ref.current;\n\n /**\n * This component might be unmounted already, if the containing\n * element was removed while the overlay was still open. (For\n * example, if an item contains an inline overlay with a button\n * that removes the item.)\n */\n if (wrapper && el) {\n el.append(wrapper);\n this.setState({ isOpen: false });\n }\n\n this.props.onDidDismiss && this.props.onDidDismiss(evt);\n };\n };\n return createForwardRef<PropType, ElementType>(ReactComponent, displayName);\n};\n\nconst DELEGATE_HOST = 'ion-delegate-host';\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
import React from "react";
|
|
3
|
+
import ReactDOM from "react-dom";
|
|
4
|
+
import { attachProps, dashToPascalCase, setRef } from "./react-component-lib/utils";
|
|
5
|
+
export const createOverlayComponent = (tagName, controller, defineCustomElement) => {
|
|
6
|
+
if (defineCustomElement !== void 0) {
|
|
7
|
+
defineCustomElement();
|
|
8
|
+
}
|
|
9
|
+
const displayName = dashToPascalCase(tagName);
|
|
10
|
+
const didDismissEventName = `on${displayName}DidDismiss`;
|
|
11
|
+
const didPresentEventName = `on${displayName}DidPresent`;
|
|
12
|
+
const willDismissEventName = `on${displayName}WillDismiss`;
|
|
13
|
+
const willPresentEventName = `on${displayName}WillPresent`;
|
|
14
|
+
class Overlay extends React.Component {
|
|
15
|
+
constructor(props) {
|
|
16
|
+
super(props);
|
|
17
|
+
this.isDismissing = false;
|
|
18
|
+
if (typeof document !== "undefined") {
|
|
19
|
+
this.el = document.createElement("div");
|
|
20
|
+
}
|
|
21
|
+
this.handleDismiss = this.handleDismiss.bind(this);
|
|
22
|
+
}
|
|
23
|
+
static get displayName() {
|
|
24
|
+
return displayName;
|
|
25
|
+
}
|
|
26
|
+
componentDidMount() {
|
|
27
|
+
if (this.props.isOpen) {
|
|
28
|
+
this.present();
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
componentWillUnmount() {
|
|
32
|
+
if (this.overlay) {
|
|
33
|
+
this.overlay.dismiss();
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
handleDismiss(event) {
|
|
37
|
+
if (this.props.onDidDismiss) {
|
|
38
|
+
this.props.onDidDismiss(event);
|
|
39
|
+
}
|
|
40
|
+
setRef(this.props.forwardedRef, null);
|
|
41
|
+
}
|
|
42
|
+
shouldComponentUpdate(nextProps) {
|
|
43
|
+
if (this.overlay && nextProps.isOpen !== this.props.isOpen && nextProps.isOpen === false) {
|
|
44
|
+
this.isDismissing = true;
|
|
45
|
+
}
|
|
46
|
+
return true;
|
|
47
|
+
}
|
|
48
|
+
async componentDidUpdate(prevProps) {
|
|
49
|
+
if (this.overlay) {
|
|
50
|
+
attachProps(this.overlay, this.props, prevProps);
|
|
51
|
+
}
|
|
52
|
+
if (prevProps.isOpen !== this.props.isOpen && this.props.isOpen === true) {
|
|
53
|
+
this.present(prevProps);
|
|
54
|
+
}
|
|
55
|
+
if (this.overlay && prevProps.isOpen !== this.props.isOpen && this.props.isOpen === false) {
|
|
56
|
+
await this.overlay.dismiss();
|
|
57
|
+
this.isDismissing = false;
|
|
58
|
+
this.forceUpdate();
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
async present(prevProps) {
|
|
62
|
+
const { children, isOpen, onDidDismiss, onDidPresent, onWillDismiss, onWillPresent, ...cProps } = this.props;
|
|
63
|
+
const elementProps = {
|
|
64
|
+
...cProps,
|
|
65
|
+
ref: this.props.forwardedRef,
|
|
66
|
+
[didDismissEventName]: this.handleDismiss,
|
|
67
|
+
[didPresentEventName]: (e) => this.props.onDidPresent && this.props.onDidPresent(e),
|
|
68
|
+
[willDismissEventName]: (e) => this.props.onWillDismiss && this.props.onWillDismiss(e),
|
|
69
|
+
[willPresentEventName]: (e) => this.props.onWillPresent && this.props.onWillPresent(e)
|
|
70
|
+
};
|
|
71
|
+
this.overlay = await controller.create({
|
|
72
|
+
...elementProps,
|
|
73
|
+
component: this.el,
|
|
74
|
+
componentProps: {}
|
|
75
|
+
});
|
|
76
|
+
setRef(this.props.forwardedRef, this.overlay);
|
|
77
|
+
attachProps(this.overlay, elementProps, prevProps);
|
|
78
|
+
await this.overlay.present();
|
|
79
|
+
}
|
|
80
|
+
render() {
|
|
81
|
+
return ReactDOM.createPortal(this.props.isOpen || this.isDismissing ? this.props.children : null, this.el);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
return React.forwardRef((props, ref) => {
|
|
85
|
+
return /* @__PURE__ */ React.createElement(Overlay, { ...props, forwardedRef: ref });
|
|
86
|
+
});
|
|
87
|
+
};
|
|
88
|
+
//# sourceMappingURL=createOverlayComponent.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/components/createOverlayComponent.tsx"],
|
|
4
|
+
"sourcesContent": ["import type { OverlayEventDetail } from '@ionic/core/components';\nimport React from 'react';\nimport ReactDOM from 'react-dom';\n\nimport { attachProps, dashToPascalCase, setRef } from './react-component-lib/utils';\n\ninterface OverlayElement extends HTMLElement {\n present: () => Promise<void>;\n dismiss: (data?: any, role?: string | undefined) => Promise<boolean>;\n}\n\nexport interface ReactOverlayProps {\n children?: React.ReactNode;\n isOpen: boolean;\n onDidDismiss?: (event: CustomEvent<OverlayEventDetail>) => void;\n onDidPresent?: (event: CustomEvent<OverlayEventDetail>) => void;\n onWillDismiss?: (event: CustomEvent<OverlayEventDetail>) => void;\n onWillPresent?: (event: CustomEvent<OverlayEventDetail>) => void;\n}\n\nexport const createOverlayComponent = <OverlayComponent extends object, OverlayType extends OverlayElement>(\n tagName: string,\n controller: { create: (options: any) => Promise<OverlayType> },\n defineCustomElement?: () => void\n) => {\n if (defineCustomElement !== undefined) {\n defineCustomElement();\n }\n\n const displayName = dashToPascalCase(tagName);\n const didDismissEventName = `on${displayName}DidDismiss`;\n const didPresentEventName = `on${displayName}DidPresent`;\n const willDismissEventName = `on${displayName}WillDismiss`;\n const willPresentEventName = `on${displayName}WillPresent`;\n\n type Props = OverlayComponent &\n ReactOverlayProps & {\n forwardedRef?: React.ForwardedRef<OverlayType>;\n };\n\n class Overlay extends React.Component<Props> {\n overlay?: OverlayType;\n el!: HTMLDivElement;\n isDismissing = false;\n constructor(props: Props) {\n super(props);\n if (typeof document !== 'undefined') {\n this.el = document.createElement('div');\n }\n this.handleDismiss = this.handleDismiss.bind(this);\n }\n\n static get displayName() {\n return displayName;\n }\n\n componentDidMount() {\n if (this.props.isOpen) {\n this.present();\n }\n }\n\n componentWillUnmount() {\n if (this.overlay) {\n this.overlay.dismiss();\n }\n }\n\n handleDismiss(event: CustomEvent<OverlayEventDetail<any>>) {\n if (this.props.onDidDismiss) {\n this.props.onDidDismiss(event);\n }\n setRef(this.props.forwardedRef, null);\n }\n\n shouldComponentUpdate(nextProps: Props) {\n // Check if the overlay component is about to dismiss\n if (this.overlay && nextProps.isOpen !== this.props.isOpen && nextProps.isOpen === false) {\n this.isDismissing = true;\n }\n\n return true;\n }\n\n async componentDidUpdate(prevProps: Props) {\n if (this.overlay) {\n attachProps(this.overlay, this.props, prevProps);\n }\n\n if (prevProps.isOpen !== this.props.isOpen && this.props.isOpen === true) {\n this.present(prevProps);\n }\n if (this.overlay && prevProps.isOpen !== this.props.isOpen && this.props.isOpen === false) {\n await this.overlay.dismiss();\n this.isDismissing = false;\n\n /**\n * Now that the overlay is dismissed\n * we need to render again so that any\n * inner components will be unmounted\n */\n this.forceUpdate();\n }\n }\n\n async present(prevProps?: Props) {\n /* eslint-disable @typescript-eslint/no-unused-vars */\n const { children, isOpen, onDidDismiss, onDidPresent, onWillDismiss, onWillPresent, ...cProps } = this.props;\n const elementProps = {\n ...cProps,\n ref: this.props.forwardedRef,\n [didDismissEventName]: this.handleDismiss,\n [didPresentEventName]: (e: CustomEvent) => this.props.onDidPresent && this.props.onDidPresent(e),\n [willDismissEventName]: (e: CustomEvent) => this.props.onWillDismiss && this.props.onWillDismiss(e),\n [willPresentEventName]: (e: CustomEvent) => this.props.onWillPresent && this.props.onWillPresent(e),\n };\n /* eslint-enable @typescript-eslint/no-unused-vars */\n\n this.overlay = await controller.create({\n ...elementProps,\n component: this.el,\n componentProps: {},\n });\n\n setRef(this.props.forwardedRef, this.overlay);\n attachProps(this.overlay, elementProps, prevProps);\n\n await this.overlay.present();\n }\n\n render() {\n /**\n * Continue to render the component even when\n * overlay is dismissing otherwise component\n * will be hidden before animation is done.\n */\n return ReactDOM.createPortal(this.props.isOpen || this.isDismissing ? this.props.children : null, this.el);\n }\n }\n\n return React.forwardRef<OverlayType, Props>((props, ref) => {\n return <Overlay {...props} forwardedRef={ref} />;\n });\n};\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
import React, { createElement } from "react";
|
|
3
|
+
import { NavContext } from "../contexts/NavContext";
|
|
4
|
+
import {
|
|
5
|
+
attachProps,
|
|
6
|
+
camelToDashCase,
|
|
7
|
+
dashToPascalCase,
|
|
8
|
+
defineCustomElement,
|
|
9
|
+
isCoveredByReact,
|
|
10
|
+
mergeRefs
|
|
11
|
+
} from "./react-component-lib/utils";
|
|
12
|
+
import { createForwardRef } from "./utils";
|
|
13
|
+
export const createRoutingComponent = (tagName, customElement) => {
|
|
14
|
+
defineCustomElement(tagName, customElement);
|
|
15
|
+
const displayName = dashToPascalCase(tagName);
|
|
16
|
+
const ReactComponent = class extends React.Component {
|
|
17
|
+
constructor(props) {
|
|
18
|
+
super(props);
|
|
19
|
+
this.handleClick = (e) => {
|
|
20
|
+
const { routerLink, routerDirection, routerOptions, routerAnimation } = this.props;
|
|
21
|
+
if (routerLink !== void 0) {
|
|
22
|
+
e.preventDefault();
|
|
23
|
+
this.context.navigate(routerLink, routerDirection, void 0, routerAnimation, routerOptions);
|
|
24
|
+
}
|
|
25
|
+
};
|
|
26
|
+
this.ref = React.createRef();
|
|
27
|
+
this.stableMergedRefs = mergeRefs(this.ref, this.props.forwardedRef);
|
|
28
|
+
}
|
|
29
|
+
componentDidMount() {
|
|
30
|
+
this.componentDidUpdate(this.props);
|
|
31
|
+
}
|
|
32
|
+
componentDidUpdate(prevProps) {
|
|
33
|
+
const node = this.ref.current;
|
|
34
|
+
attachProps(node, this.props, prevProps);
|
|
35
|
+
}
|
|
36
|
+
render() {
|
|
37
|
+
const { children, forwardedRef, style, className, ref, ...cProps } = this.props;
|
|
38
|
+
const propsToPass = Object.keys(cProps).reduce((acc, name) => {
|
|
39
|
+
if (name.indexOf("on") === 0 && name[2] === name[2].toUpperCase()) {
|
|
40
|
+
const eventName = name.substring(2).toLowerCase();
|
|
41
|
+
if (isCoveredByReact(eventName)) {
|
|
42
|
+
acc[name] = cProps[name];
|
|
43
|
+
}
|
|
44
|
+
} else if (["string", "boolean", "number"].includes(typeof cProps[name])) {
|
|
45
|
+
acc[camelToDashCase(name)] = cProps[name];
|
|
46
|
+
}
|
|
47
|
+
return acc;
|
|
48
|
+
}, {});
|
|
49
|
+
const newProps = {
|
|
50
|
+
...propsToPass,
|
|
51
|
+
ref: this.stableMergedRefs,
|
|
52
|
+
style
|
|
53
|
+
};
|
|
54
|
+
if (this.props.routerLink && !this.props.href) {
|
|
55
|
+
newProps.href = this.props.routerLink;
|
|
56
|
+
}
|
|
57
|
+
if (newProps.onClick) {
|
|
58
|
+
const oldClick = newProps.onClick;
|
|
59
|
+
newProps.onClick = (e) => {
|
|
60
|
+
oldClick(e);
|
|
61
|
+
if (!e.defaultPrevented) {
|
|
62
|
+
this.handleClick(e);
|
|
63
|
+
}
|
|
64
|
+
};
|
|
65
|
+
} else {
|
|
66
|
+
newProps.onClick = this.handleClick;
|
|
67
|
+
}
|
|
68
|
+
return createElement(tagName, newProps, children);
|
|
69
|
+
}
|
|
70
|
+
static get displayName() {
|
|
71
|
+
return displayName;
|
|
72
|
+
}
|
|
73
|
+
static get contextType() {
|
|
74
|
+
return NavContext;
|
|
75
|
+
}
|
|
76
|
+
};
|
|
77
|
+
return createForwardRef(ReactComponent, displayName);
|
|
78
|
+
};
|
|
79
|
+
//# sourceMappingURL=createRoutingComponent.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/components/createRoutingComponent.tsx"],
|
|
4
|
+
"sourcesContent": ["import type { AnimationBuilder } from '@ionic/core/components';\nimport React, { createElement } from 'react';\n\nimport { NavContext } from '../contexts/NavContext';\nimport type { RouterOptions } from '../models';\nimport type { RouterDirection } from '../models/RouterDirection';\n\nimport {\n attachProps,\n camelToDashCase,\n dashToPascalCase,\n defineCustomElement,\n isCoveredByReact,\n mergeRefs,\n} from './react-component-lib/utils';\nimport { createForwardRef } from './utils';\n\n// TODO(FW-2959): types\n\ninterface IonicReactInternalProps<ElementType> extends React.HTMLAttributes<ElementType> {\n forwardedRef?: React.ForwardedRef<ElementType>;\n href?: string;\n routerLink?: string;\n ref?: React.Ref<any>;\n routerDirection?: RouterDirection;\n routerOptions?: RouterOptions;\n routerAnimation?: AnimationBuilder;\n}\n\nexport const createRoutingComponent = <PropType, ElementType>(tagName: string, customElement?: any) => {\n defineCustomElement(tagName, customElement);\n\n const displayName = dashToPascalCase(tagName);\n const ReactComponent = class extends React.Component<IonicReactInternalProps<PropType>> {\n context!: React.ContextType<typeof NavContext>;\n ref: React.RefObject<HTMLElement>;\n stableMergedRefs: React.RefCallback<HTMLElement>;\n\n constructor(props: IonicReactInternalProps<PropType>) {\n super(props);\n // Create a local ref to to attach props to the wrapped element.\n this.ref = React.createRef();\n // React refs must be stable (not created inline).\n this.stableMergedRefs = mergeRefs(this.ref, this.props.forwardedRef);\n }\n\n componentDidMount() {\n this.componentDidUpdate(this.props);\n }\n\n componentDidUpdate(prevProps: IonicReactInternalProps<PropType>) {\n const node = this.ref.current! as HTMLElement;\n attachProps(node, this.props, prevProps);\n }\n\n private handleClick = (e: React.MouseEvent<PropType>) => {\n const { routerLink, routerDirection, routerOptions, routerAnimation } = this.props;\n if (routerLink !== undefined) {\n e.preventDefault();\n this.context.navigate(routerLink, routerDirection, undefined, routerAnimation, routerOptions);\n }\n };\n\n render() {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { children, forwardedRef, style, className, ref, ...cProps } = this.props;\n\n const propsToPass = Object.keys(cProps).reduce((acc, name) => {\n if (name.indexOf('on') === 0 && name[2] === name[2].toUpperCase()) {\n const eventName = name.substring(2).toLowerCase();\n if (isCoveredByReact(eventName)) {\n (acc as any)[name] = (cProps as any)[name];\n }\n } else if (['string', 'boolean', 'number'].includes(typeof (cProps as any)[name])) {\n (acc as any)[camelToDashCase(name)] = (cProps as any)[name];\n }\n return acc;\n }, {});\n\n const newProps: IonicReactInternalProps<PropType> = {\n ...propsToPass,\n ref: this.stableMergedRefs,\n style,\n };\n\n if (this.props.routerLink && !this.props.href) {\n newProps.href = this.props.routerLink;\n }\n if (newProps.onClick) {\n const oldClick = newProps.onClick;\n newProps.onClick = (e: React.MouseEvent<PropType>) => {\n oldClick(e);\n if (!e.defaultPrevented) {\n this.handleClick(e);\n }\n };\n } else {\n newProps.onClick = this.handleClick;\n }\n\n return createElement(tagName, newProps, children);\n }\n\n static get displayName() {\n return displayName;\n }\n\n static get contextType() {\n return NavContext;\n }\n };\n return createForwardRef<PropType, ElementType>(ReactComponent, displayName);\n};\n"],
|
|
5
|
+
"mappings": ";AACA,OAAO,SAAS,qBAAqB;AAErC,SAAS,kBAAkB;AAI3B;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAS,wBAAwB;AAc1B,aAAM,yBAAyB,CAAwB,SAAiB,kBAAwB;AACrG,sBAAoB,SAAS,aAAa;AAE1C,QAAM,cAAc,iBAAiB,OAAO;AAC5C,QAAM,iBAAiB,cAAc,MAAM,UAA6C;AAAA,IAKtF,YAAY,OAA0C;AACpD,YAAM,KAAK;AAgBb,WAAQ,cAAc,CAAC,MAAkC;AACvD,cAAM,EAAE,YAAY,iBAAiB,eAAe,gBAAgB,IAAI,KAAK;AAC7E,YAAI,eAAe,QAAW;AAC5B,YAAE,eAAe;AACjB,eAAK,QAAQ,SAAS,YAAY,iBAAiB,QAAW,iBAAiB,aAAa;AAAA,QAC9F;AAAA,MACF;AApBE,WAAK,MAAM,MAAM,UAAU;AAE3B,WAAK,mBAAmB,UAAU,KAAK,KAAK,KAAK,MAAM,YAAY;AAAA,IACrE;AAAA,IAEA,oBAAoB;AAClB,WAAK,mBAAmB,KAAK,KAAK;AAAA,IACpC;AAAA,IAEA,mBAAmB,WAA8C;AAC/D,YAAM,OAAO,KAAK,IAAI;AACtB,kBAAY,MAAM,KAAK,OAAO,SAAS;AAAA,IACzC;AAAA,IAUA,SAAS;AAEP,YAAM,EAAE,UAAU,cAAc,OAAO,WAAW,KAAK,GAAG,OAAO,IAAI,KAAK;AAE1E,YAAM,cAAc,OAAO,KAAK,MAAM,EAAE,OAAO,CAAC,KAAK,SAAS;AAC5D,YAAI,KAAK,QAAQ,IAAI,MAAM,KAAK,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,YAAY,GAAG;AACjE,gBAAM,YAAY,KAAK,UAAU,CAAC,EAAE,YAAY;AAChD,cAAI,iBAAiB,SAAS,GAAG;AAC/B,YAAC,IAAY,IAAI,IAAK,OAAe,IAAI;AAAA,UAC3C;AAAA,QACF,WAAW,CAAC,UAAU,WAAW,QAAQ,EAAE,SAAS,OAAQ,OAAe,IAAI,CAAC,GAAG;AACjF,UAAC,IAAY,gBAAgB,IAAI,CAAC,IAAK,OAAe,IAAI;AAAA,QAC5D;AACA,eAAO;AAAA,MACT,GAAG,CAAC,CAAC;AAEL,YAAM,WAA8C;AAAA,QAClD,GAAG;AAAA,QACH,KAAK,KAAK;AAAA,QACV;AAAA,MACF;AAEA,UAAI,KAAK,MAAM,cAAc,CAAC,KAAK,MAAM,MAAM;AAC7C,iBAAS,OAAO,KAAK,MAAM;AAAA,MAC7B;AACA,UAAI,SAAS,SAAS;AACpB,cAAM,WAAW,SAAS;AAC1B,iBAAS,UAAU,CAAC,MAAkC;AACpD,mBAAS,CAAC;AACV,cAAI,CAAC,EAAE,kBAAkB;AACvB,iBAAK,YAAY,CAAC;AAAA,UACpB;AAAA,QACF;AAAA,MACF,OAAO;AACL,iBAAS,UAAU,KAAK;AAAA,MAC1B;AAEA,aAAO,cAAc,SAAS,UAAU,QAAQ;AAAA,IAClD;AAAA,IAEA,WAAW,cAAc;AACvB,aAAO;AAAA,IACT;AAAA,IAEA,WAAW,cAAc;AACvB,aAAO;AAAA,IACT;AAAA,EACF;AACA,SAAO,iBAAwC,gBAAgB,WAAW;AAC5E;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|