Created
July 9, 2014 18:35
-
-
Save pauldub/a17c42eda38da91a7125 to your computer and use it in GitHub Desktop.
Sample hydrawm mail reader
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
(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)) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
(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) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
❤️