{"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;;;;;;;;;;;;;;;;;"}