123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149 |
- import {useCallback, useEffect, useMemo, useState} from 'react';
- import useFeedbackQueryKeys from 'sentry/components/feedback/useFeedbackQueryKeys';
- interface Props {
- hits: number;
- knownIds: string[];
- }
- type State = {ids: Set<string>} | {all: true};
- interface Return {
-
- countSelected: number;
-
- deselectAll: () => void;
-
- isAllSelected: 'indeterminate' | boolean;
-
- isAnySelected: boolean;
-
- isSelected: (id: string) => 'all-selected' | boolean;
-
- selectAll: () => void;
-
- selectedIds: 'all' | string[];
-
- toggleSelected: (id: string) => void;
- }
- export default function useListItemCheckboxState({hits, knownIds}: Props): Return {
- const {getListQueryKey} = useFeedbackQueryKeys();
- const [state, setState] = useState<State>({ids: new Set()});
- const listQueryKey = getListQueryKey();
- useEffect(() => {
-
- setState({ids: new Set()});
- }, [listQueryKey]);
- const selectAll = useCallback(() => {
-
- setState({all: true});
- }, []);
- const deselectAll = useCallback(() => {
- setState({ids: new Set()});
- }, []);
- const toggleSelected = useCallback(
- (id: string) => {
- setState(prev => {
- if ('all' in prev && hits !== knownIds.length) {
-
-
- }
-
- if ('all' in prev) {
- const ids = new Set(knownIds);
- ids.delete(id);
- return {ids};
- }
-
- const ids = prev.ids;
- if (ids.has(id)) {
- ids.delete(id);
- } else {
- ids.add(id);
- }
- return {ids};
- });
- },
- [hits, knownIds]
- );
- const isSelected = useCallback(
- (id: string) => {
-
-
- if ('all' in state && hits !== knownIds.length) {
- return 'all-selected';
- }
-
- if ('all' in state) {
- return true;
- }
-
- return state.ids.has(id);
- },
- [state, hits, knownIds]
- );
- const isAllSelected = useMemo(() => {
- if ('all' in state) {
- return true;
- }
- if (state.ids.size === 0) {
- return false;
- }
- if (state.ids.size === hits) {
- return true;
- }
- return 'indeterminate';
- }, [state, hits]);
- const isAnySelected = useMemo(() => 'all' in state || state.ids.size > 0, [state]);
- const selectedIds = useMemo(() => {
- return 'all' in state ? 'all' : Array.from(state.ids);
- }, [state]);
- return {
- countSelected: 'all' in state ? hits : selectedIds.length,
- deselectAll,
- isAllSelected,
- isAnySelected,
- isSelected,
- selectAll,
- selectedIds,
- toggleSelected,
- };
- }
|