mirror of
https://github.com/sky-systems/sky_phone.git
synced 2026-09-04 17:23:25 +00:00
FIX - enable cross-page Home Screen dragging
This commit is contained in:
@@ -0,0 +1,116 @@
|
||||
import { describe, expect, it } from 'vitest'
|
||||
|
||||
import type { LaunchablePhoneAppId } from '@/types/apps'
|
||||
import { HOME_GRID_PAGE_SIZE, type HomeSlot } from '@/utils/homeLayout'
|
||||
import { layoutSpringboardHomePages } from '@/utils/springboardLayout'
|
||||
|
||||
function app(id: string): LaunchablePhoneAppId {
|
||||
return id as LaunchablePhoneAppId
|
||||
}
|
||||
|
||||
describe('springboard app page layout', () => {
|
||||
it('closes visual gaps per page while keeping page membership', () => {
|
||||
const grid = new Array<LaunchablePhoneAppId | null>(
|
||||
HOME_GRID_PAGE_SIZE * 2,
|
||||
).fill(null)
|
||||
grid[20] = app('row-six')
|
||||
grid[24] = app('page-two')
|
||||
|
||||
const pages = layoutSpringboardHomePages(grid, new Map(), 2)
|
||||
|
||||
expect(pages).toHaveLength(2)
|
||||
expect(pages[0]?.cells[0]).toMatchObject({
|
||||
item: 'row-six',
|
||||
sourceIndex: 20,
|
||||
})
|
||||
expect(pages[0]?.cells[1]).toMatchObject({ item: null, sourceIndex: 1 })
|
||||
expect(pages[1]?.cells[0]).toMatchObject({
|
||||
item: 'page-two',
|
||||
sourceIndex: 24,
|
||||
})
|
||||
})
|
||||
|
||||
it('reflows apps forward around widgets without swapping their order', () => {
|
||||
const grid = new Array<LaunchablePhoneAppId | null>(
|
||||
HOME_GRID_PAGE_SIZE,
|
||||
).fill(null)
|
||||
for (let index = 0; index < 8; index += 1) grid[index] = app(`app-${index}`)
|
||||
|
||||
const pages = layoutSpringboardHomePages(
|
||||
grid,
|
||||
new Map([[1, new Set([0, 1, 4, 5])]]),
|
||||
1,
|
||||
)
|
||||
|
||||
expect(
|
||||
pages[0]?.cells.slice(0, 12).map((cell) => cell?.item ?? null),
|
||||
).toEqual([
|
||||
null,
|
||||
null,
|
||||
'app-0',
|
||||
'app-1',
|
||||
null,
|
||||
null,
|
||||
'app-2',
|
||||
'app-3',
|
||||
'app-4',
|
||||
'app-5',
|
||||
'app-6',
|
||||
'app-7',
|
||||
])
|
||||
})
|
||||
|
||||
it('reflows folders as one item and keeps their source index', () => {
|
||||
const grid = new Array<HomeSlot>(HOME_GRID_PAGE_SIZE).fill(null)
|
||||
grid[0] = app('mail')
|
||||
grid[1] = {
|
||||
apps: [app('clock'), app('notes')],
|
||||
id: 'folder-tools-123456',
|
||||
name: 'Tools',
|
||||
type: 'folder',
|
||||
}
|
||||
|
||||
const pages = layoutSpringboardHomePages(
|
||||
grid,
|
||||
new Map([[1, new Set([0, 1])]]),
|
||||
1,
|
||||
)
|
||||
|
||||
expect(pages[0]?.cells[2]).toMatchObject({
|
||||
item: 'mail',
|
||||
sourceIndex: 0,
|
||||
})
|
||||
expect(pages[0]?.cells[3]).toMatchObject({
|
||||
item: {
|
||||
apps: ['clock', 'notes'],
|
||||
id: 'folder-tools-123456',
|
||||
type: 'folder',
|
||||
},
|
||||
sourceIndex: 1,
|
||||
})
|
||||
})
|
||||
|
||||
it('maps widget overflow to the visible destination page and offset', () => {
|
||||
const grid = Array.from({ length: HOME_GRID_PAGE_SIZE }, (_, index) =>
|
||||
app(`app-${index}`),
|
||||
)
|
||||
const pages = layoutSpringboardHomePages(
|
||||
grid,
|
||||
new Map([[1, new Set([0, 1, 2, 3])]]),
|
||||
2,
|
||||
)
|
||||
|
||||
expect(pages[1]?.cells[0]).toMatchObject({
|
||||
item: 'app-20',
|
||||
sourceIndex: 20,
|
||||
targetOffset: 0,
|
||||
targetPage: 2,
|
||||
})
|
||||
expect(pages[1]?.cells[1]).toMatchObject({
|
||||
item: 'app-21',
|
||||
sourceIndex: 21,
|
||||
targetOffset: 1,
|
||||
targetPage: 2,
|
||||
})
|
||||
})
|
||||
})
|
||||
Reference in New Issue
Block a user