= ({ ideas, onUpdate }) => {
{/* Header & Add Form (Top Bar) */}
-
-
- {t('ideaboard.title')}
-
-
{t('ideaboard.desc')}
+
+
+
+ {t('ideaboard.title')}
+
+
{t('ideaboard.desc')}
+
+ {/* Status Indicator for Mobile */}
+
+ {saveStatus === 'saving' && <>>}
+ {saveStatus === 'saved_local' && <>>}
+ {saveStatus === 'saved_db' && <>>}
+
-
+
+ {/* Status Indicator for Desktop */}
+
+ {saveStatus === 'saving' && <> Sauvegarde...>}
+ {saveStatus === 'saved_local' && <> Brouillon local>}
+ {saveStatus === 'saved_db' && <> Sauvegardé>}
+ {saveStatus === 'unsaved' && Non sauvegardé...}
+
+
+
+
{/* Kanban Board */}
diff --git a/src/hooks/useProjects.ts b/src/hooks/useProjects.ts
index 91ecac2..77c0680 100644
--- a/src/hooks/useProjects.ts
+++ b/src/hooks/useProjects.ts
@@ -7,6 +7,7 @@ import {
Entity,
EntityType,
UserProfile,
+ Idea
} from '@/lib/types';
import api from '@/lib/api';
import {
@@ -293,6 +294,67 @@ export const useProjects = (user: UserProfile | null) => {
}
};
+ const createIdea = async (projectId: string, data: Partial
) => {
+ try {
+ const newIdea = await api.ideas.create({
+ projectId,
+ title: data.title || 'Nouveau',
+ description: data.description || '',
+ status: data.status || 'todo',
+ category: data.category || 'plot',
+ });
+
+ setProjects(prev => prev.map(p => {
+ if (p.id !== projectId) return p;
+ return {
+ ...p,
+ ideas: [...(p.ideas || []), {
+ ...newIdea,
+ createdAt: new Date(newIdea.createdAt).getTime()
+ }]
+ };
+ }));
+ return newIdea.id;
+ } catch (err) {
+ console.error("Failed to create idea", err);
+ throw err;
+ }
+ };
+
+ const updateIdea = async (projectId: string, ideaId: string, data: Partial) => {
+ setProjects(prev => prev.map(p => {
+ if (p.id !== projectId) return p;
+ return {
+ ...p,
+ ideas: (p.ideas || []).map(i => i.id === ideaId ? { ...i, ...data } : i)
+ };
+ }));
+
+ try {
+ await api.ideas.update(ideaId, data);
+ } catch (err) {
+ console.error("Failed to update idea", err);
+ throw err;
+ }
+ };
+
+ const deleteIdea = async (projectId: string, ideaId: string) => {
+ setProjects(prev => prev.map(p => {
+ if (p.id !== projectId) return p;
+ return {
+ ...p,
+ ideas: (p.ideas || []).filter(i => i.id !== ideaId)
+ };
+ }));
+
+ try {
+ await api.ideas.delete(ideaId);
+ } catch (err) {
+ console.error("Failed to delete idea", err);
+ throw err;
+ }
+ };
+
return {
projects,
currentProjectId,
@@ -304,6 +366,9 @@ export const useProjects = (user: UserProfile | null) => {
createEntity,
updateEntity,
deleteEntity,
+ createIdea,
+ updateIdea,
+ deleteIdea,
deleteProject: async (projectId: string) => {
try {
// Cascade delete is handled by Prisma, just delete the project
diff --git a/src/providers/ProjectProvider.tsx b/src/providers/ProjectProvider.tsx
index 1235129..13d76af 100644
--- a/src/providers/ProjectProvider.tsx
+++ b/src/providers/ProjectProvider.tsx
@@ -1,7 +1,7 @@
'use client';
import React, { createContext, useContext } from 'react';
-import { BookProject, UserProfile, Entity, EntityType } from '@/lib/types';
+import { BookProject, UserProfile, Entity, EntityType, Idea } from '@/lib/types';
interface ProjectContextType {
project: BookProject;
@@ -14,6 +14,9 @@ interface ProjectContextType {
createEntity: (type: EntityType, initialData?: Partial) => Promise;
updateEntity: (entityId: string, data: Partial) => Promise;
deleteEntity: (entityId: string) => Promise;
+ createIdea: (projectId: string, data: Partial) => Promise;
+ updateIdea: (projectId: string, ideaId: string, data: Partial) => Promise;
+ deleteIdea: (projectId: string, ideaId: string) => Promise;
deleteProject: () => Promise;
incrementUsage: () => void;
}