mirror of
https://github.com/sky-systems/sky_phone.git
synced 2026-09-01 18:58:58 +00:00
49 lines
1.3 KiB
TypeScript
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
|
|
}
|