/
projectMembersStore.ts
120 lines (95 loc) · 3.54 KB
/
projectMembersStore.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
// Copyright (C) 2023 Storj Labs, Inc.
// See LICENSE for copying information.
import { reactive } from 'vue';
import { defineStore } from 'pinia';
import {
ProjectMember,
ProjectMemberCursor,
ProjectMemberItemModel,
ProjectMemberOrderBy,
ProjectMembersApi,
ProjectMembersPage,
} from '@/types/projectMembers';
import { ProjectMembersApiGql } from '@/api/projectMembers';
import { SortDirection } from '@/types/common';
import { DEFAULT_PAGE_LIMIT } from '@/types/pagination';
export class ProjectMembersState {
public cursor: ProjectMemberCursor = new ProjectMemberCursor();
public page: ProjectMembersPage = new ProjectMembersPage();
public selectedProjectMembersEmails: string[] = [];
}
export const useProjectMembersStore = defineStore('projectMembers', () => {
const state = reactive<ProjectMembersState>(new ProjectMembersState());
const api: ProjectMembersApi = new ProjectMembersApiGql();
async function inviteMembers(emails: string[], projectID: string): Promise<void> {
await api.invite(projectID, emails);
}
async function deleteProjectMembers(projectID: string): Promise<void> {
await api.delete(projectID, state.selectedProjectMembersEmails);
clearProjectMemberSelection();
}
async function getProjectMembers(page: number, projectID: string, limit = DEFAULT_PAGE_LIMIT): Promise<ProjectMembersPage> {
state.cursor.page = page;
state.cursor.limit = limit;
const projectMembersPage: ProjectMembersPage = await api.get(projectID, state.cursor);
state.page = projectMembersPage;
state.page.getAllItems().forEach(item => {
item.setSelected(state.selectedProjectMembersEmails.includes(item.getEmail()));
});
return projectMembersPage;
}
function setPage(page: ProjectMembersPage) {
state.page = page;
}
function setPageNumber(page: number) {
state.cursor.page = page;
}
function setSearchQuery(search: string) {
state.cursor.search = search;
}
function getSearchQuery() {
return state.cursor.search;
}
function setSortingBy(order: ProjectMemberOrderBy) {
state.cursor.order = order;
}
function setSortingDirection(direction: SortDirection) {
state.cursor.orderDirection = direction;
}
function toggleProjectMemberSelection(projectMember: ProjectMemberItemModel) {
const email = projectMember.getEmail();
if (!state.selectedProjectMembersEmails.includes(email)) {
projectMember.setSelected(true);
state.selectedProjectMembersEmails.push(email);
return;
}
projectMember.setSelected(false);
state.selectedProjectMembersEmails = state.selectedProjectMembersEmails.filter(projectMemberEmail => {
return projectMemberEmail !== email;
});
}
function clearProjectMemberSelection() {
state.selectedProjectMembersEmails = [];
state.page.getAllItems().forEach(member => member.setSelected(false));
}
function clear() {
state.cursor = new ProjectMemberCursor();
state.page = new ProjectMembersPage();
state.selectedProjectMembersEmails = [];
}
return {
state,
inviteMembers,
deleteProjectMembers,
getProjectMembers,
setSearchQuery,
getSearchQuery,
setSortingBy,
setSortingDirection,
setPage,
setPageNumber,
toggleProjectMemberSelection,
clearProjectMemberSelection,
clear,
};
});