Files
spritesheet-generator/src/stores/useProjectStore.ts
2026-01-01 18:46:46 +01:00

131 lines
3.3 KiB
TypeScript

import { defineStore } from 'pinia';
import { ref } from 'vue';
import { useAuthStore } from './useAuthStore';
export interface Project {
id: string;
name: string;
data: any; // Store the JSON export of the project here
created: string;
updated: string;
}
export const useProjectStore = defineStore('project', () => {
const authStore = useAuthStore();
const projects = ref<Project[]>([]);
const currentProject = ref<Project | null>(null);
const isLoading = ref(false);
async function fetchProjects() {
if (!authStore.user) return;
isLoading.value = true;
try {
const records = await authStore.pb.collection('projects').getList(1, 50, {
sort: '-updated',
});
projects.value = records.items.map((r: any) => ({
id: r.id,
name: r.name,
data: r.data,
created: r.created,
updated: r.updated,
}));
} catch (error) {
console.error('Failed to fetch projects:', error);
} finally {
isLoading.value = false;
}
}
async function createProject(name: string, data: any) {
if (!authStore.user) return;
isLoading.value = true;
try {
const record = await authStore.pb.collection('projects').create({
name,
data,
user: authStore.user.id,
});
currentProject.value = {
id: record.id,
name: record.name,
data: record.data,
created: record.created,
updated: record.updated,
};
await fetchProjects();
} catch (error) {
console.error('Failed to create project:', error);
throw error;
} finally {
isLoading.value = false;
}
}
async function updateProject(id: string, data: any) {
if (!authStore.user) return;
isLoading.value = true;
try {
const record = await authStore.pb.collection('projects').update(id, {
data,
});
currentProject.value = { ...currentProject.value!, data: record.data, updated: record.updated };
await fetchProjects();
} catch (error) {
console.error('Failed to update project:', error);
throw error;
} finally {
isLoading.value = false;
}
}
async function loadProject(id: string) {
if (!authStore.user) return;
isLoading.value = true;
try {
const record = await authStore.pb.collection('projects').getOne(id);
currentProject.value = {
id: record.id,
name: record.name,
data: record.data,
created: record.created,
updated: record.updated,
};
} catch (error) {
console.error('Failed to load project', error);
throw error;
} finally {
isLoading.value = false;
}
}
async function deleteProject(id: string) {
if (!authStore.user) return;
if (!confirm('Are you sure you want to delete this project?')) return;
isLoading.value = true;
try {
await authStore.pb.collection('projects').delete(id);
if (currentProject.value?.id === id) {
currentProject.value = null;
}
await fetchProjects();
} catch (error) {
console.error('Failed to delete project:', error);
} finally {
isLoading.value = false;
}
}
return {
projects,
currentProject,
isLoading,
fetchProjects,
createProject,
updateProject,
loadProject,
deleteProject,
};
});