summaryrefslogtreecommitdiff
path: root/desk/web/router.hoon
diff options
context:
space:
mode:
Diffstat (limited to 'desk/web/router.hoon')
-rw-r--r--desk/web/router.hoon270
1 files changed, 270 insertions, 0 deletions
diff --git a/desk/web/router.hoon b/desk/web/router.hoon
new file mode 100644
index 0000000..547a2f9
--- /dev/null
+++ b/desk/web/router.hoon
@@ -0,0 +1,270 @@
+/- *boke, tp=trill-post, cnt=contact, tlonc=tlon-channels
+/+ kaji, plib=trill-utils, lib=boke, sr=sortug, const=constants
+/= index /web/index
+/= nav /web/layout/nav
+::
+/= blog /web/blog/router
+/= title /web/blog/title
+::
+/= board /web/board/router
+::
+/= feed /web/feed/router
+::
+/= search /web/search/router
+::
+/= chat-page /web/chat/chat
+::
+/= tv /web/tv/router
+/= tvp /web/tv/tv
+
+/= about /web/about
+/= merch /web/merch
+::
+:: common
+/= modals /web/components/modals
+/= cm /web/components/common
+::
+/= root /web/root
+/= login /web/login
+/= subscribe /web/subscribe
+/= user /web/user
+/= editor /web/editor
+::
+
+/* spinner %noun /web/assets/spinner/svg
+/* favicon %noun /web/assets/favicon/ico
+|%
+++ eyre-bail (error-response:kaji 404)
+++ manx-bail (error-page:kaji 404)
++$ request
+$% [%eyre p=eyre-order:kaji]
+ [%kaji tab=@t req=kaji-req]
+==
+++ route
+|= [r=request =bowl:gall s=state] ^- kaji-res:kaji
+|^
+ ?- -.r
+ %eyre :- %res ^- eyre-res:kaji
+ =/ rl=req-line:kaji (parse-req:kaji req.p.r)
+ =/ met method.request.req.p.r
+ =/ fpath=(pole knot) [met pat.rl]
+ ?: ?=([%apps %canvas rest=*] pat.rl) (serve-canvas rest.pat.rl rl)
+ ?: ?=([~ @] ext.rl) (serve-assets rl)
+ :: ?: ?=([[%session ~] [~ %js]] [pat ext]:rl) :- %full (serve-other:kaji %js (crip "window.ship = {(trip (rsh 3 (scot %p our.bowl)))};"))
+ ?+ fpath eyre-bail
+ [%'GET' rest=*] (serve-get rl(pat rest.fpath))
+ ==
+ %kaji :- %sse ^- sse-res:kaji
+ ?- -.req.r
+ %blog-redi (redirect-post post.req.r .y .y)
+ %board-redi (redirect-post post.req.r .n .n)
+ %redi (ui-effect [%redi url.req.r])
+ %tv-chat (give-tv-chat +.req.r)
+ %radio-chat (give-radio-chat +.req.r)
+ %chat-msg (give-chat-msg +.req.r)
+ ==
+ ==
+++ kaji-bail :- [%tab ~] :~([%redi '/404'])
+++ ui-effect |= e=effect:kaji ^- sse-res:kaji
+ :- [%tab ~] :~(e)
+::
+:: Eyre handling
+::
+ ++ serve-assets
+ |= rl=req-line:kaji
+ ~& serving-assets=rl
+ ?+ [pat ext]:rl eyre-bail
+ [[%spinner ~] [~ %svg]] [%mime ['image' 'svg+xml' ~] spinner]
+ [[%favicon ~] [~ %ico]] [%mime ['image' 'x-icon' ~] favicon]
+ :: [[%fonts @t ~] [~ %ttf]] ~& pat.rl
+ :: ~& ~(key by fonts)
+ :: =/ font (~(got by fonts) 'name')
+ :: [%mime /application/octet-stream font]
+ ==
+
+ ++ serve-get
+ |= rl=req-line:kaji ^- eyre-res:kaji
+ =/ pat pat.rl
+ ?+ pat ~(show blog [rl s bowl])
+ [~ ~] serve-root
+ [%blog rest=*] (blog [rl(pat rest.pat) s bowl])
+ ::
+ [%board rest=*] (board rl(pat rest.pat) s bowl)
+ ::
+ [%feed rest=*] (feed rl(pat rest.pat) s bowl)
+ ::
+ [%search rest=*] (search rl(pat rest.pat) s bowl)
+ ::
+ [%tv rest=*] (tv rl(pat rest.pat) s bowl)
+ ::
+ :: users
+ [%login rest=*] serve-login
+ [%subscribe ~] serve-subscribe
+ [%logout ~] logout
+ [%user ~] serve-profile
+ [%user u=@t ~] (serve-user u.pat)
+ [%chat ~] serve-chat
+ [%about ~] serve-about
+ [%book ~] serve-merch
+ :: admin
+ [%bianji rest=*] (serve-editor rest.pat)
+ ::
+ [%f rest=*] (serve-fragment rest.pat)
+ ==
+
+
+ ++ serve-root
+ :- %page
+ =/ page (root [s bowl])
+ (index ~[title page] bowl)
+ ++ serve-login
+ :- %page
+ (index ~[(login src.bowl)] bowl)
+ ++ serve-profile :- %page
+ =/ page (user src.bowl s bowl)
+ (index ~[page] bowl)
+
+ ++ serve-subscribe
+ :- %page
+ (index ~[(subscribe src.bowl)] bowl)
+
+ ++ serve-user
+ |= suser=@t :- %page
+ =/ who (slaw %p suser)
+ ?~ who manx-bail
+ =/ page (user u.who s bowl)
+ (index ~[page] bowl)
+ ::
+ ++ serve-editor
+ |= p=path
+ :- %page
+ ?. (is-admin:lib src.bowl) manx-bail
+ =/ bunt [*thread:tp *full-node:tp]
+ =/ pid (~(get by paths.s) p)
+ =/ pp ?~ pid bunt
+ =/ poast (get:gorm:tp feed.s u.pid)
+ =/ ted (get:torm:tp threads.s u.pid)
+ ?~ ted bunt ?~ poast bunt
+ :- u.ted (node-to-full:plib u.poast feed.s)
+ =/ page=manx (editor pp s bowl)
+ (index ~[page] bowl)
+
+ ++ serve-chat
+ :- %page
+ =/ contacts (get-contacts:cnt bowl)
+ =/ pat /chat/(scot %p our.bowl)/chat/posts/newest/200/post
+ =/ scry ~(scry io:sr bowl)
+ =/ chat-posts (scry %channels pat paged-posts:tlonc)
+ =/ chat-core ~(. chat-page [contacts bowl])
+ =/ page (main:chat-core chat-posts)
+ (index ~[page] bowl)
+
+ ++ serve-about
+ :- %page
+ (index ~[title about] bowl)
+ ++ serve-merch
+ :- %page
+ (index ~[merch] bowl)
+
+ ++ serve-fragment
+ |= pat=(pole knot) :- %html
+ ?+ pat manx-bail
+ [%mobile-nav ~] ~(smol nav bowl)
+ ==
+
+
+ ++ logout
+ :- %full
+ ^- simple-payload:http
+ [[303 ['location' '/~/logout'] ['redirect' '/']~] ~]
+
+ ::
+ :: Kaji handling
+ ::
+ ++ redirect-post
+ |= [=post:tp blog-view=? is-blog=?] ^- sse-res:kaji
+ =/ ted (get:torm:tp threads.s thread.post)
+ ?~ ted kaji-bail
+ =/ pat-string=@t %- spat (get-path:lib path.u.ted blog-view is-blog)
+ =/ url ?~ parent.post pat-string
+ =/ hash (enc:kaji [author.post id.post])
+ =/ id "comment-{hash}"
+ (crip "{(trip pat-string)}?goto={id}")
+ (ui-effect [%redi url])
+
+
+ ++ give-tv-chat
+ |= [name=@t p=post:tp]
+ =/ m :: TODO FIX THIS CRAP. inner vs outer html is annoying af
+ ;div
+ ;+ (chat-msg:tvp p)
+ ==
+ =/ effects :~ [%add m '#chat-container' %bottom ~]
+ [%custom *manx %s 'scroll'] ==
+ :_ effects [%custom ~[/tv/our/[name]]]
+ ++ give-radio-chat
+ |= [s=@p p=*]
+ :: =/ m :: TODO FIX THIS CRAP. inner vs outer html is annoying af
+ :: ;div
+ :: ;+ (chat-msg:tvp p)
+ :: ==
+ :: =/ effects :~ [%add m '#chat-container' %bottom ~]
+ :: [%custom *manx %s 'scroll'] ==
+ :: :_ effects [%custom ~[/tv/our/(scot %p s)]]
+ :- [%tab ~]
+ ~
+
+ ++ give-chat-msg
+ |= [=flag:tlonc q=memo:tlonc]
+ =/ subpath /chat/(scot %p p.flag)/[q.flag]
+ =/ contacts (get-contacts:cnt bowl)
+ =/ tlonchat ~(. chat-page [contacts bowl])
+ =/ m ;div ;+ (post-div:tlonchat q) ==
+ :- [%custom ~[subpath]]
+ :~ [%add m '#chat-container' %bottom ~]
+ [%custom *manx %s 'scroll']
+ ==
+
+ :: lets play with globs
+ +$ glob-reference
+ [hash=@uvH location=glob-location]
+ ::
+ +$ glob-location
+ $% [%http =cord]
+ [%ames =ship]
+ ==
+ +$ version
+ [major=@ud minor=@ud patch=@ud]
+ +$ glob (map path mime)
+ +$ href
+ $% [%glob base=term =glob-reference]
+ [%site =path]
+ ==
+ :: glob handling, TODO put in kaji.hoon
+ ++ serve-canvas
+ |= [p=(pole knot) rl=req-line:kaji]
+ =/ pat /charges/canvas
+ =/ scry ~(scry io:sr bowl)
+ =/ scry-res (scry %docket pat *)
+ =/ glob ((soft glob) scry-res)
+ ?~ glob eyre-bail
+ =/ glob u.glob
+ :: ~& glob=~(key by glob)
+ =/ suffix (weld p (drop ext.rl))
+ ?: =(suffix /desk/js)
+ :+ %mime /text/js
+ 'window.desk = "canvas";'
+ =/ requested=path
+ ?: (~(has by glob) suffix) suffix
+ /index/html
+ =/ data=(unit mime)
+ (~(get by glob) requested)
+ ?~ data ~& >>> glob-not-found=suffix eyre-bail
+ :: =/ lmao ?: (cfind:sr 'start' (spat suffix) .n) ~& > `@t`q.q.u.data .n .n
+ :: =/ clean (replace:string:sr "/apps/canvas" "/canvas" (trip q.q.u.data))
+ :: =. q.q.u.data (crip clean)
+ :: =/ lmao ?: (cfind:sr 'start' (spat suffix) .n) ~& >> `@t`q.q.u.data .n .n
+
+ [%glob u.data]
+--
+--