use super::effects::Effect;
use super::msg::{Msg, RebaseOutcome};
pub fn update(state: &mut crate::app::AppState, msg: Msg) -> Option<Effect> {
tracing::debug!("TEA update: {:?}", msg);
match msg {
Msg::Tick => {
None
}
Msg::RequestQuit => {
state.running = false;
None
}
Msg::RequestStage { path } => {
state.feedback_message = Some(format!("Staging {}...", path));
Some(Effect::GitStage { path: path.into() })
}
Msg::RequestUnstage { path } => {
state.feedback_message = Some(format!("Unstaging {}...", path));
Some(Effect::GitUnstage { path: path.into() })
}
Msg::RequestCommit { message, amend } => {
state.feedback_message = Some("Committing...".to_string());
Some(Effect::GitCommit {
message,
amend,
author_name: None,
author_email: None,
})
}
Msg::RequestPush { force } => {
state.feedback_message = Some("Pushing...".to_string());
Some(Effect::GitPush { force_with_lease: force })
}
Msg::RequestRebaseContinue { message, author_name, author_email } => {
state.feedback_message = Some("Continuing rebase...".to_string());
Some(Effect::GitRebaseContinue { message, author_name, author_email })
}
Msg::RequestRebaseAbort => {
state.feedback_message = Some("Aborting rebase...".to_string());
Some(Effect::GitRebaseAbort)
}
Msg::StageStarted { path } => {
state.feedback_message = Some(format!("Staging {}...", path));
None
}
Msg::StageSuccess { path: _ } => {
state.feedback_message = Some("Staged successfully".to_string());
Some(Effect::RefreshStatus)
}
Msg::StageFailed { path, error } => {
state.feedback_message = None;
state.last_status_error = Some(format!("Failed to stage {}: {}", path, error));
None
}
Msg::CommitStarted => {
state.feedback_message = Some("Committing...".to_string());
None
}
Msg::CommitSuccess { hash } => {
state.feedback_message = Some(format!("Committed: {}", &hash[..7.min(hash.len())]));
state.commit_input.clear();
state.commit_mode = false;
Some(Effect::RefreshAll)
}
Msg::CommitFailed { error } => {
state.feedback_message = None;
state.last_status_error = Some(error);
None
}
Msg::RebaseStarted => {
state.feedback_message = Some("Rebase in progress...".to_string());
None
}
Msg::RebaseSuccess { outcome } => {
match outcome {
RebaseOutcome::Completed => {
state.feedback_message = Some("Rebase completed".to_string());
}
RebaseOutcome::PausedForEdit => {
state.feedback_message = Some("Rebase paused for edit".to_string());
}
RebaseOutcome::PausedForReword { commit_hash: _, current_message: _ } => {
state.feedback_message = Some("Rebase paused for reword (use FSM)".to_string());
}
RebaseOutcome::Conflicts { files } => {
state.last_status_error = Some(format!("Conflicts in: {}", files.join(", ")));
}
}
Some(Effect::RefreshAll)
}
Msg::RebaseFailed { error } => {
state.feedback_message = None;
state.last_status_error = Some(error);
None
}
Msg::StatusRefreshed { entries } => {
state.status_entries = entries.into_iter().map(|e| {
crate::git::parsers::status::StatusEntry {
path: e.path,
staged: e.staged,
unstaged: e.unstaged,
conflict: e.conflict,
}
}).collect();
None
}
Msg::StatusRefreshFailed { error } => {
state.last_status_error = Some(error);
None
}
Msg::DiffComputed { path, content, truncated } => {
state.last_diff = content;
state.last_diff_path = path;
state.last_diff_truncated = truncated;
None
}
Msg::NavigateUp | Msg::NavigateDown | Msg::NavigateTop |
Msg::NavigateBottom | Msg::PageUp | Msg::PageDown => {
None
}
Msg::FocusNext => {
None
}
Msg::FocusPrev => {
None
}
Msg::ToggleHelp => {
state.show_help = !state.show_help;
None
}
Msg::ShowThemePicker => {
state.theme_picker = true;
None
}
Msg::HideThemePicker => {
state.theme_picker = false;
None
}
Msg::ApplyTheme { name } => {
let theme = crate::config::load_theme_by_name(&name);
state.theme = theme;
state.theme_picker = false;
Some(Effect::SaveConfig {
key: "theme".to_string(),
value: name,
})
}
Msg::SetFeedback { message } => {
state.feedback_message = message;
None
}
Msg::SetError { error, guidance: _ } => {
state.last_status_error = error;
None
}
Msg::ClearError => {
state.last_status_error = None;
state.error_guidance = None;
None
}
Msg::StartCommitInput => {
state.commit_mode = true;
state.commit_input.clear();
None
}
Msg::CancelCommitInput => {
state.commit_mode = false;
state.commit_input.clear();
None
}
Msg::UpdateCommitInput { text } => {
state.commit_input = text;
None
}
Msg::CharInput { ch } => {
if state.commit_mode {
state.commit_input.push(ch);
}
None
}
Msg::Backspace => {
if state.commit_mode {
state.commit_input.pop();
}
None
}
}
}
#[cfg(test)]
mod tests {
#[test]
fn placeholder() {
assert!(true);
}
}