继续补齐个人中心弹窗底部插槽
扩展 PlatformProfileModalShell 透传共享 footer 插槽能力 将昵称修改弹窗改为使用标准 profile modal footer 补充 modal shell 与昵称弹窗的 footer 接法回归测试 更新 PlatformUiKit 收口计划与共享决策记录
This commit is contained in:
@@ -0,0 +1,39 @@
|
||||
/* @vitest-environment jsdom */
|
||||
|
||||
import { render, screen } from '@testing-library/react';
|
||||
import { expect, test, vi } from 'vitest';
|
||||
|
||||
import { PlatformActionButton } from '../common/PlatformActionButton';
|
||||
import { PlatformProfileModalShell } from './PlatformProfileModalShell';
|
||||
|
||||
test('PlatformProfileModalShell forwards footer content into shared modal footer chrome', () => {
|
||||
render(
|
||||
<PlatformProfileModalShell
|
||||
title="修改昵称"
|
||||
onClose={vi.fn()}
|
||||
panelClassName="platform-remap-surface !max-w-sm rounded-[1.4rem]"
|
||||
bodyClassName="px-5 py-5"
|
||||
footerClassName="grid grid-cols-2 gap-3 px-5 pb-5 pt-0 sm:px-5"
|
||||
footer={
|
||||
<>
|
||||
<PlatformActionButton tone="secondary">取消</PlatformActionButton>
|
||||
<PlatformActionButton>保存</PlatformActionButton>
|
||||
</>
|
||||
}
|
||||
>
|
||||
<div>昵称输入区</div>
|
||||
</PlatformProfileModalShell>,
|
||||
);
|
||||
|
||||
const dialog = screen.getByRole('dialog', { name: '修改昵称' });
|
||||
const body = screen.getByText('昵称输入区').parentElement;
|
||||
const footerButton = screen.getByRole('button', { name: '保存' });
|
||||
const footer = footerButton.closest('div');
|
||||
|
||||
expect(dialog).toBeTruthy();
|
||||
expect(body?.className).toContain('px-5');
|
||||
expect(body?.className).toContain('py-5');
|
||||
expect(footer?.className).toContain('border-t');
|
||||
expect(footer?.className).toContain('grid');
|
||||
expect(footer?.className).toContain('pt-0');
|
||||
});
|
||||
@@ -8,6 +8,7 @@ type PlatformProfileModalShellProps = {
|
||||
description?: ReactNode;
|
||||
onClose: () => void;
|
||||
children: ReactNode;
|
||||
footer?: ReactNode;
|
||||
closeLabel?: string;
|
||||
closeVariant?: 'profile' | 'profileCompact';
|
||||
closeDisabled?: boolean;
|
||||
@@ -18,6 +19,7 @@ type PlatformProfileModalShellProps = {
|
||||
panelClassName: string;
|
||||
bodyClassName?: string;
|
||||
descriptionClassName?: string;
|
||||
footerClassName?: string;
|
||||
};
|
||||
|
||||
type PlatformProfileSecondaryModalShellProps = {
|
||||
@@ -56,6 +58,7 @@ export function PlatformProfileModalShell({
|
||||
description,
|
||||
onClose,
|
||||
children,
|
||||
footer,
|
||||
closeLabel,
|
||||
closeVariant = 'profile',
|
||||
closeDisabled = false,
|
||||
@@ -66,6 +69,7 @@ export function PlatformProfileModalShell({
|
||||
panelClassName,
|
||||
bodyClassName = 'px-5 py-5',
|
||||
descriptionClassName = PROFILE_MODAL_DESCRIPTION_CLASS,
|
||||
footerClassName,
|
||||
}: PlatformProfileModalShellProps) {
|
||||
return (
|
||||
<UnifiedModal
|
||||
@@ -89,6 +93,8 @@ export function PlatformProfileModalShell({
|
||||
titleClassName={PROFILE_MODAL_TITLE_CLASS}
|
||||
descriptionClassName={descriptionClassName}
|
||||
bodyClassName={bodyClassName}
|
||||
footer={footer}
|
||||
footerClassName={footerClassName}
|
||||
>
|
||||
{children}
|
||||
</UnifiedModal>
|
||||
|
||||
@@ -3159,9 +3159,12 @@ test('profile nickname modal uses platform text field and submits with Enter', a
|
||||
const nicknameInput = (await screen.findByLabelText(
|
||||
'新昵称',
|
||||
)) as HTMLInputElement;
|
||||
const footer = screen.getByRole('button', { name: '保存' }).closest('div');
|
||||
expect(nicknameInput.value).toBe('测试玩家');
|
||||
expect(nicknameInput.className).toContain('platform-text-field');
|
||||
expect(nicknameInput.className).toContain('platform-text-field--editor-dark');
|
||||
expect(footer?.className).toContain('border-t');
|
||||
expect(footer?.className).toContain('pt-0');
|
||||
|
||||
await user.clear(nicknameInput);
|
||||
await user.type(nicknameInput, '新昵称{Enter}');
|
||||
|
||||
@@ -2458,6 +2458,17 @@ function ProfileNicknameModal({
|
||||
closeVariant="profileCompact"
|
||||
panelClassName="platform-remap-surface !max-w-sm rounded-[1.4rem]"
|
||||
bodyClassName="px-5 py-5"
|
||||
footerClassName="grid grid-cols-2 gap-3 px-5 pb-5 pt-0 sm:px-5"
|
||||
footer={
|
||||
<>
|
||||
<PlatformActionButton tone="secondary" onClick={onClose}>
|
||||
取消
|
||||
</PlatformActionButton>
|
||||
<PlatformActionButton onClick={onSubmit} disabled={isSaving}>
|
||||
{isSaving ? '保存中' : '保存'}
|
||||
</PlatformActionButton>
|
||||
</>
|
||||
}
|
||||
>
|
||||
<label className="block">
|
||||
<span className="sr-only">新昵称</span>
|
||||
@@ -2488,14 +2499,6 @@ function ProfileNicknameModal({
|
||||
{error}
|
||||
</PlatformStatusMessage>
|
||||
) : null}
|
||||
<div className="mt-5 grid grid-cols-2 gap-3">
|
||||
<PlatformActionButton tone="secondary" onClick={onClose}>
|
||||
取消
|
||||
</PlatformActionButton>
|
||||
<PlatformActionButton onClick={onSubmit} disabled={isSaving}>
|
||||
{isSaving ? '保存中' : '保存'}
|
||||
</PlatformActionButton>
|
||||
</div>
|
||||
</PlatformProfileModalShell>
|
||||
);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user