(null);
+ const [failedSave, setFailedSave] = useState<{
+ themeColor: string | null;
+ } | null>(null);
const loadSequence = useRef(0);
const saveSequence = useRef(0);
const currentProjectId = useRef(projectId);
@@ -29,6 +32,7 @@ export function ProjectSettingsPanel({ projectId }: { projectId: string }) {
const themeRevision = themeRevisionRef.current[loadedProjectId] ?? 0;
setBusy(true);
setError(null);
+ setFailedSave(null);
setThemeColor(null);
try {
const settings = await project.readProjectSettings(loadedProjectId);
@@ -37,7 +41,8 @@ export function ProjectSettingsPanel({ projectId }: { projectId: string }) {
currentProjectId.current !== loadedProjectId ||
(themeRevisionRef.current[loadedProjectId] ?? 0) !== themeRevision
) return;
- setThemeColor(validThemeColor(settings.themeColor));
+ const loaded = validThemeColor(settings.themeColor);
+ setThemeColor(loaded);
} catch {
if (
loadSequence.current !== sequence ||
@@ -75,11 +80,19 @@ export function ProjectSettingsPanel({ projectId }: { projectId: string }) {
async function save(next: string | null) {
const savedProjectId = projectId;
const sequence = ++saveSequence.current;
+ const previous = themeColor;
+ const requested = validThemeColor(next);
setBusy(true);
setError(null);
+ setFailedSave(null);
+ setThemeColor(requested);
+ publishProjectThemeChanged({
+ projectId: savedProjectId,
+ themeColor: requested,
+ });
try {
const saved = await project.updateProjectSettings(savedProjectId, {
- themeColor: next,
+ themeColor: requested,
});
const normalized = validThemeColor(saved.themeColor);
if (
@@ -93,11 +106,17 @@ export function ProjectSettingsPanel({ projectId }: { projectId: string }) {
themeColor: normalized,
});
} catch {
+ publishProjectThemeChanged({
+ projectId: savedProjectId,
+ themeColor: previous,
+ });
if (
currentProjectId.current === savedProjectId &&
saveSequence.current === sequence
) {
- setError("Impossible d’enregistrer la couleur du projet.");
+ setThemeColor(previous);
+ setError("Impossible d’appliquer la couleur.");
+ setFailedSave({ themeColor: requested });
}
} finally {
if (
@@ -131,8 +150,14 @@ export function ProjectSettingsPanel({ projectId }: { projectId: string }) {
{busy && }
{error && (
- {error}
-