magi-code 0.96.1

Repository-aware CLI coding agent for terminal work
Documentation
use super::*;
#[derive(Debug, Clone, PartialEq, Eq)]
pub(crate) struct LoginProviderEntry {
    pub(crate) id: String,
    pub(crate) label: String,
    pub(crate) description: String,
    pub(crate) status: String,
}

#[derive(Debug, Clone, PartialEq, Eq)]
pub(crate) struct LogoutPickerState {
    pub(crate) entries: Vec<LoginProviderEntry>,
    pub(crate) selected: usize,
    pub(crate) notice: Option<String>,
}

#[derive(Debug, Clone, PartialEq, Eq)]
pub(crate) struct LogoutConfirmationState {
    pub(crate) provider_id: String,
    pub(crate) label: String,
}
impl LogoutPickerState {
    pub(in crate::tui::state) fn clamp(&mut self) {
        let item_count = self.entries.len();
        clamp_picker_selection(&mut self.selected, item_count);
    }
}

impl MissionControlState {
    pub(crate) fn open_logout_confirmation(&mut self, provider_id: String, label: String) {
        self.modals.logout_confirmation = Some(LogoutConfirmationState { provider_id, label });
        self.hide_autocomplete();
    }

    pub(crate) fn close_logout_confirmation(&mut self) -> bool {
        self.modals.logout_confirmation.take().is_some()
    }
    pub(crate) fn open_logout_picker(
        &mut self,
        entries: Vec<LoginProviderEntry>,
        notice: Option<String>,
        _visible_rows: usize,
    ) {
        let mut picker = LogoutPickerState {
            entries,
            selected: 0,
            notice,
        };
        picker.clamp();
        self.modals.logout_picker = Some(picker);
        self.set_scroll_offset(&self.scroll_views.logout_picker, 0);
        self.hide_autocomplete();
    }

    pub(crate) fn close_logout_picker(&mut self) -> bool {
        self.modals.logout_picker.take().is_some()
    }

    pub(crate) fn logout_picker_up(&mut self, visible_rows: usize) -> bool {
        self.move_logout_picker(false, visible_rows)
    }

    pub(crate) fn logout_picker_down(&mut self, visible_rows: usize) -> bool {
        self.move_logout_picker(true, visible_rows)
    }

    pub(super) fn move_logout_picker(&mut self, down: bool, visible_rows: usize) -> bool {
        let before_offset = self.scroll_offset(&self.scroll_views.logout_picker);
        let (before_selected, selected, offset) = {
            let Some(picker) = self.modals.logout_picker.as_mut() else {
                return false;
            };
            let before_selected = picker.selected;
            let (selected, offset) = picker_selection_after_move(
                picker.selected,
                picker.entries.len(),
                1,
                down,
                visible_rows,
                before_offset,
            );
            picker.selected = selected;
            (before_selected, selected, offset)
        };
        self.set_scroll_offset(&self.scroll_views.logout_picker, offset);
        before_selected != selected
            || before_offset != self.scroll_offset(&self.scroll_views.logout_picker)
    }

    pub(crate) fn selected_logout_provider_id(&self) -> Option<String> {
        self.modals
            .logout_picker
            .as_ref()
            .and_then(|picker| picker.entries.get(picker.selected))
            .map(|entry| entry.id.clone())
    }
}