Skip to content

Commit 1630ced

Browse files
authored
Merge pull request #115 from ClayPulse/dev
Fix sharing & canvas tab states
2 parents da8d572 + 5a37fb3 commit 1630ced

File tree

8 files changed

+47
-23
lines changed

8 files changed

+47
-23
lines changed

web/app/(main-layout)/layout.tsx

Lines changed: 10 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ import PlatformAssistantProvider from "@/components/providers/platform-assistant
77
import RemoteModuleProvider from "@/components/providers/remote-module-provider";
88
import WrappedHeroUIProvider from "@/components/providers/wrapped-hero-ui-provider";
99
import { Analytics } from "@vercel/analytics/next";
10-
import { ReactFlowProvider } from "@xyflow/react";
1110
import "material-icons/iconfont/material-icons.css";
1211
import type { Metadata } from "next";
1312
import { Suspense } from "react";
@@ -33,18 +32,16 @@ export default function RootLayout({
3332
<EditorContextProvider>
3433
<CapacitorProvider>
3534
<InterModuleCommunicationProvider>
36-
<ReactFlowProvider>
37-
<DndProvider>
38-
<RemoteModuleProvider isPreventingCSS={true}>
39-
<Toaster />
40-
<Nav>
41-
<PlatformAssistantProvider>
42-
{children}
43-
</PlatformAssistantProvider>
44-
</Nav>
45-
</RemoteModuleProvider>
46-
</DndProvider>
47-
</ReactFlowProvider>
35+
<DndProvider>
36+
<RemoteModuleProvider isPreventingCSS={true}>
37+
<Toaster />
38+
<Nav>
39+
<PlatformAssistantProvider>
40+
{children}
41+
</PlatformAssistantProvider>
42+
</Nav>
43+
</RemoteModuleProvider>
44+
</DndProvider>
4845
</InterModuleCommunicationProvider>
4946
</CapacitorProvider>
5047
</EditorContextProvider>

web/components/explorer/app/app-explorer.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -90,14 +90,14 @@ function DraggableAppPreviewCard({ ext }: { ext: ExtensionApp }) {
9090
isShowCompatibleChip={false}
9191
isShowContextMenu={false}
9292
isDisableButtonPress={!isDragFinished}
93-
onPress={(ext) => {
93+
onPress={async (ext) => {
9494
const config: AppViewConfig = {
9595
app: ext.config.id,
9696
viewId: `${ext.config.id}-${v4()}`,
9797
recommendedHeight: ext.config.recommendedHeight,
9898
recommendedWidth: ext.config.recommendedWidth,
9999
};
100-
createAppViewInCanvasView(config);
100+
await createAppViewInCanvasView(config);
101101
console.log("Is Landscape:", isLandscape);
102102
if (!isLandscape) {
103103
editorContext?.setEditorStates((prev) => ({

web/components/modals/sharing-modal.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ export default function SharingModal({
2121
const params = useSearchParams();
2222
// Use the 'app' query parameter to load specific extension app upon loading page
2323
const app = params.get("app");
24+
const workflow = params.get("workflow");
2425

2526
const tabItems: TabItem[] = [
2627
{
@@ -139,7 +140,7 @@ export default function SharingModal({
139140
Share your workspace via this URL
140141
</p>
141142

142-
<p className="font-bold break-all">{`${window.location.origin}?app=${app}${shareInfo?.inviteCode ? `&inviteCode=${shareInfo.inviteCode}` : ""}`}</p>
143+
<p className="font-bold break-all">{`${window.location.origin}?${app ? `app=${app}` : workflow ? `workflow=${workflow}` : ""}${shareInfo?.inviteCode ? `&inviteCode=${shareInfo.inviteCode}` : ""}`}</p>
143144
<Button
144145
color="primary"
145146
onPress={() => {

web/components/providers/dnd-provider.tsx

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ import {
2424
} from "@dnd-kit/core";
2525
import { addToast } from "@heroui/react";
2626
import { IMCMessageTypeEnum, ViewModel } from "@pulse-editor/shared-utils";
27-
import { Node as ReactFlowNode, useReactFlow } from "@xyflow/react";
27+
import { Node as ReactFlowNode } from "@xyflow/react";
2828
import { ReactNode, useContext, useEffect, useState } from "react";
2929
import { createPortal } from "react-dom";
3030
import { v4 } from "uuid";
@@ -58,7 +58,6 @@ export default function DndProvider({
5858
});
5959
const { isLandscape } = useScreenSize();
6060
const { createAppViewInCanvasView } = useTabViewManager();
61-
const { updateNodeData } = useReactFlow();
6261

6362
const [mounted, setMounted] = useState(false);
6463

@@ -93,7 +92,7 @@ export default function DndProvider({
9392
recommendedHeight: app.config.recommendedHeight,
9493
recommendedWidth: app.config.recommendedWidth,
9594
};
96-
createAppViewInCanvasView(config);
95+
await createAppViewInCanvasView(config);
9796
} catch (error) {
9897
addToast({
9998
title: "Failed to open app",
@@ -112,10 +111,12 @@ export default function DndProvider({
112111
recommendedWidth: app.config.recommendedWidth,
113112
};
114113

115-
const { viewId, node, paramName } = over.data.current as {
114+
const { viewId, node, paramName, updateNodeData } = over.data
115+
.current as {
116116
viewId: string;
117117
node: ReactFlowNode<AppNodeData>;
118118
paramName: string;
119+
updateNodeData: (id: string, data: Partial<AppNodeData>) => void;
119120
};
120121

121122
updateNodeData(viewId, {

web/components/views/canvas/canvas-view.tsx

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ import {
2424
ReactFlow,
2525
Edge as ReactFlowEdge,
2626
Node as ReactFlowNode,
27+
ReactFlowProvider,
2728
reconnectEdge,
2829
useReactFlow,
2930
useViewport,
@@ -377,6 +378,10 @@ export const MemoizedCanvasView = memo(
377378
config: CanvasViewConfig;
378379
isActive: boolean;
379380
tabName: string;
380-
}) => <CanvasView config={config} isActive={isActive} tabName={tabName} />,
381+
}) => (
382+
<ReactFlowProvider>
383+
<CanvasView config={config} isActive={isActive} tabName={tabName} />
384+
</ReactFlowProvider>
385+
),
381386
);
382387
MemoizedCanvasView.displayName = "MemoizedCanvasView";

web/components/views/canvas/nodes/app-node/layout.tsx

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -428,12 +428,15 @@ function DroppableInputHandle({
428428
node: ReactFlowNode<AppNodeData>;
429429
editorContext: EditorContextType | undefined;
430430
}) {
431+
const { updateNodeData } = useReactFlow();
432+
431433
const { setNodeRef, isOver } = useDroppable({
432434
id: `node-handle-input-${node.id}-${paramName}`,
433435
data: {
434436
viewId: node.id,
435437
node,
436438
paramName,
439+
updateNodeData,
437440
},
438441
});
439442

web/components/views/view-area.tsx

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,6 @@ export default function ViewArea() {
2222
selectTab,
2323
closeTabView,
2424
createAppTabView,
25-
createAppViewInCanvasView,
2625
activeTabView,
2726
} = useTabViewManager();
2827

@@ -76,7 +75,6 @@ export default function ViewArea() {
7675
} else {
7776
setIsShowTabs(true);
7877
}
79-
console.log("Tab views changed:", tabViews);
8078
}, [tabViews]);
8179

8280
return (

web/lib/hooks/use-tab-view-manager.ts

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import { EditorContext } from "@/components/providers/editor-context-provider";
22
import { IMCContext } from "@/components/providers/imc-provider";
33
import { addToast } from "@heroui/react";
44
import { ViewModeEnum } from "@pulse-editor/shared-utils";
5+
import { useRouter } from "next/navigation";
56
import { useContext, useEffect, useState } from "react";
67
import { v4 } from "uuid";
78
import {
@@ -15,6 +16,8 @@ export function useTabViewManager() {
1516
const editorContext = useContext(EditorContext);
1617
const imcContext = useContext(IMCContext);
1718

19+
const router = useRouter();
20+
1821
const [tabViews, setTabViews] = useState<TabView[]>(
1922
editorContext?.editorStates.tabViews ?? [],
2023
);
@@ -54,6 +57,7 @@ export function useTabViewManager() {
5457
};
5558
}) ?? [];
5659

60+
// Update local states when editor context changes
5761
useEffect(() => {
5862
if (!editorContext) {
5963
throw new Error("Editor context is not available");
@@ -70,6 +74,21 @@ export function useTabViewManager() {
7074
editorContext?.editorStates.tabIndex,
7175
]);
7276

77+
// Pend workflow or app param when tab index changes
78+
useEffect(() => {
79+
if (activeTabView) {
80+
if (activeTabView.type === ViewModeEnum.App) {
81+
const appConfig = activeTabView.config as AppViewConfig;
82+
router.push(`/?app=${appConfig.app}`);
83+
} else if (activeTabView.type === ViewModeEnum.Canvas) {
84+
const canvasConfig = activeTabView.config as CanvasViewConfig;
85+
router.push(`/?workflow=${canvasConfig.viewId}`);
86+
}
87+
} else {
88+
router.push(`/`);
89+
}
90+
}, [activeTabView]);
91+
7392
function selectTab(newIndex: number) {
7493
if (!editorContext) {
7594
throw new Error("Editor context is not available");

0 commit comments

Comments
 (0)