fix: resolve build-time type error in dashboard pages by relaxing submitAction return type
- Update PublicationLayoutProps and PublicationDrawerProps to allow 'void' as a valid return type for server actions (supporting redirects). - Improve error handling in PublicationLayout and PublicationDrawer to safely process both object and void responses. - Update EditEntityPage to include missing user authentication and use specialized PublicationLayout for 'posts' entity.
This commit is contained in:
parent
339ac0125e
commit
956360a693
@ -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 (
|
||||
<PublicationLayout
|
||||
initialData={document as Post}
|
||||
user={user as unknown as AuthUser}
|
||||
relationData={relationData}
|
||||
submitAction={boundUpdate}
|
||||
appwriteConfig={appwriteConfig}
|
||||
/>
|
||||
);
|
||||
}
|
||||
|
||||
// ── OTHER ENTITIES: Use the generic EntityForm ────────
|
||||
return (
|
||||
<EntityForm
|
||||
entity={entity}
|
||||
|
||||
@ -17,7 +17,7 @@ export interface PublicationDrawerProps {
|
||||
post: Post | null;
|
||||
user: AuthUser;
|
||||
relationData: Record<string, Array<{ $id: string; [key: string]: unknown }>>;
|
||||
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<PublicationDrawerProps> = ({
|
||||
|
||||
const wrappedSubmit = useCallback(async (formData: FormData) => {
|
||||
const result = await submitAction(formData);
|
||||
if (result?.success) {
|
||||
if (!result || result.success) {
|
||||
onSuccess?.();
|
||||
}
|
||||
return result;
|
||||
|
||||
@ -135,11 +135,15 @@ export const PublicationLayout: React.FC<PublicationLayoutProps> = ({
|
||||
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.');
|
||||
|
||||
@ -149,7 +149,8 @@ export interface PublicationLayoutProps {
|
||||
/** Datos de relaciones pre-cargados desde el servidor */
|
||||
relationData: Record<string, Array<{ $id: string; [key: string]: unknown }>>;
|
||||
/** 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 */
|
||||
|
||||
Loading…
Reference in New Issue
Block a user