From 7afc0bde2deb69762b10ee7b3f5c7bcf87ffa330 Mon Sep 17 00:00:00 2001 From: duckietm Date: Wed, 19 Mar 2025 12:55:27 +0100 Subject: [PATCH] :up: get the chooser fixed --- .../widgets/choosers/ChooserWidgetView.tsx | 96 +++++++++++++------ .../choosers/FurniChooserWidgetView.tsx | 21 ++-- src/css/widgets/ChooserWidgets.css | 1 + 3 files changed, 80 insertions(+), 38 deletions(-) create mode 100644 src/css/widgets/ChooserWidgets.css diff --git a/src/components/room/widgets/choosers/ChooserWidgetView.tsx b/src/components/room/widgets/choosers/ChooserWidgetView.tsx index 54c59cf..d59d6e0 100644 --- a/src/components/room/widgets/choosers/ChooserWidgetView.tsx +++ b/src/components/room/widgets/choosers/ChooserWidgetView.tsx @@ -1,52 +1,94 @@ -import { GetSessionDataManager } from '@nitrots/nitro-renderer'; +import { GetSessionDataManager, FurniturePickupAllComposer } from '@nitrots/nitro-renderer'; import { FC, useEffect, useMemo, useState } from 'react'; -import { LocalizeText, RoomObjectItem } from '../../../../api'; -import { Flex, InfiniteScroll, NitroCardContentView, NitroCardHeaderView, NitroCardView, Text } from '../../../../common'; +import { LocalizeText, RoomObjectItem, SendMessageComposer } from '../../../../api'; +import { Button, Flex, InfiniteScroll, NitroCardContentView, NitroCardHeaderView, NitroCardView, Text } from '../../../../common'; import { NitroInput, classNames } from '../../../../layout'; -interface ChooserWidgetViewProps -{ +const LIMIT_FURNI_PICKALL = 100; + +interface ChooserWidgetViewProps { title: string; items: RoomObjectItem[]; selectItem: (item: RoomObjectItem) => void; onClose: () => void; + pickallFurni?: boolean; } -export const ChooserWidgetView: FC = props => -{ - const { title = null, items = [], selectItem = null, onClose = null } = props; +export const ChooserWidgetView: FC = props => { + const { title = null, items = [], selectItem = null, onClose = null, pickallFurni = false } = props; const [ selectedItem, setSelectedItem ] = useState(null); const [ searchValue, setSearchValue ] = useState(''); + const [ checkAll, setCheckAll ] = useState(false); + const [ checkedIds, setCheckedIds ] = useState([]); const canSeeId = GetSessionDataManager().isModerator; - const filteredItems = useMemo(() => - { - const value = searchValue.toLocaleLowerCase(); + 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([]); + } + } + } - return items.filter(item => item.name?.toLocaleLowerCase().includes(value)); + const isChecked = (id: number) => checkedIds.includes(id); + + const onClickPickAll = () => { + SendMessageComposer(new FurniturePickupAllComposer(...checkedIds)); + setCheckedIds([]); + setCheckAll(false); + } + + const filteredItems = useMemo(() => { + const value = searchValue.toLocaleLowerCase(); + const itemsFilter = items.filter(item => item.name?.toLocaleLowerCase().includes(value)); + return itemsFilter.sort((a, b) => a.name.localeCompare(b.name)); }, [ items, searchValue ]); - useEffect(() => - { - if(!selectedItem) return; - + useEffect(() => { + if (!selectedItem) return; selectItem(selectedItem); }, [ selectedItem, selectItem ]); return ( - - + + setSearchValue(event.target.value) } /> - - { - return ( - setSelectedItem(row) }> - { row.name } { canSeeId && (' - ' + row.id) } - - ); - } } rows={ filteredItems } /> + { pickallFurni && ( + + checkedId() } /> + { LocalizeText('widget.chooser.checkall') } + + )} + ( + setSelectedItem(row) }> + { pickallFurni && ( + checkedId(row.id) } + onClick={ e => e.stopPropagation() } + /> + )} + { row.name } { canSeeId && (' - ' + row.id) } + + )} rows={ filteredItems } /> + { pickallFurni && ( + + )} ); -}; +}; \ No newline at end of file diff --git a/src/components/room/widgets/choosers/FurniChooserWidgetView.tsx b/src/components/room/widgets/choosers/FurniChooserWidgetView.tsx index bba30e1..67dc574 100644 --- a/src/components/room/widgets/choosers/FurniChooserWidgetView.tsx +++ b/src/components/room/widgets/choosers/FurniChooserWidgetView.tsx @@ -1,20 +1,17 @@ import { AddLinkEventTracker, ILinkEventTracker, RemoveLinkEventTracker } from '@nitrots/nitro-renderer'; import { FC, useEffect } from 'react'; import { LocalizeText } from '../../../../api'; -import { useFurniChooserWidget } from '../../../../hooks'; +import { useFurniChooserWidget, useRoom } from '../../../../hooks'; import { ChooserWidgetView } from './ChooserWidgetView'; -export const FurniChooserWidgetView: FC<{}> = props => -{ +export const FurniChooserWidgetView: FC<{}> = props => { const { items = null, onClose = null, selectItem = null, populateChooser = null } = useFurniChooserWidget(); + const { roomSession = null } = useRoom(); - useEffect(() => - { + useEffect(() => { const linkTracker: ILinkEventTracker = { - linkReceived: (url: string) => - { + linkReceived: (url: string) => { const parts = url.split('/'); - populateChooser(); }, eventUrlPrefix: 'furni-chooser/' @@ -25,7 +22,9 @@ export const FurniChooserWidgetView: FC<{}> = props => return () => RemoveLinkEventTracker(linkTracker); }, [ populateChooser ]); - if(!items) return null; + if (!items) return null; - return ; -}; + return ( + + ); +}; \ No newline at end of file diff --git a/src/css/widgets/ChooserWidgets.css b/src/css/widgets/ChooserWidgets.css new file mode 100644 index 0000000..56a6051 --- /dev/null +++ b/src/css/widgets/ChooserWidgets.css @@ -0,0 +1 @@ +1 \ No newline at end of file