git-iris 2.0.8

AI-powered Git workflow assistant for smart commits, code reviews, changelogs, and release notes
Documentation
//! Commit mode rendering for Iris Studio

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};

/// Render a panel in Commit mode
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 => {
            // Build title with file counts and mode indicator
            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 => {
            // Build title with current style settings
            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
            );

            // Render message editor with dynamic status message
            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 => {
            // Render diff view for selected file
            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,
            );
        }
    }
}