Align fullscreen return button with project actions

This commit is contained in:
鲨鱼辣椒 committed 2026-09-30 00:58:46 +08:00
1 parent 80b0cb99a8
commit 343f88ce59
9 files changed
+203 -7

No files matched your search

+47 -2
View File
@@ -24,6 +24,7 @@ describe('TitleBar platform behavior', () => {
beforeEach(() => {
invokeIpcMock.mockReset();
invokeIpcMock.mockResolvedValue(false);
vi.mocked(window.electron.ipcRenderer.on).mockReset();
useSettingsStore.setState({ sidebarCollapsed: false, classroomSidebarWidth: 171 });
});
@@ -84,7 +85,7 @@ describe('TitleBar platform behavior', () => {
expect(container.querySelector('.drag-region')).toBeInTheDocument();
expect(screen.queryByTitle('Minimize')).not.toBeInTheDocument();
expect(invokeIpcMock).not.toHaveBeenCalled();
expect(invokeIpcMock).toHaveBeenCalledWith('window:isFullScreen');
});
it('aligns the classroom title bar with one project sidebar and no duplicate branding', () => {
@@ -108,6 +109,50 @@ describe('TitleBar platform behavior', () => {
expect(screen.getByTestId('titlebar-sidebar-toggle')).toHaveClass('right-2');
});
it('aligns fullscreen return with project buttons and restores native window-control space on exit', async () => {
window.electron.platform = 'darwin';
invokeIpcMock.mockResolvedValue(true);
const unsubscribe = vi.fn();
let notify: (...args: unknown[]) => void = () => {};
vi.mocked(window.electron.ipcRenderer.on).mockImplementation((channel, callback) => {
expect(channel).toBe('window:fullscreen-changed');
notify = callback;
return unsubscribe;
});
const { unmount } = render(<TitleBar integrated workspaceLayout />);
const navigation = screen.getByTestId('classroom-titlebar-navigation');
await waitFor(() => expect(navigation).toHaveClass('pl-3'));
act(() => notify(false));
expect(navigation).toHaveClass('pl-[88px]');
act(() => notify(true));
expect(navigation).toHaveClass('pl-3');
unmount();
expect(unsubscribe).toHaveBeenCalledOnce();
});
it('keeps a native fullscreen transition when an older initial query resolves later', async () => {
window.electron.platform = 'darwin';
let resolveQuery: (value: boolean) => void = () => {};
invokeIpcMock.mockReturnValue(new Promise<boolean>((resolve) => { resolveQuery = resolve; }));
let notify: (...args: unknown[]) => void = () => {};
vi.mocked(window.electron.ipcRenderer.on).mockImplementation((_channel, callback) => {
notify = callback;
return vi.fn();
});
render(<TitleBar integrated workspaceLayout />);
act(() => notify(true));
await act(async () => resolveQuery(false));
expect(screen.getByTestId('classroom-titlebar-navigation')).toHaveClass('pl-3');
});
it('keeps the native safe inset when an older preload rejects fullscreen events', () => {
window.electron.platform = 'darwin';
vi.mocked(window.electron.ipcRenderer.on).mockImplementation(() => { throw new Error('Invalid IPC channel'); });
render(<TitleBar integrated workspaceLayout />);
expect(screen.getByTestId('classroom-titlebar-navigation')).toHaveClass('pl-[88px]');
expect(invokeIpcMock).not.toHaveBeenCalled();
});
it('renders the painting title bar as a transparent overlay with the logo at the window edge', () => {
window.electron.platform = 'darwin';
@@ -214,7 +259,7 @@ describe('TitleBar platform behavior', () => {
it.each([
['darwin', 168, 168, 'pl-[88px]'],
['win32', 128, 88, 'pl-2'],
['win32', 128, 88, 'pl-3'],
] as const)('keeps both %s navigation controls outside the conversation header at narrow and collapsed widths', (platform, narrowWidth, collapsedWidth, insetClass) => {
window.electron.platform = platform;
useSettingsStore.setState({ classroomSidebarWidth: 128 });