import CollectionView from "@/entrypoints/sidepanel/components/CollectionView"; import GroupView from "@/entrypoints/sidepanel/components/GroupView"; import { DndItem } from "@/entrypoints/sidepanel/hooks/useDndItem"; import CloudIssueMessages from "@/entrypoints/sidepanel/layouts/collections/messages/CloudIssueMessages"; import CtaMessage from "@/entrypoints/sidepanel/layouts/collections/messages/CtaMessage"; import filterCollections, { CollectionFilterType } from "@/entrypoints/sidepanel/utils/filterCollections"; import sortCollections from "@/entrypoints/sidepanel/utils/sortCollections"; import { track } from "@/features/analytics"; import useSettings from "@/hooks/useSettings"; import { CollectionItem } from "@/models/CollectionModels"; import { DndContext, DragEndEvent, DragOverlay, DragStartEvent, MouseSensor, TouchSensor, useSensor, useSensors } from "@dnd-kit/core"; import { rectSortingStrategy, SortableContext, verticalListSortingStrategy } from "@dnd-kit/sortable"; import { Body1, Button, Caption1, mergeClasses, Subtitle2 } from "@fluentui/react-components"; import { ArrowUndo20Regular, SearchInfo24Regular, Sparkle48Regular } from "@fluentui/react-icons"; import { ReactElement } from "react"; import TabView from "../../components/TabView"; import CollectionContext from "../../contexts/CollectionContext"; import { useCollections } from "../../contexts/CollectionsProvider"; import applyReorder from "../../utils/dnd/applyReorder"; import { collisionDetector } from "../../utils/dnd/collisionDetector"; import { snapHandleToCursor } from "../../utils/dnd/snapHandleToCursor"; import { useStyles_CollectionListView } from "./CollectionListView.styles"; import SearchBar from "./SearchBar"; import StorageCapacityIssueMessage from "./messages/StorageCapacityIssueMessage"; export default function CollectionListView(): ReactElement { const { tilesView, updateCollections, collections } = useCollections(); const [sortMode, setSortMode] = useSettings("sortMode"); const [query, setQuery] = useState(""); const [colors, setColors] = useState([]); const [showHidden, setShowHidden] = useState(false); const [compactView] = useSettings("compactView"); const [active, setActive] = useState(null); const sensors = useSensors( useSensor(MouseSensor, { activationConstraint: { delay: 150, tolerance: 20 } }), useSensor(TouchSensor, { activationConstraint: { delay: 300, tolerance: 20 } }) ); const resultList = useMemo( () => sortCollections(filterCollections(collections, { query, colors, showHidden }), sortMode), [query, colors, sortMode, collections, showHidden] ); const cls = useStyles_CollectionListView(); const resetFilter = useCallback(() => { setQuery(""); setColors([]); setShowHidden(false); }, []); const updateFilter = useCallback((newColors: CollectionFilterType["colors"], newShowHidden: boolean) => { setColors(newColors); setShowHidden(newShowHidden); }, []); const handleDragStart = (event: DragStartEvent): void => { setActive(event.active.data.current as DndItem); }; const handleDragEnd = (args: DragEndEvent): void => { setActive(null); const result: CollectionItem[] | null = applyReorder(resultList, args); if (result !== null) { updateCollections(result); if (sortMode !== "custom") setSortMode("custom"); track("used_drag_and_drop"); } }; if (sortMode === null || collections === null) return <>; if (collections.length < 1) return (
{ i18n.t("main.list.empty.title") } { i18n.t("main.list.empty.message") }
); return (
{ resultList.length < 1 ?
{ i18n.t("main.list.empty_search.title") } { i18n.t("main.list.empty_search.message") }
:
index.toString()) } strategy={ tilesView ? verticalListSortingStrategy : rectSortingStrategy } > { resultList.map((collection, index) => ) } { active !== null ? active.item.type === "collection" ? : { active.item.type === "group" ? : } : <> }
}
); }