workspace.ts 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. import { ProjectAPI } from '@/api';
  2. import {
  3. ActionTree, GetterTree, Module, MutationTree,
  4. } from 'vuex';
  5. import {
  6. WorkspaceState, RootState, ChangeProjectPayload, UserState,
  7. } from '../typings';
  8. const NOT_SELECT_PROJECT_HINT = '未选择项目';
  9. const EMPTY_PROJECT_LIST_HINT = '暂无项目';
  10. const NO_SUCH_PROJECT_HINT = '未知项目';
  11. const DEFAULT: WorkspaceState = {
  12. currentProjectId: -1,
  13. currentProjectMembers: [],
  14. projectList: [],
  15. };
  16. const FROM_LOCAL_STORAGE = JSON.parse(localStorage.getItem('workspace') || '{}');
  17. const INIT = Object.keys(FROM_LOCAL_STORAGE).length > 0 ? FROM_LOCAL_STORAGE : DEFAULT;
  18. const actions: ActionTree<WorkspaceState, RootState> = {
  19. clearWorkspace({ commit }) {
  20. commit('updateProjectList', []);
  21. commit('changeProject', { projectId: -1 });
  22. commit('updateMembers', []);
  23. },
  24. async refreshProjectList({ commit }) {
  25. const projectList = (await ProjectAPI.getProjectListByUserId()) || [];
  26. commit('updateProjectList', projectList);
  27. },
  28. async changeProject({ commit }, payload: ChangeProjectPayload) {
  29. const members = (await ProjectAPI.getProjectMembersByProjectId(payload.projectId)) || [];
  30. commit('updateMembers', members);
  31. commit('changeProject', payload);
  32. },
  33. resetCurrentProject({ commit }) {
  34. commit('changeProject', { projectId: -1 });
  35. },
  36. };
  37. const mutations: MutationTree<WorkspaceState> = {
  38. updateMembers(state, payload: Array<UserState>) {
  39. state.currentProjectMembers = payload;
  40. },
  41. updateProjectList(state, payload: Array<Project>) {
  42. state.projectList = payload;
  43. },
  44. changeProject(state, { projectId }: ChangeProjectPayload) {
  45. state.currentProjectId = projectId;
  46. },
  47. };
  48. const getters: GetterTree<WorkspaceState, RootState> = {
  49. currentProjectInfo(state) {
  50. if (state.projectList.length === 0) {
  51. return {
  52. id: -1,
  53. name: EMPTY_PROJECT_LIST_HINT,
  54. };
  55. }
  56. if (state.currentProjectId === -1) {
  57. return {
  58. id: -1,
  59. name: NOT_SELECT_PROJECT_HINT,
  60. };
  61. }
  62. const currentProjectInfo = Array.prototype.find.call(state.projectList, (project) => project.id === state.currentProjectId);
  63. return currentProjectInfo || {
  64. id: -1,
  65. name: NO_SUCH_PROJECT_HINT,
  66. };
  67. },
  68. userOptions(state) {
  69. return state.currentProjectMembers.map((user) => ({
  70. label: user.username,
  71. value: user.id,
  72. }));
  73. },
  74. };
  75. export const workspace: Module<WorkspaceState, RootState> = {
  76. state: () => INIT,
  77. actions,
  78. mutations,
  79. getters,
  80. };