mirror of
https://github.com/edufeed-org/edufeed-web.git
synced 2025-12-10 00:34:34 +00:00
232 lines
8.4 KiB
Clojure
232 lines
8.4 KiB
Clojure
(ns ied.views
|
|
(:require
|
|
[re-frame.core :as re-frame]
|
|
[ied.events :as events]
|
|
[ied.routes :as routes]
|
|
[ied.subs :as subs]
|
|
[reagent.core :as reagent]))
|
|
|
|
;; add resource form
|
|
(defn add-resource-form
|
|
[name uri author]
|
|
(let [s (reagent/atom {:name name
|
|
:uri uri
|
|
:author author})]
|
|
(fn []
|
|
[:form {:on-submit (fn [e]
|
|
(.preventDefault e)
|
|
;; do something with the state @s
|
|
)}
|
|
[:label {:for name} "Name: "]
|
|
[:input {:type :text :name :name
|
|
:value (:name @s)
|
|
:on-change (fn [e]
|
|
(swap! s assoc :name (-> e .-target .-value)))}]
|
|
[:label {:for uri} "Uri: "]
|
|
[:input {:type :text :name :uri
|
|
:value (:uri @s)
|
|
:on-change (fn [e]
|
|
(swap! s assoc :uri (-> e .-target .-value)))}]
|
|
[:label {:for uri} "Author: "]
|
|
[:input {:type :text :name :author
|
|
:value (:author @s)
|
|
:on-change (fn [e]
|
|
(swap! s assoc :author (-> e .-target .-value)))}]
|
|
[:button {:on-click #(re-frame/dispatch [::events/publish-resource {:name (:name @s) ;; TODO this should be sth like build event
|
|
:uri (:uri @s)
|
|
:author (:author @s)}])}
|
|
"Publish Resource"]])))
|
|
|
|
(defn add-resource-by-json []
|
|
(let [s (reagent/atom {:json-string ""})]
|
|
(fn []
|
|
[:form {:on-submit (fn [e] (.preventDefault e))}
|
|
[:textarea {:on-change (fn [e]
|
|
(swap! s assoc :json-string (-> e .-target .-value)))}]
|
|
[:button {:class "btn btn-warning"
|
|
:on-click #(re-frame/dispatch [::events/convert-amb-and-publish-as-nostr-event (:json-string @s)])}
|
|
"Publish as Nostr Event"]])))
|
|
|
|
;; events
|
|
(defn events-panel []
|
|
(let [events (re-frame/subscribe [::subs/events])
|
|
selected-events @(re-frame/subscribe [::subs/selected-events])
|
|
show-add-event (re-frame/subscribe [::subs/show-add-event])]
|
|
[:div {:class "border-2 rounded"}
|
|
[:p {:on-click #(re-frame/dispatch [::events/toggle-show-add-event])}
|
|
(if @show-add-event "X" "Add Resource!")]
|
|
(when @show-add-event
|
|
[add-resource-form])
|
|
[:p (str "Num of events: " (count @events))]
|
|
(if (> (count @events) 0)
|
|
(doall
|
|
(for [event @events]
|
|
[:li {:key (:id event)} (get event :content "")
|
|
[:input {:type "checkbox"
|
|
:on-click #(re-frame/dispatch [::events/toggle-selected-events event])}]]))
|
|
[:p "no events there"])
|
|
[:button {:class "btn"
|
|
:disabled (not (boolean (seq selected-events)))
|
|
:on-click #(re-frame/dispatch [::events/add-resources-to-list [{:d "unique-id-1"
|
|
:name "Test List SC"}
|
|
selected-events]])}
|
|
"Add To Lists"]]))
|
|
|
|
;; relays
|
|
(defn add-relay-form
|
|
[name uri]
|
|
(let [s (reagent/atom {:name name
|
|
:uri uri})]
|
|
(fn []
|
|
[:form {:on-submit (fn [e]
|
|
(.preventDefault e)
|
|
;; do something with the state @s
|
|
)}
|
|
[:label {:for name} "Name: "]
|
|
[:input {:type :text :name :name
|
|
:value (:name @s)
|
|
:on-change (fn [e]
|
|
(swap! s assoc :name (-> e .-target .-value)))}]
|
|
[:label {:for uri} "Uri: "]
|
|
[:input {:type :text :name :uri
|
|
:value (:uri @s)
|
|
:on-change (fn [e]
|
|
(swap! s assoc :uri (-> e .-target .-value)))}]
|
|
[:button {:on-click #(re-frame/dispatch [::events/create-websocket {:name (:name @s)
|
|
:id (random-uuid)
|
|
:uri (:uri @s)}])}
|
|
|
|
"Add Relay"]])))
|
|
|
|
(defn relays-panel
|
|
[]
|
|
(let [sockets (re-frame/subscribe [::subs/sockets])]
|
|
[:div
|
|
[add-relay-form]
|
|
|
|
(if (> (count @sockets) 0)
|
|
[:ul
|
|
(doall
|
|
(for [socket @sockets]
|
|
[:li {:key (:id socket)}
|
|
[:span (:name socket)]
|
|
[:span (:status socket)]
|
|
[:button {:class "btn"
|
|
:disabled (not= "connected" (:status socket))
|
|
:on-click #(re-frame/dispatch [::events/load-events (:uri socket)])} "Load events"]
|
|
(if (not= (:status socket) "connected")
|
|
[:button {:class "btn"
|
|
:on-click #(re-frame/dispatch [::events/connect-to-websocket (:uri socket)])} "Connect"]
|
|
[:button {:class "btn"
|
|
:on-click #(re-frame/dispatch [::events/close-connection-to-websocket (:uri socket)])} "Disconnect"])
|
|
|
|
[:button {:class "btn btn-error"
|
|
:on-click #(re-frame/dispatch [::events/remove-websocket socket])} "Remove relay"]]))]
|
|
[:p "No relays found"]
|
|
;(re-frame/dispatch [::events/connect-to-default-relays])
|
|
)]))
|
|
|
|
;; Header
|
|
|
|
(defn header []
|
|
(let [pk (re-frame/subscribe [::subs/pk])]
|
|
[:div
|
|
[:a {:on-click #(re-frame/dispatch [::events/navigate :home])}
|
|
"home"]
|
|
"|"
|
|
[:a {:on-click #(re-frame/dispatch [::events/navigate :add-resource])}
|
|
"add resource"]
|
|
"|"
|
|
[:a {:on-click #(re-frame/dispatch [::events/navigate :about])}
|
|
"about"]
|
|
"|"
|
|
[:a {:on-click #(re-frame/dispatch [::events/navigate :settings])}
|
|
"settings"]
|
|
"|"
|
|
(if @pk
|
|
[:a {:on-click #(re-frame/dispatch [::events/logout])} "logout"]
|
|
[:a {:on-click #(re-frame/dispatch [::events/login-with-extension])} "login"])]))
|
|
|
|
;; Add Resource Panel
|
|
|
|
(defn add-resource-panel []
|
|
[:div
|
|
[:h1 "Add Resource"]
|
|
[add-resource-form]
|
|
[add-resource-by-json]])
|
|
|
|
(defmethod routes/panels :add-resource-panel [] [add-resource-panel])
|
|
|
|
;; Settings
|
|
(defn settings-panel []
|
|
[:div
|
|
[:h1 "Settings"]
|
|
[relays-panel]])
|
|
|
|
(defmethod routes/panels :settings-panel [] [settings-panel])
|
|
|
|
;; Home
|
|
(defn home-panel []
|
|
(let [name (re-frame/subscribe [::subs/name])
|
|
events (re-frame/subscribe [::subs/events])]
|
|
[:div
|
|
[:h1
|
|
(str "Hello from " @name ". This is the Home Page.")]
|
|
|
|
[events-panel]
|
|
[:p (count @events)]]))
|
|
|
|
(defmethod routes/panels :home-panel [] [home-panel])
|
|
|
|
;; about
|
|
(defn about-panel []
|
|
[:div
|
|
[:h1 "This is the About Page."]
|
|
[:div
|
|
[:a {:on-click #(re-frame/dispatch [::events/navigate :home])}
|
|
"go to Home Page"]]])
|
|
|
|
(defmethod routes/panels :about-panel [] [about-panel])
|
|
|
|
;; npub
|
|
(defn npub-view-panel []
|
|
(let [sockets @(re-frame/subscribe [::subs/sockets])
|
|
route-params @(re-frame/subscribe [::subs/route-params])
|
|
lists @(re-frame/subscribe [::subs/lists])
|
|
missing-events-from-lists @(re-frame/subscribe [::subs/missing-events-from-lists])
|
|
_ (when (seq missing-events-from-lists) (re-frame/dispatch [::events/query-for-event-ids [sockets missing-events-from-lists]]))]
|
|
[:div
|
|
[:h1 (str "Hello Npub: " (:npub route-params))]
|
|
(if-not (seq lists)
|
|
[:p "No lists there...yet"]
|
|
[:div {:class "p-2"} "Got some lists"
|
|
(doall
|
|
(for [l lists]
|
|
[:div {:class "p-2"
|
|
:key (:id l)}
|
|
[:li
|
|
|
|
[:p (str "ID: " (:id l))]
|
|
[:p (str "Name: " (first (filter #(= "d" (first %)) (:tags l))))]
|
|
;; TODO filter tags for already being in events
|
|
;; for all that are not send a query
|
|
[:p (str "Tags: " (:tags l))]
|
|
[:button {:class "btn btn-error"
|
|
:on-click #(re-frame/dispatch [::events/delete-list l])} "Delete List"]]]))])
|
|
[:button {:class "btn"
|
|
:on-click
|
|
#(re-frame/dispatch [::events/get-lists-for-npub [sockets (:npub route-params)]])} "Load lists"]]))
|
|
|
|
(defmethod routes/panels :npub-view-panel [] [npub-view-panel])
|
|
|
|
;; main
|
|
(defn main-panel []
|
|
(let [active-panel (re-frame/subscribe [::subs/active-panel])]
|
|
[:div
|
|
[header]
|
|
[:div
|
|
(routes/panels @active-panel)]]))
|
|
|
|
(comment
|
|
|
|
(.log js/console "Hello World"))
|