Refactored OpenArticle, implemented submitting

pull/17/head
マリウス 2 years ago
parent c28ea0bced
commit 1f1ab89056
No known key found for this signature in database
GPG Key ID: 272ED814BF63261F

@ -82,6 +82,14 @@ func main() {
// ======================== /TESTING ==============================
TUI := tui.Init(&EMBEDFS, &articles)
// TUI.CallbackRefreshArticles = func() (error) {
// articles, err := db.ListArticles()
// return err
// }
TUI.CallbackSubmitArticle = func(article *models.Article) (error) {
// return db.SubmitArticle(article)
return nil
}
go func() {
time.Sleep(time.Second * 2)

@ -1,10 +1,13 @@
package tui
import (
"errors"
"fmt"
"io/ioutil"
"log"
"os"
"os/exec"
"strings"
"github.com/mrusme/superhighway84/models"
"github.com/rivo/tview"
@ -18,7 +21,7 @@ func OpenArticle(app *tview.Application, article *models.Article) (models.Articl
defer os.Remove(tmpFile.Name())
tmpContent := []byte(article.Body)
tmpContent := []byte(fmt.Sprintf("Subject: %s\n= = = = = =\n%s", article.Subject, article.Body))
if _, err = tmpFile.Write(tmpContent); err != nil {
return *article, err
}
@ -47,8 +50,26 @@ func OpenArticle(app *tview.Application, article *models.Article) (models.Articl
return *article, err
}
content := strings.Split(string(tmpContent), "\n= = = = = =\n")
if len(content) != 2 {
return *article, errors.New("Document malformatted")
}
headerPart := strings.TrimSpace(content[0])
subject := strings.TrimPrefix(headerPart, "Subject: ")
if len(subject) <= 1 {
return *article, errors.New("Invalid subject")
}
body := strings.TrimSpace(content[1])
// TODO: Perform more validations
if len(body) <= 1 {
return *article, errors.New("Invalid body")
}
newArticle := *article
newArticle.Body = string(tmpContent)
newArticle.Subject = subject
newArticle.Body = body
return newArticle, nil
}

@ -5,6 +5,7 @@ import (
"sort"
"strings"
"time"
"unicode"
"github.com/gdamore/tcell/v2"
"github.com/mrusme/superhighway84/models"
@ -139,7 +140,9 @@ func (mainscreen *Mainscreen) HandleInput(event *tcell.EventKey) (*tcell.EventKe
mainscreen.T.App.SetFocus(mainscreen.Articles)
return nil
case tcell.KeyRune:
switch event.Rune() {
switch unicode.ToLower(event.Rune()) {
case 'n':
mainscreen.submitNewArticle(mainscreen.GroupsList[mainscreen.CurrentGroupSelected])
case 'r':
mainscreen.replyToArticle(mainscreen.ArticlesList[mainscreen.CurrentArticleSelected])
}
@ -171,6 +174,43 @@ func(mainscreen *Mainscreen) selectHandler(item string)(func(int, string, string
}
}
func(mainscreen *Mainscreen) submitNewArticle(group string) {
newArticle := models.NewArticle()
newArticle.Subject = ""
newArticle.Newsgroup = group
// TODO: newArticle.From =
// TODO: newArticle.Organisation =
newArticle.Body = ""
updatedNewArticle, err := OpenArticle(mainscreen.T.App, newArticle)
if err != nil {
mainscreen.T.ShowErrorModal(err.Error())
return
}
mainscreen.T.ShowModal(
"Do you want to submit this new article?",
map[string]ModalButton{
"(Y)es": {
Rune: 'y',
Callback: func() {
if mainscreen.T.CallbackSubmitArticle != nil {
mainscreen.T.CallbackSubmitArticle(&updatedNewArticle)
}
return
},
},
"(N)ope": {
Rune: 'n',
Callback: func() {
return
},
},
})
}
func(mainscreen *Mainscreen) replyToArticle(article *models.Article) {
newArticle := models.NewArticle()
@ -181,23 +221,25 @@ func(mainscreen *Mainscreen) replyToArticle(article *models.Article) {
// TODO: newArticle.Organisation =
newArticle.Body = fmt.Sprintf("\nOn %s %s wrote:\n> %s", time.Unix(0, article.Date * int64(time.Millisecond)).Format("Mon Jan _2 15:04:05 2006"), article.From, strings.Replace(article.Body, "\n", "\n> ", -1))
_, err := OpenArticle(mainscreen.T.App, newArticle)
updatedNewArticle, err := OpenArticle(mainscreen.T.App, newArticle)
if err != nil {
// TODO: Show modal
mainscreen.T.ShowErrorModal(err.Error())
return
}
// TODO: Write reply
mainscreen.T.ShowModal(
"Do you want to post this article?",
"Do you want to submit this reply?",
map[string]ModalButton{
"[Y]es": {
"(Y)es": {
Rune: 'y',
Callback: func() {
if mainscreen.T.CallbackSubmitArticle != nil {
mainscreen.T.CallbackSubmitArticle(&updatedNewArticle)
}
return
},
},
"[N]o": {
"(N)ope": {
Rune: 'n',
Callback: func() {
return

@ -19,6 +19,9 @@ type TUI struct {
Modal *tview.Modal
ModalVisible bool
ModalButtons map[string]ModalButton
CallbackRefreshArticles func() (error)
CallbackSubmitArticle func(article *models.Article) (error)
}
type View interface {
@ -40,7 +43,7 @@ func Init(embedfs *embed.FS, articlesDatasource *[]models.Article) (*TUI) {
tview.Styles = tview.Theme{
PrimitiveBackgroundColor: tcell.ColorDefault,
ContrastBackgroundColor: tcell.ColorTeal,
ContrastBackgroundColor: tcell.ColorPink,
MoreContrastBackgroundColor: tcell.ColorTeal,
BorderColor: tcell.ColorWhite,
TitleColor: tcell.ColorWhite,
@ -73,15 +76,24 @@ func (t *TUI) initInput() {
t.App.SetInputCapture(func(event *tcell.EventKey) *tcell.EventKey {
switch event.Key() {
case tcell.KeyCtrlR:
if t.CallbackRefreshArticles != nil {
err := t.CallbackRefreshArticles()
if err != nil {
t.ShowErrorModal(err.Error())
return nil
}
}
t.Refresh()
return nil
case tcell.KeyCtrlQ:
t.App.Stop()
return nil
default:
if t.ModalVisible == true && event.Key() == tcell.KeyRune {
if t.ModalVisible == true {
for _, modalButton := range t.ModalButtons {
if unicode.ToLower(modalButton.Rune) == unicode.ToLower(event.Rune()) {
if modalButton.Rune == '*' ||
(event.Key() == tcell.KeyRune &&
unicode.ToLower(modalButton.Rune) == unicode.ToLower(event.Rune())) {
modalButton.Callback()
t.HideModal()
return nil
@ -147,3 +159,15 @@ func(t *TUI) HideModal() {
t.SetView(t.ActiveView, false)
}
func(t *TUI) ShowErrorModal(text string) {
t.ShowModal(
text,
map[string]ModalButton{
"(F)uck": {
Rune: '*',
Callback: func() {
return
},
},
})
}

Loading…
Cancel
Save