import type { TrackReference, TrackReferenceOrPlaceholder } from '@livekit/components-core'; import { inject, MaybeRef, provide, computed, shallowRef, toValue, type InjectionKey, type ShallowRef, } from 'vue'; export type TrackRefContext = ShallowRef; const TrackRefContextKey: InjectionKey = Symbol('livekit-track-ref-context'); function useProvideTrackRefContext( ref: TrackReference | TrackReferenceOrPlaceholder, ): TrackRefContext { const context = shallowRef(ref); provide(TrackRefContextKey, context); return context; } function useTrackRefContextRaw(): TrackRefContext | undefined { return inject(TrackRefContextKey, undefined); } export { useProvideTrackRefContext, useTrackRefContextRaw }; export function useMaybeTrackRefContext(): TrackRefContext | undefined { try { return useTrackRefContextRaw(); } catch { return undefined; } } export function useTrackRefContext(): TrackRefContext { const context = useMaybeTrackRefContext(); if (!context) { throw new Error('Please call `useProvideTrackRefContext` on the appropriate parent component'); } return context; } export function useEnsureTrackRef(trackRef?: MaybeRef) { const ctx = useMaybeTrackRefContext(); const ref = computed(() => toValue(trackRef) ?? toValue(ctx)); if (!ref.value) { throw new Error( 'No TrackRef, make sure you are inside a TrackRefContext or pass the TrackRef explicitly', ); } return ref as ShallowRef; }