useFlyDeprecationProjects.ts 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. import { useOrgProjectsInfiniteQuery } from '@/data/projects/org-projects-infinite-query'
  2. import { useSelectedOrganizationQuery } from '@/hooks/misc/useSelectedOrganization'
  3. import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject'
  4. import { PROVIDERS } from '@/lib/constants/infrastructure'
  5. export interface FlyDeprecationProject {
  6. ref: string
  7. name: string
  8. orgSlug: string
  9. orgName: string
  10. }
  11. export function useFlyDeprecationProjects({ enabled }: { enabled: boolean }) {
  12. const { data: selectedProject } = useSelectedProjectQuery()
  13. const { data: selectedOrg } = useSelectedOrganizationQuery()
  14. const orgSlug = selectedOrg?.slug
  15. const orgName = selectedOrg?.name ?? ''
  16. const { data: orgProjectsData, isFetched } = useOrgProjectsInfiniteQuery(
  17. { slug: orgSlug },
  18. { enabled: enabled && Boolean(orgSlug), staleTime: 30 * 60 * 1000 }
  19. )
  20. if (!enabled || !orgSlug) {
  21. return { isReady: false, primaries: [], branches: [] }
  22. }
  23. const byRef = new Map<string, FlyDeprecationProject & { isBranch: boolean }>()
  24. if (selectedProject?.cloud_provider === PROVIDERS.FLY.id) {
  25. byRef.set(selectedProject.ref, {
  26. ref: selectedProject.ref,
  27. name: selectedProject.name,
  28. orgSlug,
  29. orgName,
  30. isBranch: Boolean(selectedProject.parent_project_ref),
  31. })
  32. }
  33. const orgProjects = orgProjectsData?.pages.flatMap((page) => page.projects) ?? []
  34. for (const p of orgProjects) {
  35. if (p.cloud_provider !== PROVIDERS.FLY.id) continue
  36. if (byRef.has(p.ref)) continue
  37. byRef.set(p.ref, {
  38. ref: p.ref,
  39. name: p.name,
  40. orgSlug,
  41. orgName,
  42. isBranch: Boolean(p.is_branch),
  43. })
  44. }
  45. const all = Array.from(byRef.values())
  46. const primaries: FlyDeprecationProject[] = []
  47. const branches: FlyDeprecationProject[] = []
  48. for (const { isBranch, ...rest } of all) {
  49. ;(isBranch ? branches : primaries).push(rest)
  50. }
  51. return { isReady: isFetched, primaries, branches }
  52. }