use std::path::Path;
use crate::AppModel;
use crate::cli_outbound::Cli;
use crate::config_edit::brazen::{BzRunner, RealBzRunner};
use crate::login::{self, LoginRun};
use crate::theme;
use crate::world::toolgate::PHASE1_DISCLAIMER;
use super::LoginHolder;
pub fn pane(ui: &mut egui::Ui, model: &mut AppModel, login: &mut LoginHolder, bz: &Cli) {
let state_root = model.state_root().to_path_buf();
ui.collapsing("Toolchain", |ui| {
for (name, state) in model.toolchain().rows() {
ui.horizontal(|ui| {
ui.colored_label(theme::integration_hue(name), name);
let health = if state.permits() {
theme::HYDRA
} else {
theme::ICHOR
};
ui.colored_label(health, state.describe());
});
if let Some(fix) = state.remediation() {
ui.small(fix);
}
}
if ui.button("Re-probe").clicked() {
model.refresh_toolchain();
}
ui.separator();
login_section(ui, login, bz, &state_root);
ui.separator();
ui.small(PHASE1_DISCLAIMER);
});
}
pub(super) fn login_section(
ui: &mut egui::Ui,
login: &mut LoginHolder,
bz: &Cli,
state_root: &Path,
) {
ui.label("Login (bz device flow)");
if ui.button("↻ providers").clicked() {
let dump = RealBzRunner::new(bz.clone()).dump_config_effective();
login.providers = login::provider_rows(&dump.stdout);
}
let mut chosen = None;
for provider in &login.providers {
if ui.button(format!("Login {provider}")).clicked() {
chosen = Some(provider.clone());
}
}
if let Some(provider) = chosen
&& let Ok(run) = login::start(bz, &provider, state_root, &super::now_ts())
{
login.run = Some(run);
}
if let Some(run) = login.run.as_mut() {
run.poll();
render_run(ui, run);
}
}
fn render_run(ui: &mut egui::Ui, run: &LoginRun) {
let view = run.view();
for line in &view.lines {
ui.monospace(line);
}
if let Some(exit) = view.outcome {
let color = if exit == 0 {
theme::HYDRA
} else {
theme::ICHOR
};
ui.colored_label(color, format!("login exited {exit}"));
if let Some(command) = &view.fallback {
ui.small("or run by hand:");
ui.code(command);
}
}
}