feat: 完成 UI 基础层与核心页面迁移

This commit is contained in:
Wxw-Gu
2026-08-19 17:43:07 +08:00
parent a72ae49e2c
commit e9cc996ebb
62 changed files with 4279 additions and 5178 deletions
@@ -1,4 +1,6 @@
import { useState } from 'react'
import { fireEvent, render, screen, waitFor } from '@testing-library/react'
import userEvent from '@testing-library/user-event'
import { beforeEach, describe, expect, it, vi } from 'vitest'
import { PersonalWechatSendDialog } from '../../src/renderer/src/components/chat/PersonalWechatSendDialog'
@@ -47,6 +49,27 @@ const readyStatus = {
message: '个人微信已绑定'
}
function Harness({ onClose = vi.fn() }: { onClose?: () => void }): React.ReactElement {
const [open, setOpen] = useState(false)
return (
<>
<button type="button" onClick={() => setOpen(true)}>
</button>
{open && (
<PersonalWechatSendDialog
contact={contact}
isGroupChat
onClose={() => {
onClose()
setOpen(false)
}}
/>
)}
</>
)
}
describe('PersonalWechatSendDialog', () => {
beforeEach(() => {
getStatus.mockReset().mockResolvedValue(readyStatus)
@@ -208,4 +231,43 @@ describe('PersonalWechatSendDialog', () => {
expect(await screen.findByText('已绑定,等待消息初始化')).toBeInTheDocument()
expect(screen.getByRole('button', { name: '测试发送图片到群聊' })).toBeDisabled()
})
it('closes with Escape or the overlay and restores focus to the opener', async () => {
const user = userEvent.setup()
const onClose = vi.fn()
render(<Harness onClose={onClose} />)
const opener = screen.getByRole('button', { name: '打开测试发送' })
await user.click(opener)
await screen.findByText('技术交流群')
await user.keyboard('{Escape}')
expect(screen.queryByRole('dialog', { name: '个人微信测试发送' })).not.toBeInTheDocument()
await waitFor(() => expect(opener).toHaveFocus())
await user.click(opener)
const dialog = await screen.findByRole('dialog', { name: '个人微信测试发送' })
await user.click(dialog.previousElementSibling as HTMLElement)
expect(screen.queryByRole('dialog', { name: '个人微信测试发送' })).not.toBeInTheDocument()
await waitFor(() => expect(opener).toHaveFocus())
expect(onClose).toHaveBeenCalledTimes(2)
})
it('keeps the dialog open while a message is being sent', async () => {
const user = userEvent.setup()
sendMessage.mockImplementation(() => new Promise(() => undefined))
render(<Harness />)
await user.click(screen.getByRole('button', { name: '打开测试发送' }))
await screen.findByText('技术交流群')
await user.click(screen.getByRole('button', { name: '选择图片' }))
await user.click(screen.getByRole('button', { name: '测试发送图片到群聊' }))
expect(screen.getByRole('button', { name: '正在发送…' })).toBeDisabled()
await user.keyboard('{Escape}')
expect(screen.getByRole('dialog', { name: '个人微信测试发送' })).toBeVisible()
await user.click(
screen.getByRole('dialog', { name: '个人微信测试发送' }).previousElementSibling as HTMLElement
)
expect(screen.getByRole('dialog', { name: '个人微信测试发送' })).toBeVisible()
})
})