OrganizationInvite.utils.ts 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. import type { OrganizationInviteByToken } from '@/data/organization-members/organization-invitation-token-query'
  2. import type { ResponseError } from '@/types'
  3. type OrganizationInviteStatusVariables = {
  4. data?: OrganizationInviteByToken
  5. error?: ResponseError | null
  6. isErrorInvitation: boolean
  7. isLoadingInvitation: boolean
  8. isLoadingProfile: boolean
  9. isLoggedIn: boolean
  10. isRouterReady: boolean
  11. isSuccessInvitation: boolean
  12. profileExists: boolean
  13. }
  14. type OrganizationInviteContentVariables = {
  15. data?: OrganizationInviteByToken
  16. isSignUpEnabled: boolean
  17. status: OrganizationInviteStatus
  18. }
  19. export type OrganizationInviteStatus =
  20. | 'signed-out'
  21. | 'loading'
  22. | 'ready'
  23. | 'wrong-account'
  24. | 'expired'
  25. | 'invalid'
  26. | 'no-longer-valid'
  27. | 'error'
  28. export function getOrganizationInviteStatus({
  29. data,
  30. error,
  31. isErrorInvitation,
  32. isLoadingInvitation,
  33. isLoadingProfile,
  34. isLoggedIn,
  35. isRouterReady,
  36. isSuccessInvitation,
  37. profileExists,
  38. }: OrganizationInviteStatusVariables): OrganizationInviteStatus {
  39. const isSignedOut = !isLoggedIn || (!profileExists && !isLoadingProfile)
  40. if (isSignedOut) return 'signed-out'
  41. if (isLoadingProfile || isLoadingInvitation || !isRouterReady) return 'loading'
  42. if (error?.code === 401 && error?.message.includes('Failed to retrieve organization')) {
  43. return 'no-longer-valid'
  44. }
  45. if (
  46. (isSuccessInvitation && !!data?.token_does_not_exist) ||
  47. (isErrorInvitation && error?.code === 404)
  48. ) {
  49. return 'invalid'
  50. }
  51. if (isErrorInvitation) return 'error'
  52. if (isSuccessInvitation && !!data?.expired_token) return 'expired'
  53. if (isSuccessInvitation && !!data && !data.email_match) return 'wrong-account'
  54. return 'ready'
  55. }
  56. export function getOrganizationInviteContent({
  57. data,
  58. isSignUpEnabled,
  59. status,
  60. }: OrganizationInviteContentVariables) {
  61. const signedOutDescription = `Sign in${
  62. isSignUpEnabled ? ' or create an account' : ''
  63. } to view this invitation`
  64. if (status === 'signed-out') {
  65. return {
  66. title: 'View invitation',
  67. description: signedOutDescription,
  68. }
  69. }
  70. if (status === 'ready') {
  71. return {
  72. title: `Join ${data?.organization_name ?? 'an organization'}`,
  73. description: 'You have been invited to join this Briven organization',
  74. }
  75. }
  76. if (status === 'wrong-account') return { title: 'Wrong account' }
  77. if (status === 'expired') return { title: 'Invite expired' }
  78. if (status === 'invalid') return { title: 'Invite invalid' }
  79. if (status === 'no-longer-valid') return { title: 'Invite no longer available' }
  80. if (status === 'error') return { title: 'Unable to load invitation' }
  81. return {}
  82. }