Some checks are pending
E2E / Playwright e2e (push) Waiting to run
- Introduced turbopack alias for canvas in next.config.mjs. - Updated package.json scripts for development and branding tasks. - Added new dependencies for Tiptap extensions. - Implemented new demo layouts for agenda, contacts, drive, and mail applications. - Enhanced globals.css for improved theming and splash screen animations. - Added OAuth callback handling for drive mounts. - Updated layout components to integrate new demo shells and improve structure.
59 lines
1.6 KiB
TypeScript
59 lines
1.6 KiB
TypeScript
/** Distance mini (px) avant de considérer un geste comme drag vs clic. */
|
|
export const AGENDA_EVENT_DRAG_THRESHOLD_PX = 4
|
|
|
|
export function pointerDragExceeded(
|
|
startX: number,
|
|
startY: number,
|
|
x: number,
|
|
y: number,
|
|
threshold = AGENDA_EVENT_DRAG_THRESHOLD_PX,
|
|
): boolean {
|
|
return Math.hypot(x - startX, y - startY) >= threshold
|
|
}
|
|
|
|
/** Écouteurs window pour drag libre — évite perte capture si nœud source re-render. */
|
|
export function bindAgendaEventDragSession({
|
|
pointerId,
|
|
startX,
|
|
startY,
|
|
onMove,
|
|
onFinish,
|
|
}: {
|
|
pointerId: number
|
|
startX: number
|
|
startY: number
|
|
onMove: (clientX: number, clientY: number) => void
|
|
onFinish: (clientX: number, clientY: number, didDrag: boolean) => void
|
|
}): () => void {
|
|
let didDrag = false
|
|
|
|
const onPointerMove = (e: PointerEvent) => {
|
|
if (e.pointerId !== pointerId) return
|
|
if (!didDrag && pointerDragExceeded(startX, startY, e.clientX, e.clientY)) {
|
|
didDrag = true
|
|
}
|
|
if (didDrag) {
|
|
onMove(e.clientX, e.clientY)
|
|
}
|
|
}
|
|
|
|
const finish = (e: PointerEvent) => {
|
|
if (e.pointerId !== pointerId) return
|
|
const dragged =
|
|
didDrag || pointerDragExceeded(startX, startY, e.clientX, e.clientY)
|
|
onFinish(e.clientX, e.clientY, dragged)
|
|
cleanup()
|
|
}
|
|
|
|
const cleanup = () => {
|
|
window.removeEventListener("pointermove", onPointerMove)
|
|
window.removeEventListener("pointerup", finish)
|
|
window.removeEventListener("pointercancel", finish)
|
|
}
|
|
|
|
window.addEventListener("pointermove", onPointerMove)
|
|
window.addEventListener("pointerup", finish)
|
|
window.addEventListener("pointercancel", finish)
|
|
return cleanup
|
|
}
|