tipado desde supabase, primer listado de planes, ajustes en src/data

This commit is contained in:
2026-01-09 15:51:36 -06:00
parent 8d6b7c4ba9
commit 5a7672677d
26 changed files with 7812 additions and 1577 deletions

View File

@@ -1,4 +1,5 @@
import { useMutation } from "@tanstack/react-query";
import {
ai_plan_chat,
ai_plan_improve,

View File

@@ -1,7 +1,10 @@
import { keepPreviousData, useMutation, useQuery, useQueryClient } from "@tanstack/react-query";
import { qk } from "../query/keys";
import type { PlanEstudio, UUID } from "../types/domain";
import type { PlanListFilters, PlanMapOperation, PlansCreateManualInput, PlansUpdateFieldsPatch } from "../api/plans.api";
import {
keepPreviousData,
useMutation,
useQuery,
useQueryClient,
} from "@tanstack/react-query";
import {
ai_generate_plan,
plan_asignaturas_list,
@@ -19,13 +22,30 @@ import {
plans_update_fields,
plans_update_map,
} from "../api/plans.api";
import { qk } from "../query/keys";
import type {
PlanListFilters,
PlanMapOperation,
PlansCreateManualInput,
PlansUpdateFieldsPatch,
} from "../api/plans.api";
import type { UUID } from "../types/domain";
export function usePlanes(filters: PlanListFilters) {
// 🧠 Tip: memoiza "filters" (useMemo) para que queryKey sea estable.
return useQuery({
// Usamos la factory de keys para consistencia
queryKey: qk.planesList(filters),
// La función fetch
queryFn: () => plans_list(filters),
// UX: Mantiene los datos viejos mientras carga la paginación nueva
placeholderData: keepPreviousData,
// Opcional: Tiempo que la data se considera fresca
staleTime: 1000 * 60 * 5, // 5 minutos
});
}
@@ -47,7 +67,9 @@ export function usePlanLineas(planId: UUID | null | undefined) {
export function usePlanAsignaturas(planId: UUID | null | undefined) {
return useQuery({
queryKey: planId ? qk.planAsignaturas(planId) : ["planes", "asignaturas", null],
queryKey: planId
? qk.planAsignaturas(planId)
: ["planes", "asignaturas", null],
queryFn: () => plan_asignaturas_list(planId as UUID),
enabled: Boolean(planId),
});
@@ -144,7 +166,8 @@ export function useUpdatePlanMapa() {
const qc = useQueryClient();
return useMutation({
mutationFn: (vars: { planId: UUID; ops: PlanMapOperation[] }) => plans_update_map(vars.planId, vars.ops),
mutationFn: (vars: { planId: UUID; ops: Array<PlanMapOperation> }) =>
plans_update_map(vars.planId, vars.ops),
// ✅ Optimista (rápida) para el caso MOVE_ASIGNATURA
onMutate: async (vars) => {
@@ -152,9 +175,7 @@ export function useUpdatePlanMapa() {
const prev = qc.getQueryData<any>(qk.planAsignaturas(vars.planId));
// solo optimizamos MOVEs simples
const moves = vars.ops.filter((x) => x.op === "MOVE_ASIGNATURA") as Array<
Extract<PlanMapOperation, { op: "MOVE_ASIGNATURA" }>
>;
const moves = vars.ops.filter((x) => x.op === "MOVE_ASIGNATURA");
if (prev && Array.isArray(prev) && moves.length) {
const next = prev.map((a: any) => {