OrgProjectSelector() — supabase Function Reference
Architecture documentation for the OrgProjectSelector() function in ProjectConfigVariables.tsx from the supabase codebase.
Entity Profile
Dependency Diagram
graph TD 379c9577_c27e_ab8c_cd03_c220f0827974["OrgProjectSelector()"] 23b7acbe_3635_77a2_1239_87ad1661ea8e["useDebounce()"] 379c9577_c27e_ab8c_cd03_c220f0827974 -->|calls| 23b7acbe_3635_77a2_1239_87ad1661ea8e 328546ea_8390_1205_e0a0_db80f194a8ab["useOrganizationsQuery()"] 379c9577_c27e_ab8c_cd03_c220f0827974 -->|calls| 328546ea_8390_1205_e0a0_db80f194a8ab b510335d_4ef5_173b_d8f3_49e057a79d53["useProjectsInfiniteQuery()"] 379c9577_c27e_ab8c_cd03_c220f0827974 -->|calls| b510335d_4ef5_173b_d8f3_49e057a79d53 ee6eb3b0_c971_1fbb_bebb_32c602a24c96["toOrgProjectValue()"] 379c9577_c27e_ab8c_cd03_c220f0827974 -->|calls| ee6eb3b0_c971_1fbb_bebb_32c602a24c96 7953d7ba_a354_573a_2737_847c49589640["toDisplayNameOrgProject()"] 379c9577_c27e_ab8c_cd03_c220f0827974 -->|calls| 7953d7ba_a354_573a_2737_847c49589640 49a28a62_f6e4_17bb_f52c_25d99b997a0f["retrieve()"] 379c9577_c27e_ab8c_cd03_c220f0827974 -->|calls| 49a28a62_f6e4_17bb_f52c_25d99b997a0f 6a8ac7e0_013c_a41d_d671_f0c0576e1cd9["fromOrgProjectValue()"] 379c9577_c27e_ab8c_cd03_c220f0827974 -->|calls| 6a8ac7e0_013c_a41d_d671_f0c0576e1cd9 style 379c9577_c27e_ab8c_cd03_c220f0827974 fill:#6366f1,stroke:#818cf8,color:#fff
Relationship Graph
Source Code
apps/docs/components/ProjectConfigVariables/ProjectConfigVariables.tsx lines 92–214
function OrgProjectSelector() {
const isUserLoading = useIsUserLoading()
const isLoggedIn = useIsLoggedIn()
const [search, setSearch] = useState('')
const debouncedSearch = useDebounce(search, 500)
const { selectedOrg, selectedProject, setSelectedOrgProject } = useSnapshot(projectsStore)
const {
data: organizations,
isPending: organizationsIsPending,
isError: organizationsIsError,
} = useOrganizationsQuery({ enabled: isLoggedIn })
const {
data: projectsData,
isPending: projectsIsPending,
isError: projectsIsError,
isFetching,
isFetchingNextPage,
hasNextPage,
fetchNextPage,
} = useProjectsInfiniteQuery(
{ search: search.length === 0 ? search : debouncedSearch },
{ enabled: isLoggedIn }
)
const projects =
useMemo(() => projectsData?.pages.flatMap((page) => page.projects), [projectsData?.pages]) || []
const anyIsPending = organizationsIsPending || projectsIsPending
const anyIsError = organizationsIsError || projectsIsError
const stateSummary: ProjectOrgDataState = isUserLoading
? 'userLoading'
: !isLoggedIn
? 'loggedOut'
: anyIsPending
? 'loggedIn.dataPending'
: anyIsError
? 'loggedIn.dataError'
: projects?.length === 0
? 'loggedIn.dataSuccess.hasNoData'
: 'loggedIn.dataSuccess.hasData'
const formattedData: ComboBoxOption[] = useMemo(
() =>
stateSummary !== 'loggedIn.dataSuccess.hasData'
? []
: (projects!
.map((project) => {
const organization = organizations!.find((org) => org.id === project.organization_id)!
return {
id: project.ref,
value: toOrgProjectValue(organization, project),
displayName: toDisplayNameOrgProject(organization, project),
}
})
.filter(Boolean) as ComboBoxOption[]),
[organizations, projects, stateSummary]
)
useEffect(() => {
if (stateSummary === 'loggedIn.dataSuccess.hasData' && (!selectedOrg || !selectedProject)) {
const storedMaybeOrgId = retrieve('local', LOCAL_STORAGE_KEYS.SAVED_ORG)
const storedMaybeProjectRef = retrieve('local', LOCAL_STORAGE_KEYS.SAVED_PROJECT)
let storedOrg: Org | undefined
let storedProject: ProjectInfoInfinite | undefined
if (storedMaybeOrgId && storedMaybeProjectRef) {
storedOrg = organizations!.find((org) => org.id === Number(storedMaybeOrgId))
storedProject = projects!.find((project) => project.ref === storedMaybeProjectRef)
}
if (storedOrg && storedProject && storedProject.organization_id === storedOrg.id) {
setSelectedOrgProject(storedOrg, storedProject)
} else if (projects!.length > 0) {
const firstProject = projects![0]
const matchingOrg = organizations!.find((org) => org.id === firstProject.organization_id)
if (matchingOrg) setSelectedOrgProject(matchingOrg, firstProject)
}
}
}, [organizations, projects, selectedOrg, selectedProject, setSelectedOrgProject, stateSummary])
return (
<ComboBox
name="project"
isLoading={stateSummary === 'userLoading' || stateSummary === 'loggedIn.dataPending'}
disabled={
stateSummary === 'loggedOut' ||
stateSummary === 'loggedIn.dataError' ||
stateSummary === 'loggedIn.dataSuccess.hasNoData'
}
options={formattedData}
selectedDisplayName={
selectedOrg && selectedProject
? toDisplayNameOrgProject(selectedOrg, selectedProject)
: undefined
}
selectedOption={
selectedOrg && selectedProject ? toOrgProjectValue(selectedOrg, selectedProject) : undefined
}
onSelectOption={(optionValue) => {
const [orgId, projectRef] = fromOrgProjectValue(optionValue)
if (!orgId || !projectRef) return
const org = organizations?.find((org) => org.id === orgId)
const project = projects?.find((project) => project.ref === projectRef)
if (org && project && project.organization_id === org.id) {
setSelectedOrgProject(org, project)
}
}}
search={search}
isFetching={isFetching}
isFetchingNextPage={isFetchingNextPage}
hasNextPage={hasNextPage}
fetchNextPage={fetchNextPage}
setSearch={setSearch}
useCommandSearch={false}
/>
)
}
Domain
Subdomains
Calls
Source
Frequently Asked Questions
What does OrgProjectSelector() do?
OrgProjectSelector() is a function in the supabase codebase.
What does OrgProjectSelector() call?
OrgProjectSelector() calls 7 function(s): fromOrgProjectValue, retrieve, toDisplayNameOrgProject, toOrgProjectValue, useDebounce, useOrganizationsQuery, useProjectsInfiniteQuery.
Analyze Your Own Codebase
Get architecture documentation, dependency graphs, and domain analysis for your codebase in minutes.
Try Supermodel Free