-
-
Notifications
You must be signed in to change notification settings - Fork 2.1k
Expand file tree
/
Copy pathslides.ts
More file actions
40 lines (34 loc) · 1.33 KB
/
slides.ts
File metadata and controls
40 lines (34 loc) · 1.33 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
import type { SlideRoute } from '@slidev/types'
import { slides } from '#slidev/slides'
import { computed, watch, watchEffect } from 'vue'
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
const path = exporting ? `export/${no}` : presenter ? `presenter/${no}` : `${no}`
return `${import.meta.env.BASE_URL}${path}`
}
export function useIsSlideActive() {
const { $page, $nav } = useSlideContext()
// Use `$nav.value.currentSlideNo` rather than `useNav().currentSlideNo` to make it work in print/export mode. See https://github.com/slidevjs/slidev/issues/2310.
return computed(() => $page.value === $nav.value.currentSlideNo)
}
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())
}