forked from boos/BoosAPI
fix(web): preserve both site-created next steps (#357)
This commit is contained in:
@@ -1,7 +1,14 @@
|
|||||||
import { describe, expect, it, vi } from 'vitest';
|
import { describe, expect, it, vi } from 'vitest';
|
||||||
import { act, create } from 'react-test-renderer';
|
import { act, create, type ReactTestInstance } from 'react-test-renderer';
|
||||||
import SiteCreatedModal from './SiteCreatedModal.js';
|
import SiteCreatedModal from './SiteCreatedModal.js';
|
||||||
|
|
||||||
|
function collectText(node: ReactTestInstance): string {
|
||||||
|
return (node.children || []).map((child) => {
|
||||||
|
if (typeof child === 'string') return child;
|
||||||
|
return collectText(child);
|
||||||
|
}).join('');
|
||||||
|
}
|
||||||
|
|
||||||
describe('SiteCreatedModal', () => {
|
describe('SiteCreatedModal', () => {
|
||||||
it('routes native dialog cancel events through onClose cleanup', async () => {
|
it('routes native dialog cancel events through onClose cleanup', async () => {
|
||||||
const onChoice = vi.fn();
|
const onChoice = vi.fn();
|
||||||
@@ -26,4 +33,35 @@ describe('SiteCreatedModal', () => {
|
|||||||
expect(onClose).toHaveBeenCalledTimes(1);
|
expect(onClose).toHaveBeenCalledTimes(1);
|
||||||
expect(onChoice).not.toHaveBeenCalled();
|
expect(onChoice).not.toHaveBeenCalled();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('keeps both next-step actions visible while promoting API key flow for api-key-first presets', async () => {
|
||||||
|
const onChoice = vi.fn();
|
||||||
|
const onClose = vi.fn();
|
||||||
|
const root = create(
|
||||||
|
<SiteCreatedModal
|
||||||
|
siteName="CodingPlan"
|
||||||
|
initializationPresetId="codingplan-openai"
|
||||||
|
initialSegment="apikey"
|
||||||
|
onChoice={onChoice}
|
||||||
|
onClose={onClose}
|
||||||
|
/>,
|
||||||
|
);
|
||||||
|
|
||||||
|
const choiceButtons = root.root.findAll((node) => (
|
||||||
|
node.type === 'button'
|
||||||
|
&& typeof node.props.onClick === 'function'
|
||||||
|
&& collectText(node) !== '稍后配置'
|
||||||
|
));
|
||||||
|
|
||||||
|
expect(choiceButtons.map((button) => collectText(button))).toEqual([
|
||||||
|
'添加 API Key(推荐)',
|
||||||
|
'添加账号(用户名密码登录)',
|
||||||
|
]);
|
||||||
|
|
||||||
|
await act(async () => {
|
||||||
|
choiceButtons[1]!.props.onClick();
|
||||||
|
});
|
||||||
|
|
||||||
|
expect(onChoice).toHaveBeenCalledWith('session');
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -25,6 +25,31 @@ export default function SiteCreatedModal({
|
|||||||
|| (apiKeyFirst
|
|| (apiKeyFirst
|
||||||
? '该平台更适合直接通过 Base URL + API Key 接入,后续再补模型初始化。'
|
? '该平台更适合直接通过 Base URL + API Key 接入,后续再补模型初始化。'
|
||||||
: '接下来您可以继续补充登录连接或 API Key。');
|
: '接下来您可以继续补充登录连接或 API Key。');
|
||||||
|
const actionButtons = apiKeyFirst
|
||||||
|
? [
|
||||||
|
{
|
||||||
|
choice: 'apikey' as const,
|
||||||
|
className: 'btn btn-primary btn-block',
|
||||||
|
label: '添加 API Key(推荐)',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
choice: 'session' as const,
|
||||||
|
className: 'btn btn-outline btn-block',
|
||||||
|
label: '添加账号(用户名密码登录)',
|
||||||
|
},
|
||||||
|
]
|
||||||
|
: [
|
||||||
|
{
|
||||||
|
choice: 'session' as const,
|
||||||
|
className: 'btn btn-primary btn-block',
|
||||||
|
label: '添加账号(用户名密码登录)',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
choice: 'apikey' as const,
|
||||||
|
className: 'btn btn-outline btn-block',
|
||||||
|
label: '添加 API Key',
|
||||||
|
},
|
||||||
|
];
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
const dialog = dialogRef.current;
|
const dialog = dialogRef.current;
|
||||||
@@ -85,29 +110,15 @@ export default function SiteCreatedModal({
|
|||||||
)}
|
)}
|
||||||
|
|
||||||
<div className="modal-action" style={{ flexDirection: 'column', gap: 12 }}>
|
<div className="modal-action" style={{ flexDirection: 'column', gap: 12 }}>
|
||||||
{apiKeyFirst ? (
|
{actionButtons.map((action) => (
|
||||||
<button
|
<button
|
||||||
className="btn btn-primary btn-block"
|
key={action.choice}
|
||||||
onClick={() => onChoice('apikey')}
|
className={action.className}
|
||||||
|
onClick={() => onChoice(action.choice)}
|
||||||
>
|
>
|
||||||
添加 API Key(推荐)
|
{action.label}
|
||||||
</button>
|
</button>
|
||||||
) : (
|
))}
|
||||||
<button
|
|
||||||
className="btn btn-primary btn-block"
|
|
||||||
onClick={() => onChoice('session')}
|
|
||||||
>
|
|
||||||
添加账号(用户名密码登录)
|
|
||||||
</button>
|
|
||||||
)}
|
|
||||||
{!apiKeyFirst && (
|
|
||||||
<button
|
|
||||||
className="btn btn-outline btn-block"
|
|
||||||
onClick={() => onChoice('apikey')}
|
|
||||||
>
|
|
||||||
添加 API Key
|
|
||||||
</button>
|
|
||||||
)}
|
|
||||||
<button
|
<button
|
||||||
className="btn btn-ghost btn-block"
|
className="btn btn-ghost btn-block"
|
||||||
onClick={() => onChoice('later')}
|
onClick={() => onChoice('later')}
|
||||||
|
|||||||
Reference in New Issue
Block a user