feat(config): internal/config (load/save atomik + validasi) — wiring bahasa/suara/animasi + doctor baca config
CI / test (push) Successful in 13m3s

This commit is contained in:
oxpoe committed 2026-10-15 13:27:16 +07:00
1 parent 36bc33f904
commit c65d2cb75d
8 files changed
+328 -15

No files matched your search

+25 -5
View File
@@ -11,6 +11,7 @@ import (
"charm.land/lipgloss/v2"
"gitea.oxpoe.qzz.io/oxpoe/tia-love/internal/audio"
"gitea.oxpoe.qzz.io/oxpoe/tia-love/internal/config"
"gitea.oxpoe.qzz.io/oxpoe/tia-love/internal/docker"
"gitea.oxpoe.qzz.io/oxpoe/tia-love/internal/i18n"
"gitea.oxpoe.qzz.io/oxpoe/tia-love/internal/sysinfo"
@@ -64,12 +65,24 @@ type Model struct {
}
func New() Model {
cfg, cfgErr := config.Load()
// shortcut: TIA_LANG = override khusus dev/tes; sumber resmi bahasa
// tetap config (ui.language) — dihapus saat layar Pengaturan jadi.
if l := os.Getenv("TIA_LANG"); l != "" {
cfg.UI.Language = l
}
i18n.SetLang(cfg.UI.Language)
cl, err := docker.New()
host, _ := os.Hostname()
m := Model{
sound: audio.New(audio.Options{Enabled: true, Volume: 70, MuteOnSSH: true}),
sound: audio.New(audio.Options{
Enabled: cfg.UI.SoundEnabled,
Volume: cfg.UI.SoundVolume,
MuteOnSSH: cfg.UI.SoundMuteOnSSH,
}),
tickID: animation.NewID(),
animating: true,
animating: cfg.UI.AnimationEnabled,
toast: components.NewToast(),
view: viewHome,
hostname: host,
@@ -77,6 +90,9 @@ func New() Model {
cl: cl,
loading: true,
}
if cfgErr != nil {
m.toast.Show(i18n.T("toast.configError"), cfgErr.Error())
}
if err != nil {
m.loadErr = err
m.engineErr = err
@@ -86,10 +102,14 @@ func New() Model {
}
func (m Model) Init() tea.Cmd {
if m.cl == nil {
return animation.Next(m.tickID)
var cmds []tea.Cmd
if m.animating {
cmds = append(cmds, animation.Next(m.tickID))
}
return tea.Batch(animation.Next(m.tickID), loadContainers(m.cl), loadInfo(m.cl))
if m.cl != nil {
cmds = append(cmds, loadContainers(m.cl), loadInfo(m.cl))
}
return tea.Batch(cmds...)
}
func loadContainers(cl *docker.Client) tea.Cmd {