refactor: simplify codex account modal and collapse raw json by default
This commit is contained in:
@@ -25,6 +25,8 @@ import {
|
|||||||
Typography,
|
Typography,
|
||||||
Spin,
|
Spin,
|
||||||
Tag,
|
Tag,
|
||||||
|
Descriptions,
|
||||||
|
Collapse,
|
||||||
} from '@douyinfe/semi-ui';
|
} from '@douyinfe/semi-ui';
|
||||||
import { API, showError } from '../../../../helpers';
|
import { API, showError } from '../../../../helpers';
|
||||||
|
|
||||||
@@ -181,35 +183,30 @@ const resolveUsageStatusTag = (t, rateLimit) => {
|
|||||||
return <Tag color='red'>{tt('受限')}</Tag>;
|
return <Tag color='red'>{tt('受限')}</Tag>;
|
||||||
};
|
};
|
||||||
|
|
||||||
const AccountInfoCard = ({ t, label, value, onCopy, monospace = false }) => {
|
const AccountInfoValue = ({ t, value, onCopy, monospace = false }) => {
|
||||||
const tt = typeof t === 'function' ? t : (v) => v;
|
const tt = typeof t === 'function' ? t : (v) => v;
|
||||||
const text = getDisplayText(value);
|
const text = getDisplayText(value);
|
||||||
const hasValue = text !== '';
|
const hasValue = text !== '';
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className='rounded-md bg-semi-color-fill-0 px-2.5 py-2'>
|
<div className='flex min-w-0 items-start justify-between gap-2'>
|
||||||
<div className='text-[11px] text-semi-color-text-2'>
|
<div
|
||||||
{label}
|
className={`min-w-0 flex-1 break-all text-xs leading-5 text-semi-color-text-1 ${
|
||||||
</div>
|
monospace ? 'font-mono' : ''
|
||||||
<div className='mt-1 flex items-start justify-between gap-2'>
|
}`}
|
||||||
<div
|
>
|
||||||
className={`min-w-0 flex-1 break-all text-xs leading-5 text-semi-color-text-1 ${
|
{hasValue ? text : '-'}
|
||||||
monospace ? 'font-mono' : ''
|
|
||||||
}`}
|
|
||||||
>
|
|
||||||
{hasValue ? text : '-'}
|
|
||||||
</div>
|
|
||||||
<Button
|
|
||||||
size='small'
|
|
||||||
type='tertiary'
|
|
||||||
theme='borderless'
|
|
||||||
className='px-1 text-xs'
|
|
||||||
disabled={!hasValue}
|
|
||||||
onClick={() => onCopy?.(text)}
|
|
||||||
>
|
|
||||||
{tt('复制')}
|
|
||||||
</Button>
|
|
||||||
</div>
|
</div>
|
||||||
|
<Button
|
||||||
|
size='small'
|
||||||
|
type='tertiary'
|
||||||
|
theme='borderless'
|
||||||
|
className='shrink-0 px-1 text-xs'
|
||||||
|
disabled={!hasValue}
|
||||||
|
onClick={() => onCopy?.(text)}
|
||||||
|
>
|
||||||
|
{tt('复制')}
|
||||||
|
</Button>
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
@@ -321,22 +318,28 @@ const CodexUsageView = ({ t, record, payload, onCopy, onRefresh }) => {
|
|||||||
</Button>
|
</Button>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div className='mt-2 grid grid-cols-1 gap-2 md:grid-cols-3'>
|
<div className='mt-2 rounded-lg bg-semi-color-fill-0 px-3 py-2'>
|
||||||
<AccountInfoCard
|
<Descriptions>
|
||||||
t={tt}
|
<Descriptions.Item itemKey='User ID'>
|
||||||
label='User ID'
|
<AccountInfoValue
|
||||||
value={userId}
|
t={tt}
|
||||||
onCopy={onCopy}
|
value={userId}
|
||||||
monospace={true}
|
onCopy={onCopy}
|
||||||
/>
|
monospace={true}
|
||||||
<AccountInfoCard t={tt} label={tt('邮箱')} value={email} onCopy={onCopy} />
|
/>
|
||||||
<AccountInfoCard
|
</Descriptions.Item>
|
||||||
t={tt}
|
<Descriptions.Item itemKey={tt('邮箱')}>
|
||||||
label='Account ID'
|
<AccountInfoValue t={tt} value={email} onCopy={onCopy} />
|
||||||
value={accountId}
|
</Descriptions.Item>
|
||||||
onCopy={onCopy}
|
<Descriptions.Item itemKey='Account ID'>
|
||||||
monospace={true}
|
<AccountInfoValue
|
||||||
/>
|
t={tt}
|
||||||
|
value={accountId}
|
||||||
|
onCopy={onCopy}
|
||||||
|
monospace={true}
|
||||||
|
/>
|
||||||
|
</Descriptions.Item>
|
||||||
|
</Descriptions>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div className='mt-2 text-xs text-semi-color-text-2'>
|
<div className='mt-2 text-xs text-semi-color-text-2'>
|
||||||
@@ -370,37 +373,30 @@ const CodexUsageView = ({ t, record, payload, onCopy, onRefresh }) => {
|
|||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div>
|
<Collapse
|
||||||
<div className='mb-1 flex items-center justify-between gap-2'>
|
activeKey={showRawJson ? ['raw-json'] : []}
|
||||||
<div className='text-sm font-medium'>{tt('原始 JSON')}</div>
|
onChange={(activeKey) => {
|
||||||
<div className='flex items-center gap-2'>
|
const keys = Array.isArray(activeKey) ? activeKey : [activeKey];
|
||||||
|
setShowRawJson(keys.includes('raw-json'));
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
<Collapse.Panel header={tt('原始 JSON')} itemKey='raw-json'>
|
||||||
|
<div className='mb-2 flex justify-end'>
|
||||||
<Button
|
<Button
|
||||||
size='small'
|
size='small'
|
||||||
type='tertiary'
|
type='primary'
|
||||||
theme='outline'
|
theme='outline'
|
||||||
onClick={() => setShowRawJson((prev) => !prev)}
|
onClick={() => onCopy?.(rawText)}
|
||||||
|
disabled={!rawText}
|
||||||
>
|
>
|
||||||
{showRawJson ? tt('收起') : tt('展开')}
|
{tt('复制')}
|
||||||
</Button>
|
</Button>
|
||||||
{showRawJson && (
|
|
||||||
<Button
|
|
||||||
size='small'
|
|
||||||
type='primary'
|
|
||||||
theme='outline'
|
|
||||||
onClick={() => onCopy?.(rawText)}
|
|
||||||
disabled={!rawText}
|
|
||||||
>
|
|
||||||
{tt('复制')}
|
|
||||||
</Button>
|
|
||||||
)}
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
|
||||||
{showRawJson && (
|
|
||||||
<pre className='max-h-[50vh] overflow-y-auto rounded-lg bg-semi-color-fill-0 p-3 text-xs text-semi-color-text-0'>
|
<pre className='max-h-[50vh] overflow-y-auto rounded-lg bg-semi-color-fill-0 p-3 text-xs text-semi-color-text-0'>
|
||||||
{rawText}
|
{rawText}
|
||||||
</pre>
|
</pre>
|
||||||
)}
|
</Collapse.Panel>
|
||||||
</div>
|
</Collapse>
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|||||||
Reference in New Issue
Block a user