workspace/projects/gamilit/docs/frontend/admin/hooks/ADMIN-GAMIFICATION-CONFIG-HOOK.md
rckrdmrd 289c5a4ee5
Some checks are pending
CI Pipeline / changes (push) Waiting to run
CI Pipeline / core (push) Blocked by required conditions
CI Pipeline / trading-backend (push) Blocked by required conditions
CI Pipeline / trading-data-service (push) Blocked by required conditions
CI Pipeline / trading-frontend (push) Blocked by required conditions
CI Pipeline / erp-core (push) Blocked by required conditions
CI Pipeline / erp-mecanicas (push) Blocked by required conditions
CI Pipeline / gamilit-backend (push) Blocked by required conditions
CI Pipeline / gamilit-frontend (push) Blocked by required conditions
Gamilit: Backend fixes, frontend API updates, deployment guides and validations
Backend:
- Fix email verification and password recovery services
- Fix exercise submission and student progress services

Frontend:
- Update missions, password, and profile API services
- Fix ExerciseContentRenderer component

Docs & Scripts:
- Add SSL/Certbot deployment guide
- Add quick deployment guide
- Database scripts for testing and validations
- Migration and homologation reports
- Functions inventory documentation

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-18 23:42:48 -06:00

6.4 KiB

Hook: useGamificationConfig

Version: 1.0.0 Fecha: 2025-12-18 Ubicacion: apps/frontend/src/apps/admin/hooks/useGamificationConfig.ts


PROPOSITO

Hook de React personalizado que gestiona toda la configuracion de gamificacion del sistema, proporcionando:

  • Parametros de gamificacion (XP, coins, multiplicadores)
  • Rangos Maya (niveles, multiplicadores, perks)
  • Estadisticas del sistema
  • Operaciones CRUD completas con cache inteligente mediante React Query

API EXPUESTA

Objeto Retornado

const {
  // QUERIES
  useParameters,
  useParameter,
  useMayaRanks,
  useMayaRank,
  useStats,

  // MUTATIONS
  updateParameter,
  resetParameter,
  bulkUpdateParameters,
  updateMayaRank,
  previewImpact,
  restoreDefaults
} = useGamificationConfig();

QUERIES

useParameters(query?: ListParametersQuery)

Obtiene lista paginada de parametros de gamificacion.

interface ListParametersQuery {
  page?: number;
  limit?: number;
  category?: 'points' | 'coins' | 'levels' | 'ranks' | 'penalties' | 'bonuses';
}

const { data, isLoading, error } = useParameters({ category: 'points' });

// Retorno
{
  data: Parameter[],
  total: number,
  page: number,
  limit: number
}

Cache: 5 minutos

useParameter(key: string, enabled?: boolean)

Obtiene un parametro especifico por clave.

const { data, isLoading, error } = useParameter('xp_per_exercise', true);

useMayaRanks()

Obtiene todos los rangos Maya configurados.

const { data, isLoading, error } = useMayaRanks();

// Retorno: MayaRankConfig[]

Cache: 10 minutos

useMayaRank(id: string, enabled?: boolean)

Obtiene un rango Maya especifico.

const { data, isLoading, error } = useMayaRank('rank-uuid', true);

useStats()

Obtiene estadisticas del sistema de gamificacion.

const { data, isLoading, error } = useStats();

// Retorno
{
  totalParameters: number,
  activeParameters: number,
  totalRanks: number,
  activeRanks: number,
  lastModified: string
}

Cache: 2 minutos


MUTATIONS

updateParameter

Actualiza un parametro individual.

const { mutate, isPending, error } = updateParameter;

mutate({
  key: 'xp_per_exercise',
  data: {
    value: 50,
    reason: 'Ajuste de balanceo'
  }
});

Efectos:

  • Invalida queries de parametros
  • Invalida query de stats
  • Toast de exito/error automatico

resetParameter

Restaura un parametro a su valor por defecto.

resetParameter.mutate('xp_per_exercise');

bulkUpdateParameters

Actualiza multiples parametros en una sola operacion.

bulkUpdateParameters.mutate({
  updates: [
    { key: 'xp_per_exercise', value: 50 },
    { key: 'coins_per_streak', value: 10 }
  ],
  reason: 'Rebalanceo de economia'
});

updateMayaRank

Modifica umbrales de un rango Maya.

updateMayaRank.mutate({
  id: 'rank-uuid',
  data: {
    minXp: 500,
    maxXp: 999
  }
});

previewImpact

Genera preview del impacto de cambios sin aplicarlos.

previewImpact.mutate({
  parameterKey: 'xp_multiplier',
  newValue: 1.5
});

// Retorno: Estadisticas de usuarios afectados

restoreDefaults

Restaura TODOS los parametros a valores por defecto.

restoreDefaults.mutate();

// Retorno: { restored_count: number }

Efectos:

  • Invalida todas las queries bajo 'gamification'
  • Requiere confirmacion del usuario (implementada en UI)

CONFIGURACION DE REACT QUERY

Query staleTime gcTime
parameters 5 min 10 min
parameter (single) 5 min 10 min
mayaRanks 10 min 15 min
stats 2 min 5 min

VALIDACION DEFENSIVA

El hook implementa validaciones robustas para manejar respuestas inesperadas del backend:

// Ejemplo de validacion en useParameters
const data = response?.data;
if (!data || !Array.isArray(data.parameters)) {
  console.warn('Unexpected response structure');
  return { data: [], total: 0, page: 1, limit: 10 };
}

Caracteristicas:

  • Valida estructura de objetos antes de usar
  • Proporciona fallbacks sensatos (arrays vacios, valores por defecto)
  • Log de advertencias en consola para debugging
  • Maneja campos snake_case y camelCase del backend

EJEMPLO DE USO

En AdminGamificationPage

import { useGamificationConfig } from '../hooks/useGamificationConfig';

function AdminGamificationPage() {
  const {
    useParameters,
    useMayaRanks,
    useStats,
    updateParameter,
    resetParameter
  } = useGamificationConfig();

  const { data: stats, isLoading: loadingStats } = useStats();
  const { data: parametersData, isLoading: loadingParams } = useParameters();
  const { data: mayaRanks, isLoading: loadingRanks } = useMayaRanks();

  const handleUpdateParameter = (key: string, value: any) => {
    updateParameter.mutate({
      key,
      data: { value, reason: 'Manual update' }
    });
  };

  if (loadingStats || loadingParams || loadingRanks) {
    return <LoadingSpinner />;
  }

  return (
    <div>
      <StatsCards stats={stats} />
      <ParametersList
        parameters={parametersData?.data || []}
        onUpdate={handleUpdateParameter}
      />
      <MayaRanksList ranks={mayaRanks || []} />
    </div>
  );
}

DEPENDENCIAS

Dependencia Uso
@tanstack/react-query Gestion de estado y cache
@/services/api/admin/gamificationConfigApi Cliente API
react-hot-toast Notificaciones
@/types/admin/gamification.types Tipos TypeScript

TIPOS RELACIONADOS

Parameter

interface Parameter {
  id: string;
  key: string;
  value: any;
  category: 'points' | 'coins' | 'levels' | 'ranks' | 'penalties' | 'bonuses';
  dataType: string;
  description?: string;
  defaultValue?: any;
  minValue?: number;
  maxValue?: number;
}

MayaRankConfig

interface MayaRankConfig {
  id: string;
  name: string;
  level: number;
  minXp: number;
  maxXp?: number | null;
  multiplierXp: number;
  multiplierMlCoins: number;
  bonusMlCoins: number;
  color: string;
  icon?: string | null;
  description?: string;
  perks?: string[];
  isActive: boolean;
  order?: number;
}

REFERENCIAS

  • AdminGamificationPage.tsx - Pagina que usa este hook
  • gamificationConfigApi.ts - Cliente API
  • gamification.types.ts - Definiciones de tipos

Ultima actualizacion: 2025-12-18