UNPKG

inactivity-warning

Version:

Multi-framework inactivity warning component for Vue 3, React, Angular and Vanilla JavaScript

141 lines (127 loc) 3.95 kB
import React from "react"; import "./InactivityWarning.css"; /** * Componente React para mostrar advertencia de cierre de sesión por inactividad */ export function InactivityWarning({ isVisible = false, timeRemaining = 0, title = "Sesión a punto de expirar", message = "Su sesión se cerrará automáticamente en:", instruction = "Mueva el mouse, haga click o presione cualquier tecla para continuar su sesión", extendButtonText = "Continuar sesión", logoutButtonText = "Cerrar sesión", showButtons = false, theme = "default", overlayClass = "", modalClass = "", iconClass = "", countdownClass = "", onExtend = () => {}, onLogout = () => {}, children, }) { // Formatear tiempo restante const formatTimeRemaining = () => { const minutes = Math.floor(timeRemaining / 60); const seconds = timeRemaining % 60; return `${minutes}:${seconds.toString().padStart(2, "0")}`; }; // Clases dinámicas basadas en el tema const computedOverlayClass = [ "react-inactivity-warning-overlay", `react-inactivity-warning-theme-${theme}`, overlayClass, ] .filter(Boolean) .join(" "); const computedModalClass = [ "react-inactivity-warning-modal", `react-inactivity-warning-modal-theme-${theme}`, modalClass, ] .filter(Boolean) .join(" "); const computedIconClass = [ "react-inactivity-warning-icon", `react-inactivity-warning-icon-theme-${theme}`, iconClass, ] .filter(Boolean) .join(" "); const computedCountdownClass = [ "react-inactivity-warning-countdown-circle", `react-inactivity-warning-countdown-theme-${theme}`, countdownClass, ] .filter(Boolean) .join(" "); if (!isVisible) { return null; } return ( <div className={computedOverlayClass}> <div className={computedModalClass}> {/* Header */} <div className="react-inactivity-warning-header"> <div className={computedIconClass}> {children?.icon || ( <svg className="react-inactivity-warning-icon-svg" fill="none" stroke="currentColor" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg" > <path strokeLinecap="round" strokeLinejoin="round" strokeWidth="2" d="M12 8v4l3 3m6-3a9 9 0 11-18 0 9 9 0 0118 0z" /> </svg> )} </div> </div> {/* Título */} <h3 className="react-inactivity-warning-title"> {children?.title || title} </h3> {/* Mensaje */} <p className="react-inactivity-warning-message"> {children?.message || message} </p> {/* Countdown */} <div className="react-inactivity-warning-countdown"> <div className={computedCountdownClass}> <span className="react-inactivity-warning-countdown-text"> {formatTimeRemaining()} </span> </div> </div> {/* Información adicional */} <p className="react-inactivity-warning-instruction"> {children?.instruction || instruction} </p> {/* Botones de acción (opcional) */} {showButtons && ( <div className="react-inactivity-warning-actions"> <button onClick={onExtend} className="react-inactivity-warning-button react-inactivity-warning-button-primary" > {extendButtonText} </button> <button onClick={onLogout} className="react-inactivity-warning-button react-inactivity-warning-button-secondary" > {logoutButtonText} </button> </div> )} </div> </div> ); } export default InactivityWarning;