mirror of
https://github.com/supabase/supabase.git
synced 2026-10-18 07:39:07 +03:00
* chore: cleanup packages - Avoid circular imports - Export API-types as types - pg-format without depending on Node internal Buffer (not browser-compatible) - Avoid importing from barrel files in ui dir * chore: avoid barrel file imports in studio (#27771) * chore: avoid barrel file imports - Removes some unused imports - Avoids barrel file import for faster builds + less memory * add eslint rule * type fixes * delete layouts barrel * delete components/grid barrel file * delete components/grid/utils barrel file * delete components/grid/components/common barrel file * delete components/grid/components/editor barrel file * delete components/grid/components/formatter barrel file * delete components/grid/components/grid barrel file * delete components/grid/components/header/filter barrel file * remote components/grid/store barrel file * remove components/interfaces/Auth/Policies barrel file * delete components/interfaces/Settings/Logs barrel file * delete components/ui/CodeEditor barrel file * delete components/ui/Forms barrel file * delete components/ui/Shimmers barrel file * delete data/analytics barrel file * delete hooks barrel file * cleanup lib/common/fetch barrel file * final * barral files cleanup * global react-data-grid styles * remove console.log --------- Co-authored-by: Kevin Grüneberg <k.grueneberg1994@gmail.com> * fix build --------- Co-authored-by: Kevin Grüneberg <k.grueneberg1994@gmail.com>
67 lines
2.2 KiB
TypeScript
67 lines
2.2 KiB
TypeScript
import { PropsWithChildren, createContext, useCallback, useContext, useEffect } from 'react'
|
|
import { proxy, snapshot, subscribe, useSnapshot } from 'valtio'
|
|
|
|
import { useConstant } from 'common'
|
|
import useLatest from 'hooks/misc/useLatest'
|
|
import { ImpersonationRole } from 'lib/role-impersonation'
|
|
|
|
export function createRoleImpersonationState() {
|
|
const roleImpersonationState = proxy({
|
|
role: undefined as ImpersonationRole | undefined,
|
|
setRole: (role: ImpersonationRole | undefined) => {
|
|
roleImpersonationState.role = role
|
|
},
|
|
})
|
|
|
|
return roleImpersonationState
|
|
}
|
|
|
|
export type RoleImpersonationState = ReturnType<typeof createRoleImpersonationState>
|
|
|
|
export const RoleImpersonationStateContext = createContext<RoleImpersonationState>(
|
|
createRoleImpersonationState()
|
|
)
|
|
|
|
export const RoleImpersonationStateContextProvider = ({ children }: PropsWithChildren) => {
|
|
const state = useConstant(createRoleImpersonationState)
|
|
|
|
return (
|
|
<RoleImpersonationStateContext.Provider value={state}>
|
|
{children}
|
|
</RoleImpersonationStateContext.Provider>
|
|
)
|
|
}
|
|
|
|
export function useRoleImpersonationStateSnapshot(options?: Parameters<typeof useSnapshot>[1]) {
|
|
const roleImpersonationState = useContext(RoleImpersonationStateContext)
|
|
|
|
return useSnapshot(roleImpersonationState, options)
|
|
}
|
|
|
|
export function useGetImpersonatedRole() {
|
|
const roleImpersonationState = useContext(RoleImpersonationStateContext)
|
|
|
|
return useCallback(() => snapshot(roleImpersonationState).role, [roleImpersonationState])
|
|
}
|
|
|
|
export function useSubscribeToImpersonatedRole(
|
|
onChange: (role: ImpersonationRole | undefined) => void
|
|
) {
|
|
const roleImpersonationState = useContext(RoleImpersonationStateContext)
|
|
const onChangeRef = useLatest(onChange)
|
|
|
|
useEffect(() => {
|
|
return subscribe(roleImpersonationState, () => {
|
|
onChangeRef.current(snapshot(roleImpersonationState).role)
|
|
})
|
|
}, [roleImpersonationState])
|
|
}
|
|
|
|
export function isRoleImpersonationEnabled(impersonationRole?: ImpersonationRole) {
|
|
return impersonationRole?.type === 'postgrest'
|
|
}
|
|
|
|
export function useIsRoleImpersonationEnabled() {
|
|
return isRoleImpersonationEnabled(useRoleImpersonationStateSnapshot().role)
|
|
}
|