Files
sky_phone/frontend/src/utils/mailSwipe.ts
T
2026-08-06 17:39:24 +02:00

49 lines
1.3 KiB
TypeScript

export type MailSwipeAction = 'delete' | 'read'
export type MailSwipeAxis = 'horizontal' | 'vertical'
export const MAIL_SWIPE_ACTION_WIDTH = 84
export const MAIL_SWIPE_AXIS_LOCK = 8
export const MAIL_SWIPE_TRIGGER = 64
export function resolveMailSwipeAxis(
deltaX: number,
deltaY: number,
): MailSwipeAxis | null {
const horizontalDistance = Math.abs(deltaX)
const verticalDistance = Math.abs(deltaY)
if (Math.max(horizontalDistance, verticalDistance) < MAIL_SWIPE_AXIS_LOCK) {
return null
}
return horizontalDistance > verticalDistance * 1.15
? 'horizontal'
: 'vertical'
}
export function clampMailSwipeOffset(
deltaX: number,
canRead: boolean,
canDelete: boolean,
): number {
if ((deltaX > 0 && !canRead) || (deltaX < 0 && !canDelete)) return 0
const direction = Math.sign(deltaX)
const distance = Math.abs(deltaX)
const resistedDistance =
distance <= MAIL_SWIPE_ACTION_WIDTH
? distance
: MAIL_SWIPE_ACTION_WIDTH + (distance - MAIL_SWIPE_ACTION_WIDTH) * 0.18
return direction * Math.min(resistedDistance, MAIL_SWIPE_ACTION_WIDTH + 18)
}
export function resolveMailSwipeAction(
offset: number,
canRead: boolean,
canDelete: boolean,
): MailSwipeAction | null {
if (canRead && offset >= MAIL_SWIPE_TRIGGER) return 'read'
if (canDelete && offset <= -MAIL_SWIPE_TRIGGER) return 'delete'
return null
}