inline scss & collapable channels & show own messages

This commit is contained in:
2024-09-28 16:48:45 -06:00
parent 58a7ecd88b
commit a7135fb96d
4 changed files with 234 additions and 28 deletions
Generated
+152 -8
View File
@@ -56,6 +56,12 @@ version = "0.13.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d301b3b94cb4b2f23d7917810addbbaff90738e0ca2be692bd027e70d7e0330c" checksum = "d301b3b94cb4b2f23d7917810addbbaff90738e0ca2be692bd027e70d7e0330c"
[[package]]
name = "arc-swap"
version = "1.7.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "69f7f8c3906b62b754cd5326047894316021dcfe5a194c8ea52bdd94934a3457"
[[package]] [[package]]
name = "async-channel" name = "async-channel"
version = "2.3.1" version = "2.3.1"
@@ -1011,6 +1017,17 @@ dependencies = [
"wasi 0.9.0+wasi-snapshot-preview1", "wasi 0.9.0+wasi-snapshot-preview1",
] ]
[[package]]
name = "getrandom"
version = "0.2.15"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7"
dependencies = [
"cfg-if",
"libc",
"wasi 0.11.0+wasi-snapshot-preview1",
]
[[package]] [[package]]
name = "gimli" name = "gimli"
version = "0.29.0" version = "0.29.0"
@@ -1523,6 +1540,15 @@ version = "0.4.14"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89" checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89"
[[package]]
name = "litrs"
version = "0.4.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b4ce301924b7887e9d637144fdade93f9dfff9b60981d4ac161db09720d39aa5"
dependencies = [
"proc-macro2",
]
[[package]] [[package]]
name = "lock_api" name = "lock_api"
version = "0.4.12" version = "0.4.12"
@@ -1657,6 +1683,12 @@ version = "0.3.17"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a"
[[package]]
name = "minimal-lexical"
version = "0.2.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a"
[[package]] [[package]]
name = "miniz_oxide" name = "miniz_oxide"
version = "0.7.4" version = "0.7.4"
@@ -1713,6 +1745,7 @@ dependencies = [
"ordermap", "ordermap",
"serde-wasm-bindgen 0.6.5", "serde-wasm-bindgen 0.6.5",
"serde_json", "serde_json",
"sir",
"tokio-util", "tokio-util",
"wasm-bindgen", "wasm-bindgen",
"wasm-bindgen-futures", "wasm-bindgen-futures",
@@ -1743,6 +1776,16 @@ version = "0.1.14"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "72ef4a56884ca558e5ddb05a1d1e7e1bfd9a68d9ed024c21704cc98872dae1bb" checksum = "72ef4a56884ca558e5ddb05a1d1e7e1bfd9a68d9ed024c21704cc98872dae1bb"
[[package]]
name = "nom"
version = "7.1.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a"
dependencies = [
"memchr",
"minimal-lexical",
]
[[package]] [[package]]
name = "nu-ansi-term" name = "nu-ansi-term"
version = "0.46.0" version = "0.46.0"
@@ -1753,6 +1796,36 @@ dependencies = [
"winapi", "winapi",
] ]
[[package]]
name = "num-bigint"
version = "0.4.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9"
dependencies = [
"num-integer",
"num-traits",
]
[[package]]
name = "num-integer"
version = "0.1.46"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f"
dependencies = [
"num-traits",
]
[[package]]
name = "num-rational"
version = "0.4.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f83d14da390562dca69fc84082e73e548e1ad308d24accdedd2720017cb37824"
dependencies = [
"num-bigint",
"num-integer",
"num-traits",
]
[[package]] [[package]]
name = "num-traits" name = "num-traits"
version = "0.2.19" version = "0.2.19"
@@ -1927,7 +2000,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "17367f0cc86f2d25802b2c26ee58a7b23faeccf78a396094c13dced0d0182526" checksum = "17367f0cc86f2d25802b2c26ee58a7b23faeccf78a396094c13dced0d0182526"
dependencies = [ dependencies = [
"phf_shared", "phf_shared",
"rand", "rand 0.7.3",
] ]
[[package]] [[package]]
@@ -2088,14 +2161,25 @@ version = "0.7.3"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03" checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03"
dependencies = [ dependencies = [
"getrandom", "getrandom 0.1.16",
"libc", "libc",
"rand_chacha", "rand_chacha 0.2.2",
"rand_core", "rand_core 0.5.1",
"rand_hc", "rand_hc",
"rand_pcg", "rand_pcg",
] ]
[[package]]
name = "rand"
version = "0.8.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404"
dependencies = [
"libc",
"rand_chacha 0.3.1",
"rand_core 0.6.4",
]
[[package]] [[package]]
name = "rand_chacha" name = "rand_chacha"
version = "0.2.2" version = "0.2.2"
@@ -2103,7 +2187,17 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402" checksum = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402"
dependencies = [ dependencies = [
"ppv-lite86", "ppv-lite86",
"rand_core", "rand_core 0.5.1",
]
[[package]]
name = "rand_chacha"
version = "0.3.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88"
dependencies = [
"ppv-lite86",
"rand_core 0.6.4",
] ]
[[package]] [[package]]
@@ -2112,7 +2206,16 @@ version = "0.5.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19" checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19"
dependencies = [ dependencies = [
"getrandom", "getrandom 0.1.16",
]
[[package]]
name = "rand_core"
version = "0.6.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c"
dependencies = [
"getrandom 0.2.15",
] ]
[[package]] [[package]]
@@ -2121,7 +2224,7 @@ version = "0.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c" checksum = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c"
dependencies = [ dependencies = [
"rand_core", "rand_core 0.5.1",
] ]
[[package]] [[package]]
@@ -2130,7 +2233,7 @@ version = "0.2.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "16abd0c1b639e9eb4d7c50c0b8100b0d0f849be2349829c740fe8e6eb4816429" checksum = "16abd0c1b639e9eb4d7c50c0b8100b0d0f849be2349829c740fe8e6eb4816429"
dependencies = [ dependencies = [
"rand_core", "rand_core 0.5.1",
] ]
[[package]] [[package]]
@@ -2211,6 +2314,23 @@ dependencies = [
"winreg", "winreg",
] ]
[[package]]
name = "rsass"
version = "0.28.10"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "212e14dfa9e48df42c0125c80a213a9a0269103130c8c154080fdbbb79ce7d52"
dependencies = [
"arc-swap",
"fastrand",
"lazy_static",
"nom",
"num-bigint",
"num-integer",
"num-rational",
"num-traits",
"tracing",
]
[[package]] [[package]]
name = "rustc-demangle" name = "rustc-demangle"
version = "0.1.24" version = "0.1.24"
@@ -2519,6 +2639,30 @@ version = "0.3.11"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "38b58827f4464d87d377d175e90bf58eb00fd8716ff0a62f80356b5e61555d0d" checksum = "38b58827f4464d87d377d175e90bf58eb00fd8716ff0a62f80356b5e61555d0d"
[[package]]
name = "sir"
version = "0.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "75a6aabaa54dc0d627a5f9af5d932fb71ba940cb8401cfe0e7b7bf340f9c45c3"
dependencies = [
"dioxus",
"once_cell",
"sir-macro",
]
[[package]]
name = "sir-macro"
version = "0.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8bff4c4b9aafdb2abc85cbe4e252474c319ed7f4ce57e5ffcb768473f6aaf393"
dependencies = [
"litrs",
"proc-macro2",
"quote",
"rand 0.8.5",
"rsass",
]
[[package]] [[package]]
name = "slab" name = "slab"
version = "0.4.9" version = "0.4.9"
+1
View File
@@ -27,3 +27,4 @@ html-purifier = "0.3.0"
markdown = "0.3.0" markdown = "0.3.0"
gloo-timers = { version = "0.3.0", features = ["futures"] } gloo-timers = { version = "0.3.0", features = ["futures"] }
futures-channel = "0.3.30" futures-channel = "0.3.30"
sir = { version = "0.5.0", features = ["dioxus"] }
+53 -18
View File
@@ -4,6 +4,7 @@ use std::collections::{BTreeMap, BTreeSet, HashMap};
use dioxus::prelude::*; use dioxus::prelude::*;
use ordermap::OrderSet; use ordermap::OrderSet;
use sir::css;
pub type ChannelId = u32; pub type ChannelId = u32;
pub type UserId = u32; pub type UserId = u32;
@@ -75,31 +76,67 @@ pub static STATE: State = State {
server: Signal::global(|| Default::default()), server: Signal::global(|| Default::default()),
}; };
#[component]
pub fn UserPill(name: String) -> Element {
let pill = css!(
"
border: solid 1px black;
border-radius: 8px;
margin: 4px;
padding: 4px;
"
);
rsx!(
span {
class: "{pill}",
"{name}"
}
)
}
#[component] #[component]
pub fn User(id: UserId) -> Element { pub fn User(id: UserId) -> Element {
let server = STATE.server.read(); let server = STATE.server.read();
let state = server.users.get(&id)?; let state = server.users.get(&id)?;
rsx!( rsx!(UserPill {
span { name: state.name.clone()
style: "border: solid black 1px; border-radius: 4px;", })
"{state.name}"
}
)
} }
#[component] #[component]
pub fn Channel(id: ChannelId) -> Element { pub fn Channel(id: ChannelId) -> Element {
let server = STATE.server.read(); let server = STATE.server.read();
let state = server.channels.get(&id)?; let state = server.channels.get(&id)?;
let channel_details = css!(
"
flex: 0 0 100%;
"
);
let channel_children = css!(
"
border-left: solid black 1px;
display: flex;
flex-direction: row;
flex-wrap: wrap;
margin-left: 5px;
padding-left: 11px; "
);
rsx!( rsx!(
"{state.name}" details {
div { class: "{channel_details}",
style: "border-left: solid black 1px; padding-left: 8px;", open: true,
for child in state.children.iter() { summary { "{state.name}" }
Channel { id: *child } div {
} class: "{channel_children}",
for id in state.users.iter() { for id in state.users.iter() {
User { id: *id } User { id: *id }
}
for child in state.children.iter() {
Channel { id: *child }
}
} }
} }
) )
@@ -115,10 +152,7 @@ pub fn ChatView() -> Element {
style: "margin: 16px; padding: 16px; border: solid black 1px;", style: "margin: 16px; padding: 16px; border: solid black 1px;",
for chat in server.chat.iter() { for chat in server.chat.iter() {
if let Some(sender) = chat.sender.and_then(|u| server.users.get(&u)) { if let Some(sender) = chat.sender.and_then(|u| server.users.get(&u)) {
span { UserPill { name: sender.name.clone() }
style: "border: solid black 1px; border-radius: 4px;",
"{sender.name}"
}
"\u{8194}" "\u{8194}"
} }
span { span {
@@ -170,6 +204,7 @@ pub fn app() -> Element {
let status = &STATE.status; let status = &STATE.status;
rsx!( rsx!(
sir::AppStyle { }
div { div {
input { input {
placeholder: "username", placeholder: "username",
+28 -2
View File
@@ -549,9 +549,35 @@ fn accept_command(
) -> Result<(), JsValue> { ) -> Result<(), JsValue> {
match command { match command {
Command::SendChat { markdown, channels } => { Command::SendChat { markdown, channels } => {
let html_text = markdown::to_html(&markdown); use markdown::*;
let html_text = match tokenize(&markdown).as_slice() {
block @ [Block::Paragraph(par)] => match par.as_slice() {
[Span::Text(par)] => par.to_string(),
_ => generate_markdown(block.to_vec())
.trim()
.strip_prefix("<p>")
.unwrap()
.strip_suffix("</p>")
.unwrap()
.to_string(),
},
block => generate_markdown(block.to_vec()).trim().to_string(),
};
{
let mut server = STATE.server.write();
let Some(me) = server.session else {
bail!("not signed in with a session id")
};
server.chat.push(Chat {
raw: markdown,
dangerous_html: html_text.clone(),
sender: Some(me),
})
}
let mut u = msgs::TextMessage::new(); let mut u = msgs::TextMessage::new();
u.set_message(html_text); u.set_message(html_text.to_string());
u.set_channel_id(channels); u.set_channel_id(channels);
let _ = send_chan.unbounded_send(u.into()); let _ = send_chan.unbounded_send(u.into());
} }