index.vue 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  1. <template>
  2. <AppSection label="teams">
  3. <h4 class="text-secondaryDark">
  4. {{ $t("team.title") }}
  5. </h4>
  6. <div class="mt-1 text-secondaryLight">
  7. <SmartAnchor
  8. :label="`${$t('team.join_beta')}`"
  9. to="https://hoppscotch.io/beta"
  10. blank
  11. class="link"
  12. />
  13. </div>
  14. <div class="space-y-4 mt-4">
  15. <ButtonSecondary
  16. :label="`${$t('team.create_new')}`"
  17. outline
  18. @click.native="displayModalAdd(true)"
  19. />
  20. <div
  21. v-if="myTeams.loading"
  22. class="flex flex-col items-center justify-center"
  23. >
  24. <SmartSpinner class="mb-4" />
  25. <span class="text-secondaryLight">{{ $t("state.loading") }}</span>
  26. </div>
  27. <div
  28. v-if="
  29. !myTeams.loading &&
  30. E.isRight(myTeams.data) &&
  31. myTeams.data.right.myTeams.length === 0
  32. "
  33. class="flex items-center"
  34. >
  35. <i class="mr-4 material-icons">help_outline</i>
  36. {{ $t("empty.teams") }}
  37. </div>
  38. <div
  39. v-else-if="!myTeams.loading && E.isRight(myTeams.data)"
  40. class="grid gap-4 sm:grid-cols-2 md:grid-cols-3"
  41. >
  42. <TeamsTeam
  43. v-for="(team, index) in myTeams.data.right.myTeams"
  44. :key="`team-${String(index)}`"
  45. :team-i-d="team.id"
  46. :team="team"
  47. @edit-team="editTeam(team, team.id)"
  48. />
  49. </div>
  50. </div>
  51. <TeamsAdd :show="showModalAdd" @hide-modal="displayModalAdd(false)" />
  52. <!-- ¯\_(ツ)_/¯ -->
  53. <TeamsEdit
  54. v-if="
  55. !myTeams.loading &&
  56. E.isRight(myTeams.data) &&
  57. myTeams.data.right.myTeams.length > 0
  58. "
  59. :team="myTeams.data.right.myTeams[0]"
  60. :show="showModalEdit"
  61. :editing-team="editingTeam"
  62. :editingteam-i-d="editingTeamID"
  63. @hide-modal="displayModalEdit(false)"
  64. />
  65. </AppSection>
  66. </template>
  67. <script setup lang="ts">
  68. import { gql } from "@apollo/client/core"
  69. import { ref, watchEffect } from "@nuxtjs/composition-api"
  70. import * as E from "fp-ts/Either"
  71. import { useGQLQuery } from "~/helpers/backend/GQLClient"
  72. import { MyTeamsQueryError } from "~/helpers/backend/QueryErrors"
  73. import { TeamMemberRole } from "~/helpers/backend/types/TeamMemberRole"
  74. const showModalAdd = ref(false)
  75. const showModalEdit = ref(false)
  76. const editingTeam = ref<any>({}) // TODO: Check this out
  77. const editingTeamID = ref<any>("")
  78. const myTeams = useGQLQuery<
  79. {
  80. myTeams: Array<{
  81. id: string
  82. name: string
  83. myRole: TeamMemberRole
  84. ownersCount: number
  85. members: Array<{
  86. user: {
  87. photoURL: string | null
  88. displayName: string
  89. email: string
  90. uid: string
  91. }
  92. role: TeamMemberRole
  93. }>
  94. }>
  95. },
  96. MyTeamsQueryError
  97. >(
  98. gql`
  99. query GetMyTeams {
  100. myTeams {
  101. id
  102. name
  103. myRole
  104. ownersCount
  105. members {
  106. user {
  107. photoURL
  108. displayName
  109. email
  110. uid
  111. }
  112. role
  113. }
  114. }
  115. }
  116. `
  117. )
  118. watchEffect(() => {
  119. console.log(myTeams)
  120. })
  121. const displayModalAdd = (shouldDisplay: boolean) => {
  122. showModalAdd.value = shouldDisplay
  123. }
  124. const displayModalEdit = (shouldDisplay: boolean) => {
  125. showModalEdit.value = shouldDisplay
  126. if (!shouldDisplay) resetSelectedData()
  127. }
  128. const editTeam = (team: any, teamID: any) => {
  129. editingTeam.value = team
  130. editingTeamID.value = teamID
  131. displayModalEdit(true)
  132. }
  133. const resetSelectedData = () => {
  134. editingTeam.value = undefined
  135. editingTeamID.value = undefined
  136. }
  137. </script>