Delete records and stuff
This commit is contained in:
@@ -25,6 +25,7 @@ import (
|
||||
"fmt"
|
||||
"log/slog"
|
||||
"net/url"
|
||||
"slices"
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
@@ -76,6 +77,11 @@ func (s *ScreenHome) Init(a *App) {
|
||||
s.style = a.style
|
||||
|
||||
s.alert = w.NewAlert("expds.alert", s.style)
|
||||
s.alert.SetOkPressed(func() bool {
|
||||
s.alert.SetVisible(false)
|
||||
return true
|
||||
})
|
||||
s.alert.SetCancelPressed(nil)
|
||||
|
||||
s.openPdsEntry = w.NewField("home.openpds.field", s.style)
|
||||
s.openPdsEntry.SetLabel("ID")
|
||||
@@ -131,6 +137,7 @@ func (s *ScreenHome) Init(a *App) {
|
||||
}),
|
||||
)
|
||||
s.jsonContent.SetKeyMap(km)
|
||||
s.jsonContent.SetVimMode(viper.GetBool(data.KeyVimMode))
|
||||
s.jsonContent.SetBorder(
|
||||
[]rune{'─', '┐', '│', '┘', '─', '─', ' ', '─', '├', '─', '┤', '┬', '│', '┴', '┼'},
|
||||
)
|
||||
@@ -158,17 +165,16 @@ func (s *ScreenHome) GetName() string { return "home" }
|
||||
func (s *ScreenHome) HandleResize(ev *tcell.EventResize) {
|
||||
s.w, s.h = ev.Size()
|
||||
s.menuLayout.HandleResize(w.Coord{X: s.w, Y: s.h - 1}.ResizeEvent())
|
||||
s.alert.HandleResize(ev)
|
||||
s.alert.HandleResize(w.Coord{X: s.w / 2, Y: s.h / 2}.ResizeEvent())
|
||||
s.alert.SetPos(w.Coord{X: s.w / 4, Y: s.h / 4})
|
||||
|
||||
s.status.SetPos(w.Coord{X: 0, Y: s.h - 1})
|
||||
s.status.HandleResize(w.Coord{X: s.w, Y: 1}.ResizeEvent())
|
||||
}
|
||||
|
||||
func (s *ScreenHome) HandleKey(ev *tcell.EventKey) bool {
|
||||
if s.showAlert {
|
||||
handled := s.alert.HandleKey(ev)
|
||||
s.alert.SetMessage(fmt.Sprintf("Alert Handled? %v -> %s", handled, ev.Name()))
|
||||
return handled
|
||||
if s.alert.Visible() {
|
||||
return s.alert.HandleKey(ev)
|
||||
}
|
||||
if ev.Key() == tcell.KeyF12 {
|
||||
s.toggleCli()
|
||||
@@ -192,7 +198,14 @@ func (s *ScreenHome) HandleKey(ev *tcell.EventKey) bool {
|
||||
}
|
||||
return s.openPdsEntry.HandleKey(ev)
|
||||
}
|
||||
|
||||
switch ev.Key() {
|
||||
case tcell.KeyCtrlO:
|
||||
return s.menuOpenPds()
|
||||
case tcell.KeyCtrlD:
|
||||
return s.deleteCurrentRecord()
|
||||
case tcell.KeyCtrlR:
|
||||
return s.menuRefreshPds()
|
||||
}
|
||||
return s.menuLayout.HandleKey(ev)
|
||||
}
|
||||
func (s *ScreenHome) HandleTime(ev *tcell.EventTime) {
|
||||
@@ -201,6 +214,10 @@ func (s *ScreenHome) HandleTime(ev *tcell.EventTime) {
|
||||
s.status.HandleTime(ev)
|
||||
}
|
||||
func (s *ScreenHome) Draw() {
|
||||
if s.alert.Visible() {
|
||||
s.a.DrawWidget(s.alert)
|
||||
return
|
||||
}
|
||||
if s.doOpen {
|
||||
s.menuLayout.SetStyle(s.style.Foreground(tcell.ColorGray))
|
||||
}
|
||||
@@ -208,6 +225,8 @@ func (s *ScreenHome) Draw() {
|
||||
m := s.menuLayout.Menu()
|
||||
s.a.DrawWidget(s.menuLayout)
|
||||
if s.doOpen && !m.Active() {
|
||||
x, y := s.pdsListing.GetX(), s.pdsListing.GetY()
|
||||
s.a.DrawText(x+2, y, strings.Repeat(" ", len(s.pdsListing.Title())), s.style)
|
||||
s.a.DrawWidget(s.openPdsEntry)
|
||||
}
|
||||
|
||||
@@ -219,6 +238,10 @@ func (s *ScreenHome) Draw() {
|
||||
}
|
||||
func (s *ScreenHome) Exit() error { return nil }
|
||||
func (s *ScreenHome) Log(t string, a ...any) {
|
||||
if strings.Contains(fmt.Sprintf(t, a...), "auth server request failed") {
|
||||
// This error happens even on successfully creating an oAuth request? Maybe it's just me
|
||||
return
|
||||
}
|
||||
s.cli.Log(t, a...)
|
||||
s.showCli()
|
||||
}
|
||||
@@ -237,39 +260,13 @@ func (s *ScreenHome) initMenu() {
|
||||
inferRecNm := fmt.Sprintf("%s Infer Record Names", wrk)
|
||||
s.menuLayout.AddMenuItems(
|
||||
s.menuLayout.CreateMenuItem("file", "File", nil, 'f',
|
||||
s.menuLayout.CreateMenuItem("file.openpds", "Open PDS", func() bool {
|
||||
s.menuLayout.ToggleMenu()
|
||||
s.doOpen = true
|
||||
s.pdsListing.SetTitle(strings.Repeat(" ", 30))
|
||||
return true
|
||||
}, 'o'),
|
||||
s.menuLayout.CreateMenuItem("file.reloadpds", "Reload PDS", func() bool {
|
||||
s.menuLayout.ToggleMenu()
|
||||
if s.activePds == nil {
|
||||
return false
|
||||
}
|
||||
return s.cliGetPds("getpds", s.activePds.AtId.String())
|
||||
}, 'r'),
|
||||
s.menuLayout.CreateMenuItem("file.exit", "Exit", func() bool {
|
||||
s.a.Exit()
|
||||
return true
|
||||
}, 'x'),
|
||||
s.menuLayout.CreateMenuItem("file.openpds", "Open PDS", s.menuOpenPds, 'o'),
|
||||
s.menuLayout.CreateMenuItem("file.reloadpds", "Reload PDS", s.menuRefreshPds, 'r'),
|
||||
s.menuLayout.CreateMenuItem("file.exit", "Exit", s.menuExit, 'x'),
|
||||
),
|
||||
s.menuLayout.CreateMenuItem("settings", "Settings", nil, 's',
|
||||
s.menuLayout.CreateMenuItem("settings.vimmode", vimText, func() bool {
|
||||
s.menuLayout.ToggleMenu()
|
||||
viper.Set(data.KeyVimMode, !viper.GetBool(data.KeyVimMode))
|
||||
viper.WriteConfig()
|
||||
s.update()
|
||||
return true
|
||||
}, 'v'),
|
||||
s.menuLayout.CreateMenuItem("settings.inferrecnm", inferRecNm, func() bool {
|
||||
s.menuLayout.ToggleMenu()
|
||||
viper.Set(data.KeyRecNmInfer, !viper.GetBool(data.KeyRecNmInfer))
|
||||
viper.WriteConfig()
|
||||
s.update()
|
||||
return true
|
||||
}, 'r'),
|
||||
s.menuLayout.CreateMenuItem("settings.vimmode", vimText, s.menuVimMode, 'v'),
|
||||
s.menuLayout.CreateMenuItem("settings.inferrecnm", inferRecNm, s.menuInferRecNm, 'r'),
|
||||
),
|
||||
)
|
||||
}
|
||||
@@ -337,41 +334,13 @@ func (s *ScreenHome) showCli() {
|
||||
}
|
||||
|
||||
func (s *ScreenHome) cliGetPds(args ...string) bool {
|
||||
s.isLoading = true
|
||||
if len(args) < 1 {
|
||||
s.Log("No id given.")
|
||||
s.Log("Usage: 'getpds <atproto id>'")
|
||||
s.isLoading = false
|
||||
return true
|
||||
}
|
||||
go func() {
|
||||
defer func() { s.isLoading = false }()
|
||||
var pds *models.Pds
|
||||
var err error
|
||||
if s.activePds != nil && string(s.activePds.AtId) == args[1] {
|
||||
pds, err = s.r.ReloadPds(args[1])
|
||||
} else {
|
||||
pds, err = s.r.GetPDS(args[1])
|
||||
}
|
||||
if err != nil {
|
||||
s.Log(err.Error())
|
||||
return
|
||||
} else if pds == nil {
|
||||
s.Log("PDS (%s) Not Found.", args[1])
|
||||
return
|
||||
}
|
||||
s.doOpen = false
|
||||
slog.Default().Debug(fmt.Sprintf("Retrieved: %s (%s) at %s", pds.AtId, pds.Did, time.Now().Format(time.RFC3339)))
|
||||
s.activePds = pds
|
||||
s.updatePdsListing()
|
||||
n, err := s.pdsListing.GetActiveNode()
|
||||
if err == nil && n != nil {
|
||||
s.changePdsList(n)
|
||||
}
|
||||
|
||||
s.layout.ActivateWidget(s.columns)
|
||||
s.columns.ActivateWidget(s.pdsListing)
|
||||
}()
|
||||
s.getPds(args[1])
|
||||
return true
|
||||
}
|
||||
|
||||
@@ -383,24 +352,32 @@ func (s *ScreenHome) cliAuthPds(args ...string) bool {
|
||||
s.isLoading = true
|
||||
go func() {
|
||||
defer func() { s.isLoading = false }()
|
||||
atid := s.activePds.AtId.String()
|
||||
callbackRes := make(chan url.Values, 1)
|
||||
listenPort, err := s.r.Auth.ListenForCallback(callbackRes)
|
||||
if err != nil {
|
||||
s.Log("Error Instantiating HTTP Server for Callback: %w", err)
|
||||
return
|
||||
// Check if we already have authentication.
|
||||
if !s.r.Auth.HasAuth(s.activePds.Did) {
|
||||
atid := s.activePds.AtId.String()
|
||||
callbackRes := make(chan url.Values, 1)
|
||||
listenPort, err := s.r.Auth.ListenForCallback(callbackRes)
|
||||
if err != nil {
|
||||
s.Log("Error Instantiating HTTP Server for Callback: %w", err)
|
||||
return
|
||||
}
|
||||
s.Log("Listening on %d", listenPort)
|
||||
_, err = s.r.Auth.StartAuthFlow(listenPort, atid, callbackRes)
|
||||
if err != nil {
|
||||
s.Log("Error starting auth flow: %w", err)
|
||||
} else {
|
||||
s.alert.SetTitle("Authentication Started")
|
||||
s.alert.SetMessage(fmt.Sprintf("OAuth Process Started.\nIf a browser window didn't open, you can open this URL manually:\nhttp://localhost:%d/auth\nThis url will redirect to the PDS OAuth Page.", listenPort))
|
||||
s.alert.SetVisible(true)
|
||||
s.alert.SetActive(true)
|
||||
go func() {
|
||||
for s.isLoading {
|
||||
time.Sleep(100)
|
||||
}
|
||||
s.alert.SetVisible(false)
|
||||
}()
|
||||
}
|
||||
}
|
||||
s.Log("Listening on %d", listenPort)
|
||||
var authUrl string
|
||||
authUrl, err = s.r.Auth.StartAuthFlow(listenPort, atid, callbackRes)
|
||||
if err != nil {
|
||||
s.Log("Error starting auth flow: %w", err)
|
||||
}
|
||||
s.alert.SetTitle("Authentication Started")
|
||||
s.alert.SetMessage(fmt.Sprintf("OAuth Process Started.\nIf a browser window didn't open, you can open this URL manually:\n%s", authUrl))
|
||||
s.alert.SetVisible(true)
|
||||
s.alert.SetActive(true)
|
||||
s.showAlert = true
|
||||
}()
|
||||
return true
|
||||
}
|
||||
@@ -518,6 +495,130 @@ func (s *ScreenHome) updateJsonView(tn *wd.TreeNode) bool {
|
||||
} else {
|
||||
s.jsonContent.SetValue(s.activePds.Records[tn.Value()])
|
||||
}
|
||||
|
||||
return true
|
||||
}
|
||||
|
||||
func (s *ScreenHome) menuOpenPds() bool {
|
||||
s.menuLayout.HideMenu()
|
||||
s.doOpen = true
|
||||
s.pdsListing.SetTitle(strings.Repeat(" ", 30))
|
||||
return true
|
||||
}
|
||||
|
||||
func (s *ScreenHome) menuRefreshPds() bool {
|
||||
s.menuLayout.HideMenu()
|
||||
if s.activePds == nil {
|
||||
return false
|
||||
}
|
||||
|
||||
// We want to persist 'opened' nodes
|
||||
var opened []string
|
||||
for _, n := range s.pdsListing.GetNodeList() {
|
||||
if n.IsExpanded() {
|
||||
opened = append(opened, n.Value())
|
||||
s.Log("Opened: %s", n.Value())
|
||||
}
|
||||
}
|
||||
s.getPds(s.activePds.AtId.String())
|
||||
for _, n := range s.pdsListing.GetNodeList() {
|
||||
s.Log("Testing: %s", n.Value())
|
||||
if slices.Contains(opened, n.Value()) {
|
||||
s.Log("-> Is Opened")
|
||||
n.Expand()
|
||||
}
|
||||
}
|
||||
return true
|
||||
}
|
||||
|
||||
func (s *ScreenHome) menuExit() bool {
|
||||
s.a.Exit()
|
||||
return true
|
||||
}
|
||||
|
||||
func (s *ScreenHome) menuVimMode() bool {
|
||||
s.menuLayout.HideMenu()
|
||||
viper.Set(data.KeyVimMode, !viper.GetBool(data.KeyVimMode))
|
||||
viper.WriteConfig()
|
||||
s.update()
|
||||
return true
|
||||
}
|
||||
|
||||
func (s *ScreenHome) menuInferRecNm() bool {
|
||||
s.menuLayout.HideMenu()
|
||||
viper.Set(data.KeyRecNmInfer, !viper.GetBool(data.KeyRecNmInfer))
|
||||
viper.WriteConfig()
|
||||
s.update()
|
||||
return true
|
||||
}
|
||||
|
||||
func (s *ScreenHome) getPds(atId string) {
|
||||
s.isLoading = true
|
||||
go func() {
|
||||
defer func() { s.isLoading = false }()
|
||||
var pds *models.Pds
|
||||
var err error
|
||||
if s.activePds != nil && string(s.activePds.AtId) == atId {
|
||||
pds, err = s.r.ReloadPds(atId)
|
||||
} else {
|
||||
pds, err = s.r.GetPDS(atId)
|
||||
}
|
||||
if err != nil {
|
||||
s.Log(err.Error())
|
||||
return
|
||||
} else if pds == nil {
|
||||
s.Log("PDS (%s) Not Found.", atId)
|
||||
return
|
||||
}
|
||||
s.doOpen = false
|
||||
slog.Default().Debug(fmt.Sprintf("Retrieved: %s (%s) at %s", pds.AtId, pds.Did, time.Now().Format(time.RFC3339)))
|
||||
s.activePds = pds
|
||||
s.updatePdsListing()
|
||||
n, err := s.pdsListing.GetActiveNode()
|
||||
if err == nil && n != nil {
|
||||
s.changePdsList(n)
|
||||
}
|
||||
|
||||
s.layout.ActivateWidget(s.columns)
|
||||
s.columns.ActivateWidget(s.pdsListing)
|
||||
}()
|
||||
}
|
||||
|
||||
func (s *ScreenHome) deleteCurrentRecord() bool {
|
||||
tn, err := s.pdsListing.GetActiveNode()
|
||||
if err != nil {
|
||||
s.Log("error getting active node")
|
||||
return false
|
||||
}
|
||||
tnPath := tn.GetValuePath()
|
||||
if len(tnPath) != 2 {
|
||||
return false
|
||||
}
|
||||
//tnLabelPath := tn.GetLabelPath()
|
||||
nsid, err := syntax.ParseNSID(tnPath[0])
|
||||
if err != nil {
|
||||
s.Log("error parsing NSID from %s: %w", tnPath[0], err)
|
||||
return false
|
||||
}
|
||||
rkey := tnPath[1]
|
||||
if err := s.r.DeleteRecord(s.activePds.Did, nsid, rkey); err != nil {
|
||||
s.Log("error deleting record: %w", err)
|
||||
}
|
||||
/*
|
||||
s.alert.SetTitle("Confirm Deletion")
|
||||
s.alert.SetMessage(fmt.Sprintf("Are you sure you want to delete this record?\n%s %s\nThis cannot be undone.", tnLabelPath[0], tnLabelPath[1]))
|
||||
s.alert.SetVisible(true)
|
||||
s.alert.SetActive(true)
|
||||
s.alert.SetOkPressed(func() bool {
|
||||
s.r.DeleteRecord(s.activePds.Did, nsid, rkey)
|
||||
s.alert.SetVisible(false)
|
||||
s.alert.SetActive(false)
|
||||
return true
|
||||
})
|
||||
s.alert.SetCancelPressed(func() bool {
|
||||
s.alert.SetVisible(false)
|
||||
s.alert.SetActive(false)
|
||||
return true
|
||||
})
|
||||
*/
|
||||
return true
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user