shithub: hell

ref: 7d1a10551f567003be765fff0e56a84a43423835
dir: /pages.go/

View raw version
package main

import (
	"context"
	"fmt"
	"strings"
	
	"codeberg.org/penny64/hellclient-go-mastodon"
)

type StatusLoader interface {
	Load(int) *[]PageItem
}

type Page struct {
	loader StatusLoader
	//Array index for the item buffer
	index int
	//our previous index for going back
	previndex int
	//Semantic page number for the UI
	page int
	itembuffer *[]PageItem
	
}
type NotificationPages struct {
	hc *Hellclient
	page *mastodon.Pagination
}

type StatusPages struct {
	hc *Hellclient
	page *mastodon.Pagination
}

type PageItem struct {
	itemtext string
	lines    int
}

func (statusData *StatusPages) Load(limit int) *[]PageItem {
	if statusData.page == nil {
		statusData.page = &mastodon.Pagination{}
	}
	statusData.page.Limit = int64(limit)
	var statuses []*mastodon.Status
	var err error
	statuses, err = statusData.hc.client.GetBookmarks(context.Background(), statusData.page)
	if err != nil {
		fmt.Printf("Error loading status page: %s\n", err)
	}
	
	var itemArray []PageItem
	for i, _ := range statuses {
		item := PageItem{itemtext: statusData.hc.renderAndIncrement(statusData.hc.ctxref, statuses[i]) + "\n"}
		itemArray = append(itemArray, item)
	}
	statusData.page.MinID = ""
	return &itemArray
}

func (noticeData *NotificationPages) Load(limit int) *[]PageItem {
	if noticeData.page == nil {
		noticeData.page = &mastodon.Pagination{}
	}
	noticeData.page.Limit = int64(limit)
	var notices []*mastodon.Notification
	var err error
	getnotifs := func(job *GenericJob){notices, err = noticeData.hc.client.GetNotifications(context.Background(), noticeData.page)}
	notifjob := noticeData.hc.dispatchFunc(getnotifs)
	notifjob.Wait()
	if err != nil {
		fmt.Printf("Error getting notification page: %s\n", err)
	}
	noticeArray := noticeData.hc.RenderNotificationsArray(notices)
	var itemArray []PageItem
	for i, _ := range noticeArray {
		item := PageItem{itemtext: noticeArray[i]}
		itemArray = append(itemArray, item)
	}
	noticeData.page.MinID = ""
	return &itemArray
}

func (page *Page) Buffer() {
	if page.itembuffer == nil {
		page.itembuffer = &[]PageItem{}
	}
	if len(*page.itembuffer) < (page.index + 5) {
		*page.itembuffer = append(*page.itembuffer, *page.loader.Load(20)...)

	}
}

func (page *Page) String() string {
	var sb strings.Builder
	page.Buffer()
	var items []PageItem
	if len(*page.itembuffer) >= page.index {
		items = (*page.itembuffer)[page.index:]
	}

	if len(items) > 5 {
		items = items[:5]
	}
	reverseditems := reverseArray(items)
	for i, _ := range reverseditems {
		sb.WriteString(reverseditems[i].itemtext)
	}
	sb.WriteString(page.pageTitle())
	return sb.String()
}

func (page *Page) Next() {
	page.page++
	page.index = page.index + 5
}

func (page *Page) Prev() {
	if(page.index -5 ) >= 0 {
		page.index = page.index - 5
		page.page--
	}
}

func (page *Page) pageTitle() string {
	return fmt.Sprintf("Page %v. /next for next page /prev for previous\n", page.page+1)
}

func (page *Page) Current() int {
	return page.page
}