import { createRef, PureComponent } from 'react'; import { Trans, t } from '@grafana/i18n'; import { ConfirmButton, ConfirmModal, Button, Stack } from '@grafana/ui'; import { TagBadge } from 'app/core/components/TagFilter/TagBadge'; import { contextSrv } from 'app/core/core'; import { formatDate } from 'app/core/internationalization/dates'; import { AccessControlAction } from 'app/types/accessControl'; import { UserSession } from 'app/types/user'; interface Props { sessions: UserSession[]; onSessionRevoke: (id: number) => void; onAllSessionsRevoke: () => void; } interface State { showLogoutModal: boolean; } class BaseUserSessions extends PureComponent { forceAllLogoutButton = createRef(); state: State = { showLogoutModal: false, }; showLogoutConfirmationModal = () => { this.setState({ showLogoutModal: true }); }; dismissLogoutConfirmationModal = () => { this.setState({ showLogoutModal: false }, () => { this.forceAllLogoutButton.current?.focus(); }); }; onSessionRevoke = (id: number) => { return () => { this.props.onSessionRevoke(id); }; }; onAllSessionsRevoke = () => { this.setState({ showLogoutModal: false }); this.props.onAllSessionsRevoke(); }; render() { const { sessions } = this.props; const { showLogoutModal } = this.state; const canLogout = contextSrv.hasPermission(AccessControlAction.UsersLogout); return (

Sessions

{sessions && sessions.map((session, index) => ( ))}
Last seen Logged on IP address Browser and OS Identity Provider
{session.isActive ? t('admin.user-sessions.now', 'Now') : session.seenAt} {formatDate(session.createdAt, { dateStyle: 'long' })} {session.clientIp} {`${session.browser} on ${session.os} ${session.osVersion}`} {session.authModule && } {canLogout && ( {t('admin.user-sessions.force-logout-button', 'Force logout')} )}
{canLogout && sessions.length > 0 && ( )}
); } } export const UserSessions = BaseUserSessions;