feat: Implement project management with new views, services, store, and sidebar project selection.

This commit is contained in:
xds
2026-02-09 16:06:50 +03:00
parent 70e96eb503
commit 1a8c66ca35
11 changed files with 915 additions and 97 deletions

View File

@@ -13,8 +13,15 @@ const api = axios.create({
api.interceptors.request.use(
config => {
const user = JSON.parse(localStorage.getItem('user'));
if (user && user.token) {
config.headers['Authorization'] = `${user.tokenType} ${user.token}`;
if (user && user.access_token) {
config.headers.Authorization = `Bearer ${user.access_token}`;
} else if (user && user.token) {
config.headers.Authorization = `${user.tokenType} ${user.token}`;
}
const projectId = localStorage.getItem('active_project_id');
if (projectId) {
config.headers['X-Project-ID'] = projectId;
}
return config;
},

View File

@@ -25,6 +25,16 @@ export const dataService = {
return response.data
},
createCharacter: async (characterData) => {
const response = await api.post('/characters/', characterData)
return response.data
},
deleteCharacter: async (id) => {
const response = await api.delete(`/characters/${id}`)
return response.data
},
getAssetsByCharacterId: async (charId, limit, offset) => {
const response = await api.get(`/characters/${charId}/assets`, { params: { limit, offset } })
return response.data

View File

@@ -0,0 +1,31 @@
import api from './api';
export default {
async getProjects() {
return api.get('/projects');
},
async createProject(projectData) {
return api.post('/projects', projectData);
},
async getProject(id) {
// Using getProjects for now as per previous plan, or could try specific endpoint if it exists
// Validating with backend: project_router has GET /api/projects (list)
// It does NOT have GET /api/projects/{id}.
// So we must fetch all and find, or assume the store has them.
return api.get('/projects');
},
async joinProject(projectId) {
return api.post(`/projects/${projectId}/join`);
},
async addMember(projectId, username) {
return api.post(`/projects/${projectId}/members`, { username });
},
async deleteProject(projectId) {
return api.delete(`/projects/${projectId}`);
}
};