Skip to content

Commit 318a2ca

Browse files
authored
Merge pull request #109 from ClayPulse/improve-beginner-ux
Use dnd-kit for file and app drag & drop
2 parents 7e9de30 + 3d0fb6c commit 318a2ca

File tree

29 files changed

+921
-508
lines changed

29 files changed

+921
-508
lines changed

mobile/README.md

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
# Android release
2+
```bash
3+
npx cap sync
4+
# Build .aab file (will fail signing, use the next command to fix)
5+
npx cap build android --keystorepath "<path_to_keystore>" --keystorepass "<keystore_pass>" --keystorealias "<keystore_alias>" --keystorealiaspass "<keystore_alias_pass>" --androidreleasetype AAB
6+
# Sign the .aab
7+
jarsigner -verbose -keystore "<path_to_keystore>" "<path_to_aab>" "<keystore_alias>"
8+
```
9+
10+
Then, `mobile/android/app/build/outputs/bundle/release/app-released.aab` is a signed .aab ready for publishing.

mobile/android/app/build.gradle

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
apply plugin: 'com.android.application'
22

33
android {
4-
namespace "com.pulse.app"
4+
namespace "com.pulse_editor.app"
55
compileSdk rootProject.ext.compileSdkVersion
66
defaultConfig {
7-
applicationId "com.pulse.app"
7+
applicationId "com.pulse_editor.app"
88
minSdkVersion rootProject.ext.minSdkVersion
99
targetSdkVersion rootProject.ext.targetSdkVersion
1010
versionCode 1

mobile/android/app/src/main/java/com/pulse/app/MainActivity.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package com.pulse.app;
1+
package com.pulse_editor.app;
22

33
import com.getcapacitor.BridgeActivity;
44

mobile/android/app/src/main/res/values/strings.xml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,6 @@
22
<resources>
33
<string name="app_name">Pulse Editor</string>
44
<string name="title_activity_main">Pulse Editor</string>
5-
<string name="package_name">com.pulse.app</string>
6-
<string name="custom_url_scheme">com.pulse.app</string>
5+
<string name="package_name">com.pulse_editor.app</string>
6+
<string name="custom_url_scheme">com.pulse_editor.app</string>
77
</resources>

mobile/capacitor.config.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import type { CapacitorConfig } from "@capacitor/cli";
22

33
const config: CapacitorConfig = {
4-
appId: "com.pulse.app",
4+
appId: "com.pulse_editor.app",
55
appName: "Pulse Editor",
66
webDir: "../build/next",
77
android: {
@@ -18,7 +18,7 @@ const config: CapacitorConfig = {
1818
enabled: true,
1919
},
2020
CapacitorHttp: {
21-
enabled: true,
21+
enabled: false,
2222
},
2323
},
2424
};

npm-packages/cli/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@pulse-editor/cli",
3-
"version": "0.1.0-beta.8",
3+
"version": "0.1.1-beta.0",
44
"license": "MIT",
55
"bin": {
66
"pulse": "dist/cli.js"

package-lock.json

Lines changed: 50 additions & 10 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

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

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,13 @@
11
import Nav from "@/components/interface/navigation/nav";
22
import CapacitorProvider from "@/components/providers/capacitor-provider";
3+
import DndProvider from "@/components/providers/dnd-provider";
34
import EditorContextProvider from "@/components/providers/editor-context-provider";
45
import InterModuleCommunicationProvider from "@/components/providers/imc-provider";
56
import PlatformAssistantProvider from "@/components/providers/platform-assistant-provider";
67
import RemoteModuleProvider from "@/components/providers/remote-module-provider";
78
import WrappedHeroUIProvider from "@/components/providers/wrapped-hero-ui-provider";
89
import { Analytics } from "@vercel/analytics/next";
10+
import { ReactFlowProvider } from "@xyflow/react";
911
import "material-icons/iconfont/material-icons.css";
1012
import type { Metadata } from "next";
1113
import { Suspense } from "react";
@@ -31,14 +33,18 @@ export default function RootLayout({
3133
<EditorContextProvider>
3234
<CapacitorProvider>
3335
<InterModuleCommunicationProvider>
34-
<RemoteModuleProvider isPreventingCSS={true}>
35-
<Toaster />
36-
<Nav>
37-
<PlatformAssistantProvider>
38-
{children}
39-
</PlatformAssistantProvider>
40-
</Nav>
41-
</RemoteModuleProvider>
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>
4248
</InterModuleCommunicationProvider>
4349
</CapacitorProvider>
4450
</EditorContextProvider>

web/components/app-loaders/sandbox-app-loader.tsx

Lines changed: 14 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,11 @@ import BaseAppLoader from "@/components/app-loaders/base-app-loader";
22
import Loading from "@/components/interface/status-screens/loading";
33
import { EditorContext } from "@/components/providers/editor-context-provider";
44
import { IMCContext } from "@/components/providers/imc-provider";
5-
import { DragEventTypeEnum, PlatformEnum } from "@/lib/enums";
5+
import { PlatformEnum } from "@/lib/enums";
66
import { usePlatformApi } from "@/lib/hooks/use-platform-api";
77
import { getPlatform } from "@/lib/platform-api/platform-checker";
8-
import { ExtensionApp, FileDragData } from "@/lib/types";
9-
import { addToast } from "@heroui/react";
8+
import { ExtensionApp } from "@/lib/types";
9+
import { useDroppable } from "@dnd-kit/core";
1010
import {
1111
ConnectionListener,
1212
IMCMessage,
@@ -32,6 +32,16 @@ export default function SandboxAppLoader({
3232
const editorContext = useContext(EditorContext);
3333
const imcContext = useContext(IMCContext);
3434

35+
const { resolvedTheme } = useTheme();
36+
const { platformApi } = usePlatformApi();
37+
38+
const { setNodeRef } = useDroppable({
39+
id: "app-node-view-" + viewModel.viewId,
40+
data: {
41+
viewId: viewModel.viewId,
42+
},
43+
});
44+
3545
const [currentExtension, setCurrentExtension] = useState<
3646
ExtensionApp | undefined
3747
>();
@@ -48,9 +58,6 @@ export default function SandboxAppLoader({
4858
// const [isConnected, setIsConnected] = useState<boolean>(false);
4959
const [isInitialized, setIsInitialized] = useState<boolean>(false);
5060

51-
const { resolvedTheme } = useTheme();
52-
const { platformApi } = usePlatformApi();
53-
5461
// Update view Id when the view model changes
5562
useEffect(() => {
5663
// If the view Id changes (e.g. when switching file but not extension),
@@ -137,13 +144,6 @@ export default function SandboxAppLoader({
137144
};
138145
}, []);
139146

140-
useEffect(() => {
141-
console.log(
142-
"Is dragging over canvas: ",
143-
editorContext?.editorStates.isDraggingOverCanvas,
144-
);
145-
}, [editorContext?.editorStates.isDraggingOverCanvas]);
146-
147147
// Set is loading extension to true when current extension changes
148148
useEffect(() => {
149149
if (currentExtension) {
@@ -316,48 +316,7 @@ export default function SandboxAppLoader({
316316
return (
317317
<div
318318
className="relative h-full w-full"
319-
onDragOver={(e) => {
320-
e.stopPropagation();
321-
const types = e.dataTransfer.types;
322-
if (
323-
types.includes(`application/${DragEventTypeEnum.File.toLowerCase()}`)
324-
) {
325-
e.preventDefault(); // allow drop
326-
e.dataTransfer.dropEffect = "move";
327-
} else {
328-
e.dataTransfer.dropEffect = "none";
329-
}
330-
}}
331-
onDrop={async (e) => {
332-
const dataText = e.dataTransfer.getData(
333-
`application/${DragEventTypeEnum.File.toLowerCase()}`,
334-
);
335-
if (!dataText) {
336-
return;
337-
}
338-
console.log("Dropped item:", dataText);
339-
try {
340-
const data = JSON.parse(dataText) as FileDragData;
341-
342-
e.preventDefault();
343-
const uri = data.uri;
344-
345-
// Send uri to app view
346-
await imcContext?.polyIMC?.sendMessage(
347-
viewModel.viewId,
348-
IMCMessageTypeEnum.EditorAppReceiveFileUri,
349-
{
350-
uri,
351-
},
352-
);
353-
} catch (error) {
354-
addToast({
355-
title: "Failed to open file",
356-
description: "The dropped file data is invalid.",
357-
color: "danger",
358-
});
359-
}
360-
}}
319+
ref={setNodeRef}
361320
>
362321
{isLookingForExtension ? (
363322
<div className="bg-content1 h-full w-full">

0 commit comments

Comments
 (0)