diff --git a/src/app/dashboard/[entity]/[id]/page.tsx b/src/app/dashboard/[entity]/[id]/page.tsx index e26304e..d199394 100644 --- a/src/app/dashboard/[entity]/[id]/page.tsx +++ b/src/app/dashboard/[entity]/[id]/page.tsx @@ -1,10 +1,11 @@ import { APPWRITE_ALMEIRA_CONFIG, projectId, endpoint } from '@/lib/appwrite'; -import { createSessionClient } from '@/lib/appwrite.server'; +import { createSessionClient, getLoggedInUser } from '@/lib/appwrite.server'; import { collectionMap, SCHEMA_MAP } from '@/lib/schema'; import { updateDocumentServer } from '@/app/actions/appwrite'; import { updateEntityAction } from '@/app/actions/entities'; import { redirect } from 'next/navigation'; import { EntityForm } from '@/components/dashboard/EntityForm'; +import type { AuthUser, Post } from '@/types/publications'; export default async function EditEntityPage({ params }: { params: Promise<{ entity: string, id: string }> }) { const { entity, id } = await params; @@ -26,8 +27,9 @@ export default async function EditEntityPage({ params }: { params: Promise<{ ent } const sessionClient = await createSessionClient(); - if (!sessionClient) { - throw new Error("No sesión activa"); + const user = await getLoggedInUser(); + if (!sessionClient || !user) { + redirect('/login'); } // Fetch the existing document @@ -60,7 +62,28 @@ export default async function EditEntityPage({ params }: { params: Promise<{ ent ); const boundUpdate = updateEntityAction.bind(null, entity, id); + const appwriteConfig = { + endpoint, + projectId, + databaseId: APPWRITE_ALMEIRA_CONFIG.databaseId, + }; + // ── POSTS: Use the new PublicationLayout ────────────── + if (entity === 'posts') { + const { default: PublicationLayout } = await import('@/components/publications/PublicationLayout'); + + return ( + + ); + } + + // ── OTHER ENTITIES: Use the generic EntityForm ──────── return ( >; - submitAction: (formData: FormData) => Promise<{ success: boolean; error?: string; data?: unknown }>; + submitAction: (formData: FormData) => Promise<{ success: boolean; error?: string; data?: unknown } | void>; appwriteConfig: { endpoint: string; projectId: string; @@ -65,7 +65,7 @@ export const PublicationDrawer: React.FC = ({ const wrappedSubmit = useCallback(async (formData: FormData) => { const result = await submitAction(formData); - if (result?.success) { + if (!result || result.success) { onSuccess?.(); } return result; diff --git a/src/components/publications/PublicationLayout.tsx b/src/components/publications/PublicationLayout.tsx index 5f6d1fc..5a25f14 100644 --- a/src/components/publications/PublicationLayout.tsx +++ b/src/components/publications/PublicationLayout.tsx @@ -135,11 +135,15 @@ export const PublicationLayout: React.FC = ({ startTransition(async () => { try { const result = await submitAction(formData); - if (result?.success) { + // If result is undefined/void, it likely redirected (success) + if (!result || result.success) { setOptimisticState('saved'); - setTimeout(() => router.push('/dashboard/posts'), 800); + // Only redirect manually if we didn't already redirect from the action + if (result) { + setTimeout(() => router.push('/dashboard/posts'), 800); + } } else { - setOptimisticState('error', result?.error || 'Error al guardar.'); + setOptimisticState('error', result.error || 'Error al guardar.'); } } catch (err: unknown) { setOptimisticState('error', err instanceof Error ? err.message : 'Error desconocido.'); diff --git a/src/types/publications.ts b/src/types/publications.ts index f695a62..455487f 100644 --- a/src/types/publications.ts +++ b/src/types/publications.ts @@ -149,7 +149,8 @@ export interface PublicationLayoutProps { /** Datos de relaciones pre-cargados desde el servidor */ relationData: Record>; /** Acción de servidor para guardar */ - submitAction: (formData: FormData) => Promise<{ success: boolean; error?: string; data?: unknown }>; + /** Acción de servidor para guardar. Puede retornar un objeto de éxito o void (si redirige) */ + submitAction: (formData: FormData) => Promise<{ success: boolean; error?: string; data?: unknown } | void>; /** Usuario autenticado */ user: AuthUser; /** Config de Appwrite para URLs de media */