{"version":3,"file":"vueHelpers-DJmQHPbF.js","sources":["../../../app/javascript/src/helpers/vueHelpers.js"],"sourcesContent":["import { useI18n } from 'vue-i18n';\nimport { refAutoReset, until, useBreakpoints, useCssVar, useElementSize, useMediaControls, useMutationObserver, useScroll, watchImmediate } from \"@vueuse/core\";\nimport { computed, onBeforeMount, onBeforeUnmount, onMounted, ref, toValue } from \"vue\";\nimport { useComponentChain } from \"@/utils/errorReportingUtils.js\";\nimport { useRouter } from \"vue-router\";\nimport consumer from \"@/../channels/consumer.js\";\n\nexport function useShared() {\n const bp = useBreakpoints({ mobile: 0, desktop: 768 }).active();\n\n return {\n ...useI18n({\n inheritLocale: true,\n useScope: 'local',\n }),\n componentInfo: {\n chain: useComponentChain(),\n },\n mobile: computed(() => bp.value === 'mobile'),\n desktop: computed(() => bp.value === 'desktop'),\n };\n}\n\nexport function redirectUnless(cond, route) {\n onBeforeMount(() => {\n if (!cond) {\n const router = useRouter();\n router.push(route);\n }\n });\n}\n\nexport function useBodyClass(classname) {\n onMounted(() => document.body.classList.add(classname));\n onBeforeUnmount(() => document.body.classList.remove(classname));\n}\n\nexport function useBodyClassWhen(ref, classname) {\n watchImmediate(ref, (on) => document.body.classList.toggle(classname, on));\n\n onBeforeUnmount(() => document.body.classList.remove(classname));\n}\n\nexport function setBodyCssVar(varname, value) {\n const cssVar = useCssVar(varname, document.body);\n cssVar.value = value;\n}\n\nexport function setMobileBodyCssVar(varname, value) {\n const { mobile } = useShared();\n const cssVar = useCssVar(varname, document.body);\n watchImmediate(mobile, on => cssVar.value = on ? value : null);\n}\n\nexport function optionList(arr) {\n return arr.map(v => ({ value: v, label: String(v) }));\n}\n\nexport function scrollBehavior(to, from, savedPosition) {\n if (from.path === to.path) {\n return { x: window.scrollX, y: window.scrollY };\n }\n\n return savedPosition ? savedPosition : { left: 0, top: 0 }\n}\n\nexport function useSmoothScroll() {\n onMounted(() => document.querySelector('html').style.scrollBehavior = 'smooth');\n onBeforeUnmount(() => document.querySelector('html').style.scrollBehavior = 'unset');\n}\n\nexport function useVideoControls(target, options) {\n const controls = useMediaControls(target, options);\n const played = ref(false);\n\n until(controls.playing).toBeTruthy().then(() => played.value = true);\n\n const play = () => {\n toValue(target).play().catch(console.error);\n }\n\n const mutedPlay = () => {\n controls.muted.value = true;\n toValue(target).play().catch(console.error);\n }\n\n const pause = () => {\n toValue(target).pause();\n }\n\n return {\n ...controls, played, play, mutedPlay, pause\n };\n}\n\nexport function useElementScroll(el) {\n const { x, y } = useScroll(el);\n const { width, height } = useElementSize(el);\n const xRemaining = ref(0);\n const yRemaining = ref(0);\n\n const setRemainingX = () => xRemaining.value = el.value ? el.value.scrollWidth - el.value.clientWidth - el.value.scrollLeft : 0;\n const setRemainingY = () => yRemaining.value = el.value ? el.value.scrollHeight - el.value.clientHeight - el.value.scrollTop : 0;\n\n watchImmediate([x, width], setRemainingX);\n watchImmediate([y, height], setRemainingY);\n\n useMutationObserver(el, () => {\n setRemainingX();\n setRemainingY();\n }, { childList: true, subtree: true });\n\n return { x, y, xRemaining, yRemaining };\n}\n\nexport function useConsumerSubscription(channel, channelId, callbackFn, validateFn = () => true) {\n const called = refAutoReset(false, 0);\n const subscription = ref();\n\n const onReceived = (...args) => {\n if (validateFn(...args)) {\n called.value = true;\n callbackFn(...args);\n }\n };\n\n onBeforeMount(async () => {\n await until(() => toValue(channel) && toValue(channelId)).toBeTruthy();\n\n subscription.value = consumer.subscriptions.create(\n {\n channel: toValue(channel),\n channel_id: toValue(channelId),\n },\n { received: onReceived }\n )\n });\n\n onBeforeUnmount(() => {\n subscription.value?.unsubscribe();\n });\n\n return { subscription, called };\n}"],"names":["useShared","bp","useBreakpoints","useI18n","useComponentChain","computed","redirectUnless","cond","route","onBeforeMount","useRouter","useBodyClass","classname","onMounted","onBeforeUnmount","useBodyClassWhen","ref","watchImmediate","on","setBodyCssVar","varname","value","cssVar","useCssVar","setMobileBodyCssVar","mobile","scrollBehavior","to","from","savedPosition","useSmoothScroll","useVideoControls","target","options","controls","useMediaControls","played","until","toValue","useElementScroll","el","x","y","useScroll","width","height","useElementSize","xRemaining","yRemaining","setRemainingX","setRemainingY","useMutationObserver","useConsumerSubscription","channel","channelId","callbackFn","validateFn","called","refAutoReset","subscription","onReceived","args","consumer","_a"],"mappings":"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"}