import clsx from 'clsx' import { DragDropContext, Droppable, Draggable } from 'react-beautiful-dnd' import { MenuIcon } from '@heroicons/react/solid' import { Col } from 'web/components/layout/col' import { Row } from 'web/components/layout/row' import { Subtitle } from 'web/components/subtitle' import { useMemberGroups } from 'web/hooks/use-group' import { filterDefined } from 'common/util/array' import { keyBy } from 'lodash' import { User } from 'common/user' export function ArrangeHome(props: { user: User | null homeSections: { visible: string[]; hidden: string[] } setHomeSections: (homeSections: { visible: string[] hidden: string[] }) => void }) { const { user, homeSections: { visible, hidden }, setHomeSections, } = props const memberGroups = useMemberGroups(user?.id) ?? [] const items = [ { label: 'Trending', id: 'score' }, { label: 'Newest', id: 'newest' }, { label: 'Close date', id: 'close-date' }, ...memberGroups.map((g) => ({ label: g.name, id: g.id, })), ] const itemsById = keyBy(items, 'id') const [visibleItems, hiddenItems] = [ filterDefined(visible.map((id) => itemsById[id])), filterDefined(hidden.map((id) => itemsById[id])), ] // Add unmentioned items to the visible list. visibleItems.push( ...items.filter( (item) => !visibleItems.includes(item) && !hiddenItems.includes(item) ) ) return ( { console.log('drag end', e) const { destination, source, draggableId } = e if (!destination) return const item = itemsById[draggableId] const newHomeSections = { visible: visibleItems.map((item) => item.id), hidden: hiddenItems.map((item) => item.id), } const sourceSection = source.droppableId as 'visible' | 'hidden' newHomeSections[sourceSection].splice(source.index, 1) const destSection = destination.droppableId as 'visible' | 'hidden' newHomeSections[destSection].splice(destination.index, 0, item.id) setHomeSections(newHomeSections) }} > ) } function DraggableList(props: { title: string items: { id: string; label: string }[] }) { const { title, items } = props return ( {(provided, snapshot) => ( {items.map((item, index) => ( {(provided, snapshot) => (
)}
))} {provided.placeholder} )}
) }