mirror of
https://github.com/anotherhadi/ilovetui.git
synced 2026-08-21 12:05:49 +02:00
21b574eb6f
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>
72 lines
1.2 KiB
Go
72 lines
1.2 KiB
Go
package notification
|
|
|
|
import (
|
|
"time"
|
|
|
|
tea "charm.land/bubbletea/v2"
|
|
)
|
|
|
|
type Kind int
|
|
|
|
const (
|
|
Info Kind = iota
|
|
Success
|
|
Warning
|
|
Error
|
|
)
|
|
|
|
const DefaultDuration = 3 * time.Second
|
|
|
|
type Toast struct {
|
|
ID string
|
|
Title string
|
|
Message string
|
|
Kind Kind
|
|
|
|
Duration time.Duration
|
|
|
|
Style *KindStyle
|
|
}
|
|
|
|
type ToastOption func(*Toast)
|
|
|
|
func WithID(id string) ToastOption {
|
|
return func(t *Toast) { t.ID = id }
|
|
}
|
|
|
|
func WithDuration(d time.Duration) ToastOption {
|
|
return func(t *Toast) { t.Duration = d }
|
|
}
|
|
|
|
func WithToastStyle(s KindStyle) ToastOption {
|
|
return func(t *Toast) { t.Style = &s }
|
|
}
|
|
|
|
func newToast(title, message string, kind Kind, opts ...ToastOption) Toast {
|
|
t := Toast{
|
|
Title: title,
|
|
Message: message,
|
|
Kind: kind,
|
|
Duration: DefaultDuration,
|
|
}
|
|
for _, opt := range opts {
|
|
opt(&t)
|
|
}
|
|
return t
|
|
}
|
|
|
|
type ShowMsg struct{ Toast Toast }
|
|
|
|
func Show(title, message string, kind Kind, opts ...ToastOption) tea.Cmd {
|
|
t := newToast(title, message, kind, opts...)
|
|
return func() tea.Msg { return ShowMsg{Toast: t} }
|
|
}
|
|
|
|
type DismissMsg struct{ ID string }
|
|
|
|
func Dismiss(id string) tea.Cmd {
|
|
return func() tea.Msg { return DismissMsg{ID: id} }
|
|
}
|
|
|
|
type expireMsg struct{ id string }
|