diff --git a/components/teams/Edit.vue b/components/teams/Edit.vue
index ad705e042..d20806732 100644
--- a/components/teams/Edit.vue
+++ b/components/teams/Edit.vue
@@ -290,8 +290,22 @@ export default {
rename: null,
doneButton: 'done',
members: [],
+ membersSubject: null,
+ membersSubscription: null,
}
},
+ watch: {
+ editingteamID(teamID) {
+ team_utils.getLiveTeamMembersList(this.$apollo, teamID).then((subject) => {
+ this.membersSubject = subject
+
+ this.membersSubscription = this.membersSubject.subscribe((memberList) => {
+ console.log(memberList)
+ this.members = memberList
+ })
+ })
+ },
+ },
computed: {
editingTeamCopy() {
return this.editingTeam
diff --git a/helpers/teams/utils.js b/helpers/teams/utils.js
index 5b445e524..a214c6a6f 100644
--- a/helpers/teams/utils.js
+++ b/helpers/teams/utils.js
@@ -1,4 +1,117 @@
+import { ApolloClient } from "@apollo/client/core"
import gql from "graphql-tag"
+import { BehaviorSubject } from "rxjs"
+
+/**
+ * Returns an observable list of team members in the given Team
+ *
+ * @param {ApolloClient} apollo - Instance of ApolloClient
+ * @param {string} teamID - ID of the team to observe
+ *
+ * @returns {{user: {uid: string, email: string}, role: 'OWNER' | 'EDITOR' | 'VIEWER'}}
+ */
+export async function getLiveTeamMembersList(apollo, teamID) {
+ const subject = new BehaviorSubject([])
+
+ const { data } = await apollo.query({
+ query: gql`
+ query GetTeamMembers($teamID: String!) {
+ team(teamID: $teamID) {
+ members {
+ user {
+ uid
+ email
+ }
+ role
+ }
+ }
+ }
+ `,
+ variables: {
+ teamID,
+ },
+ })
+
+ debugger
+ subject.next(data.team.members)
+
+ const addedSub = apollo
+ .subscribe({
+ query: gql`
+ subscription TeamMemberAdded($teamID: String!) {
+ teamMemberAdded(teamID: $teamID) {
+ user {
+ uid
+ email
+ }
+ role
+ }
+ }
+ `,
+ variables: {
+ teamID,
+ },
+ })
+ .subscribe(({ data }) => {
+ subject.next([...subject.value, data.teamMemberAdded])
+ })
+
+ const updateSub = apollo
+ .subscribe({
+ query: gql`
+ subscription TeamMemberUpdated($teamID: String!) {
+ teamMemberUpdated(teamID: $teamID) {
+ user {
+ uid
+ email
+ }
+ role
+ }
+ }
+ `,
+ variables: {
+ teamID,
+ },
+ })
+ .subscribe(({ data }) => {
+ const val = subject.value.find(
+ (member) => member.user.uid === data.teamMemberUpdated.user.uid
+ )
+
+ if (!val) return
+
+ Object.assign(val, data.teamMemberUpdated)
+ })
+
+ const removeSub = apollo
+ .subscribe({
+ query: gql`
+ subscription TeamMemberRemoved($teamID: String!) {
+ teamMemberRemoved(teamID: $teamID)
+ }
+ `,
+ variables: {
+ teamID,
+ },
+ })
+ .subscribe(({ data }) => {
+ subject.next(
+ subject.value.filter((member) => member.user.uid !== data.teamMemberAdded.user.uid)
+ )
+ })
+
+ const mainSub = subject.subscribe({
+ complete() {
+ addedSub.unsubscribe()
+ updateSub.unsubscribe()
+ removeSub.unsubscribe()
+
+ mainSub.unsubscribe()
+ },
+ })
+
+ return subject
+}
export async function createTeam(apollo, name) {
return apollo.mutate({