23008670f3
CI / Build & Quality Checks (push) Successful in 10m13s
- i18next 23->26 + react-i18next 15->17 - prettier 2->3, reformat all files - replace @fontsource/inter with @fontsource-variable/inter 5, update import path - domhandler 5->6 (aligns with transitive deps) - lint-staged 16->17
95 lines
3.1 KiB
TypeScript
95 lines
3.1 KiB
TypeScript
import React, { useState } from 'react';
|
|
import { Badge, color, Icon, Icons, Text } from 'folds';
|
|
import {
|
|
SidebarAvatar,
|
|
SidebarItem,
|
|
SidebarItemBadge,
|
|
SidebarItemTooltip,
|
|
} from '../../../components/sidebar';
|
|
import { useDeviceIds, useDeviceList, useSplitCurrentDevice } from '../../../hooks/useDeviceList';
|
|
import { useMatrixClient } from '../../../hooks/useMatrixClient';
|
|
import * as css from './UnverifiedTab.css';
|
|
import {
|
|
useDeviceVerificationStatus,
|
|
useUnverifiedDeviceCount,
|
|
VerificationStatus,
|
|
} from '../../../hooks/useDeviceVerificationStatus';
|
|
import { useCrossSigningActive } from '../../../hooks/useCrossSigning';
|
|
import { Modal500 } from '../../../components/Modal500';
|
|
import { Settings, SettingsPages } from '../../../features/settings';
|
|
|
|
function UnverifiedIndicator() {
|
|
const mx = useMatrixClient();
|
|
|
|
const crypto = mx.getCrypto();
|
|
const [devices] = useDeviceList();
|
|
|
|
const [currentDevice, otherDevices] = useSplitCurrentDevice(devices);
|
|
|
|
const verificationStatus = useDeviceVerificationStatus(
|
|
crypto,
|
|
mx.getSafeUserId(),
|
|
currentDevice?.device_id,
|
|
);
|
|
const unverified = verificationStatus === VerificationStatus.Unverified;
|
|
|
|
const otherDevicesId = useDeviceIds(otherDevices);
|
|
const unverifiedDeviceCount = useUnverifiedDeviceCount(
|
|
crypto,
|
|
mx.getSafeUserId(),
|
|
otherDevicesId,
|
|
);
|
|
|
|
const [settings, setSettings] = useState(false);
|
|
const closeSettings = () => setSettings(false);
|
|
|
|
const hasUnverified =
|
|
unverified || (unverifiedDeviceCount !== undefined && unverifiedDeviceCount > 0);
|
|
return (
|
|
<>
|
|
{hasUnverified && (
|
|
<SidebarItem active={settings} className={css.UnverifiedTab}>
|
|
<SidebarItemTooltip tooltip={unverified ? 'Unverified Device' : 'Unverified Devices'}>
|
|
{(triggerRef) => (
|
|
<SidebarAvatar
|
|
className={unverified ? css.UnverifiedAvatar : css.UnverifiedOtherAvatar}
|
|
as="button"
|
|
ref={triggerRef}
|
|
outlined
|
|
onClick={() => setSettings(true)}
|
|
>
|
|
<Icon
|
|
style={{ color: unverified ? color.Critical.Main : color.Warning.Main }}
|
|
src={Icons.ShieldUser}
|
|
/>
|
|
</SidebarAvatar>
|
|
)}
|
|
</SidebarItemTooltip>
|
|
{!unverified && unverifiedDeviceCount && unverifiedDeviceCount > 0 && (
|
|
<SidebarItemBadge hasCount>
|
|
<Badge variant="Warning" size="400" fill="Solid" radii="Pill" outlined={false}>
|
|
<Text as="span" size="L400">
|
|
{unverifiedDeviceCount}
|
|
</Text>
|
|
</Badge>
|
|
</SidebarItemBadge>
|
|
)}
|
|
</SidebarItem>
|
|
)}
|
|
{settings && (
|
|
<Modal500 requestClose={closeSettings}>
|
|
<Settings initialPage={SettingsPages.DevicesPage} requestClose={closeSettings} />
|
|
</Modal500>
|
|
)}
|
|
</>
|
|
);
|
|
}
|
|
|
|
export function UnverifiedTab() {
|
|
const crossSigningActive = useCrossSigningActive();
|
|
|
|
if (!crossSigningActive) return null;
|
|
|
|
return <UnverifiedIndicator />;
|
|
}
|