Files
Triple-C/app/src/hooks/useProjects.ts
Josh Knapp 7e1cc92aa4
All checks were successful
Build App / build-linux (push) Successful in 2m54s
Build App / build-windows (push) Successful in 4m18s
Build Container / build-container (push) Successful in 1m30s
Add app update detection and multi-folder project support
Feature 1 - Update Detection: Query Gitea releases API on startup (3s
delay) and every 24h, compare patch versions by platform, show pulsing
"Update" button in TopBar with dialog for release notes/downloads.
Settings: auto-check toggle, manual check, dismiss per-version.

Feature 2 - Multi-Folder Projects: Replace single `path` with
`paths: Vec<ProjectPath>` (host_path + mount_name). Each folder mounts
to `/workspace/{mount_name}`. Auto-migrate old single-path JSON on load.
Container recreation via paths-fingerprint label. AddProjectDialog and
ProjectCard support add/remove/edit of multiple folders.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-28 21:18:33 +00:00

103 lines
2.5 KiB
TypeScript

import { useCallback } from "react";
import { useShallow } from "zustand/react/shallow";
import { useAppState } from "../store/appState";
import * as commands from "../lib/tauri-commands";
import type { ProjectPath } from "../lib/types";
export function useProjects() {
const {
projects,
selectedProjectId,
setProjects,
setSelectedProject,
updateProjectInList,
removeProjectFromList,
} = useAppState(
useShallow(s => ({
projects: s.projects,
selectedProjectId: s.selectedProjectId,
setProjects: s.setProjects,
setSelectedProject: s.setSelectedProject,
updateProjectInList: s.updateProjectInList,
removeProjectFromList: s.removeProjectFromList,
}))
);
const selectedProject = projects.find((p) => p.id === selectedProjectId) ?? null;
const refresh = useCallback(async () => {
const list = await commands.listProjects();
setProjects(list);
}, [setProjects]);
const add = useCallback(
async (name: string, paths: ProjectPath[]) => {
const project = await commands.addProject(name, paths);
// Refresh from backend to avoid stale closure issues
const list = await commands.listProjects();
setProjects(list);
setSelectedProject(project.id);
return project;
},
[setProjects, setSelectedProject],
);
const remove = useCallback(
async (id: string) => {
await commands.removeProject(id);
removeProjectFromList(id);
},
[removeProjectFromList],
);
const start = useCallback(
async (id: string) => {
const updated = await commands.startProjectContainer(id);
updateProjectInList(updated);
return updated;
},
[updateProjectInList],
);
const stop = useCallback(
async (id: string) => {
await commands.stopProjectContainer(id);
const list = await commands.listProjects();
setProjects(list);
},
[setProjects],
);
const rebuild = useCallback(
async (id: string) => {
const updated = await commands.rebuildProjectContainer(id);
updateProjectInList(updated);
return updated;
},
[updateProjectInList],
);
const update = useCallback(
async (project: Parameters<typeof commands.updateProject>[0]) => {
const updated = await commands.updateProject(project);
updateProjectInList(updated);
return updated;
},
[updateProjectInList],
);
return {
projects,
selectedProject,
selectedProjectId,
setSelectedProject,
refresh,
add,
remove,
start,
stop,
rebuild,
update,
};
}