import type { Ref } from "vue" // Definición de tipos interface DetalleAccion { title?: string acctionAdd?: string component: boolean } interface Permiso { [key: string]: string[] // Ejemplo: "cotizacion": ["listar", "registrar", "actualizar"] } interface Validacion { [key: string]: { [accion: string]: DetalleAccion } // Ejemplo: "compania": { "actualizar": DetalleAccion, ... } } interface ResultadoValidacion { validateActions: (aValidar: Validacion) => { error?: string } // Función que recibe los datos a validar actions: Ref // Array de strings para las accionesde botones showComponent: Ref>> // Booleano para mostrar o no el componente } export type PermisoValidacion = Validacion export default function (): ResultadoValidacion { const actions = ref([]) const showComponent = ref>>({}) const validateActions = (aValidar: Validacion): { [titulo: string]: { [accion: string]: boolean} } | { error: string} => { const permisosJSON = localStorage.getItem('permisos') if (!permisosJSON) { return { error: 'No se encontraron permisos en el almacenamiento local.' } } const permisos: Permiso[] = JSON.parse(permisosJSON) const permisosTransformados = permisos.map((permiso) => { const titulo = Object.keys(permiso)[0] const acciones = Object.values(permiso)[0] const accionesTransformadas = acciones.map(accionCompleta => accionCompleta.split('.')[1]) return { [titulo]: accionesTransformadas } }) const resultados: { [titulo: string]: { [accion: string]: boolean} } = {} const showComponentTemp: Record> = {} Object.entries(aValidar).forEach(([tituloAValidar, accionesAValidar]) => { resultados[tituloAValidar] = {} showComponentTemp[tituloAValidar] = {} const permisoEncontrado = permisosTransformados.find(item => Object.keys(item)[0] === tituloAValidar) const permisosAcciones = permisoEncontrado ? permisoEncontrado[tituloAValidar] : [] Object.entries(accionesAValidar).forEach(([accion, detalles]) => { if (detalles.component) { const tienePermiso = permisosAcciones.includes(accion) resultados[tituloAValidar][accion] = tienePermiso showComponentTemp[tituloAValidar][accion] = tienePermiso if (tienePermiso && detalles.acctionAdd) { actions.value.push(detalles.acctionAdd) } } else { if (detalles.acctionAdd) { const tienePermiso = permisosAcciones.includes(accion) if (tienePermiso) { actions.value.push(detalles.acctionAdd) } } } }) }) showComponent.value = showComponentTemp return resultados } return { validateActions, actions, showComponent, } }