From 607f920d4c880ef548be07c26f6df706bc5f2486 Mon Sep 17 00:00:00 2001 From: Tim Date: Thu, 14 May 2026 15:12:49 +0200 Subject: Initial commit --- src/aome/org_file.cljs | 49 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) create mode 100644 src/aome/org_file.cljs (limited to 'src/aome/org_file.cljs') diff --git a/src/aome/org_file.cljs b/src/aome/org_file.cljs new file mode 100644 index 0000000..9fa6c4a --- /dev/null +++ b/src/aome/org_file.cljs @@ -0,0 +1,49 @@ +(ns aome.org-file + (:require [shadow.cljs.modern :as scmodern] + [reagent.core :as r] + ["openpgp" :as pgp])) + +(def current-file-name (r/atom "")) +(def current-file-extension (r/atom ".org")) +(def content (r/atom "")) + +(defn- decrypt-string [bytes callback] + (scmodern/js-await [pgp-message (pgp/readMessage #js {"binaryMessage" bytes})] + (scmodern/js-await [decrypted (pgp/decrypt #js {"message" pgp-message + "passwords" (.prompt js/window "Passphrase:" "")})] + (callback (-> decrypted + js->clj + (get "data")))))) + +(defn load-from-file-picker! [] + (scmodern/js-await [fileHandles (.showOpenFilePicker js/window (clj->js opts))] + (let [fileHandle (first fileHandles)] + (scmodern/js-await [file (.getFile fileHandle)] + (if-let [split-name (->> (.-name file) + (re-seq #"([A-z0-9-_]*)((\.[A-z]*){1,2})$") + first)] + (do (reset! current-file-name (nth split-name 1)) + (reset! current-file-extension (nth split-name 2)))) + (if (= @current-file-extension ".org.gpg") + (scmodern/js-await [file-content-bytes (.bytes file)] + (decrypt-string file-content-bytes #(reset! content %))) + (scmodern/js-await [file-content (.text file)] + (reset! content file-content))))))) + +(defn- encrypt-string [s callback] + (scmodern/js-await [pgp-message (pgp/createMessage #js {"text" s})] + (scmodern/js-await [encrypted (pgp/encrypt #js {"message" pgp-message + "passwords" (.prompt js/window "Passphrase:" "") + "format" "binary"})] + (callback encrypted)))) + +(defn save-to-file-picker! [] + (scmodern/js-await [fileHandle (.showSaveFilePicker js/window #js {"suggestedName" (str @current-file-name @current-file-extension)})] + (scmodern/js-await [writable (.createWritable fileHandle)] + (if (= @current-file-extension ".org.gpg") + (encrypt-string @content + #(scmodern/js-await [_ (.write writable %)] + (scmodern/js-await [_ (.close writable)]))) + (scmodern/js-await [_ (.write writable @content)] + (scmodern/js-await [_ (.close writable)])))))) + -- cgit v1.2.3