2026-02-24 03:28:30 +02:00
|
|
|
import React from 'react';
|
2026-07-18 00:11:05 +03:00
|
|
|
import { SettingsPageLayout } from '@/components/sections/shared/SettingsPageLayout';
|
2026-02-24 03:28:30 +02:00
|
|
|
import { useProjectsStore } from '@/stores/useProjectsStore';
|
|
|
|
|
import { useUIStore } from '@/stores/useUIStore';
|
2026-07-09 13:54:05 +03:00
|
|
|
import { ProjectSettingsPanel } from '@/components/sections/projects/ProjectSettingsPanel';
|
|
|
|
|
import type { ProjectIdentitySaveData } from '@/components/sections/projects/useProjectIdentityForm';
|
2026-04-26 14:03:39 +03:00
|
|
|
import { useI18n } from '@/lib/i18n';
|
2026-02-24 03:28:30 +02:00
|
|
|
|
|
|
|
|
export const ProjectsPage: React.FC = () => {
|
2026-04-26 14:03:39 +03:00
|
|
|
const { t } = useI18n();
|
2026-02-24 03:28:30 +02:00
|
|
|
const projects = useProjectsStore((state) => state.projects);
|
|
|
|
|
const updateProjectMeta = useProjectsStore((state) => state.updateProjectMeta);
|
|
|
|
|
const selectedId = useUIStore((state) => state.settingsProjectsSelectedId);
|
|
|
|
|
const setSelectedId = useUIStore((state) => state.setSettingsProjectsSelectedId);
|
|
|
|
|
|
|
|
|
|
const selectedProject = React.useMemo(() => {
|
|
|
|
|
if (!selectedId) return null;
|
|
|
|
|
return projects.find((p) => p.id === selectedId) ?? null;
|
|
|
|
|
}, [projects, selectedId]);
|
|
|
|
|
|
|
|
|
|
React.useEffect(() => {
|
|
|
|
|
if (projects.length === 0) {
|
|
|
|
|
setSelectedId(null);
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
if (selectedId && projects.some((p) => p.id === selectedId)) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
setSelectedId(projects[0].id);
|
|
|
|
|
}, [projects, selectedId, setSelectedId]);
|
|
|
|
|
|
2026-07-09 13:54:05 +03:00
|
|
|
const handleIdentitySave = React.useCallback(async (data: ProjectIdentitySaveData) => {
|
2026-02-24 03:28:30 +02:00
|
|
|
if (!selectedProject) return;
|
2026-03-04 01:41:01 +02:00
|
|
|
updateProjectMeta(selectedProject.id, {
|
2026-07-09 13:54:05 +03:00
|
|
|
label: data.label,
|
|
|
|
|
icon: data.icon,
|
|
|
|
|
color: data.color,
|
|
|
|
|
iconBackground: data.iconBackground,
|
|
|
|
|
defaultModel: data.defaultModel ?? null,
|
2026-08-22 20:31:20 +03:00
|
|
|
defaultVariant: data.defaultVariant ?? null,
|
2026-03-04 01:41:01 +02:00
|
|
|
});
|
2026-07-09 13:54:05 +03:00
|
|
|
}, [selectedProject, updateProjectMeta]);
|
2026-02-24 03:28:30 +02:00
|
|
|
|
|
|
|
|
if (!selectedProject) {
|
|
|
|
|
return (
|
2026-07-18 00:11:05 +03:00
|
|
|
<SettingsPageLayout title={t('settings.page.projects.title')} showSaveStatus>
|
|
|
|
|
<p className="typography-meta text-muted-foreground">{t('settings.projects.page.empty.noProjects')}</p>
|
|
|
|
|
</SettingsPageLayout>
|
2026-02-24 03:28:30 +02:00
|
|
|
);
|
|
|
|
|
}
|
2026-07-09 13:54:05 +03:00
|
|
|
|
2026-07-18 00:11:05 +03:00
|
|
|
const headerLabel = selectedProject.label ?? t('settings.projects.page.title.default');
|
|
|
|
|
|
2026-02-24 03:28:30 +02:00
|
|
|
return (
|
2026-07-18 00:11:05 +03:00
|
|
|
<SettingsPageLayout
|
|
|
|
|
title={headerLabel}
|
|
|
|
|
description={selectedProject.path}
|
|
|
|
|
showSaveStatus
|
|
|
|
|
outerClassName="bg-background"
|
|
|
|
|
>
|
|
|
|
|
<ProjectSettingsPanel project={selectedProject} onIdentitySave={handleIdentitySave} />
|
|
|
|
|
</SettingsPageLayout>
|
2026-02-24 03:28:30 +02:00
|
|
|
);
|
|
|
|
|
};
|