(props, { attrs, emit, slots })
| 102 | }, |
| 103 | |
| 104 | setup (props, { attrs, emit, slots }) { |
| 105 | const { themeClasses } = provideTheme(props) |
| 106 | const { densityClasses } = useDensity(props) |
| 107 | const { dimensionStyles } = useDimension(props) |
| 108 | const { elevationClasses } = useElevation(props) |
| 109 | const { ssr } = useDisplay() |
| 110 | |
| 111 | const roundedForContainer = toRef(() => Array.isArray(props.rounded) ? props.rounded[0] : props.rounded) |
| 112 | const roundedForControls = toRef(() => Array.isArray(props.rounded) ? props.rounded.at(-1) : props.rounded ?? false) |
| 113 | const { roundedClasses: roundedContainerClasses, roundedStyles: roundedContainerStyles } = useRounded(roundedForContainer) |
| 114 | const { roundedClasses: roundedControlsClasses, roundedStyles: roundedControlsStyles } = useRounded(roundedForControls) |
| 115 | |
| 116 | const containerRef = ref<HTMLDivElement>() |
| 117 | const videoRef = ref<HTMLVideoElement>() |
| 118 | const controlsRef = ref<VVideoControls>() |
| 119 | |
| 120 | const playing = useProxiedModel(props, 'playing') |
| 121 | const progress = useProxiedModel(props, 'progress') |
| 122 | const volume = useProxiedModel(props, 'volume', 0, (v?: number | string) => Number(v ?? 0)) |
| 123 | |
| 124 | const fullscreen = shallowRef(false) |
| 125 | const waiting = shallowRef(false) |
| 126 | const triggered = shallowRef(false) |
| 127 | const startAfterLoad = shallowRef(false) |
| 128 | const error = useProxiedModel(props, 'error') |
| 129 | const state = shallowRef<'idle' | 'loading' | 'loaded' | 'error'>(props.autoplay ? 'loading' : 'idle') |
| 130 | const duration = shallowRef(0) |
| 131 | |
| 132 | const fullscreenEnabled = toRef(() => !props.noFullscreen && !String(attrs.controlsList ?? '').includes('nofullscreen')) |
| 133 | |
| 134 | function onTimeupdate () { |
| 135 | const { currentTime, duration } = videoRef.value! |
| 136 | progress.value = duration === 0 ? 0 : 100 * currentTime / duration |
| 137 | } |
| 138 | |
| 139 | async function onTriggered () { |
| 140 | await nextTick() |
| 141 | if (!videoRef.value) return |
| 142 | videoRef.value.addEventListener('timeupdate', onTimeupdate) |
| 143 | videoRef.value.volume = volume.value / 100 |
| 144 | if (state.value !== 'loaded') { |
| 145 | state.value = 'loading' |
| 146 | } |
| 147 | } |
| 148 | |
| 149 | function onVideoLoaded () { |
| 150 | state.value = 'loaded' |
| 151 | duration.value = videoRef.value!.duration |
| 152 | |
| 153 | const startTime = Number(props.startAt ?? 0) |
| 154 | if (startTime && startTime <= duration.value) { |
| 155 | videoRef.value!.currentTime = startTime |
| 156 | progress.value = duration.value === 0 ? 0 : 100 * startTime / duration.value |
| 157 | } |
| 158 | |
| 159 | if (startAfterLoad.value) { |
| 160 | setTimeout(() => playing.value = true, 100) |
| 161 | } |
nothing calls this directly
no test coverage detected
searching dependent graphs…