@@ -50,6 +50,8 @@ func (m *Model) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
5050 return m .handleObjectVersionsMsg (msg )
5151 case CreateMsg :
5252 return m .handleCreateMsg (msg )
53+ case DeleteMsg :
54+ return m .handleDeleteMsg (msg )
5355 case DebouncePreviewMsg :
5456 if msg .CursorVersion == m .cursorVersion {
5557 return m , msg .FetchCmd
@@ -652,6 +654,10 @@ func (m *Model) handleKeyMsg(msg tea.KeyMsg) (tea.Model, tea.Cmd) {
652654 return m .handleDownloadConfirmKey (msg )
653655 }
654656
657+ if m .state == viewDeleteConfirm {
658+ return m .handleDeleteConfirmKey (msg )
659+ }
660+
655661 switch {
656662 case key .Matches (msg , keys .Help ):
657663 m .showHelp = true
@@ -702,6 +708,9 @@ func (m *Model) handleKeyMsg(msg tea.KeyMsg) (tea.Model, tea.Cmd) {
702708 case key .Matches (msg , keys .Create ):
703709 return m .handleCreateKey ()
704710
711+ case key .Matches (msg , keys .Delete ):
712+ return m .handleDeleteKey ()
713+
705714 case key .Matches (msg , keys .Select ):
706715 return m .handleSelectKey ()
707716
@@ -1642,3 +1651,87 @@ func (m *Model) handleCreateMsg(msg CreateMsg) (tea.Model, tea.Cmd) {
16421651 nm , refreshCmd := m .handleRefreshKey (true )
16431652 return nm , tea .Batch (statusCmd , refreshCmd )
16441653}
1654+
1655+ func (m * Model ) handleDeleteKey () (tea.Model , tea.Cmd ) {
1656+ switch m .state {
1657+ case viewBuckets :
1658+ filtered := m .filteredBuckets ()
1659+ if m .cursor < 0 || m .cursor >= len (filtered ) {
1660+ return m , nil
1661+ }
1662+ item := filtered [m .cursor ]
1663+ if item .IsProject {
1664+ return m , nil // Cannot delete projects
1665+ }
1666+ m .pendingDeleteBucket = item .BucketName
1667+ m .pendingDeleteIsBucket = true
1668+ m .state = viewDeleteConfirm
1669+ return m , nil
1670+
1671+ case viewObjects :
1672+ if len (m .selected ) > 1 {
1673+ return m , m .AddMessage (LevelError , "Multi-delete not supported yet" , 0 , "" )
1674+ }
1675+
1676+ currentPrefixes , currentObjects , _ := m .filteredObjects ()
1677+ if m .cursor < 0 || m .cursor >= len (currentPrefixes )+ len (currentObjects ) {
1678+ return m , nil
1679+ }
1680+
1681+ m .pendingDeleteBucket = m .currentBucket
1682+ m .pendingDeleteIsBucket = false
1683+ if m .cursor < len (currentPrefixes ) {
1684+ m .pendingDeletePrefix = currentPrefixes [m .cursor ].Name
1685+ m .pendingDeleteObject = ""
1686+ } else {
1687+ m .pendingDeleteObject = currentObjects [m .cursor - len (currentPrefixes )].Name
1688+ m .pendingDeletePrefix = ""
1689+ }
1690+ m .state = viewDeleteConfirm
1691+ return m , nil
1692+ }
1693+ return m , nil
1694+ }
1695+
1696+ func (m * Model ) handleDeleteConfirmKey (msg tea.KeyMsg ) (tea.Model , tea.Cmd ) {
1697+ switch msg .String () {
1698+ case "y" , "Y" :
1699+ var cmd tea.Cmd
1700+ if m .pendingDeleteIsBucket {
1701+ cmd = m .deleteBucket (m .pendingDeleteBucket )
1702+ } else if m .pendingDeletePrefix != "" {
1703+ cmd = m .deletePrefix (m .pendingDeleteBucket , m .pendingDeletePrefix )
1704+ } else {
1705+ cmd = m .deleteObject (m .pendingDeleteBucket , m .pendingDeleteObject )
1706+ }
1707+ m .state = viewObjects
1708+ if m .pendingDeleteIsBucket {
1709+ m .state = viewBuckets
1710+ }
1711+ m .pendingDeleteBucket = ""
1712+ m .pendingDeleteObject = ""
1713+ m .pendingDeletePrefix = ""
1714+ return m , cmd
1715+ default :
1716+ if m .pendingDeleteIsBucket {
1717+ m .state = viewBuckets
1718+ } else {
1719+ m .state = viewObjects
1720+ }
1721+ m .pendingDeleteBucket = ""
1722+ m .pendingDeleteObject = ""
1723+ m .pendingDeletePrefix = ""
1724+ return m , nil
1725+ }
1726+ }
1727+
1728+ func (m * Model ) handleDeleteMsg (msg DeleteMsg ) (tea.Model , tea.Cmd ) {
1729+ if msg .Err != nil {
1730+ statusCmd := m .AddMessage (LevelError , fmt .Sprintf ("Deletion failed: %v" , msg .Err ), 0 , "" )
1731+ return m , statusCmd
1732+ }
1733+
1734+ statusCmd := m .AddMessage (LevelInfo , fmt .Sprintf ("Deleted %s" , msg .Name ), 0 , "" )
1735+ nm , refreshCmd := m .handleRefreshKey (true )
1736+ return nm , tea .Batch (statusCmd , refreshCmd )
1737+ }
0 commit comments