From 9189df2f4a23c7ca5f191f6e36019e96f764f232 Mon Sep 17 00:00:00 2001 From: crumbyte Date: Wed, 6 May 2026 01:39:45 +0300 Subject: [PATCH 1/3] Fix application crash on showing popup error message. Signed-off-by: crumbyte --- render/delete_dialog_model.go | 20 ++++++++++++-------- render/dir_model.go | 2 +- render/popup.go | 9 ++++----- render/popup_test.go | 10 +++++----- 4 files changed, 22 insertions(+), 19 deletions(-) diff --git a/render/delete_dialog_model.go b/render/delete_dialog_model.go index 5f4015e..3d1267d 100644 --- a/render/delete_dialog_model.go +++ b/render/delete_dialog_model.go @@ -10,6 +10,10 @@ import ( "charm.land/lipgloss/v2" ) +type DeleteHandler interface { + Delete(entry *structure.Entry) error +} + type DeleteChoice int const ( @@ -27,16 +31,16 @@ type EntryDeleted struct { } type DeleteDialogModel struct { - nav *Navigation - toDelete []*structure.Entry - choice DeleteChoice + deleteHandler DeleteHandler + toDelete []*structure.Entry + choice DeleteChoice } -func NewDeleteDialogModel(nav *Navigation, toDelete []*structure.Entry) *DeleteDialogModel { +func NewDeleteDialogModel(dh DeleteHandler, toDelete []*structure.Entry) *DeleteDialogModel { return &DeleteDialogModel{ - choice: CancelChoice, - toDelete: toDelete, - nav: nav, + deleteHandler: dh, + choice: CancelChoice, + toDelete: toDelete, } } @@ -59,7 +63,7 @@ func (ddm *DeleteDialogModel) Update(msg tea.Msg) (tea.Model, tea.Cmd) { if ddm.choice == ConfirmChoice { for _, entry := range ddm.toDelete { - err = ddm.nav.Delete(entry) + err = ddm.deleteHandler.Delete(entry) } deleted = true diff --git a/render/dir_model.go b/render/dir_model.go index a3f9088..7e0ea31 100644 --- a/render/dir_model.go +++ b/render/dir_model.go @@ -156,7 +156,7 @@ func NewDirModel(nav *Navigation, filters ...filter.EntryFilter) *DirModel { func() { go teaProg.Send(EnqueueRefresh{Mode: CMD}) }, ), errPopup: NewPopupModel( - ErrorTitle, time.Second*10, teaProg, PopupDefaultErrorStyle(), + ErrorTitle, time.Second*10, PopupDefaultErrorStyle(), ), summaryInfo: &summaryInfo{}, sortState: SortState{Key: structure.SortSize, Desc: true}, diff --git a/render/popup.go b/render/popup.go index d7367d3..6ffc2de 100644 --- a/render/popup.go +++ b/render/popup.go @@ -46,7 +46,6 @@ type PopupModel struct { duration time.Duration ttl time.Time styles *PopupStyles - program *tea.Program title string queueLimit int hideCountdown bool @@ -56,7 +55,7 @@ type PopupModel struct { // NewPopupModel creates a new *PopupModel instance with the provided title and // visibility duration. The *PopupStyles are optional, and if the value is empty, // the DefaultPopupStyle will be used. -func NewPopupModel(title string, d time.Duration, p *tea.Program, ps *PopupStyles) *PopupModel { +func NewPopupModel(title string, d time.Duration, ps *PopupStyles) *PopupModel { if len(title) == 0 { title = InfoTitle } @@ -69,7 +68,6 @@ func NewPopupModel(title string, d time.Duration, p *tea.Program, ps *PopupStyle title: title, duration: d, styles: ps, - program: p, messageQueue: make([]string, 0, queueLimit), queueLimit: queueLimit, } @@ -191,6 +189,7 @@ func (pm *PopupModel) Show(message string) { pm.messageQueue = append(pm.messageQueue, message) } + // TODO: concurrent? defer pm.condTickCmd() pm.visible, pm.ttl = true, time.Now().Add(pm.duration) @@ -224,7 +223,7 @@ func (pm *PopupModel) nextMessage() (string, bool) { } func (pm *PopupModel) condTickCmd() { - if pm.program == nil || !pm.visible { + if teaProg == nil || !pm.visible { return } @@ -233,7 +232,7 @@ func (pm *PopupModel) condTickCmd() { defer ticker.Stop() for range ticker.C { - pm.program.Send(PopupMsgTick{}) + teaProg.Send(PopupMsgTick{}) pm.Update(nil) diff --git a/render/popup_test.go b/render/popup_test.go index 3fbb579..d5e2f34 100644 --- a/render/popup_test.go +++ b/render/popup_test.go @@ -11,7 +11,7 @@ import ( ) func TestPopupModel_Show_AddsMessage(t *testing.T) { - pm := render.NewPopupModel("Test", time.Second, nil, nil) + pm := render.NewPopupModel("Test", time.Second, nil) pm.Show("msg1") @@ -20,7 +20,7 @@ func TestPopupModel_Show_AddsMessage(t *testing.T) { } func TestPopupModel_Show_ReplacesWhenFull(t *testing.T) { - pm := render.NewPopupModel("Test", time.Second, nil, nil) + pm := render.NewPopupModel("Test", time.Second, nil) for i := 1; i <= 5; i++ { pm.Show("msg" + string(rune('0'+i))) @@ -35,7 +35,7 @@ func TestPopupModel_Show_ReplacesWhenFull(t *testing.T) { } func TestPopupModel_Update_RemovesMessagesOnTTL(t *testing.T) { - pm := render.NewPopupModel("Test", time.Millisecond*50, nil, nil) + pm := render.NewPopupModel("Test", time.Millisecond*50, nil) pm.Show("msg1") pm.Show("msg2") @@ -51,7 +51,7 @@ func TestPopupModel_Update_RemovesMessagesOnTTL(t *testing.T) { } func TestPopupModel_View_ReturnsEmptyWhenNotVisible(t *testing.T) { - pm := render.NewPopupModel("Test", time.Second, nil, nil) + pm := render.NewPopupModel("Test", time.Second, nil) assert.Empty(t, pm.View()) @@ -72,7 +72,7 @@ func TestPopupModel_View_ShowsCountdown(t *testing.T) { lipgloss.NewStyle(), ) - pm := render.NewPopupModel("Test", time.Second, nil, style) + pm := render.NewPopupModel("Test", time.Second, style) pm.Show("hello") view := pm.View() From 143da6250a491101a226a63ed6a299ebcd27f866 Mon Sep 17 00:00:00 2001 From: crumbyte Date: Wed, 6 May 2026 02:42:09 +0300 Subject: [PATCH 2/3] Fix application crash on showing popup error message. Signed-off-by: crumbyte --- render/popup.go | 1 - render/popup_test.go | 1 + render/render.go | 2 +- 3 files changed, 2 insertions(+), 2 deletions(-) diff --git a/render/popup.go b/render/popup.go index 6ffc2de..55a741f 100644 --- a/render/popup.go +++ b/render/popup.go @@ -189,7 +189,6 @@ func (pm *PopupModel) Show(message string) { pm.messageQueue = append(pm.messageQueue, message) } - // TODO: concurrent? defer pm.condTickCmd() pm.visible, pm.ttl = true, time.Now().Add(pm.duration) diff --git a/render/popup_test.go b/render/popup_test.go index d5e2f34..39a3734 100644 --- a/render/popup_test.go +++ b/render/popup_test.go @@ -10,6 +10,7 @@ import ( "github.com/stretchr/testify/assert" ) + func TestPopupModel_Show_AddsMessage(t *testing.T) { pm := render.NewPopupModel("Test", time.Second, nil) diff --git a/render/render.go b/render/render.go index dfb64ed..21dafa5 100644 --- a/render/render.go +++ b/render/render.go @@ -26,7 +26,7 @@ type ( EnqueueRefresh struct{ Mode Mode } ) -var teaProg = new(tea.Program) +var teaProg *tea.Program type ViewModel struct { driveModel *DriveModel From 7fda475c749951fba891de0b06e8e6593e8d59ba Mon Sep 17 00:00:00 2001 From: crumbyte Date: Wed, 6 May 2026 02:47:40 +0300 Subject: [PATCH 3/3] Fix application crash on showing popup error message. Signed-off-by: crumbyte --- render/popup_test.go | 1 - 1 file changed, 1 deletion(-) diff --git a/render/popup_test.go b/render/popup_test.go index 39a3734..d5e2f34 100644 --- a/render/popup_test.go +++ b/render/popup_test.go @@ -10,7 +10,6 @@ import ( "github.com/stretchr/testify/assert" ) - func TestPopupModel_Show_AddsMessage(t *testing.T) { pm := render.NewPopupModel("Test", time.Second, nil)