UNPKG

@mantine/hooks

Version:

A collection of 50+ hooks for state and UI management

1 lines 4.71 kB
{"version":3,"file":"use-selection.cjs","names":[],"sources":["../../src/use-selection/use-selection.ts"],"sourcesContent":["import { useCallback, useState } from 'react';\nimport { useDidUpdate } from '../use-did-update/use-did-update';\n\nexport interface UseSelectionInput<T> {\n /** The array of items to select from */\n data: T[];\n\n /** The initial selection, empty array by default */\n defaultSelection?: T[];\n\n /** If true, selection is reset when data changes */\n resetSelectionOnDataChange?: boolean;\n}\n\nexport interface UseSelectionHandlers<T> {\n /** Add an item to the selection */\n select: (selected: T) => void;\n\n /** Remove an item from the selection */\n deselect: (deselected: T) => void;\n\n /** Toggle an item's selection state */\n toggle: (toggled: T) => void;\n\n /** Returns true if all items from the `data` are selected */\n isAllSelected: () => boolean;\n\n /** Returns true if at least one item from the `data` is selected */\n isSomeSelected: () => boolean;\n\n /** Set the selection to a specific array of items */\n setSelection: (selection: T[]) => void;\n\n /** Clear all selections */\n resetSelection: () => void;\n}\n\nexport type UseSelectionReturnValue<T> = readonly [T[], UseSelectionHandlers<T>];\n\nexport function useSelection<T>(input: UseSelectionInput<T>): UseSelectionReturnValue<T> {\n const [selectionSet, setSelectionSet] = useState<Set<T>>(new Set(input.defaultSelection || []));\n\n useDidUpdate(() => {\n if (input.resetSelectionOnDataChange) {\n setSelectionSet(new Set());\n }\n }, [input.data, input.resetSelectionOnDataChange]);\n\n const select = useCallback((selected: T) => {\n setSelectionSet((state) => {\n if (!state.has(selected)) {\n const newSet = new Set(state);\n newSet.add(selected);\n return newSet;\n }\n return state;\n });\n }, []);\n\n const deselect = useCallback((deselected: T) => {\n setSelectionSet((state) => {\n if (state.has(deselected)) {\n const newSet = new Set(state);\n newSet.delete(deselected);\n return newSet;\n }\n return state;\n });\n }, []);\n\n const toggle = useCallback((toggled: T) => {\n setSelectionSet((state) => {\n const newSet = new Set(state);\n if (state.has(toggled)) {\n newSet.delete(toggled);\n } else {\n newSet.add(toggled);\n }\n return newSet;\n });\n }, []);\n\n const resetSelection = useCallback(() => {\n setSelectionSet(new Set());\n }, []);\n\n const setSelection = useCallback((selection: T[]) => {\n setSelectionSet(new Set(selection));\n }, []);\n\n const isAllSelected = useCallback(() => {\n if (input.data.length === 0) {\n return false;\n }\n return input.data.every((item) => selectionSet.has(item));\n }, [selectionSet, input.data]);\n\n const isSomeSelected = useCallback(() => {\n return input.data.some((item) => selectionSet.has(item));\n }, [selectionSet, input.data]);\n\n return [\n Array.from(selectionSet),\n {\n select,\n deselect,\n toggle,\n isAllSelected,\n isSomeSelected,\n setSelection,\n resetSelection,\n },\n ];\n}\n\nexport namespace useSelection {\n export type Input<T> = UseSelectionInput<T>;\n export type Handlers<T> = UseSelectionHandlers<T>;\n export type ReturnValue<T> = UseSelectionReturnValue<T>;\n}\n"],"mappings":";;;;AAuCA,SAAgB,aAAgB,OAAyD;CACvF,MAAM,CAAC,cAAc,oBAAA,GAAA,MAAA,UAAoC,IAAI,IAAI,MAAM,oBAAoB,EAAE,CAAC,CAAC;AAE/F,wBAAA,mBAAmB;AACjB,MAAI,MAAM,2BACR,iCAAgB,IAAI,KAAK,CAAC;IAE3B,CAAC,MAAM,MAAM,MAAM,2BAA2B,CAAC;CAElD,MAAM,UAAA,GAAA,MAAA,cAAsB,aAAgB;AAC1C,mBAAiB,UAAU;AACzB,OAAI,CAAC,MAAM,IAAI,SAAS,EAAE;IACxB,MAAM,SAAS,IAAI,IAAI,MAAM;AAC7B,WAAO,IAAI,SAAS;AACpB,WAAO;;AAET,UAAO;IACP;IACD,EAAE,CAAC;CAEN,MAAM,YAAA,GAAA,MAAA,cAAwB,eAAkB;AAC9C,mBAAiB,UAAU;AACzB,OAAI,MAAM,IAAI,WAAW,EAAE;IACzB,MAAM,SAAS,IAAI,IAAI,MAAM;AAC7B,WAAO,OAAO,WAAW;AACzB,WAAO;;AAET,UAAO;IACP;IACD,EAAE,CAAC;CAEN,MAAM,UAAA,GAAA,MAAA,cAAsB,YAAe;AACzC,mBAAiB,UAAU;GACzB,MAAM,SAAS,IAAI,IAAI,MAAM;AAC7B,OAAI,MAAM,IAAI,QAAQ,CACpB,QAAO,OAAO,QAAQ;OAEtB,QAAO,IAAI,QAAQ;AAErB,UAAO;IACP;IACD,EAAE,CAAC;CAEN,MAAM,kBAAA,GAAA,MAAA,mBAAmC;AACvC,kCAAgB,IAAI,KAAK,CAAC;IACzB,EAAE,CAAC;CAEN,MAAM,gBAAA,GAAA,MAAA,cAA4B,cAAmB;AACnD,kBAAgB,IAAI,IAAI,UAAU,CAAC;IAClC,EAAE,CAAC;CAEN,MAAM,iBAAA,GAAA,MAAA,mBAAkC;AACtC,MAAI,MAAM,KAAK,WAAW,EACxB,QAAO;AAET,SAAO,MAAM,KAAK,OAAO,SAAS,aAAa,IAAI,KAAK,CAAC;IACxD,CAAC,cAAc,MAAM,KAAK,CAAC;CAE9B,MAAM,kBAAA,GAAA,MAAA,mBAAmC;AACvC,SAAO,MAAM,KAAK,MAAM,SAAS,aAAa,IAAI,KAAK,CAAC;IACvD,CAAC,cAAc,MAAM,KAAK,CAAC;AAE9B,QAAO,CACL,MAAM,KAAK,aAAa,EACxB;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACD,CACF"}