use helix_core::EffectSink;
use crate::error::ImError;
use crate::state::ChannelId;
use super::super::{ImWsContext, WsFrame, WsHandlerRegistration, WsMessageHandler};
const QUIT_COMPANY_ACTION: &str = "quit_company";
struct QuitCompanyHandler;
impl WsMessageHandler for QuitCompanyHandler {
fn action(&self) -> &'static str {
QUIT_COMPANY_ACTION
}
fn handle(
&self,
_ctx: &mut ImWsContext<'_>,
frame: &WsFrame,
out: &mut EffectSink,
) -> Result<(), ImError> {
let Ok(data) = frame.data_required() else {
return Ok(());
};
let raw = serde_json::to_vec(data).unwrap_or_default();
if let Some(channels) = data.get("channels").and_then(serde_json::Value::as_array) {
for item in channels {
if let Some(channel_id) = item
.get("channelId")
.or_else(|| item.get("channel_id"))
.or_else(|| item.get("id"))
.and_then(serde_json::Value::as_str)
.and_then(ChannelId::from_str)
{
out.push(crate::acl::to_effect_s1::emit_channel_member_updated(
channel_id, &raw,
));
}
}
}
Ok(())
}
}
static QUIT_COMPANY_HANDLER: QuitCompanyHandler = QuitCompanyHandler;
#[cfg(target_arch = "wasm32")]
pub(super) fn inventory_link_anchor() {
std::hint::black_box(&QUIT_COMPANY_HANDLER);
}
inventory::submit! {
WsHandlerRegistration {
action: QUIT_COMPANY_ACTION,
handler: &QUIT_COMPANY_HANDLER,
}
}