diff --git a/frontend/src/modules/project/api/index.ts b/frontend/src/modules/project/api/index.ts index e69de29..aa06d75 100644 --- a/frontend/src/modules/project/api/index.ts +++ b/frontend/src/modules/project/api/index.ts @@ -0,0 +1,25 @@ +import api from '@/shared/api' +import type { Project } from '@/shared/types/api' + +export async function listProjects(): Promise { + const { data } = await api.get('/projects') + return data +} + +export async function createProject(name: string, designDir: string, codeDir?: string): Promise { + const { data } = await api.post('/projects', { + name, + design_dir: designDir, + code_dir: codeDir || null, + }) + return data +} + +export async function getProject(id: string): Promise { + const { data } = await api.get(`/projects/${id}`) + return data +} + +export async function deleteProject(id: string): Promise { + await api.delete(`/projects/${id}`) +} diff --git a/frontend/src/modules/project/components/ProjectList.vue b/frontend/src/modules/project/components/ProjectList.vue index e69de29..c28ba19 100644 --- a/frontend/src/modules/project/components/ProjectList.vue +++ b/frontend/src/modules/project/components/ProjectList.vue @@ -0,0 +1,75 @@ + + + + + diff --git a/frontend/src/modules/project/components/ProjectOverview.vue b/frontend/src/modules/project/components/ProjectOverview.vue index e69de29..b5ffb48 100644 --- a/frontend/src/modules/project/components/ProjectOverview.vue +++ b/frontend/src/modules/project/components/ProjectOverview.vue @@ -0,0 +1,25 @@ + + + + + diff --git a/frontend/src/modules/project/components/ProjectSidebar.vue b/frontend/src/modules/project/components/ProjectSidebar.vue new file mode 100644 index 0000000..2e7da79 --- /dev/null +++ b/frontend/src/modules/project/components/ProjectSidebar.vue @@ -0,0 +1,41 @@ + + + + + diff --git a/frontend/src/modules/project/composables/useProject.ts b/frontend/src/modules/project/composables/useProject.ts index e69de29..ea9f514 100644 --- a/frontend/src/modules/project/composables/useProject.ts +++ b/frontend/src/modules/project/composables/useProject.ts @@ -0,0 +1,59 @@ +import { defineStore } from 'pinia' +import { ref } from 'vue' +import type { Project } from '@/shared/types/api' +import * as projectApi from '../api' + +export const useProjectStore = defineStore('project', () => { + const projects = ref([]) + const currentProject = ref(null) + const loading = ref(false) + const error = ref(null) + + async function fetchProjects() { + loading.value = true + error.value = null + try { + projects.value = await projectApi.listProjects() + } catch (e: any) { + error.value = e.message + } finally { + loading.value = false + } + } + + async function createProject(name: string, designDir: string, codeDir?: string) { + loading.value = true + error.value = null + try { + const project = await projectApi.createProject(name, designDir, codeDir) + projects.value.push(project) + return project + } catch (e: any) { + error.value = e.response?.data?.detail || e.message + throw e + } finally { + loading.value = false + } + } + + async function selectProject(id: string) { + loading.value = true + try { + currentProject.value = await projectApi.getProject(id) + } catch (e: any) { + error.value = e.message + } finally { + loading.value = false + } + } + + async function removeProject(id: string) { + await projectApi.deleteProject(id) + projects.value = projects.value.filter(p => p.id !== id) + if (currentProject.value?.id === id) { + currentProject.value = null + } + } + + return { projects, currentProject, loading, error, fetchProjects, createProject, selectProject, removeProject } +}) diff --git a/frontend/src/modules/project/types/index.ts b/frontend/src/modules/project/types/index.ts index e69de29..4a938e7 100644 --- a/frontend/src/modules/project/types/index.ts +++ b/frontend/src/modules/project/types/index.ts @@ -0,0 +1 @@ +export type { Project } from '@/shared/types/api'