Skip to content

Instantly share code, notes, and snippets.

@pauldub
Created July 9, 2014 18:35
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save pauldub/a17c42eda38da91a7125 to your computer and use it in GitHub Desktop.
Save pauldub/a17c42eda38da91a7125 to your computer and use it in GitHub Desktop.
Sample hydrawm mail reader
(ns mu-reader.core
(:import [org.apache.james.mailbox.maildir MaildirStore])
(:use compojure.core)
(:require [compojure.handler :as handler]
[compojure.route :as route]
[clojure-mail.core :refer :all :as mail]
[clojure-mail.message :as message :refer [safe-get]]
[me.raynes.fs :as fs]
[me.raynes.conch :refer [with-programs]]
[noir.response :as response]))
(def dirs (atom ["/priv" "/unsorted"]))
(def maildir (fs/expand-home "~/Library/Application Support/JaroMail"))
(defn subdir [dir]
(if-let [dir (fs/file maildir dir)]
dir))
(defn read-mails [dir]
(map #(->> %
str
mail/file->message)
(->> (fs/find-files* dir #(and (fs/exists? %) (fs/file? %)))
(take 10))))
(defroutes app-routes
(GET "/dirs" [] (response/edn @dirs))
(GET "/dirs/:dir-name" [dir-name]
(if-let [dir (subdir dir-name)]
(response/edn (vec (map #(assoc {}
:id (str (safe-get (message/date-sent %)) (safe-get (message/subject %)))
:to (safe-get (message/to %))
:from (safe-get (message/from %))
:date-received (safe-get (message/date-recieved %))
:date-sent (safe-get (message/date-sent %))
:subject (safe-get (message/subject %)))
(read-mails dir))))))
(route/resources "/")
(route/not-found "Page not found"))
(def handler (handler/site app-routes))
(ns mu-reader.core
(:require [domina :as dom]
[ajax.core :refer [GET POST]]
[reagent.core :as reagent :refer [atom]]))
(declare dirs-list mails-list get-page)
(def app-state (atom {}))
(defn parse-json [data]
(.parse js/JSON data))
(defn fetch-dirs []
(GET "/dirs"
{ :handler #(swap! app-state assoc-in [:current-page :dirs] %) }))
(defn fetch-mails [dir-id]
(let [url (str "/dirs" dir-id) ]
(GET url { :handler #(swap! app-state assoc-in [:current-page :mails] %) })))
(defn reset-last-page []
(swap! app-state assoc :last-page nil))
(defn set-title [title]
(swap! app-state assoc-in [:current-page :title] title))
(defn navigate-to [page-name]
(let [page (get-page page-name)]
(swap! app-state assoc
:last-page (get-in @app-state [:current-page :id]))
(swap! app-state assoc
:current-page page)
(when (:on-navigate page)
((:on-navigate page)))
))
(defn get-page [page-name]
(case page-name
:dirs {:id :dirs
:title "Dirs"
:on-navigate #(do
(fetch-dirs)
(reset-last-page))
:content (fn [page]
[dirs-list (:dirs page)])}
:mails-list {:id :mails-list
:title "Mails"
:on-navigate #(do
(fetch-mails (get-in @app-state [:current-dir]))
(set-title (get-in @app-state [:current-dir])))
:content (fn [page]
[mails-list (:mails page)])}
:not-found))
(defn dirs-list-item [dir]
^{:key dir}
[:li
[:a {:href "#"
:on-click #(do
(swap! app-state assoc :current-dir dir)
(navigate-to :mails-list))} dir]])
(defn dirs-list [dirs]
[:ul.list {:id :dirs-list}
(map dirs-list-item dirs)])
(defn mails-list-item [mail]
^{:key mail}
[:li
[:a {:href "#"} (str (:from mail) " - " (:subject mail))]])
(defn mails-list [mails]
[:ul.list {:id :mails-list}
(map mails-list-item mails)])
(defn header [page last-page]
[:div.header {:id "header"}
(if last-page
[:a.button {:id "backButton"
:href "#"
:on-click #(navigate-to last-page)}
"Back"])
[:h1 (get-in page [:title])]])
(defn app []
(let [{:keys [current-page last-page]} @app-state]
[:div.afui {:id "afui"}
[header current-page last-page]
(if-let [content (:content current-page)]
[:div {:id "content"}
[:div.panel {:style {:display "block"}}
(content current-page)]])
;; [:div.footer {:id "footer"}
;; [:a.button {:href "#" :on-click #(if last-page (navigate-to last-page))} "Back"]]
[:div {:id "navbar"}]]))
(defn init []
(when (and js/document
(.-getElementById js/document))
(reagent/render-component [app] (dom/by-id "app"))
(navigate-to :dirs)))
(set! (.-onload js/window) init)
require 'pprint'
ext.mu = {}
function ext.mu.open()
local wv = webview:open()
wv:loadurl("http://localhost:8000/index.html")
wv:settitle("Mails")
return wv
end
@sdegutis
Copy link

sdegutis commented Jul 9, 2014

❤️

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment