package app import ( "fmt" "os" "os/user" "strconv" "git.sr.ht/~rockorager/vaxis" "git.tilde.town/nbsp/neofeels/ttbp" "git.tilde.town/nbsp/neofeels/ui" ) type Management struct { title string list ui.List help string } func NewManagement() *Management { return &Management{ title, ui.NewList([]string{ "read over feels", "modify feels publishing", // TODO "backup your feels", // TODO "import a feels backup", // TODO "bury some feels", // TODO "delete feels by day", "purge all feels", "wipe feels account", }), "↑↓/kj move ↵ enter q return", } } func (management *Management) Event(state *ui.State, event vaxis.Event) (processed bool) { if key, ok := event.(vaxis.Key); ok && key.EventType == vaxis.EventPress { switch key.String() { case "Ctrl+c", "Ctrl+d": close(ui.Quit) case "Down", "j", "Ctrl+n": management.list.Down() case "Up", "k", "Ctrl+p": management.list.Up() case "End", "Shift+g": management.list.End() case "Home", "g": management.list.Home() case "0", "1", "2", "3", "4", "5", "6", "7": i, _ := strconv.Atoi(key.String()) management.list.SetIndex(i) case "q", "h", "Left": ui.ViewChange <- NewMainMenu() case "Enter", "l", "Right": switch management.list.Index() { case 0: user, _ := user.Current() ui.ViewChange <- NewUserPage(user.Username, true) case 5: ui.ViewChange <- NewDelete() case 6: management.Confirmation(state, purgeFeels, "feels purged") case 7: management.Confirmation(state, wipeAccount, "feels account wiped") } } processed = true } management.Draw(state) return } func (management *Management) Draw(state *ui.State) { win := state.Window() win.New(win.Width/2-10, win.Height/2-8, 20, 5).Print(vaxis.Segment{Text: management.title}) management.list.Draw(vaxis.Window{ Vx: win.Vx, Parent: nil, Column: win.Width/2 - 14, Row: win.Height/2 - 2, Width: 28, Height: 10, }) win.New(win.Width/2-15, win.Height/2+7, 30, 1).Print(vaxis.Segment{Text: management.help}) } func purgeFeels() { ttbp.Unpublish() os.RemoveAll(ttbp.PathUserEntries) os.MkdirAll(ttbp.PathUserEntries, 0700) } func wipeAccount() { // TODO: edit users.txt ttbp.Unpublish() os.RemoveAll(ttbp.PathUserFeels) close(ui.Quit) } // TODO: abstract this to our own List type // TODO: figure out a less janky way instead of nesting event channels func (management *Management) Confirmation(state *ui.State, action func(), message string) { management.Draw(state) win := state.Window() win.New(win.Width/2-14, win.Height/2-2+management.list.Index(), 28, 1).Print(vaxis.Segment{ Text: " are you sure? ", Style: vaxis.Style{ Foreground: vaxis.IndexColor(1), Attribute: vaxis.AttrReverse, }, }) state.Render() loop: for ev := range state.Events() { switch ev.(type) { case vaxis.Resize, vaxis.Redraw: management.Draw(state) win.New(win.Width/2-14, win.Height/2-2+management.list.Index(), 28, 1).Print(vaxis.Segment{ Text: " are you sure? ", Style: vaxis.Style{ Foreground: vaxis.IndexColor(1), Attribute: vaxis.AttrReverse, }, }) state.Render() case vaxis.Key: switch ev.(vaxis.Key).String() { case "Enter", "l", "Right": action() management.Draw(state) win.New(win.Width/2-14, win.Height/2-2+management.list.Index(), 28, 1).Print(vaxis.Segment{ Text: fmt.Sprintf(" %-26s", message), Style: vaxis.Style{ Foreground: vaxis.IndexColor(1), Attribute: vaxis.AttrReverse, }, }) state.Render() for ev := range state.Events() { switch ev.(type) { case vaxis.Resize, vaxis.Redraw: management.Draw(state) win.New(win.Width/2-14, win.Height/2-2+management.list.Index(), 28, 1).Print(vaxis.Segment{ Text: fmt.Sprintf(" %26s", message), Style: vaxis.Style{ Foreground: vaxis.IndexColor(1), Attribute: vaxis.AttrReverse, }, }) state.Render() case vaxis.Key: if ev.(vaxis.Key).EventType == vaxis.EventPress { break loop } } } } break loop } } }