diff --git a/README.md b/README.md index 060133d..608525d 100644 --- a/README.md +++ b/README.md @@ -4,13 +4,6 @@ Quick tool to write gemtext posts for my gemlog. => gemini://travisshears.com/gemlog -## Dev - -To run command locally: - -```shell -$ go run . -``` ## Entites diff --git a/actionsList.go b/actionsList.go index a6d068f..430021c 100644 --- a/actionsList.go +++ b/actionsList.go @@ -32,12 +32,9 @@ func (m ActionListPageModel) InitActionListPage() tea.Cmd { return nil } -func (m ActionListPageModel) Update(msg tea.Msg, active bool, ctx *context) (ActionListPageModel, tea.Cmd) { +func (m ActionListPageModel) Update(msg tea.Msg, ctx *context) (ActionListPageModel, tea.Cmd) { switch msg := msg.(type) { case tea.KeyMsg: - if !active { - return m, nil - } switch msg.String() { case "up", "k": if m.cursor > 0 { @@ -47,20 +44,27 @@ func (m ActionListPageModel) Update(msg tea.Msg, active bool, ctx *context) (Act if m.cursor < len(actions)-1 { m.cursor++ } - case "enter", " ", "l": + case "enter", " ": action := actions[m.cursor] switch action { case Write: return m, gemlog.WritePostCMD(ctx.config) - case Read, Delete, Edit: + case Read: switchPageCmd := func() tea.Msg { return SwitchPages{Page: EntryList} } - actionToTakeCmd := func() tea.Msg { - return SelectActionToTake{ActionToTake: action} - } - loadGemLogsCmd := gemlog.LoadGemlogsCMD(ctx.config) - return m, tea.Batch(switchPageCmd, loadGemLogsCmd, actionToTakeCmd) + loadGemLogsCmd := gemlog.LoadGemlogCMD(ctx.config) + return m, tea.Batch(switchPageCmd, loadGemLogsCmd) + // case Edit: + // m.ui.page = EntryList + // m.ui.entryListPage.cursor = 0 + // m.ui.entryListPage.actionToTake = Edit + // return m, gemlog.LoadGemlogCMD(ctx.config) + // case Delete: + // m.ui.page = EntryList + // m.ui.entryListPage.cursor = 0 + // m.ui.entryListPage.actionToTake = Delete + // return m, gemlog.LoadGemlogCMD(m.context.config) } } } diff --git a/bruno/Gemlog/Get Gemlog.bru b/bruno/Gemlog/Get Gemlog.bru deleted file mode 100644 index 019a53b..0000000 --- a/bruno/Gemlog/Get Gemlog.bru +++ /dev/null @@ -1,20 +0,0 @@ -meta { - name: Get Gemlog - type: http - seq: 5 -} - -get { - url: http://eisenhorn:5023/gemlog/d198245cbc0d67891f3d3d6dc301c242 - body: json - auth: basic -} - -auth:basic { - username: gemlog-cli - password: {{pw}} -} - -settings { - encodeUrl: true -} diff --git a/bruno/Gemlog/Update Gemlog.bru b/bruno/Gemlog/Update Gemlog.bru deleted file mode 100644 index 584bcbc..0000000 --- a/bruno/Gemlog/Update Gemlog.bru +++ /dev/null @@ -1,33 +0,0 @@ -meta { - name: Update Gemlog - type: http - seq: 4 -} - -put { - url: http://eisenhorn:5023/gemlog/d198245cbc0d67891f3d3d6dc301c242?rev=2-e997af4bb2b1b18ce224ebcb46d145dc - body: json - auth: basic -} - -params:query { - rev: 2-e997af4bb2b1b18ce224ebcb46d145dc -} - -auth:basic { - username: gemlog-cli - password: {{pw}} -} - -body:json { - { - "title": "Bruno Test Updated", - "slug": "bruno-test", - "date": "2025-09-30T21:04:45.092Z", - "gemtxt": "this is a test\n\nfrom bruno\nwith someupdated data" - } -} - -settings { - encodeUrl: true -} diff --git a/entry.go b/entry.go deleted file mode 100644 index d9f25ad..0000000 --- a/entry.go +++ /dev/null @@ -1,45 +0,0 @@ -package main - -import ( - "gemini_site/gemlog" - - tea "github.com/charmbracelet/bubbletea" -) - -type EntryPageModel struct { - entry gemlog.GemlogEntry -} - -func initialEntryPageModel() EntryPageModel { - return EntryPageModel{} -} - -func (m EntryPageModel) Update(msg tea.Msg, active bool, ctx *context) (EntryPageModel, tea.Cmd) { - switch msg := msg.(type) { - case gemlog.GemLogLoaded: - m.entry = msg.Log - case tea.KeyMsg: - if !active { - return m, nil - } - switch msg.String() { - case "left", "h": - cmd := func() tea.Msg { - return SwitchPages{Page: EntryList} - } - return m, cmd - } - } - - return m, nil - -} - -func (m EntryPageModel) View() string { - s := m.entry.Slug - s += "\n\n" - s += m.entry.Gemtxt - s += "\n\n-------------------------\n" - s += "\n\nPress h or left arrow to go back" - return s -} diff --git a/entryList.go b/entryList.go index b70bc5f..af9e8c3 100644 --- a/entryList.go +++ b/entryList.go @@ -13,26 +13,23 @@ type EntryListPageModel struct { cursor int } -type SelectActionToTake struct{ ActionToTake Action } - -func initialEntryListPageModel() EntryListPageModel { +func InitialEntryListPageModel() EntryListPageModel { return EntryListPageModel{ cursor: 0, actionToTake: Read, } } -func (m EntryListPageModel) Update(msg tea.Msg, active bool, ctx *context) (EntryListPageModel, tea.Cmd) { +func (m EntryListPageModel) InitEntryListPage() tea.Cmd { + return nil +} + +func (m EntryListPageModel) Update(msg tea.Msg, ctx *context) (EntryListPageModel, tea.Cmd) { switch msg := msg.(type) { - case SelectActionToTake: - m.actionToTake = msg.ActionToTake case gemlog.GemLogsLoaded: m.entries = msg.Logs return m, nil case tea.KeyMsg: - if !active { - return m, nil - } switch msg.String() { case "up", "k": if m.cursor > 0 { @@ -42,31 +39,28 @@ func (m EntryListPageModel) Update(msg tea.Msg, active bool, ctx *context) (Entr if m.cursor < len(actions)-1 { m.cursor++ } - case "left", "h": - cmd := func() tea.Msg { - return SwitchPages{Page: ActionList} - } - return m, cmd + // case "enter", " ": - case "enter", " ", "l": - id := m.entries[m.cursor].ID - rev := m.entries[m.cursor].Rev - switch m.actionToTake { - // TODO: handle edit - case Read: - loadCmd := gemlog.LoadGemlogCMD(ctx.config, id) - navCmd := func() tea.Msg { - return SwitchPages{Page: Entry} - } - return m, tea.Sequence(loadCmd, navCmd) - case Delete: - delCmd := gemlog.DeleteGemlogCMD(ctx.config, id, rev) - loadCmd := gemlog.LoadGemlogsCMD(ctx.config) - navCmd := func() tea.Msg { - return SwitchPages{Page: ActionList} - } - return m, tea.Sequence(delCmd, loadCmd, navCmd) - } + // action := actions[m.cursor] + // switch action { + // case Write: + // return m, gemlog.WritePostCMD(ctx.config) + // case Read: + // m.ui.page = EntryList + // m.ui.entryListPage.cursor = 0 + // m.ui.entryListPage.actionToTake = Read + // return m, gemlog.LoadGemlogCMD(ctx.config) + // case Edit: + // m.ui.page = EntryList + // m.ui.entryListPage.cursor = 0 + // m.ui.entryListPage.actionToTake = Edit + // return m, gemlog.LoadGemlogCMD(ctx.config) + // case Delete: + // m.ui.page = EntryList + // m.ui.entryListPage.cursor = 0 + // m.ui.entryListPage.actionToTake = Delete + // return m, gemlog.LoadGemlogCMD(m.context.config) + // } } } @@ -82,7 +76,5 @@ func (m EntryListPageModel) View() string { } s += fmt.Sprintf("%s %s : %s\n", cursor, entry.Date, entry.Slug) } - - s += "\n\n Press h or left arrow to go back" return s } diff --git a/gemlog/common.go b/gemlog/common.go index 363215d..e7d44f1 100644 --- a/gemlog/common.go +++ b/gemlog/common.go @@ -3,4 +3,3 @@ package gemlog type Notification string type ErrorMsg struct{ err error } type GemLogsLoaded struct{ Logs []GemlogListEntry } -type GemLogLoaded struct{ Log GemlogEntry } diff --git a/gemlog/core.go b/gemlog/core.go index 4b369c6..4501a97 100644 --- a/gemlog/core.go +++ b/gemlog/core.go @@ -21,7 +21,6 @@ type GemlogListEntry struct { Slug string `json:"slug"` Date time.Time `json:"date"` ID string `json:"id"` - Rev string `json:"rev"` } // NewUUID generates a new UUID v4 using crypto/rand diff --git a/gemlog/db.go b/gemlog/db.go index 356a466..e5f123f 100644 --- a/gemlog/db.go +++ b/gemlog/db.go @@ -51,7 +51,6 @@ func listGemLogs(config *Config) ([]GemlogListEntry, error) { Title string `json:"title"` Slug string `json:"slug"` Date time.Time `json:"date"` - Rev string `json:"rev"` ID string `json:"id"` } `json:"value"` } `json:"rows"` @@ -69,7 +68,6 @@ func listGemLogs(config *Config) ([]GemlogListEntry, error) { Title: row.Value.Title, Slug: row.Value.Slug, Date: row.Value.Date, - Rev: row.Value.Rev, } entries = append(entries, entry) } @@ -78,81 +76,6 @@ func listGemLogs(config *Config) ([]GemlogListEntry, error) { return entries, nil } -func ReadGemlogEntry(config *Config, id string) (GemlogEntry, error) { - url := fmt.Sprintf("%s:%d/gemlog/%s", config.CouchDB.Host, config.CouchDB.Port, id) - req, err := http.NewRequest("GET", url, nil) - if err != nil { - return GemlogEntry{}, fmt.Errorf("failed to create request: %w", err) - } - - req.Header.Add("authorization", genBasicAuthHeader(config.CouchDB.User, config.CouchDB.Password)) - req.Header.Add("content-type", "application/json") - - res, err := http.DefaultClient.Do(req) - if err != nil { - return GemlogEntry{}, fmt.Errorf("failed to send request: %w", err) - } - defer res.Body.Close() - - body, err := io.ReadAll(res.Body) - if err != nil { - return GemlogEntry{}, fmt.Errorf("failed to read response body: %w", err) - } - - if res.StatusCode < 200 || res.StatusCode >= 300 { - return GemlogEntry{}, fmt.Errorf("unexpected status code %d: %s", res.StatusCode, string(body)) - } - - var rawData struct { - // ID int `json:"_id"` - // Rev int `json:"_rev"` - Title string `json:"title"` - GemText string `json:"gemtxt"` - Slug string `json:"slug"` - Date time.Time `json:"date"` - } - - if err := json.Unmarshal(body, &rawData); err != nil { - return GemlogEntry{}, fmt.Errorf("failed to parse response: %w", err) - } - - return GemlogEntry{ - Title: rawData.Title, - Slug: rawData.Slug, - Date: rawData.Date, - Gemtxt: rawData.GemText, - Tags: make([]string, 0), - }, nil -} - -func DeleteGemlogEntry(config *Config, id string, rev string) error { - url := fmt.Sprintf("%s:%d/gemlog/%s?rev=%s", config.CouchDB.Host, config.CouchDB.Port, id, rev) - req, err := http.NewRequest("DELETE", url, nil) - if err != nil { - return fmt.Errorf("failed to create request: %w", err) - } - - req.Header.Add("authorization", genBasicAuthHeader(config.CouchDB.User, config.CouchDB.Password)) - req.Header.Add("content-type", "application/json") - - res, err := http.DefaultClient.Do(req) - if err != nil { - return fmt.Errorf("failed to send request: %w", err) - } - defer res.Body.Close() - - body, err := io.ReadAll(res.Body) - if err != nil { - return fmt.Errorf("failed to read response body: %w", err) - } - - if res.StatusCode < 200 || res.StatusCode >= 300 { - return fmt.Errorf("unexpected status code %d: %s", res.StatusCode, string(body)) - } - - return nil -} - func SaveGemlogEntry(config *Config, entry *GemlogEntry) error { url := fmt.Sprintf("%s:%d/gemlog/", config.CouchDB.Host, config.CouchDB.Port) diff --git a/gemlog/list.go b/gemlog/list.go new file mode 100644 index 0000000..ce51dfc --- /dev/null +++ b/gemlog/list.go @@ -0,0 +1,15 @@ +package gemlog + +import ( + tea "github.com/charmbracelet/bubbletea" +) + +func LoadGemlogCMD(config *Config) tea.Cmd { + return func() tea.Msg { + logs, err := listGemLogs(config) + if err != nil { + return ErrorMsg{err} + } + return GemLogsLoaded{Logs: logs} + } +} diff --git a/gemlog/read.go b/gemlog/read.go deleted file mode 100644 index 173fc7b..0000000 --- a/gemlog/read.go +++ /dev/null @@ -1,38 +0,0 @@ -package gemlog - -import ( - "fmt" - - tea "github.com/charmbracelet/bubbletea" -) - -func DeleteGemlogCMD(config *Config, id string, rev string) tea.Cmd { - return func() tea.Msg { - err := DeleteGemlogEntry(config, id, rev) - if err != nil { - return ErrorMsg{err} - } - - return Notification(fmt.Sprintf("Gemlog with id: %s deleted", id)) - } -} - -func LoadGemlogCMD(config *Config, id string) tea.Cmd { - return func() tea.Msg { - log, err := ReadGemlogEntry(config, id) - if err != nil { - return ErrorMsg{err} - } - return GemLogLoaded{Log: log} - } -} - -func LoadGemlogsCMD(config *Config) tea.Cmd { - return func() tea.Msg { - logs, err := listGemLogs(config) - if err != nil { - return ErrorMsg{err} - } - return GemLogsLoaded{Logs: logs} - } -} diff --git a/main.go b/main.go index cc2d5b3..6b2d5e8 100644 --- a/main.go +++ b/main.go @@ -14,7 +14,7 @@ type Page string const ( ActionList Page = "actionList" EntryList Page = "entryList" - Entry Page = "entry" + // Entry Page = "entry" ) type SwitchPages struct{ Page Page } @@ -25,7 +25,6 @@ type uiState struct { page Page entryListPage EntryListPageModel - entryPage EntryPageModel actionListPage ActionListPageModel } @@ -41,10 +40,12 @@ type model struct { func initialModel(config *gemlog.Config) model { return model{ ui: uiState{ - page: ActionList, + page: ActionList, + // entryListPage: entryListPageModel{ + // cursor: 0, + // entries: []gemlog.GemlogListEntry{}, + // }, actionListPage: initialActionListPageModel(), - entryListPage: initialEntryListPageModel(), - entryPage: initialEntryPageModel(), }, context: &context{ config: config, @@ -60,7 +61,7 @@ func (m model) Init() tea.Cmd { } func (m model) Update(msg tea.Msg) (tea.Model, tea.Cmd) { - cmds := make([]tea.Cmd, 3) + cmds := make([]tea.Cmd, 0) switch msg := msg.(type) { case SwitchPages: m.ui.page = msg.Page @@ -75,18 +76,14 @@ func (m model) Update(msg tea.Msg) (tea.Model, tea.Cmd) { } } - actionListM, cmd := m.ui.actionListPage.Update(msg, m.ui.page == ActionList, m.context) + actionListM, cmd := m.ui.actionListPage.Update(msg, m.context) m.ui.actionListPage = actionListM cmds = append(cmds, cmd) - entryListM, cmd := m.ui.entryListPage.Update(msg, m.ui.page == EntryList, m.context) + entryListM, cmd := m.ui.entryListPage.Update(msg, m.context) m.ui.entryListPage = entryListM cmds = append(cmds, cmd) - entrytM, cmd := m.ui.entryPage.Update(msg, m.ui.page == Entry, m.context) - m.ui.entryPage = entrytM - cmds = append(cmds, cmd) - return m, tea.Batch(cmds...) } @@ -99,13 +96,10 @@ func (m model) View() string { s += m.ui.notification } - switch m.ui.page { - case ActionList: + if m.ui.page == ActionList { s += m.ui.actionListPage.View() - case EntryList: + } else if m.ui.page == EntryList { s += m.ui.entryListPage.View() - case Entry: - s += m.ui.entryPage.View() } s += "\nPress q to quit.\n"