41 lines
1.2 KiB
TypeScript
41 lines
1.2 KiB
TypeScript
import type { SlideRoute } from '@slidev/types'
|
|
import { slides } from '#slidev/slides'
|
|
import { computed, watch, watchEffect } from 'vue'
|
|
import { useNav } from '../composables/useNav'
|
|
import { useSlideContext } from '../context'
|
|
|
|
export { slides }
|
|
|
|
export function getSlide(no: number | string) {
|
|
return slides.value.find(
|
|
s => (s.no === +no || s.meta.slide?.frontmatter.routeAlias === no),
|
|
)
|
|
}
|
|
|
|
export function getSlidePath(
|
|
route: SlideRoute | number | string,
|
|
presenter: boolean,
|
|
exporting: boolean = false,
|
|
) {
|
|
if (typeof route === 'number' || typeof route === 'string')
|
|
route = getSlide(route)!
|
|
const no = route.meta.slide?.frontmatter.routeAlias ?? route.no
|
|
return exporting ? `/export/${no}` : presenter ? `/presenter/${no}` : `/${no}`
|
|
}
|
|
|
|
export function useIsSlideActive() {
|
|
const { $page } = useSlideContext()
|
|
const { currentSlideNo } = useNav()
|
|
return computed(() => $page.value === currentSlideNo.value)
|
|
}
|
|
|
|
export function onSlideEnter(cb: () => void) {
|
|
const isActive = useIsSlideActive()
|
|
watchEffect(() => isActive.value && cb())
|
|
}
|
|
|
|
export function onSlideLeave(cb: () => void) {
|
|
const isActive = useIsSlideActive()
|
|
watch(isActive, () => !isActive.value && cb())
|
|
}
|