# first: # connection to authd # display the authd widget # # second: # connection to todod # rewrite the whole body component # maquette = require "maquette" nmd = require "nano-markdown" authd = require "./authd.ls" todows = require "./todowebsocket.ls" bulma = require "./bulma.ls" Task = require "./task.ls" Project = require "./project.ls" {create-projector, h} = maquette projector = create-projector! model = { current-view: "login" editing: undefined selected: undefined users: {} projects: {} todo-list: [] port: 9999 todod-url: undefined authd-ws: undefined todod-ws: undefined previous-error: undefined error: undefined # authentication token jwt: undefined } # '://' + location.hostname + \: + model.todod-url = (if location.protocol == 'https' then 'wss' else 'ws') + "://www.junkos.netlib.re:" + model.port + "/kanban.JSON" console.log model.todod-url # # network configuration # model.authd-ws = authd.create-socket model.authd-url model.todod-ws = todows.create-socket model.todod-url on-websocket-error = (event) -> console.log "WebSocket error.", event model.current-view := "network-error" projector.schedule-render! on-websocket-close = (event) -> model.current-view := "login" console.log "WebSocket has been closed.", event # model.todod-ws.reopen! projector.schedule-render! on-websocket-message = (data) -> message = JSON.parse data switch message.type when "login" model.current-view := "todo-list" when "list-projects" model.todo-list := message.projects || [] when "project" model.projects[message.project.id] = Project.new message.project, model when "user" if message.user model.users[message.user.uid] := message.user when "login-error" model.login-error = message.error else console.log "RECEIVED UNKNOWN MESSAGE TYPE: #{message.type}" projector.schedule-render! console.log message # record changes that need to happen on a network event model.todod-ws.user-on-error ++= [ on-websocket-error ] model.todod-ws.user-on-close ++= [ on-websocket-close ] model.todod-ws.user-on-message ++= [ on-websocket-message ] render-navbar = -> h \div.navbar [ h \div.navbar-start [ h \a.navbar-item.is-size-1 { onclick: -> model.viewed-project := undefined model.current-view := "todo-list" } [ "⌂" ] ] h \div.navbar-end [ h \a.navbar-item { onclick: -> model.current-view := "login" model.todod-ws.reopen! } [ "Logout" ] ] authd.login-widget model ] render-todo-list = -> h \div.section model.todo-list.map (project) -> h \a.box { key: project.id onclick: -> model.current-view := "todo" model.viewed-project := project.id model.todod-ws.get-project project.id } [ bulma.title 3 project.name ] render-new-project-button = -> h \div.button.is-primary.is-large.is-fullwidth { onclick: -> model.todod-ws.new-project "New project" } [ "New project! (random atm)" ] render-todo = (todo-id) -> if model.projects[todo-id] model.projects[todo-id].render! # # Pages: # login # todo-list # todo # network-error # render-body = -> h \div.section [ switch model.current-view when "login" authd.login-page model when "todo-list" h \div#todo-list [ render-navbar! render-todo-list! render-new-project-button! ] when "todo" h \div [ render-navbar! render-todo model.viewed-project ] else h \div.notification.is-error [ "Wait, what? Internal error!" ] ] renderer = -> render-navbar! render-body! document.add-event-listener 'DOMContentLoaded' -> projector.append document.body, renderer