- Improved lightbox toolbar button hit targets for better accessibility. - Updated ActivityItem and ActivityTimeline components to support managed collapse states for messages. - Refactored message collapsing logic to allow for user-controlled expansion in various components. - Enhanced CreateTeamDialog and LaunchTeamDialog with improved loading indicators and layout adjustments. - Increased maximum message length in SendMessageDialog to accommodate larger inputs. - Added icons and visual enhancements in ProjectPathSelector and EffortLevelSelector for better user experience.
116 lines
3.1 KiB
TypeScript
116 lines
3.1 KiB
TypeScript
import { describe, expect, it, vi } from 'vitest';
|
|
|
|
import {
|
|
findNewestMessageIndex,
|
|
resolveTimelineCollapseState,
|
|
} from '@renderer/components/team/activity/collapseState';
|
|
|
|
describe('team activity collapse state', () => {
|
|
describe('findNewestMessageIndex', () => {
|
|
it('skips a pinned thought group and returns the first real message', () => {
|
|
expect(
|
|
findNewestMessageIndex([
|
|
{ type: 'lead-thoughts' },
|
|
{ type: 'message' },
|
|
{ type: 'lead-thoughts' },
|
|
{ type: 'message' },
|
|
])
|
|
).toBe(1);
|
|
});
|
|
|
|
it('returns -1 when there are no real messages', () => {
|
|
expect(findNewestMessageIndex([{ type: 'lead-thoughts' }, { type: 'lead-thoughts' }])).toBe(
|
|
-1
|
|
);
|
|
});
|
|
});
|
|
|
|
describe('resolveTimelineCollapseState', () => {
|
|
it('falls back to default mode when global collapsed mode is off', () => {
|
|
expect(
|
|
resolveTimelineCollapseState({
|
|
allCollapsed: false,
|
|
itemIndex: 3,
|
|
newestMessageIndex: 1,
|
|
isPinnedThoughtGroup: false,
|
|
isExpandedOverride: false,
|
|
})
|
|
).toEqual({ mode: 'default' });
|
|
});
|
|
|
|
it('keeps the newest message open and non-toggleable in collapsed mode', () => {
|
|
expect(
|
|
resolveTimelineCollapseState({
|
|
allCollapsed: true,
|
|
itemIndex: 1,
|
|
newestMessageIndex: 1,
|
|
isPinnedThoughtGroup: false,
|
|
isExpandedOverride: false,
|
|
})
|
|
).toEqual({
|
|
mode: 'managed',
|
|
isCollapsed: false,
|
|
canToggle: false,
|
|
});
|
|
});
|
|
|
|
it('keeps the pinned thought group open and non-toggleable', () => {
|
|
expect(
|
|
resolveTimelineCollapseState({
|
|
allCollapsed: true,
|
|
itemIndex: 0,
|
|
newestMessageIndex: 2,
|
|
isPinnedThoughtGroup: true,
|
|
isExpandedOverride: false,
|
|
})
|
|
).toEqual({
|
|
mode: 'managed',
|
|
isCollapsed: false,
|
|
canToggle: false,
|
|
});
|
|
});
|
|
|
|
it('collapses an older item when it is no longer the newest message', () => {
|
|
const onToggleOverride = vi.fn();
|
|
const state = resolveTimelineCollapseState({
|
|
allCollapsed: true,
|
|
itemIndex: 2,
|
|
newestMessageIndex: 1,
|
|
isPinnedThoughtGroup: false,
|
|
isExpandedOverride: false,
|
|
onToggleOverride,
|
|
});
|
|
|
|
expect(state).toMatchObject({
|
|
mode: 'managed',
|
|
isCollapsed: true,
|
|
canToggle: true,
|
|
});
|
|
|
|
if (state.mode !== 'managed') {
|
|
throw new Error('Expected managed collapse state');
|
|
}
|
|
|
|
state.onToggle?.();
|
|
expect(onToggleOverride).toHaveBeenCalledTimes(1);
|
|
});
|
|
|
|
it('reopens older items that have a persisted expand override', () => {
|
|
expect(
|
|
resolveTimelineCollapseState({
|
|
allCollapsed: true,
|
|
itemIndex: 4,
|
|
newestMessageIndex: 1,
|
|
isPinnedThoughtGroup: false,
|
|
isExpandedOverride: true,
|
|
onToggleOverride: () => undefined,
|
|
})
|
|
).toEqual({
|
|
mode: 'managed',
|
|
isCollapsed: false,
|
|
canToggle: true,
|
|
onToggle: expect.any(Function),
|
|
});
|
|
});
|
|
});
|
|
});
|