Browse Source

Add file handling (#1736)

* Add file handling
https://github.com/WICG/file-handling/blob/master/explainer.md#example

* Only trigger on `.excalidraw` for now
Thomas Steiner 4 years ago
parent
commit
6b87278a0f
3 changed files with 24 additions and 4 deletions
  1. 9 1
      public/manifest.json
  2. 1 3
      src/actions/actionCanvas.tsx
  3. 14 0
      src/index.tsx

+ 9 - 1
public/manifest.json

@@ -17,5 +17,13 @@
   "start_url": ".",
   "display": "standalone",
   "theme_color": "#000000",
-  "background_color": "#ffffff"
+  "background_color": "#ffffff",
+  "file_handlers": [
+    {
+      "action": "/",
+      "accept": {
+        "application/vnd.excalidraw+json": [".excalidraw"]
+      }
+    }
+  ]
 }

+ 1 - 3
src/actions/actionCanvas.tsx

@@ -58,9 +58,7 @@ export const actionClearCanvas = register({
       showAriaLabel={useIsMobile()}
       onClick={() => {
         if (window.confirm(t("alerts.clearReset"))) {
-          // TODO: Defined globally, since file handles aren't yet serializable.
-          // Once `FileSystemFileHandle` can be serialized, make this
-          // part of `AppState`.
+          // TODO: Make this part of `AppState`.
           (window as any).handle = null;
           updateData(null);
         }

+ 14 - 0
src/index.tsx

@@ -10,6 +10,7 @@ import App from "./components/App";
 import { register as registerServiceWorker } from "./serviceWorker";
 
 import "./css/styles.scss";
+import { loadFromBlob } from "./data";
 
 // On Apple mobile devices add the proprietary app icon and splashscreen markup.
 // No one should have to do this manually, and eventually this annoyance will
@@ -88,3 +89,16 @@ registerServiceWorker({
     }
   },
 });
+
+if ("launchQueue" in window && "LaunchParams" in window) {
+  (window as any).launchQueue.setConsumer(
+    async (launchParams: { files: any[] }) => {
+      if (!launchParams.files.length) {
+        return;
+      }
+      const fileHandle = launchParams.files[0];
+      const blob = await fileHandle.getFile();
+      loadFromBlob(blob);
+    },
+  );
+}