use super::*;
impl MissionControlState {
pub(super) fn active_modal_field_mut(&mut self) -> Option<&mut SingleLineField> {
let connect = self.modals.connect_provider.as_mut()?;
match connect.stage {
ConnectProviderStage::ConfigureCustom => connect.current_field_mut(),
ConnectProviderStage::OAuth if connect.oauth_focus == OAuthControl::Fallback => {
Some(&mut connect.fallback_input)
}
_ => None,
}
}
pub(super) fn finish_modal_field_edit(&mut self) {
if let Some(connect) = &mut self.modals.connect_provider
&& connect.stage == ConnectProviderStage::ConfigureCustom
{
connect.error = None;
if connect.selected_field == ConnectProviderField::Label {
connect.provider_id =
crate::config::derive_custom_provider_id(connect.label.value()).ok();
}
}
}
pub(super) fn reject_secret_like_api_key_env_var(&mut self, text: &str) -> bool {
let Some(connect) = &mut self.modals.connect_provider else {
return false;
};
if connect.stage != ConnectProviderStage::ConfigureCustom
|| connect.selected_field != ConnectProviderField::ApiKeyEnvVar
{
return false;
}
let mut candidate = connect.api_key_env_var.clone();
candidate.insert_str(text);
if crate::config::looks_like_secret_value(candidate.value()) {
connect.error = Some(
"API key environment variable name looks like a secret value; enter a variable name such as CUSTOM_PROVIDER_API_KEY".to_string(),
);
true
} else {
false
}
}
pub(crate) fn insert_modal_field_char(&mut self, ch: char) {
if self.reject_secret_like_api_key_env_var(&ch.to_string()) {
return;
}
if self
.active_modal_field_mut()
.is_some_and(|field| field.insert_char(ch))
{
self.finish_modal_field_edit();
}
}
pub(crate) fn insert_modal_field_text(&mut self, text: &str) -> bool {
if self.reject_secret_like_api_key_env_var(text) {
return false;
}
let changed = self
.active_modal_field_mut()
.is_some_and(|field| field.insert_str(text));
if changed {
self.finish_modal_field_edit();
}
changed
}
pub(crate) fn backspace_modal_field(&mut self) {
if self
.active_modal_field_mut()
.is_some_and(SingleLineField::backspace)
{
self.finish_modal_field_edit();
}
}
pub(crate) fn delete_modal_field_forward(&mut self) {
if self
.active_modal_field_mut()
.is_some_and(SingleLineField::delete_forward)
{
self.finish_modal_field_edit();
}
}
pub(crate) fn move_modal_field_left(&mut self) {
if let Some(field) = self.active_modal_field_mut() {
field.move_left();
}
}
pub(crate) fn move_modal_field_right(&mut self) {
if let Some(field) = self.active_modal_field_mut() {
field.move_right();
}
}
pub(crate) fn move_modal_field_home(&mut self) {
if let Some(field) = self.active_modal_field_mut() {
field.move_home();
}
}
pub(crate) fn move_modal_field_end(&mut self) {
if let Some(field) = self.active_modal_field_mut() {
field.move_end();
}
}
}