{"version":3,"file":"rockSuspense.obs.js","sources":["../../../Framework/Controls/rockSuspense.obs"],"sourcesContent":["<!-- Copyright by the Spark Development Network; Licensed under the Rock Community License -->\r\n<template>\r\n <div v-show=\"isContentVisible\">\r\n <slot />\r\n </div>\r\n\r\n <template v-if=\"isLoadingVisible\">\r\n <slot name=\"loading\" />\r\n </template>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\n import { PropType, computed, ref, onMounted } from \"vue\";\r\n import { BasicSuspenseProvider, provideSuspense, useSuspense } from \"@Obsidian/Utility/suspense\";\r\n\r\n // Prevents the content from displaying until all asynchronous events have completed.\r\n //\r\n // Emits a \"timeout\" event if the timeout is reached which caused the content to\r\n // display.\r\n //\r\n // Emits a \"loaded\" event if the content successfully loaded and was displayed.\r\n //\r\n // Emits a \"ready\" event any time the content is displayed, whether from timeout or loaded.\r\n\r\n const props = defineProps({\r\n delay: {\r\n type: Number as PropType<number>,\r\n default: 500\r\n },\r\n\r\n timeout: {\r\n type: Number as PropType<number>,\r\n default: 5000\r\n }\r\n });\r\n\r\n const emit = defineEmits<{\r\n (e: \"loaded\"): void;\r\n (e: \"ready\"): void;\r\n (e: \"timeout\"): void;\r\n }>();\r\n\r\n const isContentLoaded = ref(false);\r\n const hasDelayElapsed = ref(false);\r\n const hasTimeoutElapsed = ref(false);\r\n\r\n const parentSuspense = useSuspense();\r\n const suspense = new BasicSuspenseProvider(parentSuspense);\r\n provideSuspense(suspense);\r\n\r\n const isContentVisible = computed((): boolean => isContentLoaded.value || hasTimeoutElapsed.value);\r\n const isLoadingVisible = computed((): boolean => !isContentVisible.value && hasDelayElapsed.value);\r\n\r\n // Start timer that triggers when the delay has elapsed so we can show\r\n // the loading content after a brief delay.\r\n setTimeout(() => hasDelayElapsed.value = true, props.delay);\r\n\r\n // Start timer that triggers when the timeout has elapsed so we can show\r\n // the content even if it hasn't fully loaded yet.\r\n setTimeout(() => {\r\n hasTimeoutElapsed.value = true;\r\n emit(\"timeout\");\r\n emit(\"ready\");\r\n }, props.timeout);\r\n\r\n // Wait until we are mounted. This indicates that all child components\r\n // have been initialized and would have submitted their pending operations\r\n // to the provider already.\r\n onMounted(() => {\r\n if (!suspense.hasPendingOperations()) {\r\n isContentLoaded.value = true;\r\n emit(\"loaded\");\r\n emit(\"ready\");\r\n }\r\n else {\r\n suspense.addFinishedHandler(() => {\r\n isContentLoaded.value = true;\r\n emit(\"loaded\");\r\n emit(\"ready\");\r\n });\r\n }\r\n });\r\n</script>\r\n"],"names":["isContentLoaded","ref","hasDelayElapsed","hasTimeoutElapsed","parentSuspense","useSuspense","suspense","BasicSuspenseProvider","provideSuspense","isContentVisible","computed","value","isLoadingVisible","setTimeout","props","delay","emit","timeout","onMounted","hasPendingOperations","addFinishedHandler"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MA0CI,IAAA,IAAMA,eAAe,GAAGC,GAAG,CAAC,KAAK,CAAC,CAAA;MAClC,IAAA,IAAMC,eAAe,GAAGD,GAAG,CAAC,KAAK,CAAC,CAAA;MAClC,IAAA,IAAME,iBAAiB,GAAGF,GAAG,CAAC,KAAK,CAAC,CAAA;UAEpC,IAAMG,cAAc,GAAGC,WAAW,EAAE,CAAA;MACpC,IAAA,IAAMC,QAAQ,GAAG,IAAIC,qBAAqB,CAACH,cAAc,CAAC,CAAA;UAC1DI,eAAe,CAACF,QAAQ,CAAC,CAAA;MAEzB,IAAA,IAAMG,gBAAgB,GAAGC,QAAQ,CAAC,MAAeV,eAAe,CAACW,KAAK,IAAIR,iBAAiB,CAACQ,KAAK,CAAC,CAAA;MAClG,IAAA,IAAMC,gBAAgB,GAAGF,QAAQ,CAAC,MAAe,CAACD,gBAAgB,CAACE,KAAK,IAAIT,eAAe,CAACS,KAAK,CAAC,CAAA;UAIlGE,UAAU,CAAC,MAAMX,eAAe,CAACS,KAAK,GAAG,IAAI,EAAEG,KAAK,CAACC,KAAK,CAAC,CAAA;MAI3DF,IAAAA,UAAU,CAAC,MAAM;YACbV,iBAAiB,CAACQ,KAAK,GAAG,IAAI,CAAA;YAC9BK,IAAI,CAAC,SAAS,CAAC,CAAA;YACfA,IAAI,CAAC,OAAO,CAAC,CAAA;MACjB,KAAC,EAAEF,KAAK,CAACG,OAAO,CAAC,CAAA;MAKjBC,IAAAA,SAAS,CAAC,MAAM;MACZ,MAAA,IAAI,CAACZ,QAAQ,CAACa,oBAAoB,EAAE,EAAE;cAClCnB,eAAe,CAACW,KAAK,GAAG,IAAI,CAAA;cAC5BK,IAAI,CAAC,QAAQ,CAAC,CAAA;cACdA,IAAI,CAAC,OAAO,CAAC,CAAA;MACjB,OAAC,MACI;cACDV,QAAQ,CAACc,kBAAkB,CAAC,MAAM;gBAC9BpB,eAAe,CAACW,KAAK,GAAG,IAAI,CAAA;gBAC5BK,IAAI,CAAC,QAAQ,CAAC,CAAA;gBACdA,IAAI,CAAC,OAAO,CAAC,CAAA;MACjB,SAAC,CAAC,CAAA;MACN,OAAA;MACJ,KAAC,CAAC,CAAA;;;;;;;;;;;;;;;;;"}