Files
logseq/src/main/frontend/components/diff.cljs

93 lines
3.1 KiB
Clojure

(ns frontend.components.diff
(:require [clojure.string :as string]
[frontend.diff :as diff]
[frontend.handler.file :as file]
[frontend.state :as state]
[frontend.ui :as ui]
[frontend.util :as util]
[medley.core :as medley]
[rum.core :as rum]))
(defonce disk-value (atom nil))
(defonce db-value (atom nil))
(rum/defc diff-cp
[diff]
[:div
(for [[idx {:keys [added removed value]}] diff]
(let [bg-color (cond
added "#057a55"
removed "#d61f69"
:else
"initial")]
[:span.diff {:key idx
:style {:background-color bg-color}}
value]))])
(rum/defcs local-file < rum/reactive
{:will-unmount (fn [state]
(reset! disk-value nil)
(reset! db-value nil)
state)}
[state repo path disk-content db-content]
(when (nil? @disk-value)
(reset! disk-value disk-content)
(reset! db-value db-content))
[:div.cp__diff-file
[:div.cp__diff-file-header
[:span.cp__diff-file-header-content.pl-1.font-medium
(str "File " path " has been modified on the disk.")]]
[:div.p-4
(when (not= (string/trim disk-content) (string/trim db-content))
(ui/foldable
[:span.text-sm.font-medium.ml-1 "Check diff"]
(fn []
(let [local-content (or db-content "")
content (or disk-content "")
diff (medley/indexed (diff/diff local-content content))
diff? (some (fn [[_idx {:keys [added removed]}]]
(or added removed))
diff)]
(when diff?
[:div.overflow-y-scroll.flex.flex-col
[:div {:style {:max-height "65vh"}}
(diff-cp diff)]])))
{:default-collapsed? true
:title-trigger? true}))
[:hr]
[:div.flex.flex-col.mt-4.sm:flex-row
[:div.flex-1
[:div.mb-2 "On disk:"]
[:textarea.overflow-auto
{:value (rum/react disk-value)
:on-change (fn [e]
(reset! disk-value (util/evalue e)))}
disk-content]
(ui/button "Select this"
:on-click
(fn []
(when-let [value @disk-value]
(file/alter-file repo path value
{:re-render-root? true
:skip-compare? true}))
(state/close-modal!)))]
[:div.flex-1.mt-8.sm:ml-4.sm:mt-0
[:div.mb-2 "In Logseq:"]
[:textarea.overflow-auto
{:value (rum/react db-value)
:on-change (fn [e]
(prn "new-value: " (util/evalue e))
(reset! db-value (util/evalue e)))}
db-content]
(ui/button "Select this"
:on-click
(fn []
(when-let [value @db-value]
(file/alter-file repo path value
{:re-render-root? true
:skip-compare? true}))
(state/close-modal!)))]]]])