use super::*;
#[derive(Debug)]
pub(crate) struct TranscriptModal {
pub(crate) state: MissionControlState,
pub(crate) visible: bool,
pub(crate) active: bool,
pub(crate) unread: bool,
}
impl TranscriptModal {
pub(crate) fn new(mut state: MissionControlState) -> Self {
state.transcript_only_layout = true;
state.welcome_render_cache.get_mut().take();
state.focus_prompt();
Self {
state,
visible: true,
active: false,
unread: false,
}
}
fn modal_area(area: Rect) -> Rect {
crate::tui::modal_container::modal_area(area, 60, 60)
}
pub(crate) fn close_control_area(area: Rect) -> Option<Rect> {
crate::tui::modal_container::close_control_area(Self::modal_area(area), Some("[Esc] close"))
}
pub(crate) fn content_area(area: Rect) -> Rect {
Self::modal_area(area).inner(Margin {
horizontal: 1,
vertical: 1,
})
}
pub(super) fn draw(&self, frame: &mut Frame<'_>) {
if !self.visible {
if self.active || self.unread {
let label = match (self.active, self.unread) {
(true, true) => " /side running • unread ",
(true, false) => " /side running ",
_ => " /side unread ",
};
let area = frame.area();
let width = (label.len() as u16).min(area.width);
frame.render_widget(
Paragraph::new(label).style(self.state.theme.app()),
Rect::new(area.right().saturating_sub(width), area.y, width, 1),
);
}
return;
}
let area = Self::modal_area(frame.area());
let content = crate::tui::modal_container::draw_modal_container(
frame,
area,
"Side",
"[Alt+C] cancel · /reset",
self.state.theme,
Some("[Esc] close"),
);
super::draw_in_area(frame, content, &self.state);
}
}
impl MissionControlState {
pub(crate) fn focused_conversation_mut(&mut self) -> &mut Self {
if self
.conversation_modal
.as_ref()
.is_some_and(|modal| modal.visible)
{
&mut self
.conversation_modal
.as_mut()
.expect("visible modal")
.state
} else {
self
}
}
}