import { platform } from '~/platform'; import { AuthEvent, HoppUser } from '~/platform/auth'; import { Subscription } from 'rxjs'; import { onBeforeUnmount, onMounted, watch, WatchStopHandle } from 'vue'; import { useReadonlyStream } from './stream'; /** * A Vue composable function that is called when the auth status * is being updated to being logged in (fired multiple times), * this is also called on component mount if the login * was already resolved before mount. */ export function onLoggedIn(exec: (user: HoppUser) => void) { const currentUser = useReadonlyStream( platform.auth.getCurrentUserStream(), platform.auth.getCurrentUser() ); let watchStop: WatchStopHandle | null = null; onMounted(() => { if (currentUser.value) exec(currentUser.value); watchStop = watch(currentUser, (newVal, prev) => { if (prev === null && newVal !== null) { exec(newVal); } }); }); onBeforeUnmount(() => { watchStop?.(); }); } /** * A Vue composable function that calls its param function * when a new event (login, logout etc.) happens in * the auth system. * * NOTE: Unlike `onLoggedIn` for which the callback will be called once on mount with the current state, * here the callback will only be called on authentication event occurances. * You might want to check the auth state from an `onMounted` hook or something * if you want to access the initial state * * @param func A function which accepts an event */ export function onAuthEvent(func: (ev: AuthEvent) => void) { const authEvents$ = platform.auth.getAuthEventsStream(); let sub: Subscription | null = null; onMounted(() => { sub = authEvents$.subscribe((ev) => { func(ev); }); }); onBeforeUnmount(() => { sub?.unsubscribe(); }); }