UNPKG

@mantine/core

Version:

React components library focused on usability, accessibility and developer experience

1 lines 4.84 kB
{"version":3,"file":"use-cascader-safe-area.mjs","names":[],"sources":["../../../src/components/Cascader/use-cascader-safe-area.ts"],"sourcesContent":["import { useCallback, useEffect, useRef } from 'react';\nimport { safePolygon, type HandleCloseContext } from '@floating-ui/react';\nimport { useDirection } from '../../core';\nimport type { CascaderOption, CascaderSafeAreaPolygonOptions } from './Cascader';\n\nexport interface CascaderSafeAreaArmInput {\n level: number;\n reference: HTMLElement;\n floating: HTMLElement;\n clientX: number;\n clientY: number;\n}\n\nexport interface UseCascaderSafeAreaInput {\n safeAreaPolygon: boolean | CascaderSafeAreaPolygonOptions | undefined;\n onFlush: (level: number, option: CascaderOption) => void;\n}\n\nexport function useCascaderSafeArea({ safeAreaPolygon, onFlush }: UseCascaderSafeAreaInput) {\n const { dir } = useDirection();\n const enabled = Boolean(safeAreaPolygon);\n\n const optionsRef = useRef<CascaderSafeAreaPolygonOptions | undefined>(undefined);\n optionsRef.current = typeof safeAreaPolygon === 'object' ? safeAreaPolygon : undefined;\n\n const dirRef = useRef(dir);\n dirRef.current = dir;\n\n const onFlushRef = useRef(onFlush);\n onFlushRef.current = onFlush;\n\n const blockedLevelRef = useRef<number | null>(null);\n const pendingRef = useRef<{ level: number; option: CascaderOption } | null>(null);\n const cleanupRef = useRef<() => void>(() => {});\n const generationRef = useRef(0);\n\n const disarm = useCallback(() => {\n generationRef.current += 1;\n cleanupRef.current();\n cleanupRef.current = () => {};\n blockedLevelRef.current = null;\n pendingRef.current = null;\n }, []);\n\n const arm = useCallback(\n ({ level, reference, floating, clientX, clientY }: CascaderSafeAreaArmInput) => {\n disarm();\n const generation = generationRef.current;\n const ownerDocument = floating.ownerDocument;\n\n const handleMouseMove = safePolygon(optionsRef.current)({\n x: clientX,\n y: clientY,\n placement: dirRef.current === 'rtl' ? 'left-start' : 'right-start',\n elements: { domReference: reference, floating },\n onClose: () => {\n if (generationRef.current !== generation) {\n return;\n }\n\n const pending = pendingRef.current;\n pendingRef.current = null;\n disarm();\n\n if (pending) {\n onFlushRef.current(pending.level, pending.option);\n }\n },\n } as unknown as HandleCloseContext);\n\n blockedLevelRef.current = level;\n ownerDocument.addEventListener('mousemove', handleMouseMove);\n cleanupRef.current = () => ownerDocument.removeEventListener('mousemove', handleMouseMove);\n },\n [disarm]\n );\n\n useEffect(() => disarm, [disarm]);\n\n useEffect(() => {\n if (!enabled) {\n disarm();\n }\n }, [enabled, disarm]);\n\n const isBlocked = (level: number) =>\n blockedLevelRef.current !== null && level <= blockedLevelRef.current;\n\n const setPending = (level: number, option: CascaderOption) => {\n pendingRef.current = { level, option };\n };\n\n const clearPending = (level: number, option: CascaderOption) => {\n if (pendingRef.current?.level === level && pendingRef.current?.option.value === option.value) {\n pendingRef.current = null;\n }\n };\n\n return { enabled, arm, disarm, isBlocked, setPending, clearPending };\n}\n"],"mappings":";;;;;AAkBA,SAAgB,oBAAoB,EAAE,iBAAiB,WAAqC;CAC1F,MAAM,EAAE,QAAQ,aAAa;CAC7B,MAAM,UAAU,QAAQ,eAAe;CAEvC,MAAM,aAAa,OAAmD,KAAA,CAAS;CAC/E,WAAW,UAAU,OAAO,oBAAoB,WAAW,kBAAkB,KAAA;CAE7E,MAAM,SAAS,OAAO,GAAG;CACzB,OAAO,UAAU;CAEjB,MAAM,aAAa,OAAO,OAAO;CACjC,WAAW,UAAU;CAErB,MAAM,kBAAkB,OAAsB,IAAI;CAClD,MAAM,aAAa,OAAyD,IAAI;CAChF,MAAM,aAAa,aAAyB,CAAC,CAAC;CAC9C,MAAM,gBAAgB,OAAO,CAAC;CAE9B,MAAM,SAAS,kBAAkB;EAC/B,cAAc,WAAW;EACzB,WAAW,QAAQ;EACnB,WAAW,gBAAgB,CAAC;EAC5B,gBAAgB,UAAU;EAC1B,WAAW,UAAU;CACvB,GAAG,CAAC,CAAC;CAEL,MAAM,MAAM,aACT,EAAE,OAAO,WAAW,UAAU,SAAS,cAAwC;EAC9E,OAAO;EACP,MAAM,aAAa,cAAc;EACjC,MAAM,gBAAgB,SAAS;EAE/B,MAAM,kBAAkB,YAAY,WAAW,OAAO,CAAC,CAAC;GACtD,GAAG;GACH,GAAG;GACH,WAAW,OAAO,YAAY,QAAQ,eAAe;GACrD,UAAU;IAAE,cAAc;IAAW;GAAS;GAC9C,eAAe;IACb,IAAI,cAAc,YAAY,YAC5B;IAGF,MAAM,UAAU,WAAW;IAC3B,WAAW,UAAU;IACrB,OAAO;IAEP,IAAI,SACF,WAAW,QAAQ,QAAQ,OAAO,QAAQ,MAAM;GAEpD;EACF,CAAkC;EAElC,gBAAgB,UAAU;EAC1B,cAAc,iBAAiB,aAAa,eAAe;EAC3D,WAAW,gBAAgB,cAAc,oBAAoB,aAAa,eAAe;CAC3F,GACA,CAAC,MAAM,CACT;CAEA,gBAAgB,QAAQ,CAAC,MAAM,CAAC;CAEhC,gBAAgB;EACd,IAAI,CAAC,SACH,OAAO;CAEX,GAAG,CAAC,SAAS,MAAM,CAAC;CAEpB,MAAM,aAAa,UACjB,gBAAgB,YAAY,QAAQ,SAAS,gBAAgB;CAE/D,MAAM,cAAc,OAAe,WAA2B;EAC5D,WAAW,UAAU;GAAE;GAAO;EAAO;CACvC;CAEA,MAAM,gBAAgB,OAAe,WAA2B;EAC9D,IAAI,WAAW,SAAS,UAAU,SAAS,WAAW,SAAS,OAAO,UAAU,OAAO,OACrF,WAAW,UAAU;CAEzB;CAEA,OAAO;EAAE;EAAS;EAAK;EAAQ;EAAW;EAAY;CAAa;AACrE"}