From eec80d2cd590234dc653517adc78b2c6c6423716 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Chalifour?= Date: Sat, 14 Nov 2020 14:16:57 +0100 Subject: [PATCH] fix(js): clean environment effects --- packages/autocomplete-js/src/autocomplete.ts | 34 ++++++++++++++----- .../src/createAutocompleteDom.ts | 9 ----- .../src/createEffectWrapper.ts | 14 +++++--- 3 files changed, 35 insertions(+), 22 deletions(-) diff --git a/packages/autocomplete-js/src/autocomplete.ts b/packages/autocomplete-js/src/autocomplete.ts index 6b1c01b6f..c2201131b 100644 --- a/packages/autocomplete-js/src/autocomplete.ts +++ b/packages/autocomplete-js/src/autocomplete.ts @@ -23,7 +23,7 @@ export function autocomplete({ classNames = {}, ...props }: AutocompleteOptions): AutocompleteApi { - const { effects, triggerEffect } = createEffectWrapper(); + const { runEffect, cleanEffects } = createEffectWrapper(); const autocomplete = createAutocomplete({ ...props, onStateChange(options) { @@ -74,15 +74,33 @@ export function autocomplete({ }); } - function destroy() { - effects.forEach((cleanUp) => cleanUp()); - } - requestAnimationFrame(() => { setPanelPosition(); }); - triggerEffect(() => { + runEffect(() => { + const environmentProps = autocomplete.getEnvironmentProps({ + searchBoxElement: form, + panelElement: panel, + inputElement: input, + }); + + setProperties(window as any, environmentProps); + + return () => { + setProperties( + window as any, + Object.keys(environmentProps).reduce((acc, key) => { + return { + ...acc, + [key]: undefined, + }; + }, {}) + ); + }; + }); + + runEffect(() => { const containerElement = getHTMLElement(container); containerElement.appendChild(root); @@ -91,7 +109,7 @@ export function autocomplete({ }; }); - triggerEffect(() => { + runEffect(() => { const onResize = debounce(() => { setPanelPosition(); }, 100); @@ -111,6 +129,6 @@ export function autocomplete({ setStatus: autocomplete.setStatus, setContext: autocomplete.setContext, refresh: autocomplete.refresh, - destroy, + destroy: cleanEffects, }; } diff --git a/packages/autocomplete-js/src/createAutocompleteDom.ts b/packages/autocomplete-js/src/createAutocompleteDom.ts index 41d739070..49a758b69 100644 --- a/packages/autocomplete-js/src/createAutocompleteDom.ts +++ b/packages/autocomplete-js/src/createAutocompleteDom.ts @@ -9,7 +9,6 @@ type CreateDomProps = AutocompleteCoreApi & { }; export function createAutocompleteDom({ - getEnvironmentProps, getRootProps, getFormProps, getLabelProps, @@ -25,14 +24,6 @@ export function createAutocompleteDom({ const resetButton = document.createElement('button'); const panel = document.createElement('div'); - setProperties( - window as any, - getEnvironmentProps({ - searchBoxElement: form, - panelElement: panel, - inputElement: input, - }) - ); setProperties(root, { ...getRootProps(), class: concatClassNames(['aa-Autocomplete', classNames.root]), diff --git a/packages/autocomplete-js/src/createEffectWrapper.ts b/packages/autocomplete-js/src/createEffectWrapper.ts index f98170ea5..17f6b3110 100644 --- a/packages/autocomplete-js/src/createEffectWrapper.ts +++ b/packages/autocomplete-js/src/createEffectWrapper.ts @@ -1,13 +1,13 @@ type Effect = () => void; type EffectWrapper = { - effects: Effect[]; - triggerEffect(fn: () => Effect): void; + runEffect(fn: () => Effect): void; + cleanEffects(): void; }; export function createEffectWrapper(): EffectWrapper { let effects: Effect[] = []; - const triggerEffect: EffectWrapper['triggerEffect'] = (fn: () => Effect) => { + const runEffect: EffectWrapper['runEffect'] = (fn: () => Effect) => { const unsubscribe = fn(); function cleanUp() { @@ -18,8 +18,12 @@ export function createEffectWrapper(): EffectWrapper { effects.push(cleanUp); }; + function cleanEffects() { + effects.forEach((cleanUp) => cleanUp()); + } + return { - effects, - triggerEffect, + runEffect, + cleanEffects, }; }