Skip to content

Commit

Permalink
Add show and hide
Browse files Browse the repository at this point in the history
  • Loading branch information
Daniel Brain committed Sep 24, 2019
1 parent d4984a3 commit eec1458
Show file tree
Hide file tree
Showing 5 changed files with 82 additions and 14 deletions.
16 changes: 14 additions & 2 deletions src/child/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,9 @@ export type ChildHelpers<P> = {|
onError : (mixed) => ZalgoPromise<void>,
onProps : ((PropsType<P>) => void) => void,
getParent : () => CrossDomainWindowType,
getParentDomain : () => string
getParentDomain : () => string,
show : () => ZalgoPromise<void>,
hide : () => ZalgoPromise<void>
|};

/* Child Component
Expand Down Expand Up @@ -104,10 +106,20 @@ export class ChildComponent<P> {
onError: (err) => this.onError(err),
onProps: (handler) => this.onProps(handler),
getParent: () => this.parentComponentWindow,
getParentDomain: () => this.parentDomain
getParentDomain: () => this.parentDomain,
show: () => this.show(),
hide: () => this.hide()
};
}

show() : ZalgoPromise<void> {
return this.parent.show();
}

hide() : ZalgoPromise<void> {
return this.parent.hide();
}

checkParentDomain(domain : string) {
if (!matchDomain(this.component.allowedParentDomains, domain)) {
throw new Error(`Can not be rendered by domain: ${ domain }`);
Expand Down
4 changes: 2 additions & 2 deletions src/child/props.js
Original file line number Diff line number Diff line change
Expand Up @@ -17,8 +17,8 @@ export function normalizeChildProp<T, P>(component : Component<P>, props : (Prop
}

if (typeof prop.childDecorate === 'function') {
const { close, focus, onError, onProps, resize, getParent, getParentDomain } = helpers;
return prop.childDecorate({ value, close, focus, onError, onProps, resize, getParent, getParentDomain });
const { close, focus, onError, onProps, resize, getParent, getParentDomain, show, hide } = helpers;
return prop.childDecorate({ value, close, focus, onError, onProps, resize, getParent, getParentDomain, show, hide });
}

return value;
Expand Down
14 changes: 14 additions & 0 deletions src/component/props.js
Original file line number Diff line number Diff line change
Expand Up @@ -184,6 +184,20 @@ export function getBuiltInProps<P>() : BuiltInPropsDefinitionType<P> {
childDecorate: ({ getParentDomain }) => getParentDomain
},

show: {
type: 'function',
required: false,
sendToChild: false,
childDecorate: ({ show }) => show
},

hide: {
type: 'function',
required: false,
sendToChild: false,
childDecorate: ({ hide }) => hide
},

onDisplay: {
type: 'function',
required: false,
Expand Down
8 changes: 6 additions & 2 deletions src/parent/drivers.js
Original file line number Diff line number Diff line change
Expand Up @@ -85,7 +85,9 @@ RENDER_DRIVERS[CONTEXT.IFRAME] = {
'openPrerenderFrame',
'prerender',
'open',
'openPrerender'
'openPrerender',
'show',
'hide'
]
};

Expand Down Expand Up @@ -124,7 +126,9 @@ if (__ZOID__.__POPUP_SUPPORT__) {
delegate: [
'getProxyContainer',
'renderContainer',
'setProxyWin'
'setProxyWin',
'show',
'hide'
]
};
}
54 changes: 46 additions & 8 deletions src/parent/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ import { isSameDomain, matchDomain, getDomainFromUrl, isBlankDomain,
import { ZalgoPromise } from 'zalgo-promise/src';
import { addEventListener, uniqueID, elementReady, writeElementToWindow, eventEmitter, type EventEmitterType,
noop, onResize, extendUrl, appendChild, cleanup, type CleanupType, base64encode,
once, stringifyError, destroyElement, getElementSafe } from 'belter/src';
once, stringifyError, destroyElement, getElementSafe, showElement, hideElement } from 'belter/src';

import { ZOID, POST_MESSAGE, CONTEXT, EVENT,
INITIAL_PROPS, WINDOW_REFERENCES } from '../constants';
Expand Down Expand Up @@ -42,7 +42,9 @@ export type ParentExportsType<P> = {|
close : () => ZalgoPromise<void>,
checkClose : CrossDomainFunctionType<[], void>,
resize : CrossDomainFunctionType<[{ width? : ?number, height? : ?number }], void>,
onError : (mixed) => ZalgoPromise<void>
onError : (mixed) => ZalgoPromise<void>,
show : () => ZalgoPromise<void>,
hide : () => ZalgoPromise<void>
|};

export type PropRef =
Expand Down Expand Up @@ -74,7 +76,9 @@ export type ParentHelpers<P> = {|
resize : ({ width : ?number, height : ?number }) => ZalgoPromise<void>,
onError : (mixed) => ZalgoPromise<void>,
updateProps : PropsInputType<P> => ZalgoPromise<void>,
event : EventEmitterType
event : EventEmitterType,
show : () => ZalgoPromise<void>,
hide : () => ZalgoPromise<void>
|};

export class ParentComponent<P> {
Expand All @@ -91,8 +95,11 @@ export class ParentComponent<P> {
state : StateType
child : ?ChildExportsType<P>

proxyContainer : ?ProxyObject<HTMLElement>
proxyWin : ?ProxyWindow

visible : boolean = true

constructor(component : Component<P>, props : PropsInputType<P>) {
this.initPromise = new ZalgoPromise();
this.handledErrors = [];
Expand Down Expand Up @@ -163,7 +170,10 @@ export class ParentComponent<P> {
const openPrerenderFrame = this.openPrerenderFrame();

const renderContainer = ZalgoPromise.hash({ proxyContainer: getProxyContainer, proxyFrame: openFrame, proxyPrerenderFrame: openPrerenderFrame }).then(({ proxyContainer, proxyFrame, proxyPrerenderFrame }) => {
return this.renderContainer(proxyContainer, { context, uid, proxyFrame, proxyPrerenderFrame });
return this.renderContainer(proxyContainer, { context, uid, proxyFrame, proxyPrerenderFrame, visible: this.visible });
}).then(proxyContainer => {
this.proxyContainer = proxyContainer;
return proxyContainer;
});

const open = this.driver.openOnClick
Expand Down Expand Up @@ -294,10 +304,32 @@ export class ParentComponent<P> {
focus: () => this.focus(),
resize: ({ width, height }) => this.resize({ width, height }),
onError: (err) => this.onError(err),
updateProps: (props) => this.updateProps(props)
updateProps: (props) => this.updateProps(props),
show: () => this.show(),
hide: () => this.hide()
};
}

show() : ZalgoPromise<void> {
return ZalgoPromise.try(() => {
this.visible = true;
if (this.proxyContainer) {
return this.proxyContainer.get()
.then(showElement);
}
});
}

hide() : ZalgoPromise<void> {
return ZalgoPromise.try(() => {
this.visible = false;
if (this.proxyContainer) {
return this.proxyContainer.get()
.then(hideElement);
}
});
}

setProps(props : PropsInputType<P>, isUpdate : boolean = false) {
if (this.component.validate) {
this.component.validate({ props });
Expand Down Expand Up @@ -521,10 +553,12 @@ export class ParentComponent<P> {
const close = () => this.close();
const checkClose = () => this.checkClose(win);
const resize = ({ width, height }) => this.resize({ width, height });
const show = () => this.show();
const hide = () => this.hide();

init.onError = onError;

return { init, close, checkClose, resize, onError };
return { init, close, checkClose, resize, onError, show, hide };
}

resize({ width, height } : { width? : ?number, height? : ?number }) : ZalgoPromise<void> {
Expand Down Expand Up @@ -625,8 +659,8 @@ export class ParentComponent<P> {
});
}

renderContainer(proxyContainer : ProxyObject<HTMLElement>, { proxyFrame, proxyPrerenderFrame, context, uid } :
{ context : $Values<typeof CONTEXT>, uid : string, proxyFrame : ?ProxyObject<HTMLIFrameElement>, proxyPrerenderFrame : ?ProxyObject<HTMLIFrameElement> }) : ZalgoPromise<?ProxyObject<HTMLElement>> {
renderContainer(proxyContainer : ProxyObject<HTMLElement>, { proxyFrame, proxyPrerenderFrame, context, uid, visible } :
{ context : $Values<typeof CONTEXT>, uid : string, proxyFrame : ?ProxyObject<HTMLIFrameElement>, proxyPrerenderFrame : ?ProxyObject<HTMLIFrameElement>, visible : boolean }) : ZalgoPromise<?ProxyObject<HTMLElement>> {


return ZalgoPromise.hash({
Expand All @@ -638,8 +672,12 @@ export class ParentComponent<P> {
}).then(({ container, frame, prerenderFrame }) => {
const innerContainer = this.renderTemplate(this.component.containerTemplate, { context, uid, container, frame, prerenderFrame, doc: document });
if (innerContainer) {
if (!visible) {
hideElement(innerContainer);
}
appendChild(container, innerContainer);
this.clean.register(() => destroyElement(innerContainer));
this.proxyContainer = getProxyObject(innerContainer);
return getProxyObject(innerContainer);
}
});
Expand Down

0 comments on commit eec1458

Please sign in to comment.