123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576 |
- import gql from "graphql-tag"
- import { BehaviorSubject } from "rxjs"
- /**
- * Returns an observable list of team members in the given Team
- *
- * @param {ApolloClient<any>} 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,
- },
- })
- 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 function createTeam(apollo, name) {
- return apollo.mutate({
- mutation: gql`
- mutation ($name: String!) {
- createTeam(name: $name) {
- name
- }
- }
- `,
- variables: {
- name,
- },
- })
- }
- export function addTeamMemberByEmail(apollo, userRole, userEmail, teamID) {
- return apollo.mutate({
- mutation: gql`
- mutation addTeamMemberByEmail(
- $userRole: TeamMemberRole!
- $userEmail: String!
- $teamID: String!
- ) {
- addTeamMemberByEmail(
- userRole: $userRole
- userEmail: $userEmail
- teamID: $teamID
- ) {
- role
- }
- }
- `,
- variables: {
- userRole,
- userEmail,
- teamID,
- },
- })
- }
- export function updateTeamMemberRole(apollo, userID, newRole, teamID) {
- return apollo.mutate({
- mutation: gql`
- mutation updateTeamMemberRole(
- $newRole: TeamMemberRole!
- $userUid: String!
- $teamID: String!
- ) {
- updateTeamMemberRole(
- newRole: $newRole
- userUid: $userUid
- teamID: $teamID
- ) {
- role
- }
- }
- `,
- variables: {
- newRole,
- userUid: userID,
- teamID,
- },
- })
- }
- export function renameTeam(apollo, name, teamID) {
- return apollo.mutate({
- mutation: gql`
- mutation renameTeam($newName: String!, $teamID: String!) {
- renameTeam(newName: $newName, teamID: $teamID) {
- id
- }
- }
- `,
- variables: {
- newName: name,
- teamID,
- },
- })
- }
- export function removeTeamMember(apollo, userID, teamID) {
- return apollo.mutate({
- mutation: gql`
- mutation removeTeamMember($userUid: String!, $teamID: String!) {
- removeTeamMember(userUid: $userUid, teamID: $teamID)
- }
- `,
- variables: {
- userUid: userID,
- teamID,
- },
- })
- }
- export async function deleteTeam(apollo, teamID) {
- let response
- while (true) {
- response = await apollo.mutate({
- mutation: gql`
- mutation ($teamID: String!) {
- deleteTeam(teamID: $teamID)
- }
- `,
- variables: {
- teamID,
- },
- })
- if (response !== undefined) break
- }
- return response
- }
- export function exitTeam(apollo, teamID) {
- return apollo.mutate({
- mutation: gql`
- mutation ($teamID: String!) {
- leaveTeam(teamID: $teamID)
- }
- `,
- variables: {
- teamID,
- },
- })
- }
- export async function rootCollectionsOfTeam(apollo, teamID) {
- const collections = []
- let cursor = ""
- while (true) {
- const response = await apollo.query({
- query: gql`
- query rootCollectionsOfTeam($teamID: String!, $cursor: String!) {
- rootCollectionsOfTeam(teamID: $teamID, cursor: $cursor) {
- id
- title
- }
- }
- `,
- variables: {
- teamID,
- cursor,
- },
- fetchPolicy: "no-cache",
- })
- if (response.data.rootCollectionsOfTeam.length === 0) break
- response.data.rootCollectionsOfTeam.forEach((collection) => {
- collections.push(collection)
- })
- cursor = collections[collections.length - 1].id
- }
- return collections
- }
- export async function getCollectionChildren(apollo, collectionID) {
- const children = []
- const response = await apollo.query({
- query: gql`
- query getCollectionChildren($collectionID: String!) {
- collection(collectionID: $collectionID) {
- children {
- id
- title
- }
- }
- }
- `,
- variables: {
- collectionID,
- },
- fetchPolicy: "no-cache",
- })
- response.data.collection.children.forEach((child) => {
- children.push(child)
- })
- return children
- }
- export async function getCollectionRequests(apollo, collectionID) {
- const requests = []
- let cursor = ""
- while (true) {
- const response = await apollo.query({
- query: gql`
- query getCollectionRequests($collectionID: String!, $cursor: String) {
- requestsInCollection(collectionID: $collectionID, cursor: $cursor) {
- id
- title
- request
- }
- }
- `,
- variables: {
- collectionID,
- cursor,
- },
- fetchPolicy: "no-cache",
- })
- response.data.requestsInCollection.forEach((request) => {
- requests.push(request)
- })
- if (response.data.requestsInCollection.length < 10) {
- break
- }
- cursor = requests[requests.length - 1].id
- }
- return requests
- }
- export async function renameCollection(apollo, title, id) {
- let response
- while (true) {
- response = await apollo.mutate({
- mutation: gql`
- mutation ($newTitle: String!, $collectionID: String!) {
- renameCollection(newTitle: $newTitle, collectionID: $collectionID) {
- id
- }
- }
- `,
- variables: {
- newTitle: title,
- collectionID: id,
- },
- })
- if (response !== undefined) break
- }
- return response
- }
- export async function updateRequest(apollo, request, requestName, requestID) {
- let response
- while (true) {
- response = await apollo.mutate({
- mutation: gql`
- mutation ($data: UpdateTeamRequestInput!, $requestID: String!) {
- updateRequest(data: $data, requestID: $requestID) {
- id
- }
- }
- `,
- variables: {
- data: {
- request: JSON.stringify(request),
- title: requestName,
- },
- requestID,
- },
- })
- if (response !== undefined) break
- }
- return response
- }
- export async function addChildCollection(apollo, title, id) {
- let response
- while (true) {
- response = await apollo.mutate({
- mutation: gql`
- mutation ($childTitle: String!, $collectionID: String!) {
- createChildCollection(
- childTitle: $childTitle
- collectionID: $collectionID
- ) {
- id
- }
- }
- `,
- variables: {
- childTitle: title,
- collectionID: id,
- },
- })
- if (response !== undefined) break
- }
- return response
- }
- export async function deleteCollection(apollo, id) {
- let response
- while (true) {
- response = await apollo.mutate({
- mutation: gql`
- mutation ($collectionID: String!) {
- deleteCollection(collectionID: $collectionID)
- }
- `,
- variables: {
- collectionID: id,
- },
- })
- if (response !== undefined) break
- }
- return response
- }
- export async function deleteRequest(apollo, requestID) {
- let response
- while (true) {
- response = await apollo.mutate({
- mutation: gql`
- mutation ($requestID: String!) {
- deleteRequest(requestID: $requestID)
- }
- `,
- variables: {
- requestID,
- },
- })
- if (response !== undefined) break
- }
- return response
- }
- export async function createNewRootCollection(apollo, title, id) {
- let response
- while (true) {
- response = await apollo.mutate({
- mutation: gql`
- mutation ($title: String!, $teamID: String!) {
- createRootCollection(title: $title, teamID: $teamID) {
- id
- }
- }
- `,
- variables: {
- title,
- teamID: id,
- },
- })
- if (response !== undefined) break
- }
- return response
- }
- export async function saveRequestAsTeams(
- apollo,
- request,
- title,
- teamID,
- collectionID
- ) {
- const x = await apollo.mutate({
- mutation: gql`
- mutation ($data: CreateTeamRequestInput!, $collectionID: String!) {
- createRequestInCollection(data: $data, collectionID: $collectionID) {
- id
- collection {
- id
- team {
- id
- name
- }
- }
- }
- }
- `,
- variables: {
- collectionID,
- data: {
- teamID,
- title,
- request,
- },
- },
- })
- return x.data?.createRequestInCollection
- }
- export async function overwriteRequestTeams(apollo, request, title, requestID) {
- await apollo.mutate({
- mutation: gql`
- mutation updateRequest(
- $data: UpdateTeamRequestInput!
- $requestID: String!
- ) {
- updateRequest(data: $data, requestID: $requestID) {
- id
- title
- }
- }
- `,
- variables: {
- requestID,
- data: {
- request,
- title,
- },
- },
- })
- }
- export async function importFromMyCollections(apollo, collectionID, teamID) {
- const response = await apollo.mutate({
- mutation: gql`
- mutation importFromMyCollections(
- $fbCollectionPath: String!
- $teamID: String!
- ) {
- importCollectionFromUserFirestore(
- fbCollectionPath: $fbCollectionPath
- teamID: $teamID
- ) {
- id
- title
- }
- }
- `,
- variables: {
- fbCollectionPath: collectionID,
- teamID,
- },
- })
- return response.data != null
- }
- export async function importFromJSON(apollo, collections, teamID) {
- const response = await apollo.mutate({
- mutation: gql`
- mutation importFromJSON($jsonString: String!, $teamID: String!) {
- importCollectionsFromJSON(jsonString: $jsonString, teamID: $teamID)
- }
- `,
- variables: {
- jsonString: JSON.stringify(collections),
- teamID,
- },
- })
- return response.data != null
- }
- export async function replaceWithJSON(apollo, collections, teamID) {
- const response = await apollo.mutate({
- mutation: gql`
- mutation replaceWithJSON($jsonString: String!, $teamID: String!) {
- replaceCollectionsWithJSON(jsonString: $jsonString, teamID: $teamID)
- }
- `,
- variables: {
- jsonString: JSON.stringify(collections),
- teamID,
- },
- })
- return response.data != null
- }
- export async function exportAsJSON(apollo, teamID) {
- const response = await apollo.query({
- query: gql`
- query exportAsJSON($teamID: String!) {
- exportCollectionsToJSON(teamID: $teamID)
- }
- `,
- variables: {
- teamID,
- },
- })
- return response.data.exportCollectionsToJSON
- }
|