use ratatui::Frame;
use ratatui::layout::Rect;
use crate::studio::components::{render_diff_view, render_file_tree, render_message_editor};
use crate::studio::state::{EmojiMode, PanelId, StudioState};
pub fn render_commit_panel(
state: &mut StudioState,
frame: &mut Frame,
area: Rect,
panel_id: PanelId,
) {
let is_focused = panel_id == state.focused_panel;
match panel_id {
PanelId::Left => {
let staged = state.git_status.staged_count;
let modified = state.git_status.modified_count;
let title = if state.modes.commit.show_all_files {
format!("All Files · ✓{}", staged)
} else if modified > 0 {
format!("Changes ✓{} ○{}", staged, modified)
} else if staged > 0 {
format!("Changes ✓{}", staged)
} else {
"Changes".to_string()
};
render_file_tree(
frame,
area,
&mut state.modes.commit.file_tree,
&title,
is_focused,
);
}
PanelId::Center => {
let emoji_indicator = match &state.modes.commit.emoji_mode {
EmojiMode::None => "—",
EmojiMode::Auto => "✨",
EmojiMode::Custom(e) => e,
};
let preset_name = &state.modes.commit.preset;
let amend_indicator = if state.modes.commit.amend_mode {
" [AMEND]"
} else {
""
};
let title = format!(
"Message · {} {}{}",
preset_name, emoji_indicator, amend_indicator
);
let status_msg = state.iris_status.message();
render_message_editor(
frame,
area,
&state.modes.commit.message_editor,
&title,
is_focused,
state.modes.commit.generating,
status_msg,
);
}
PanelId::Right => {
let title = if let Some(diff) = state.modes.commit.diff_view.current_diff() {
format!(
"◈ {}",
diff.path.file_name().unwrap_or_default().to_string_lossy()
)
} else {
state.modes.commit.file_tree.selected_path().map_or_else(
|| "Changes".to_string(),
|p| format!("◈ {}", p.file_name().unwrap_or_default().to_string_lossy()),
)
};
render_diff_view(
frame,
area,
&state.modes.commit.diff_view,
&title,
is_focused,
);
}
}
}