2026-06-30 16:12:13 -04:00
|
|
|
import React, { useCallback } from 'react';
|
|
|
|
|
import { Box, Chip, Text } from 'folds';
|
|
|
|
|
import { SequenceCard } from '../../../components/sequence-card';
|
|
|
|
|
import { SequenceCardStyle } from '../styles.css';
|
|
|
|
|
import { SettingTile } from '../../../components/setting-tile';
|
|
|
|
|
import { useAuthMetadata } from '../../../hooks/useAuthMetadata';
|
|
|
|
|
import { useAccountManagementActions } from '../../../hooks/useAccountManagement';
|
|
|
|
|
import { withSearchParam } from '../../../pages/pathUtils';
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* On OIDC/next-gen-auth servers, profile/password/sessions are managed by the
|
|
|
|
|
* authentication service — surface a deep-link to its account page (MSC2965
|
|
|
|
|
* account-management URL). Renders nothing on password/legacy-SSO servers, where
|
|
|
|
|
* `useAuthMetadata()` is undefined.
|
|
|
|
|
*/
|
|
|
|
|
export function OidcManageAccount() {
|
|
|
|
|
const authMetadata = useAuthMetadata();
|
|
|
|
|
const accountManagementActions = useAccountManagementActions();
|
|
|
|
|
|
|
|
|
|
const open = useCallback(() => {
|
|
|
|
|
const authUrl = authMetadata?.account_management_uri ?? authMetadata?.issuer;
|
|
|
|
|
if (!authUrl) return;
|
2026-07-18 21:23:35 -04:00
|
|
|
window.open(
|
|
|
|
|
withSearchParam(authUrl, { action: accountManagementActions.profile }),
|
|
|
|
|
'_blank',
|
|
|
|
|
'noopener,noreferrer',
|
|
|
|
|
);
|
2026-06-30 16:12:13 -04:00
|
|
|
}, [authMetadata, accountManagementActions]);
|
|
|
|
|
|
|
|
|
|
if (!authMetadata) return null;
|
|
|
|
|
|
|
|
|
|
return (
|
|
|
|
|
<Box direction="Column" gap="100">
|
|
|
|
|
<Text size="L400">Account Management</Text>
|
|
|
|
|
<SequenceCard
|
|
|
|
|
className={SequenceCardStyle}
|
|
|
|
|
variant="SurfaceVariant"
|
|
|
|
|
direction="Column"
|
|
|
|
|
gap="400"
|
|
|
|
|
>
|
|
|
|
|
<SettingTile
|
|
|
|
|
title="Manage account"
|
|
|
|
|
description="Your profile, password, and sessions are managed by your single sign-on provider."
|
|
|
|
|
after={
|
|
|
|
|
<Chip variant="Secondary" radii="Pill" onClick={open}>
|
|
|
|
|
<Text size="T200">Open</Text>
|
|
|
|
|
</Chip>
|
|
|
|
|
}
|
|
|
|
|
/>
|
|
|
|
|
</SequenceCard>
|
|
|
|
|
</Box>
|
|
|
|
|
);
|
|
|
|
|
}
|