use helix_core::EffectSink;
use crate::error::ImError;
use crate::state::ChannelId;
use super::super::{ImWsContext, WsFrame, WsHandlerRegistration, WsMessageHandler};
const POST_PIN_ACTION: &str = "post_pin";
struct PostPinHandler;
impl WsMessageHandler for PostPinHandler {
fn action(&self) -> &'static str {
POST_PIN_ACTION
}
fn handle(
&self,
ctx: &mut ImWsContext<'_>,
frame: &WsFrame,
out: &mut EffectSink,
) -> Result<(), ImError> {
let Ok(data) = frame.data_required() else {
return Ok(());
};
let Some(channel_id) = data
.get("channelId")
.or_else(|| data.get("channel_id"))
.and_then(serde_json::Value::as_str)
.and_then(ChannelId::from_str)
else {
return Ok(());
};
ctx.state.invalidate_recent_message_coverage(channel_id);
let Some(post_id) = data
.get("postId")
.or_else(|| data.get("post_id"))
.and_then(serde_json::Value::as_str)
.filter(|s| !s.is_empty())
else {
return Ok(());
};
let Some(pinned) = data
.get("operation")
.and_then(serde_json::Value::as_str)
.and_then(|operation| match operation {
"add" => Some(true),
"remove" => Some(false),
_ => None,
})
else {
return Ok(());
};
out.push(helix_core::Effect::PersistFire {
ops: vec![crate::channel::pin_state_op(post_id, pinned)],
});
Ok(())
}
}
static POST_PIN_HANDLER: PostPinHandler = PostPinHandler;
#[cfg(target_arch = "wasm32")]
pub(super) fn inventory_link_anchor() {
std::hint::black_box(&POST_PIN_HANDLER);
}
inventory::submit! {
WsHandlerRegistration {
action: POST_PIN_ACTION,
handler: &POST_PIN_HANDLER,
}
}