diff --git a/src/pages/Main/SortableWorkspaceSelector.tsx b/src/components/WorkspaceIcon/SortableWorkspaceSelector.tsx similarity index 97% rename from src/pages/Main/SortableWorkspaceSelector.tsx rename to src/components/WorkspaceIcon/SortableWorkspaceSelector.tsx index 7944211c..e443b4d1 100644 --- a/src/pages/Main/SortableWorkspaceSelector.tsx +++ b/src/components/WorkspaceIcon/SortableWorkspaceSelector.tsx @@ -2,7 +2,7 @@ import { useCallback, MouseEvent, useState } from 'react'; import { useTranslation } from 'react-i18next'; import { useSortable } from '@dnd-kit/sortable'; import { CSS } from '@dnd-kit/utilities'; -import WorkspaceSelector from './WorkspaceSelector'; +import { WorkspaceSelector } from './WorkspaceSelector'; import { IWorkspace } from '@services/workspaces/interface'; import { getWorkspaceMenuTemplate, openWorkspaceTagTiddler } from '@services/workspaces/getWorkspaceMenuTemplate'; diff --git a/src/components/WorkspaceIcon/SortableWorkspaceSelectorList.tsx b/src/components/WorkspaceIcon/SortableWorkspaceSelectorList.tsx new file mode 100644 index 00000000..e3bdbf5d --- /dev/null +++ b/src/components/WorkspaceIcon/SortableWorkspaceSelectorList.tsx @@ -0,0 +1,56 @@ +import { DndContext, useSensor, useSensors, PointerSensor } from '@dnd-kit/core'; +import { SortableContext, arrayMove, verticalListSortingStrategy } from '@dnd-kit/sortable'; +import { restrictToVerticalAxis } from '@dnd-kit/modifiers'; +import { IWorkspace, IWorkspaceWithMetadata } from '@services/workspaces/interface'; +import { SortableWorkspaceSelector } from './SortableWorkspaceSelector'; + +export interface ISortableListProps { + sidebarShortcutHints: boolean; + workspacesList: IWorkspaceWithMetadata[]; +} + +export function SortableWorkspaceSelectorList({ workspacesList, sidebarShortcutHints }: ISortableListProps): JSX.Element { + const dndSensors = useSensors( + useSensor(PointerSensor, { + activationConstraint: { + distance: 5, + }, + }), + ); + + const workspaceIDs = workspacesList?.map((workspace) => workspace.id) ?? []; + + return ( + { + if (over === null || active.id === over.id) return; + const oldIndex = workspaceIDs.indexOf(active.id); + const newIndex = workspaceIDs.indexOf(over.id); + + const newWorkspacesList = arrayMove(workspacesList, oldIndex, newIndex); + const newWorkspaces: Record = {}; + newWorkspacesList.forEach((workspace, index) => { + newWorkspaces[workspace.id] = workspace; + newWorkspaces[workspace.id].order = index; + }); + + await window.service.workspace.setWorkspaces(newWorkspaces); + }}> + + {workspacesList + .sort((a, b) => a.order - b.order) + .map((workspace, index) => ( + + ))} + + + ); +} diff --git a/src/pages/Main/WorkspaceSelector.tsx b/src/components/WorkspaceIcon/WorkspaceSelector.tsx similarity index 97% rename from src/pages/Main/WorkspaceSelector.tsx rename to src/components/WorkspaceIcon/WorkspaceSelector.tsx index 7d6d42ae..b9a9021b 100644 --- a/src/pages/Main/WorkspaceSelector.tsx +++ b/src/components/WorkspaceIcon/WorkspaceSelector.tsx @@ -39,7 +39,7 @@ const Root = styled.div<{ active?: boolean; hibernated?: boolean; workspaceClick `} box-sizing: border-box; border-left: ${({ workspaceCount }) => (workspaceCount > 1 ? '3px' : '0')} solid - ${({ active, theme }) => (active ? theme.palette.text.primary : 'transparent')}; + ${({ active, theme }) => (active === true ? theme.palette.text.primary : 'transparent')}; ${({ workspaceClickedLoading }) => workspaceClickedLoading === true && css` @@ -134,10 +134,10 @@ interface Props { showSidebarShortcutHints?: boolean; transparentBackground?: boolean; workspaceClickedLoading?: boolean; - workspaceName?: string; workspaceCount?: number; + workspaceName?: string; } -export default function WorkspaceSelector({ +export function WorkspaceSelector({ active = false, badgeCount = 0, hibernated = false, diff --git a/src/components/WorkspaceIcon/index.ts b/src/components/WorkspaceIcon/index.ts new file mode 100644 index 00000000..58b2d18f --- /dev/null +++ b/src/components/WorkspaceIcon/index.ts @@ -0,0 +1,3 @@ +export * from './WorkspaceSelector'; +export * from './SortableWorkspaceSelector'; +export * from './SortableWorkspaceSelectorList'; diff --git a/src/pages/Main/index.tsx b/src/pages/Main/index.tsx index 367fc64b..8b28d72c 100644 --- a/src/pages/Main/index.tsx +++ b/src/pages/Main/index.tsx @@ -2,9 +2,6 @@ import React from 'react'; import styled, { css } from 'styled-components'; import { useTranslation } from 'react-i18next'; import { Helmet } from 'react-helmet'; -import { DndContext, useSensor, useSensors, PointerSensor } from '@dnd-kit/core'; -import { SortableContext, arrayMove, verticalListSortingStrategy } from '@dnd-kit/sortable'; -import { restrictToVerticalAxis } from '@dnd-kit/modifiers'; import SimpleBar from 'simplebar-react'; import 'simplebar/dist/simplebar.min.css'; @@ -18,12 +15,10 @@ import { IUpdaterStatus } from '@services/updater/interface'; import { usePromiseValue } from '@/helpers/useServiceValue'; import { useUpdaterObservable } from '@services/updater/hooks'; -import WorkspaceSelector from './WorkspaceSelector'; import FindInPage from '../../components/FindInPage'; import { latestStableUpdateUrl } from '@/constants/urls'; -import { SortableWorkspaceSelector } from './SortableWorkspaceSelector'; -import { IWorkspace } from '@services/workspaces/interface'; +import { WorkspaceSelector, SortableWorkspaceSelectorList } from '@/components/WorkspaceIcon'; import { useWorkspacesListObservable } from '@services/workspaces/hooks'; import { usePreferenceObservable } from '@services/preferences/hooks'; import { CommandPaletteIcon } from '@/components/icon/CommandPaletteSVG'; @@ -150,15 +145,6 @@ export default function Main(): JSX.Element { const preferences = usePreferenceObservable(); const isFullScreen = usePromiseValue(window.service.window.isFullScreen, false)!; - const dndSensors = useSensors( - useSensor(PointerSensor, { - activationConstraint: { - distance: 5, - }, - }), - ); - - const workspaceIDs = workspacesList?.map((workspace) => workspace.id) ?? []; const activeWorkspaceMetadata = workspacesList ?.map((workspace) => ({ active: workspace.active, ...workspace.metadata })) ?.find((workspace) => workspace.active); @@ -184,37 +170,7 @@ export default function Main(): JSX.Element { {workspacesList === undefined ? (
{t('Loading')}
) : ( - { - if (over === null || active.id === over.id) return; - const oldIndex = workspaceIDs.indexOf(active.id); - const newIndex = workspaceIDs.indexOf(over.id); - - const newWorkspacesList = arrayMove(workspacesList, oldIndex, newIndex); - const newWorkspaces: Record = {}; - newWorkspacesList.forEach((workspace, index) => { - newWorkspaces[workspace.id] = workspace; - newWorkspaces[workspace.id].order = index; - }); - - await window.service.workspace.setWorkspaces(newWorkspaces); - }}> - - {workspacesList - .sort((a, b) => a.order - b.order) - .map((workspace, index) => ( - - ))} - - + )}