From 0c4277e5b917df5971a85f0e5f1e11040d9f78dc Mon Sep 17 00:00:00 2001 From: Peng Xiao Date: Thu, 7 Sep 2023 23:20:48 +0800 Subject: [PATCH] fix: better transition (#4267) --- apps/core/src/providers/modal-provider.tsx | 7 +-- .../src/components/workspace-list/index.tsx | 47 ++++++++++++++----- 2 files changed, 38 insertions(+), 16 deletions(-) diff --git a/apps/core/src/providers/modal-provider.tsx b/apps/core/src/providers/modal-provider.tsx index ddeaeb26b..db36ca475 100644 --- a/apps/core/src/providers/modal-provider.tsx +++ b/apps/core/src/providers/modal-provider.tsx @@ -13,6 +13,7 @@ import { useAtom, useAtomValue, useSetAtom } from 'jotai'; import type { ReactElement } from 'react'; import { lazy, + startTransition, Suspense, useCallback, useEffect, @@ -223,13 +224,14 @@ export const AllWorkspaceModals = (): ReactElement => { ); const { jumpToSubPath } = useNavigateHelper(); - const workspaces = useAtomValue(rootWorkspacesMetadataAtom); + const workspaces = useAtomValue(rootWorkspacesMetadataAtom, { + delay: 0, + }); const setWorkspaces = useSetAtom(rootWorkspacesMetadataAtom); const [currentWorkspaceId, setCurrentWorkspaceId] = useAtom( currentWorkspaceIdAtom ); const setCurrentPageId = useSetAtom(currentPageIdAtom); - const [isPending, startTransition] = useTransition(); const [, startCloseTransition] = useTransition(); const [, setOpenSettingModalAtom] = useAtom(openSettingModalAtom); @@ -250,7 +252,6 @@ export const AllWorkspaceModals = (): ReactElement => { <> { } const SortableWorkspaceItem = (props: SortableWorkspaceItemProps) => { - const { setNodeRef, attributes, listeners, transform } = useSortable({ - id: props.item.id, - }); + const { setNodeRef, attributes, listeners, transform, transition } = + useSortable({ + id: props.item.id, + }); const style: CSSProperties = useMemo( () => ({ transform: transform ? `translate3d(${transform.x}px, ${transform.y}px, 0)` : undefined, + transition, pointerEvents: props.disabled ? 'none' : undefined, opacity: props.disabled ? 0.6 : undefined, }), - [props.disabled, transform] + [props.disabled, transform, transition] ); return (
{ }, }) ); + const workspaceList = props.items; + const [optimisticList, setOptimisticList] = useState(workspaceList); + + useEffect(() => { + setOptimisticList(workspaceList); + }, [workspaceList]); + + const onDragEnd = useCallback( + (event: DragEndEvent) => { + const { active, over } = event; + if (active.id !== over?.id) { + setOptimisticList(workspaceList => { + const oldIndex = workspaceList.findIndex(w => w.id === active.id); + const newIndex = workspaceList.findIndex(w => w.id === over?.id); + const newList = arrayMove(workspaceList, oldIndex, newIndex); + return newList; + }); + props.onDragEnd(event); + } + }, + [props] + ); + return ( - - - {props.items.map(item => ( + + + {optimisticList.map(item => ( ))}