comparison src/index.html.luan @ 21:5a56297713a3

move chat to home
author Franklin Schmidt <fschmidt@gmail.com>
date Tue, 05 Nov 2024 12:57:41 -0700
parents src/chat.html.luan@dade6a560494
children c54c806fcc6e
comparison
equal deleted inserted replaced
20:dade6a560494 21:5a56297713a3
1 local Luan = require "luan:Luan.luan" 1 local Luan = require "luan:Luan.luan"
2 local error = Luan.error 2 local error = Luan.error
3 local ipairs = Luan.ipairs or error()
4 local pairs = Luan.pairs or error()
5 local range = Luan.range or error()
6 local Table = require "luan:Table.luan"
7 local concat = Table.concat or error()
8 local is_empty = Table.is_empty or error()
9 local size = Table.size or error()
3 local Io = require "luan:Io.luan" 10 local Io = require "luan:Io.luan"
4 local Http = require "luan:http/Http.luan" 11 local Http = require "luan:http/Http.luan"
5 local Shared = require "site:/lib/Shared.luan" 12 local Shared = require "site:/lib/Shared.luan"
6 local head = Shared.head or error() 13 local head = Shared.head or error()
7 local header = Shared.header or error() 14 local header = Shared.header or error()
15 local started = Shared.started or error()
16 local chats_html = Shared.chats_html or error()
17 local http_push_to_users = Shared.http_push_to_users or error()
18 local User = require "site:/lib/User.luan"
19 local current_user = User.current or error()
20 local get_user_by_email = User.get_by_email or error()
21 local Utils = require "site:/lib/Utils.luan"
22 local to_set = Utils.to_set or error()
23 local Db = require "site:/lib/Db.luan"
24 local run_in_transaction = Db.run_in_transaction or error()
25 local Chat = require "site:/lib/Chat.luan"
26 local chat_search = Chat.search or error()
27 local Logging = require "luan:logging/Logging.luan"
28 local logger = Logging.logger "index.html"
8 29
9 30
31 local function get_chat(with)
32 local t = {}
33 local ids = {}
34 for email in pairs(with) do
35 local with_user = get_user_by_email(email) or error()
36 local id = with_user.id
37 t[#t+1] = "+chat_user_ids:"..id
38 ids[#ids+1] = id
39 end
40 local query = concat(t," ")
41 local need_push = false
42 local chat = run_in_transaction( function()
43 local chats = chat_search(query)
44 local n = #chats
45 if n == 0 then
46 local chat = Chat.new{
47 user_ids = ids
48 }
49 chat.save()
50 need_push = true
51 return chat
52 elseif n == 1 then
53 return chats[1]
54 else
55 error("multiple chats for: "..query)
56 end
57 end )
58 if need_push then
59 local js = "getChats('"..chat.id.."')"
60 http_push_to_users( chat.user_ids, js )
61 end
62 return chat
63 end
64
10 return function() 65 return function()
66 local with = Http.request.parameters.with
67 with = to_set(with)
68 local user = current_user()
69 if user == nil then
70 local url = "/login.html"
71 if not is_empty(with) then
72 local t = {}
73 for email in pairs(with) do
74 t[#t+1] = "with="..email
75 end
76 url = url.."?"..concat(t,"&")
77 end
78 Http.response.send_redirect(url)
79 return
80 end
81 local selected = nil
82 if not is_empty(with) then
83 with[user.email] = true
84 if size(with) > 1 then
85 selected = get_chat(with)
86 end
87 end
11 Io.stdout = Http.response.text_writer() 88 Io.stdout = Http.response.text_writer()
12 %> 89 %>
13 <!doctype html> 90 <!doctype html>
14 <html> 91 <html>
15 <head> 92 <head>
16 <% head() %> 93 <% head() %>
17 <style> 94 <style>
18 h1 { 95 @import "chat.css?s=<%=started%>";
19 margin-bottom: 0;
20 }
21 h3 {
22 margin-top: 8px;
23 }
24 </style> 96 </style>
97 <script src="chat.js?s=<%=started%>"></script>
25 </head> 98 </head>
26 <body> 99 <body>
27 <% header() %> 100 <% header() %>
28 <div content> 101 <div content>
29 <h1>Web Chat</h1> 102 <div chats>
30 <h3>A free web-based instant messaging service</h3> 103 <% chats_html() %>
31 <p><a href="https://hg.reactionary.software/repo/chat/">source code</a></p> 104 </div>
105 <div posts></div>
32 </div> 106 </div>
107 <dialog delete_chat>
108 <h2>Delete Chat</h2>
109 <p>Are you sure that you want to delete this chat?</p>
110 <div buttons>
111 <button cancel onclick="closeModal(this)">Cancel</button>
112 <button go onclick="doDeleteChat(this)">Delete</button>
113 </div>
114 </dialog>
115 <script>
116 <%
117 if selected ~= nil then
118 %>
119 let div = document.querySelector('div[chat="<%=selected.id%>"]');
120 selectChat(div);
121 <%
122 end
123 %>
124 setUserEventSource(<%=user.id%>);
125 </script>
33 </body> 126 </body>
34 </html> 127 </html>
35 <% 128 <%
36 end 129 end