Home / Function/ OrgProjectSelector() — supabase Function Reference

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}
    />
  )
}

Subdomains

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