diff --git a/src/_utils/composition/index.js b/src/_utils/composition/index.js index 51d5b5cb9..8337c1cf0 100644 --- a/src/_utils/composition/index.js +++ b/src/_utils/composition/index.js @@ -2,7 +2,11 @@ import { ref, computed, watch, - onMounted, inject, toRef + onMounted, + inject, + toRef, + getCurrentInstance, + onBeforeUnmount } from 'vue' export function useFalseUntilTruthy (valueRef) { @@ -62,4 +66,59 @@ export function useInjectionRef (injectionName, key, fallback) { return toRef(injection, key) } +export function onFontReady (callback) { + onMounted(() => { + const fontsReady = document.fonts.ready + const currentInstance = getCurrentInstance().proxy + fontsReady.then(() => { + callback(currentInstance) + }) + }) +} + +export function useInjectionCollection (injectionName, collectionKey, valueRef) { + const injection = inject(injectionName) + if (!(collectionKey in injection)) { + injection[collectionKey] = [] + } + injection[collectionKey].push(valueRef.value) + watch(valueRef, (value, prevValue) => { + const collectionArray = injection[collectionKey] + const index = collectionArray.findIndex( + collectionValue => collectionValue === prevValue + ) + if (~index) collectionArray.splice(index, 1) + collectionArray.push(value) + }) + onBeforeUnmount(() => { + const collectionArray = injection[collectionKey] + const index = collectionArray.findIndex( + collectionValue => collectionValue === valueRef.value + ) + if (~index) collectionArray.splice(index, 1) + }) +} + +export function useInjectionElementCollection (injectionName, collectionKey, getElement) { + const injection = inject(injectionName) + if (!(collectionKey in injection)) { + injection[collectionKey] = [] + } + onMounted(() => { + const currentInstance = getCurrentInstance().proxy + injection[collectionKey].push( + getElement(currentInstance) + ) + }) + onBeforeUnmount(() => { + const collectionArray = injection[collectionKey] + const currentInstance = getCurrentInstance().proxy + const element = getElement(currentInstance) + const index = collectionArray.findIndex( + collectionElement => collectionElement === element + ) + if (~index) collectionArray.splice(index, 1) + }) +} + export { default as useLastClickPosition } from './use-last-click-position' diff --git a/src/anchor/src/AnchorAdapter.vue b/src/anchor/src/AnchorAdapter.vue index 48d65b69f..406bf7fdc 100644 --- a/src/anchor/src/AnchorAdapter.vue +++ b/src/anchor/src/AnchorAdapter.vue @@ -1,6 +1,5 @@