'use client'; import { useState, useMemo } from 'react'; import { DragDropContext, Draggable, Droppable } from 'react-beautiful-dnd'; import classNames from 'classnames'; import { Button } from 'react-basics'; import { firstBy } from 'thenby'; import useDashboard, { saveDashboard } from 'store/dashboard'; import useMessages from 'components/hooks/useMessages'; import useApi from 'components/hooks/useApi'; import styles from './DashboardEdit.module.css'; const dragId = 'dashboard-website-ordering'; export function DashboardEdit() { const settings = useDashboard(); const { websiteOrder } = settings; const { formatMessage, labels } = useMessages(); const [order, setOrder] = useState(websiteOrder || []); const { get, useQuery } = useApi(); const { data: result } = useQuery(['websites'], () => get('/websites', { includeTeams: 1 })); const { data: websites } = result || {}; const ordered = useMemo(() => { if (websites) { return websites .map(website => ({ ...website, order: order.indexOf(website.id) })) .sort(firstBy('order')); } return []; }, [websites, order]); function handleWebsiteDrag({ destination, source }) { if (!destination || destination.index === source.index) return; const orderedWebsites = [...ordered]; const [removed] = orderedWebsites.splice(source.index, 1); orderedWebsites.splice(destination.index, 0, removed); setOrder(orderedWebsites.map(website => website?.id || 0)); } function handleSave() { saveDashboard({ editing: false, websiteOrder: order, }); } function handleCancel() { saveDashboard({ editing: false, websiteOrder }); } function handleReset() { setOrder([]); } return ( <>