import React, { FC, memo, useCallback, useEffect, useMemo, } from '../../../lib/teact/teact'; import { withGlobal } from '../../../lib/teact/teactn'; import { GlobalActions } from '../../../global/types'; import { ApiSession } from '../../../api/types'; import { pick } from '../../../util/iteratees'; import { formatPastTimeShort } from '../../../util/dateFormat'; import useFlag from '../../../hooks/useFlag'; import useLang from '../../../hooks/useLang'; import ListItem from '../../ui/ListItem'; import ConfirmDialog from '../../ui/ConfirmDialog'; type StateProps = { activeSessions: ApiSession[]; }; type DispatchProps = Pick; const SettingsPrivacyActiveSessions: FC = ({ activeSessions, loadAuthorizations, terminateAuthorization, terminateAllAuthorizations, }) => { const [isConfirmTerminateAllDialogOpen, openConfirmTerminateAllDialog, closeConfirmTerminateAllDialog] = useFlag(); useEffect(() => { loadAuthorizations(); }, [loadAuthorizations]); const handleTerminateSessionClick = useCallback((hash: string) => { terminateAuthorization({ hash }); }, [terminateAuthorization]); const handleTerminateAllSessions = useCallback(() => { closeConfirmTerminateAllDialog(); terminateAllAuthorizations(); }, [closeConfirmTerminateAllDialog, terminateAllAuthorizations]); const currentSession = useMemo(() => { return activeSessions.find((session) => session.isCurrent); }, [activeSessions]); const otherSessions = useMemo(() => { return activeSessions.filter((session) => !session.isCurrent); }, [activeSessions]); const lang = useLang(); function renderCurrentSession(session: ApiSession) { return (

{lang('AuthSessions.CurrentSession')}

{session.appName} {getDeviceEnvironment(session)} {session.ip} - {getLocation(session)}
{lang('TerminateAllSessions')}
); } function renderOtherSessions(sessions: ApiSession[]) { return (

Other Sessions

{sessions.map(renderSession)}
); } function renderSession(session: ApiSession) { return ( { handleTerminateSessionClick(session.hash); }, }]} >
{formatPastTimeShort(lang, session.dateActive * 1000)} {session.appName} {getDeviceEnvironment(session)} {session.ip} - {getLocation(session)}
); } return (
{currentSession && renderCurrentSession(currentSession)} {otherSessions && renderOtherSessions(otherSessions)} {otherSessions && ( )}
); }; function getLocation(session: ApiSession) { return [session.region, session.country].filter(Boolean).join(', '); } function getDeviceEnvironment(session: ApiSession) { return `${session.deviceModel}${session.deviceModel ? ', ' : ''} ${session.platform} ${session.systemVersion}`; } export default memo(withGlobal( (global): StateProps => { return { activeSessions: global.activeSessions, }; }, (setGlobal, actions): DispatchProps => pick(actions, [ 'loadAuthorizations', 'terminateAuthorization', 'terminateAllAuthorizations', ]), )(SettingsPrivacyActiveSessions));