import { default as React, ReactNode } from 'react'; import { PyrionLayoutActionItemProps } from './PLActionEntry'; import { NavigationDrawerSidebarProps } from '../NavigationDrawer/NavigationDrawerSidebar'; import { NotificationCardProps } from '../NotificationCard/NotificationCard'; import { HyperextensionConfig, HyperextensionListenerCallback, ScrollTargetConfig, ScrollTargetData } from '../Scrollable/useScrollable'; import { TabSwitchElement } from '../TabSwitch/TabSwitch'; import { NotificationLoaderType } from './PLNotificationsList'; import { CollapsedState } from '../NavigationDrawer/NavigationDrawer'; import { ModuleNameOptions, SessionCardOptions, UserCardAccesors, UserCardOptions } from './pyrionUserAccessors'; import { AuthSession, TCompany, TSystem, TUser } from './pyrionHubTypes'; import { PyrionRailEntry, PyrionRailModuleLink, PyrionSidebarEntry } from './pyrionLayoutNavTypes'; export type { PyrionLayoutModuleProps, PyrionLayoutNavEntry, PyrionLayoutNavDivider, PyrionNavLink, PyrionNavAction, PyrionNavDivider, PyrionRailEntry, PyrionRailModuleLink, PyrionSidebarEntry, PyrionTertiaryEntry, } from './pyrionLayoutNavTypes'; export type { AuthSession, TAuthUser, TCompany, TSystem, TUser, } from './pyrionHubTypes'; export interface PyrionLayoutTabsProps { currentTabName?: string; customTabs?: TabSwitchElement[]; onTabClick?: (name: string) => void; } export type { AvailableData, ModuleNameOptions, SessionCardAccesors, SessionCardOptions, SessionAvailableData, UserCardAccesors, UserCardOptions, } from './pyrionUserAccessors'; export interface NotificationsDrawerOptions { hide?: boolean; hideActionButton?: boolean; onMarkAllAsRead?: () => void; } export interface HelpSectionDrawerOptions { hide?: boolean; hideActionButton?: boolean; } export interface ConfigurationActionOptions { hideActionButton?: boolean; onClick: (controls: PyrionLayoutControls) => void; } export interface SidebarHeaderOptions { /** Nombre de la suite (ej. "Pyrion"). */ suiteName?: string; /** Accessor para el nombre del sistema actual (default: `system.name`). */ systemNameSlot?: UserCardAccesors; hideLogo?: boolean; } export interface PyrionLayoutOptions { userCardOptions?: UserCardOptions; sessionCardOptions?: SessionCardOptions; moduleNameOptions?: ModuleNameOptions; sidebarHeaderOptions?: SidebarHeaderOptions; notificationsDrawerOptions?: NotificationsDrawerOptions; helpSectionDrawerOptions?: HelpSectionDrawerOptions; configurationActionOptions?: ConfigurationActionOptions; sidebarOptions?: Pick; closeDrawerOnNavigate?: boolean; defaultCollapsedState?: CollapsedState; } export interface PyrionLayoutProps { links?: PyrionSidebarEntry[]; footerLinks?: PyrionSidebarEntry[]; modules?: PyrionRailEntry[]; footerModules?: PyrionRailEntry[]; activeModuleId?: string; /** * Notificación de click en un módulo del rail. El DS navega por su cuenta cuando * el módulo tiene `path` (mismo mecanismo que los links del sidebar). Usar este * callback solo para side-effects adicionales — no como mecanismo de navegación. */ onModuleClick?: (module: PyrionRailModuleLink, controls: PyrionLayoutControls) => void; /** @deprecated Use `footerLinks` with `{ type: "action" }` entries */ actions?: PyrionLayoutActionItemProps[]; tabsProps?: PyrionLayoutTabsProps; activeActionId?: string; currentSystemId: string; helpSection?: ReactNode | (() => ReactNode); children?: ReactNode; embedded?: boolean; state: { company: TCompany; enabled_systems: TSystem[]; user: TUser; sessions?: AuthSession[]; metadata?: TAppMetadata; }; options?: PyrionLayoutOptions; onActionClick?: (id: string, payload?: any) => void; /** * * @param path - La ruta desde la que se está navegando. * Reemplaza el comportamiento nativo de navegación. El consumidor pasa a tomar control total de la navegación. */ onLinkClick?: (path: string) => void; /** * * @param session - La sesión que se ha seleccionado. * @param controls - Los controles de la navegación. * Se ejecuta cuando el usuario selecciona una sesión en el menú de sesión. */ onSessionClick?: (session: AuthSession, controls: PyrionLayoutControls) => void; /** * * @param from - La ruta desde la que se está navegando. * @param to - La ruta a la que se está navegando. * Se ejecuta cuando el usuario navega entre rutas (si no está usando `onLinkClick`). */ onNavigate?: (from: string, to: string) => void; /** * * @param collapsed - Indica si el layout está colapsado. * Se ejecuta cuando el usuario hace clic en el logo del sistema. */ onSystemLogoClick?: (collapsed?: boolean) => void; /** * * @param controls - Los controles de la navegación. * Se ejecuta cuando el usuario hace clic en el botón de logout, dentro del Menu de usuario. */ onLogoutClick?: (controls: PyrionLayoutControls) => void; /** * * @param controls - Los controles de la navegación. * Se ejecuta cuando el usuario hace clic en el botón de agregar cuenta, dentro del Menu de usuario. * @returns */ onAddAccountClick?: (controls: PyrionLayoutControls) => void; /** * * @param collapsed - Indica si el layout está colapsado. * @param controls - Los controles de la navegación. * Se ejecuta cuando el usuario hace clic en el botón de perfil, dentro del Menu de usuario. */ onProfileClick?: (collapsed: boolean, controls: PyrionLayoutControls) => void; /** * Se ejecuta cuando el usuario hace clic en "Preferencias" dentro del menú de usuario. */ onUserPreferencesClick?: (controls: PyrionLayoutControls) => void; } export type PyrionLayoutControls = { /** * @deprecated Este método está deprecado. * Usa `toggleDrawer` o los métodos específicos `openDrawer` y `closeDrawer`. */ toggleCollapse?: () => void; /** * Metodo para toggle del drawer (menu de navegación), solo funciona en mobile. */ toggleDrawer?: () => void; /** * Metodo para cerrar el drawer, solo funciona en mobile. */ closeDrawer?: (params?: { closeIfMobile?: boolean; closeIfDesktop?: boolean; }) => void; /** * Metodo para abrir el drawer (menu de navegación), solo funciona en mobile. */ openDrawer?: (params?: { openIfMobile?: boolean; openIfDesktop?: boolean; }) => void; /** * Metodo para obtener el estado del drawer (menu de navegación), solo funciona en mobile. */ getIsCollapsed?: () => boolean; /** * Metodo para suscribirse a cambios en el estado del drawer (menu de navegación), solo funciona en mobile. */ subscribeToCollapse?: (listener: (collapsed: boolean) => void) => () => void; /** * Metodo para abrir el sidebar (menu lateral notificaciones o ayuda). */ openSidebar?: () => void; /** * Metodo para cerrar el sidebar (menu lateral notificaciones o ayuda). */ closeSidebar?: (cb?: () => void) => void; /** * Metodo para toggle del sidebar (menu lateral notificaciones o ayuda). */ toggleSidebar?: () => void; /** * Metodo para obtener el estado del sidebar (menu lateral notificaciones o ayuda). */ getIsSidebarOpen?: () => boolean; /** * Metodo para suscribirse a cambios en el estado del sidebar (menu lateral notificaciones o ayuda). */ subscribeToSidebarOpen?: (listener: (open: boolean) => void) => () => void; /** * Metodo para abrir el sidebar y mostrar la secccion de ayuda. */ openHelp?: () => void; /** * Metodo para abrir el sidebar y mostrar la secccion de notificaciones. */ openNotifications?: () => void; /** * Metodo para suscribirse a cambios en la secccion del sidebar (menu lateral notificaciones o ayuda). */ subscribeToSection?: (listener: (section: 'notifications' | 'help') => void) => () => void; /** * Metodo para mostrar el modal de error. */ showErrorModal?: (node: (ReactNode | ((disableDrawerMenu: boolean, hideCloseButton: boolean) => ReactNode)), disableDrawer: boolean, hideCloseButton?: boolean) => void; /** * Metodo para cerrar el modal de error. */ closeErrorModal?: () => void; /** * @param notification - La notificacion a agregar. * @param position - La posicion de la notificacion en la lista, 'top' al inicio y 'bottom' al final. * Método para agregar una nueva notificacion. */ addNewNotification?: (notification: NotificationCardProps | NotificationCardProps[], position?: 'top' | 'bottom') => void; /** * @param callback - La funcion callback que se ejecuta cuando las notificaciones cambian. * @param notifications - La lista de notificaciones. * @param count - El numero total de notificaciones y el numero de notificaciones no leidas. * Metodo para suscribirse a cambios en las notificaciones. */ subscribeToNotificationsUpdates?: (callback: (notifications: NotificationCardProps[], count: { total: number; unread: number; }) => void) => () => void; /** * @param notifications - La lista de notificaciones. * Metodo para setear la lista de notificaciones, reemplaza la lista actual completa por la nueva. Si desea agregar notificaciones, usa `addNewNotification`. */ setNotifications?: (notifications: NotificationCardProps[] | ((notifications: NotificationCardProps[]) => NotificationCardProps[])) => void; /** * Metodo para eliminar todas las notificaciones. */ removeAllNotifications?: () => void; /** * @param id - El id de la notificacion a eliminar o un array de ids. * Metodo para eliminar una o varias notificaciones por su id. */ removeNotification?: (id: string | string[]) => void; /** * @param loading - Indica si las notificaciones están cargando. * @param type - El tipo de notificacion, 'loading' o 'error'. * Metodo para setear el estado de carga de las notificaciones. */ setNotificationsLoading?: (loading: boolean, type?: NotificationLoaderType) => void; /** * @param hasError - Indica si hay un error en las notificaciones. * @param children - El contenido del modal de error. * Metodo para setear el estado de error de las notificaciones. */ setNotificationsError?: (hasError: boolean, children?: React.ReactNode | (() => React.ReactNode)) => void; /** * @param callback - La funcion callback que se ejecuta cuando el scroll cambia. * @param config - La configuracion del target del scroll. * Metodo para suscribirse a cambios en el scroll de las notificaciones. */ subscribeToNotificationsScroll?: (callback: (data: ScrollTargetData) => void, config?: ScrollTargetConfig) => () => void; /** * @param callback - La funcion callback que se ejecuta cuando el hyperextension cambia. * @param config - La configuracion del hyperextension. * Metodo para suscribirse a cambios en el hyperextension de las notificaciones. */ subscribeToHyperextension?: (callback: HyperextensionListenerCallback, config?: HyperextensionConfig) => () => void; /** * Metodo para abrir el menu de usuario. */ openUserMenu?: () => void; /** * Metodo para cerrar el menu de usuario. */ closeUserMenu?: () => void; /** * Metodo para toggle del menu de usuario. */ toggleUserMenu?: () => void; /** * Metodo para obtener el estado del menu de usuario. */ getIsUserMenuOpen?: () => boolean; /** * Metodo para suscribirse a cambios en el estado del menu de usuario. */ subscribeToUserMenuOpen?: (listener: (open: boolean) => void) => () => void; }; export type PyrionLayoutContextValue = { controls: PyrionLayoutControls; initialSectionRef: React.RefObject<"notifications" | "help">; }; export declare const usePyrionLayout: () => PyrionLayoutControls; export declare const usePyrionLayoutContext: () => PyrionLayoutContextValue; export declare const useOptionalPyrionLayoutContext: () => PyrionLayoutContextValue | null; export declare const usePyrionLayoutOptions: () => PyrionLayoutOptions; declare const PyrionLayout: ({ children, helpSection, state, links: navlinks, footerLinks, modules, footerModules, activeModuleId: controlledActiveModuleId, onModuleClick, onLinkClick, onNavigate, onLogoutClick, onAddAccountClick, onProfileClick, onUserPreferencesClick, actions, activeActionId, onActionClick, tabsProps, currentSystemId, onSessionClick, onSystemLogoClick, embedded, ...props }: PyrionLayoutProps) => import("react/jsx-runtime").JSX.Element; export default PyrionLayout;