summaryrefslogtreecommitdiff
path: root/src/aome/org_file.cljs
diff options
context:
space:
mode:
authorTim <contact@bytim.eu>2026-05-14 15:12:49 +0200
committerTim <contact@bytim.eu>2026-05-14 15:12:49 +0200
commit607f920d4c880ef548be07c26f6df706bc5f2486 (patch)
tree77fd96383a331e589e5be6024a7820b1a4c78c57 /src/aome/org_file.cljs
Initial commitHEADmaster
Diffstat (limited to 'src/aome/org_file.cljs')
-rw-r--r--src/aome/org_file.cljs49
1 files changed, 49 insertions, 0 deletions
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)]))))))
+