63 lines
1.7 KiB
TypeScript
63 lines
1.7 KiB
TypeScript
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()
|
|
})
|
|
}
|