(in-package :fwoar.rss-reader) (defclass rss-reader-route () ((%feed-list :initarg :feed-list :reader feed-list))) (defclass+ intercooler-request () ((%request :initarg :request :reader request))) (defclass+ partial-request ((intercooler-request (request))) ()) (defclass+ full-request ((intercooler-request (request))) ()) (defmethod araneus:view :around ((route rss-reader-route) model) "basic html and javascript for our app, as well as an invocation of the hook that pulls in CSS" (etypecase model (full-request (spinneret:with-html-string (:doctype) (:html (:head (:script :src "https://cdnjs.cloudflare.com/ajax/libs/jquery/3.4.1/jquery.min.js") (:script :src "https://cdnjs.cloudflare.com/ajax/libs/intercooler-js/1.2.2/intercooler.min.js" :defer "defer") (:script :defer "defer" (:raw (fwoar.rss-reader.ui:intercooler-debugger))) (:meta :name "intercoolerjs:use-data-prefix" :content "true"/) (:style (apply 'lass:compile-and-write (araneus:styles route)))) (:body (call-next-method))))) (partial-request (spinneret:with-html-string (call-next-method))))) (defmethod araneus:styles append ((route rss-reader-route)) "CSS Reset" '((* :margin 0 :padding 0 :font-family "\"Lato\", sans" :box-sizing border-box) ((:or pre code) :font-family "\"Source Code Pro\", monospace") (body :font-size 12pt) ((:or h1 h2 h3 h4 h5 h6) :font-size 1.6rem) ((:or ul ol) :padding-left 2rem))) (defclass+ feed-page ((rss-reader-route (feed-list)) fwoar.default-layout:default-layout) ((%feed :initarg :feed :reader feed))) (defmethod araneus:controller ((route feed-page) params &key) (funcall (if (equal (serapeum:assocdr "ic-request" params :test 'equal) "true") 'partial-request 'full-request) (alimenta.pull-feed:pull-feed (feed route)))) (defmacro with-layout ((render-type layout) &body content) `(let ((content (lambda () (spinneret:with-html (:main ,@content))))) (ecase ,render-type (:full (spinneret:with-html (,layout content))) (:partial (funcall content))))) (defmethod araneus:view ((_ feed-page) (model intercooler-request)) (spinneret:with-html (:main#content (alimenta:render (request model) 'fwoar.rss-render:summary)))) (defmethod araneus:view ((route feed-page) (model full-request)) (spinneret:with-html (:h1 "Hello, World!") (:div.main (:nav :data-ic-push-url "true" :data-ic-target "main" :data-ic-replace-target "true" (loop for (feed-id) in (feed-list route) collect (:a :data-ic-get-from (format nil "/f/~a" (string-downcase feed-id)) feed-id))) (:main#content (alimenta:render (request model) 'fwoar.rss-render:summary))))) (defclass homepage (rss-reader-route fwoar.default-layout:default-layout) ()) (defmethod fwoar.default-layout:border-color ((layout rss-reader-route)) "#BDE0F3") (defmethod araneus:controller ((route homepage) params &key) (format t "~&~s~%" params) (if (equal (serapeum:assocdr "ic-request" params :test 'equal) "true") :partial :full)) (defmethod araneus:view ((route homepage) model) (with-layout (model fwoar.rss-reader.ui:homepage) (:raw (plump:serialize (alimenta:render (alimenta.pull-feed:pull-feed "https://thomism.wordpress.com/feed/") 'fwoar.rss-render:summary) nil)))) (araneus:define-controller other (_) (values)) (araneus:define-view other (_) "<main><h2>???</h2></main>")