(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)]))))))