{"version":3,"file":"autoplay-a292de16.js","sources":["../../../app/javascript/vuecomponents/AutoplayMenu.vue","../../../app/javascript/vuecomponents/AutoplaySettings.vue","../../../app/javascript/vuecomposables/autoplay.ts"],"sourcesContent":["\n\n\n","\n\n\n","// @file Vue composable for all autoplay related logic\nimport type { AutoplayDurationType } from '@@/bits/autoplay'\nimport { getAutoplayNotificationMessages } from '@@/bits/autoplay'\nimport device from '@@/bits/device'\nimport { __ } from '@@/bits/intl'\nimport { PausableTimer } from '@@/bits/pausable_timer'\nimport { SnackbarNotificationType, useGlobalSnackbarStore } from '@@/pinia/global_snackbar'\nimport type { Ref } from 'vue'\nimport { computed, onMounted, onUnmounted, ref, watch } from 'vue'\n\ninterface AutoplayOptions {\n currentPageIndex: Ref\n isLastPage: Ref\n autoplayButtonId: string\n pauseOnOverlayOpen?: boolean\n isAnyOtherOverlayOpen: Ref\n computeAutoplayDurationInMs: (x: AutoplayDurationType) => number\n // callback functions\n onStart: () => void\n onPause: () => void\n onStop: () => void\n onNext: () => void\n onRestart: () => void\n}\n\ninterface AutoplayReturn {\n autoplayTimer: PausableTimer\n isAutoplayMenuOpen: Ref\n isAutoplaying: Ref\n isAutoplayPaused: Ref\n isAutoplayLooping: Ref\n selectedAutoplayDuration: Ref\n computedAutoplayDurationInMs: Ref\n onAutoplayLoopingToggle: () => void\n onAutoplayDurationSelected: (durationType: AutoplayDurationType) => void\n toggleAutoplay: () => void\n startAutoplay: () => void\n}\n\nconst useAutoplay = ({\n currentPageIndex,\n isLastPage,\n autoplayButtonId,\n pauseOnOverlayOpen = true,\n isAnyOtherOverlayOpen,\n computeAutoplayDurationInMs,\n onStart,\n onPause,\n onStop,\n onNext,\n onRestart,\n}: AutoplayOptions): AutoplayReturn => {\n const autoplayTimer = new PausableTimer()\n const globalSnackbarStore = useGlobalSnackbarStore()\n\n const isAutoplayMenuOpen = ref(false)\n const isAutoplaying = ref(false)\n const isAutoplayPaused = ref(false)\n const isAutoplayLooping = ref(false)\n\n const previousAutoplayDuration = ref()\n const selectedAutoplayDuration = ref('auto')\n\n const computedAutoplayDurationInMs = computed(() => computeAutoplayDurationInMs(selectedAutoplayDuration.value))\n\n const autoplayHandler = (): void => {\n if (!isLastPage.value) {\n onNext()\n return\n }\n\n if (isAutoplayLooping.value) {\n onRestart()\n } else {\n stopAutoplay()\n }\n }\n\n const resetAutoplayTimer = (): void => {\n autoplayTimer.setTimeoutDuration(computedAutoplayDurationInMs.value)\n autoplayTimer.setOnComplete(autoplayHandler)\n autoplayTimer.start()\n }\n\n const startAutoplay = (): void => {\n isAutoplaying.value = true\n resetAutoplayTimer()\n\n if (!(autoplayTimer.isPaused || autoplayTimer.isResumed)) {\n onStop()\n }\n onStart()\n }\n\n const stopAutoplay = (): void => {\n isAutoplaying.value = false\n autoplayTimer.stop()\n onStop()\n }\n\n const toggleAutoplay = (): void => {\n if (isAutoplaying.value) {\n stopAutoplay()\n } else {\n startAutoplay()\n }\n }\n\n const onAutoplayLoopingToggle = (): void => {\n isAutoplayLooping.value = !isAutoplayLooping.value\n }\n\n const onAutoplayDurationSelected = (durationType: AutoplayDurationType): void => {\n previousAutoplayDuration.value = selectedAutoplayDuration.value\n selectedAutoplayDuration.value = durationType\n autoplayTimer.setTimeoutDuration(computedAutoplayDurationInMs.value)\n }\n\n /**\n * This is the \"engine\" behind autoplay.\n * Since autoplayTimer is not a recurring interval, it ends after progressing a page.\n * We start the timer again if autoplay is still enabled.\n */\n watch(currentPageIndex, () => {\n if (isAutoplaying.value) {\n startAutoplay()\n }\n })\n\n const onPauseWhenOverlayOpen = (): void => {\n isAutoplaying.value = false\n autoplayTimer.pause()\n isAutoplayPaused.value = true\n onPause()\n previousAutoplayDuration.value = selectedAutoplayDuration.value\n }\n\n const isAnyOverlayOpen = computed(() => isAnyOtherOverlayOpen.value || isAutoplayMenuOpen.value)\n if (pauseOnOverlayOpen) {\n watch(isAnyOverlayOpen, () => {\n // pause autoplaying when any menu is open\n if (isAnyOverlayOpen.value && isAutoplaying.value) {\n onPauseWhenOverlayOpen()\n } else if (!isAnyOverlayOpen.value && autoplayTimer.isPaused) {\n isAutoplayPaused.value = false\n\n // resume autoplaying when the menu is closed\n // if user did not change the autoplay duration while the menu is open, resume from where it was paused\n // otherwise, restart autoplaying with the new duration\n if (previousAutoplayDuration.value === selectedAutoplayDuration.value) {\n isAutoplaying.value = true\n autoplayTimer.resume()\n onStart()\n } else {\n startAutoplay()\n }\n }\n })\n }\n\n const pauseAutoplayForMouseDevices = (event: KeyboardEvent): void => {\n if (device.touchable) {\n return\n }\n\n const isKeydownOnAutoplayButton =\n (document.activeElement as HTMLElement).id === autoplayButtonId && [' ', 'Enter'].includes(event.key)\n // if user clicks on the autoplay button, we let the button naturally set isAutoplaying as false\n // so we don't need to manually toggle it here\n if (!isAutoplaying.value || isKeydownOnAutoplayButton) {\n return\n }\n\n stopAutoplay()\n globalSnackbarStore.setSnackbar({\n notificationType: SnackbarNotificationType.success,\n message: getAutoplayNotificationMessages().stoppedAutoplaying,\n actionText: __('Resume'),\n actionTextActions: [\n () => {\n startAutoplay()\n },\n ],\n })\n }\n\n onMounted(() => {\n window.addEventListener('keydown', pauseAutoplayForMouseDevices)\n })\n onUnmounted(() => {\n window.removeEventListener('keydown', pauseAutoplayForMouseDevices)\n })\n\n return {\n // Overlays\n isAutoplayMenuOpen,\n\n // Autoplay\n autoplayTimer,\n isAutoplaying,\n isAutoplayPaused,\n isAutoplayLooping,\n selectedAutoplayDuration,\n computedAutoplayDurationInMs,\n\n // Event handlers\n onAutoplayLoopingToggle,\n onAutoplayDurationSelected,\n toggleAutoplay,\n startAutoplay,\n }\n}\n\ninterface IndicatorAnimationOptions {\n maxScaleValue?: number\n numStepsInScale?: number\n amountToScalePerInterval?: number\n}\n\nexport const useAutoplayWithIndicatorAnimation = ({\n // Autoplay\n currentPageIndex,\n isLastPage,\n autoplayButtonId,\n isAnyOtherOverlayOpen,\n computeAutoplayDurationInMs,\n onNext,\n onRestart,\n // Animation\n maxScaleValue = 1,\n numStepsInScale = 100,\n amountToScalePerInterval = 0.01,\n}: Omit & IndicatorAnimationOptions): AutoplayReturn & {\n indicatorTransformScaleX: Ref\n} => {\n // #region Animates the indicator bar when autoplaying\n const indicatorTransformScaleX = ref(0)\n let indicatorTransformScaleXInterval: ReturnType\n const startIndicatorTransformScaleXAnimation = (computedAutoplayDurationInMs: number): void => {\n stopIndicatorTransformScaleXAnimation()\n\n indicatorTransformScaleXInterval = setInterval(() => {\n indicatorTransformScaleX.value += amountToScalePerInterval\n if (indicatorTransformScaleX.value >= maxScaleValue) {\n stopIndicatorTransformScaleXAnimation()\n }\n }, computedAutoplayDurationInMs / numStepsInScale)\n }\n const stopIndicatorTransformScaleXAnimation = (): void => {\n clearInterval(indicatorTransformScaleXInterval)\n }\n // #endregion\n\n const autoplay = useAutoplay({\n currentPageIndex,\n isLastPage,\n autoplayButtonId,\n pauseOnOverlayOpen: true,\n isAnyOtherOverlayOpen,\n computeAutoplayDurationInMs,\n onStart: () => startIndicatorTransformScaleXAnimation(autoplay.computedAutoplayDurationInMs.value),\n onPause: stopIndicatorTransformScaleXAnimation,\n onStop: () => {\n stopIndicatorTransformScaleXAnimation()\n indicatorTransformScaleX.value = 0\n },\n onNext,\n onRestart,\n })\n\n return {\n ...autoplay,\n indicatorTransformScaleX,\n }\n}\n"],"names":["handleSetDurationType","value","emit","autoplayDurationGroup","computed","Object","keys","AUTOPLAY_DURATIONS","map","duration","text","long","checked","props","selectedAutoplayDuration","role","autoplayDescription","isAutoplayLooping","__","windowHeight","storeToRefs","useWindowSizeStore","button","ref","popover","reference","$el","floating","MAX_POPOVER_HEIGHT","floatingStyles","useFloating","middleware","shiftUpWhenOverflow","placement","referenceContainerStyles","width","offsetWidth","height","offsetHeight","useAutoplay","currentPageIndex","isLastPage","autoplayButtonId","pauseOnOverlayOpen","isAnyOtherOverlayOpen","computeAutoplayDurationInMs","onStart","onPause","onStop","onNext","onRestart","autoplayTimer","PausableTimer","globalSnackbarStore","useGlobalSnackbarStore","isAutoplayMenuOpen","isAutoplaying","isAutoplayPaused","previousAutoplayDuration","computedAutoplayDurationInMs","autoplayHandler","stopAutoplay","resetAutoplayTimer","setTimeoutDuration","setOnComplete","start","startAutoplay","isPaused","isResumed","stop","toggleAutoplay","onAutoplayLoopingToggle","onAutoplayDurationSelected","durationType","watch","onPauseWhenOverlayOpen","pause","isAnyOverlayOpen","resume","pauseAutoplayForMouseDevices","event","device","touchable","isKeydownOnAutoplayButton","document","activeElement","id","includes","key","setSnackbar","notificationType","SnackbarNotificationType","success","message","getAutoplayNotificationMessages","stoppedAutoplaying","actionText","actionTextActions","onMounted","window","addEventListener","onUnmounted","removeEventListener","useAutoplayWithIndicatorAnimation","maxScaleValue","numStepsInScale","amountToScalePerInterval","indicatorTransformScaleX","indicatorTransformScaleXInterval","startIndicatorTransformScaleXAnimation","stopIndicatorTransformScaleXAnimation","setInterval","clearInterval","autoplay"],"mappings":"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"}