Files
proxy/internal/tui/confirmation_dialog.go
T

72 lines
1.7 KiB
Go

package tui
import (
"fmt"
"strings"
"proxyctl/internal/app"
)
type confirmationResult uint8
const (
confirmationPending confirmationResult = iota
confirmationAccepted
confirmationCancelled
)
// confirmationDialog is the reusable safe-default interaction used for
// destructive Profile deletion and Application-requested confirmations.
// confirmFocused is deliberately false in every new dialog.
type confirmationDialog struct {
request app.Confirmation
confirmFocused bool
}
func newConfirmationDialog(request app.Confirmation) confirmationDialog {
return confirmationDialog{request: request}
}
func (d *confirmationDialog) update(key string) confirmationResult {
switch key {
case "left", "right", "tab", "shift+tab":
d.confirmFocused = !d.confirmFocused
case "y":
return confirmationAccepted
case "n", "esc", "q":
return confirmationCancelled
case "enter":
if d.confirmFocused {
return confirmationAccepted
}
return confirmationCancelled
}
return confirmationPending
}
func (d confirmationDialog) view() string {
confirmLabel := d.request.ConfirmLabel
if confirmLabel == "" {
confirmLabel = "Confirm"
}
cancelLabel := d.request.CancelLabel
if cancelLabel == "" {
cancelLabel = "Cancel"
}
confirm, cancel := " "+confirmLabel, "> "+cancelLabel
if d.confirmFocused {
confirm, cancel = "> "+confirmLabel, " "+cancelLabel
}
var body strings.Builder
body.WriteString(d.request.Title)
if d.request.Summary != "" {
fmt.Fprintf(&body, "\n%s", d.request.Summary)
}
for _, detail := range d.request.Details {
fmt.Fprintf(&body, "\n• %s", detail)
}
fmt.Fprintf(&body, "\n\n%s %s", cancel, confirm)
return body.String()
}