diff --git a/src/components/room/widgets/choosers/ChooserWidgetView.tsx b/src/components/room/widgets/choosers/ChooserWidgetView.tsx index acedb9f..e6655d2 100644 --- a/src/components/room/widgets/choosers/ChooserWidgetView.tsx +++ b/src/components/room/widgets/choosers/ChooserWidgetView.tsx @@ -1,6 +1,9 @@ +import { FurniturePickupAllComposer } from '@nitrots/nitro-renderer'; import { FC, useEffect, useMemo, useState } from 'react'; -import { GetSessionDataManager, LocalizeText, RoomObjectItem } from '../../../../api'; -import { classNames, Flex, InfiniteScroll, NitroCardContentView, NitroCardHeaderView, NitroCardView, Text } from '../../../../common'; +import { GetSessionDataManager, LocalizeText, RoomObjectItem, SendMessageComposer } from '../../../../api'; +import { Base, Button, Flex, InfiniteScroll, NitroCardContentView, NitroCardHeaderView, NitroCardView, Text, classNames } from '../../../../common'; + +const LIMIT_FURNI_PICKALL = 100; interface ChooserWidgetViewProps { @@ -8,6 +11,7 @@ interface ChooserWidgetViewProps items: RoomObjectItem[]; selectItem: (item: RoomObjectItem) => void; onClose: () => void; + pickallFurni?: boolean; } export const ChooserWidgetView: FC = props => @@ -17,11 +21,52 @@ export const ChooserWidgetView: FC = props => const [ searchValue, setSearchValue ] = useState(''); const canSeeId = GetSessionDataManager().isModerator; + const [ checkAll, setCheckAll ] = useState(false); + const [ checkedIds, setCheckedIds ] = useState([]); + + const checkedId = (id?: number) => + { + if (id) + { + if (isChecked(id)) + setCheckedIds(checkedIds.filter(x => x !== id)); + else if(checkedIds.length < LIMIT_FURNI_PICKALL) + setCheckedIds([ ...checkedIds, id ]); + } + else + { + setCheckAll(value => !value); + + if (!checkAll) + { + const itemIds = filteredItems.map(x => x.id).slice(0, LIMIT_FURNI_PICKALL); + setCheckedIds(itemIds); + } + else + { + setCheckedIds([]); + } + } + } + + const isChecked = (id: number) => checkedIds.includes(id); + + const onClickPickAll = () => + { + SendMessageComposer(new FurniturePickupAllComposer(...checkedIds)); + setCheckedIds([]); + setCheckAll(false); + } + const filteredItems = useMemo(() => { const value = searchValue.toLocaleLowerCase(); - return items.filter(item => item.name?.toLocaleLowerCase().includes(value)); + const itemsFilter = items.filter(item => item.name?.toLocaleLowerCase().includes(value)); + + const itemsFilterSorted = itemsFilter.sort((a, b) => a.name.localeCompare(b.name)); + + return itemsFilterSorted }, [ items, searchValue ]); useEffect(() => @@ -33,17 +78,25 @@ export const ChooserWidgetView: FC = props => return ( - - + + setSearchValue(event.target.value) } /> + { props.pickallFurni && + checkedId() } /> + + } { return ( setSelectedItem(row) }> + { props.pickallFurni && checkedId(row.id) } /> } { row.name } { canSeeId && (' - ' + row.id) } ); } } /> + { props.pickallFurni && } ); diff --git a/src/components/room/widgets/choosers/FurniChooserWidgetView.tsx b/src/components/room/widgets/choosers/FurniChooserWidgetView.tsx index ae84e60..3ccdf46 100644 --- a/src/components/room/widgets/choosers/FurniChooserWidgetView.tsx +++ b/src/components/room/widgets/choosers/FurniChooserWidgetView.tsx @@ -1,12 +1,13 @@ import { ILinkEventTracker } from '@nitrots/nitro-renderer'; import { FC, useEffect } from 'react'; import { AddEventLinkTracker, LocalizeText, RemoveLinkEventTracker } from '../../../../api'; -import { useFurniChooserWidget } from '../../../../hooks'; +import { useFurniChooserWidget, useRoom } from '../../../../hooks'; import { ChooserWidgetView } from './ChooserWidgetView'; export const FurniChooserWidgetView: FC<{}> = props => { const { items = null, onClose = null, selectItem = null, populateChooser = null } = useFurniChooserWidget(); + const { roomSession = null } = useRoom() useEffect(() => { @@ -25,7 +26,7 @@ export const FurniChooserWidgetView: FC<{}> = props => return () => RemoveLinkEventTracker(linkTracker); }, [ populateChooser ]); - if(!items) return null; + if (!items) return null; - return ; + return ; }