99 lines
3.4 KiB
JavaScript
99 lines
3.4 KiB
JavaScript
import { defineStore } from 'pinia';
|
|
import projectsService from '@/services/projectsService';
|
|
|
|
export const useProjectsStore = defineStore('projects', {
|
|
state: () => ({
|
|
projects: [],
|
|
currentProject: null,
|
|
loading: false,
|
|
error: null
|
|
}),
|
|
|
|
actions: {
|
|
async fetchProjects() {
|
|
this.loading = true;
|
|
this.error = null;
|
|
try {
|
|
const response = await projectsService.getProjects();
|
|
this.projects = response.data;
|
|
|
|
// Restore selection from localStorage if valid
|
|
this.restoreSelection();
|
|
} catch (err) {
|
|
console.error("Failed to fetch projects", err);
|
|
this.error = "Failed to load projects";
|
|
} finally {
|
|
this.loading = false;
|
|
}
|
|
},
|
|
|
|
restoreSelection() {
|
|
const savedId = localStorage.getItem('active_project_id');
|
|
if (savedId && this.projects.length > 0) {
|
|
const found = this.projects.find(p => p.id === savedId);
|
|
if (found) {
|
|
this.currentProject = found;
|
|
} else {
|
|
// ID exists but project not in list (maybe deleted or lost access)
|
|
// Optional: clear it or keep it? Clearing seems safer.
|
|
localStorage.removeItem('active_project_id');
|
|
this.currentProject = null;
|
|
}
|
|
}
|
|
},
|
|
|
|
async createProject(name, description) {
|
|
this.loading = true;
|
|
try {
|
|
const response = await projectsService.createProject({ name, description });
|
|
const newProject = response.data;
|
|
this.projects.push(newProject);
|
|
// Automatically select the new project
|
|
this.selectProject(newProject.id);
|
|
return newProject;
|
|
} catch (err) {
|
|
console.error("Failed to create project", err);
|
|
throw err;
|
|
} finally {
|
|
this.loading = false;
|
|
}
|
|
},
|
|
|
|
selectProject(projectId) {
|
|
const project = this.projects.find(p => p.id === projectId);
|
|
if (project) {
|
|
this.currentProject = project;
|
|
localStorage.setItem('active_project_id', projectId);
|
|
}
|
|
},
|
|
|
|
async addMember(projectId, username) {
|
|
try {
|
|
await projectsService.addMember(projectId, username);
|
|
await this.fetchProjects(); // Refresh list to see updates if necessary
|
|
} catch(err) {
|
|
console.error("Failed to add member", err);
|
|
throw err;
|
|
}
|
|
},
|
|
|
|
getProjectById(id) {
|
|
return this.projects.find(p => p.id === id);
|
|
},
|
|
|
|
async deleteProject(projectId) {
|
|
try {
|
|
await projectsService.deleteProject(projectId);
|
|
this.projects = this.projects.filter(p => p.id !== projectId);
|
|
if (this.currentProject && this.currentProject.id === projectId) {
|
|
this.currentProject = null;
|
|
localStorage.removeItem('active_project_id');
|
|
}
|
|
} catch (err) {
|
|
console.error("Failed to delete project", err);
|
|
throw err;
|
|
}
|
|
}
|
|
}
|
|
});
|