mirror of
https://github.com/CompassConnections/Compass.git
synced 2026-01-06 12:57:51 -05:00
96 lines
2.3 KiB
TypeScript
96 lines
2.3 KiB
TypeScript
'use client'
|
|
import { PrivateUser, User } from 'common/user'
|
|
import { useContext, useEffect, useState } from 'react'
|
|
import { AuthContext } from 'web/components/auth-context'
|
|
import { useIsPageVisible } from './use-page-visible'
|
|
import { useApiSubscription } from './use-api-subscription'
|
|
import { getFullUserById, getPrivateUserSafe } from 'web/lib/supabase/users'
|
|
|
|
export const useUser = () => {
|
|
const authUser = useContext(AuthContext)
|
|
return authUser ? authUser.user : authUser
|
|
}
|
|
|
|
export const usePrivateUser = () => {
|
|
const authUser = useContext(AuthContext)
|
|
return authUser ? authUser.privateUser : authUser
|
|
}
|
|
|
|
export const useIsAuthorized = () => {
|
|
const authUser = useContext(AuthContext)
|
|
return authUser?.authLoaded || authUser === null ? !!authUser : undefined
|
|
}
|
|
|
|
export const useWebsocketUser = (userId: string | undefined) => {
|
|
const [user, setUser] = useState<User | null | undefined>()
|
|
|
|
const isPageVisible = useIsPageVisible()
|
|
|
|
useApiSubscription({
|
|
topics: [`user/${userId ?? '_'}`],
|
|
onBroadcast: ({ data }) => {
|
|
console.debug(data)
|
|
setUser((user) => {
|
|
if (!user || !data.user) {
|
|
return user
|
|
} else {
|
|
return {
|
|
...user,
|
|
...(data.user as Partial<User>),
|
|
}
|
|
}
|
|
})
|
|
},
|
|
})
|
|
|
|
useEffect(() => {
|
|
if (!isPageVisible) return
|
|
|
|
if (userId) {
|
|
getFullUserById(userId).then((result) => {
|
|
setUser(result)
|
|
})
|
|
} else {
|
|
setUser(null)
|
|
}
|
|
}, [userId, isPageVisible])
|
|
|
|
return user
|
|
}
|
|
|
|
export const useWebsocketPrivateUser = (userId: string | undefined) => {
|
|
const [privateUser, setPrivateUser] = useState<
|
|
PrivateUser | null | undefined
|
|
>()
|
|
|
|
useApiSubscription({
|
|
topics: [`private-user/${userId ?? '_'}`],
|
|
onBroadcast: () => {
|
|
getPrivateUserSafe().then((result) => {
|
|
if (result) {
|
|
setPrivateUser(result)
|
|
}
|
|
})
|
|
},
|
|
})
|
|
|
|
useEffect(() => {
|
|
if (userId) {
|
|
getPrivateUserSafe().then((result) => setPrivateUser(result))
|
|
} else {
|
|
setPrivateUser(null)
|
|
}
|
|
}, [userId])
|
|
return privateUser
|
|
}
|
|
|
|
export const isBlocked = (
|
|
privateUser: PrivateUser | null | undefined,
|
|
otherUserId: string
|
|
) => {
|
|
return (
|
|
privateUser?.blockedUserIds.includes(otherUserId) ||
|
|
privateUser?.blockedByUserIds.includes(otherUserId)
|
|
)
|
|
}
|