generated from t/malachite
add: increase group maximum, better read receipts
This commit is contained in:
parent
0b242ac5f0
commit
9546c580e7
4 changed files with 41 additions and 18 deletions
|
@ -13,11 +13,11 @@ function create_streamer(chat_id, hook_element) {
|
||||||
STATE.stream_element = hook_element.parentElement;
|
STATE.stream_element = hook_element.parentElement;
|
||||||
|
|
||||||
STATE.observer = new IntersectionObserver(
|
STATE.observer = new IntersectionObserver(
|
||||||
() => {
|
(entries) => {
|
||||||
load_messages();
|
load_messages();
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
root: STATE.stream_element,
|
root: document.body,
|
||||||
rootMargin: "0px",
|
rootMargin: "0px",
|
||||||
scrollMargin: "0px",
|
scrollMargin: "0px",
|
||||||
threshold: 1.0,
|
threshold: 1.0,
|
||||||
|
@ -52,8 +52,6 @@ function load_messages() {
|
||||||
.getAttribute("data-first-message-time"),
|
.getAttribute("data-first-message-time"),
|
||||||
);
|
);
|
||||||
|
|
||||||
// STATE.stream_element.scrollTo(0, STATE.stream_element.scrollHeight);
|
|
||||||
|
|
||||||
if (document.getElementById(`msgs_quit_${STATE.id}`)) {
|
if (document.getElementById(`msgs_quit_${STATE.id}`)) {
|
||||||
STATE.observer.disconnect();
|
STATE.observer.disconnect();
|
||||||
console.log("quit");
|
console.log("quit");
|
||||||
|
@ -64,6 +62,10 @@ function load_messages() {
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
|
|
||||||
|
STATE.stream_element
|
||||||
|
.querySelector("[ui_ident=data_marker]")
|
||||||
|
.remove();
|
||||||
|
|
||||||
const element = document.createElement("div");
|
const element = document.createElement("div");
|
||||||
element.setAttribute("ui_ident", "data_marker");
|
element.setAttribute("ui_ident", "data_marker");
|
||||||
STATE.stream_element.append(element);
|
STATE.stream_element.append(element);
|
||||||
|
@ -80,10 +82,21 @@ function render_message(id) {
|
||||||
STATE.is_loading = false;
|
STATE.is_loading = false;
|
||||||
STATE.stream_element.innerHTML = `${res}${STATE.stream_element.innerHTML}`;
|
STATE.stream_element.innerHTML = `${res}${STATE.stream_element.innerHTML}`;
|
||||||
mark_message_read();
|
mark_message_read();
|
||||||
STATE.stream_element.scrollTo(0, STATE.stream_element.scrollHeight);
|
scroll_bottom();
|
||||||
|
|
||||||
|
if (document.getElementById("delivered_read_status")) {
|
||||||
|
document.getElementById("delivered_read_status").remove(); // clear read receipt box
|
||||||
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function scroll_bottom() {
|
||||||
|
STATE.stream_element.parentElement.scrollTo(
|
||||||
|
0,
|
||||||
|
STATE.stream_element.parentElement.scrollHeight,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
function sock_con() {
|
function sock_con() {
|
||||||
const socket = new WebSocket(
|
const socket = new WebSocket(
|
||||||
`//${window.location.origin.split("//")[1]}/api/v1/chats/${STATE.chat_id}/_connect`,
|
`//${window.location.origin.split("//")[1]}/api/v1/chats/${STATE.chat_id}/_connect`,
|
||||||
|
@ -109,7 +122,7 @@ function sock_con() {
|
||||||
} else if (msg.method === "ReadReceipt") {
|
} else if (msg.method === "ReadReceipt") {
|
||||||
setTimeout(() => {
|
setTimeout(() => {
|
||||||
read_receipt();
|
read_receipt();
|
||||||
}, 1500);
|
}, 150);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
@ -164,7 +177,7 @@ function read_receipt() {
|
||||||
fetch(`/chats/_templates/chat/${STATE.chat_id}/read_receipt`)
|
fetch(`/chats/_templates/chat/${STATE.chat_id}/read_receipt`)
|
||||||
.then((res) => res.text())
|
.then((res) => res.text())
|
||||||
.then((res) => {
|
.then((res) => {
|
||||||
STATE.stream_element.innerHTML = `${res}${STATE.stream_element.innerHTML}`;
|
document.getElementById("read_receipt_zone").innerHTML = res;
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -23,14 +23,18 @@
|
||||||
("class" "flex flex_col card_nest reverse")
|
("class" "flex flex_col card_nest reverse")
|
||||||
("style" "flex: 1 0 auto")
|
("style" "flex: 1 0 auto")
|
||||||
(div
|
(div
|
||||||
("class" "card flex flex_rev_col gap_2")
|
("class" "flex flex_col")
|
||||||
("style" "flex: 1 0 auto; max-height: 80dvh; overflow: auto")
|
("style" "flex: 1 0 auto; max-height: 80dvh; overflow: auto")
|
||||||
("id" "messages_stream")
|
(div
|
||||||
(text "{% if messages|length == 0 -%}")
|
("class" "card flex flex_rev_col gap_2")
|
||||||
(i ("class" "flex gap_ch items_center fade") (text "{{ icon \"star\" }} This is the start of the chat!"))
|
("style" "flex: 1 0 auto")
|
||||||
(text "{%- endif %}")
|
("id" "messages_stream")
|
||||||
|
(text "{% if messages|length == 0 -%}")
|
||||||
|
(i ("class" "flex gap_ch items_center fade") (text "{{ icon \"star\" }} This is the start of the chat!"))
|
||||||
|
(text "{%- endif %}")
|
||||||
|
|
||||||
(div ("ui_ident" "data_marker")))
|
(div ("ui_ident" "data_marker")))
|
||||||
|
(div ("id" "read_receipt_zone") ("class" "card") ("style" "min-height: 32.5px; position: sticky; bottom: 0")))
|
||||||
(form
|
(form
|
||||||
("class" "card flex flex_row items_center gap_2")
|
("class" "card flex flex_row items_center gap_2")
|
||||||
("onsubmit" "create_message(event)")
|
("onsubmit" "create_message(event)")
|
||||||
|
@ -49,5 +53,9 @@
|
||||||
(text "create_streamer(\"{{ chat.id }}\", document.querySelector(\"[ui_ident=data_marker]\"));
|
(text "create_streamer(\"{{ chat.id }}\", document.querySelector(\"[ui_ident=data_marker]\"));
|
||||||
sock_con();
|
sock_con();
|
||||||
mark_message_read();
|
mark_message_read();
|
||||||
read_receipt();"))
|
read_receipt();
|
||||||
|
|
||||||
|
setTimeout(() => {
|
||||||
|
scroll_bottom();
|
||||||
|
}, 500);"))
|
||||||
(text "{% endblock %}")
|
(text "{% endblock %}")
|
||||||
|
|
|
@ -11,7 +11,7 @@
|
||||||
; delivered and read by at least two people
|
; delivered and read by at least two people
|
||||||
(text "{{ icon \"check-check\" }}")
|
(text "{{ icon \"check-check\" }}")
|
||||||
(text "{% for uid in chat.last_message_read_by -%}")
|
(text "{% for uid in chat.last_message_read_by -%}")
|
||||||
(text "{{ components::avatar(id=uid) }}")
|
(a ("href" "/@{{ uid }}?redirect=true") (text "{{ components::avatar(id=uid) }}"))
|
||||||
(text "{%- endfor %}")
|
(text "{%- endfor %}")
|
||||||
(text "{%- endif %}"))
|
(text "{%- endif %}"))
|
||||||
(text "{%- endif %}")
|
(text "{%- endif %}")
|
||||||
|
|
|
@ -28,6 +28,8 @@ pub struct CreateChat {
|
||||||
pub members: Vec<String>,
|
pub members: Vec<String>,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub const GC_MAXIMUM_MEMBERS: usize = 20;
|
||||||
|
|
||||||
pub async fn create_request(
|
pub async fn create_request(
|
||||||
jar: CookieJar,
|
jar: CookieJar,
|
||||||
Extension(data): Extension<State>,
|
Extension(data): Extension<State>,
|
||||||
|
@ -41,7 +43,7 @@ pub async fn create_request(
|
||||||
req.members.dedup();
|
req.members.dedup();
|
||||||
|
|
||||||
if (req.members.len() > 2 && req.style == ChatStyle::Direct)
|
if (req.members.len() > 2 && req.style == ChatStyle::Direct)
|
||||||
| (req.members.len() > 10 && req.style != ChatStyle::Direct)
|
| (req.members.len() > GC_MAXIMUM_MEMBERS && req.style != ChatStyle::Direct)
|
||||||
{
|
{
|
||||||
return Json(Error::DataTooLong("members list".to_string()).into());
|
return Json(Error::DataTooLong("members list".to_string()).into());
|
||||||
} else if req.members.len() < 1 {
|
} else if req.members.len() < 1 {
|
||||||
|
@ -197,8 +199,8 @@ pub async fn add_member_request(
|
||||||
return Json(Error::NotAllowed.into());
|
return Json(Error::NotAllowed.into());
|
||||||
}
|
}
|
||||||
|
|
||||||
if chat.style != ChatStyle::Direct && chat.members.len() > 10 {
|
if chat.style != ChatStyle::Direct && chat.members.len() > GC_MAXIMUM_MEMBERS {
|
||||||
// can only have a maximum of 10 members in one chat
|
// can only have a maximum of GC_MAXIMUM_MEMBERS members in one chat
|
||||||
return Json(Error::DataTooLong("members list".to_string()).into());
|
return Json(Error::DataTooLong("members list".to_string()).into());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue