github.com/wtfutil/wtf@v0.43.0/modules/zendesk/widget.go (about)

     1  package zendesk
     2  
     3  import (
     4  	"fmt"
     5  
     6  	"github.com/rivo/tview"
     7  	"github.com/wtfutil/wtf/utils"
     8  	"github.com/wtfutil/wtf/view"
     9  )
    10  
    11  // A Widget represents a Zendesk widget
    12  type Widget struct {
    13  	view.ScrollableWidget
    14  
    15  	result   *TicketArray
    16  	settings *Settings
    17  	err      error
    18  }
    19  
    20  // NewWidget creates a new instance of a widget
    21  func NewWidget(tviewApp *tview.Application, redrawChan chan bool, pages *tview.Pages, settings *Settings) *Widget {
    22  	widget := Widget{
    23  		ScrollableWidget: view.NewScrollableWidget(tviewApp, redrawChan, pages, settings.Common),
    24  
    25  		settings: settings,
    26  	}
    27  
    28  	widget.SetRenderFunction(widget.Render)
    29  
    30  	widget.initializeKeyboardControls()
    31  
    32  	return &widget
    33  }
    34  
    35  /* -------------------- Exported Functions -------------------- */
    36  
    37  func (widget *Widget) Refresh() {
    38  	ticketArray, err := widget.newTickets()
    39  	ticketArray.Count = len(ticketArray.Tickets)
    40  	widget.err = err
    41  	widget.result = ticketArray
    42  	widget.Render()
    43  }
    44  
    45  /* -------------------- Unexported Functions -------------------- */
    46  
    47  func (widget *Widget) Render() {
    48  	widget.Redraw(widget.content)
    49  }
    50  
    51  func (widget *Widget) content() (string, string, bool) {
    52  	title := fmt.Sprintf("%s (%d)", widget.CommonSettings().Title, widget.result.Count)
    53  	if widget.err != nil {
    54  		return title, widget.err.Error(), true
    55  	}
    56  
    57  	items := widget.result.Tickets
    58  	if len(items) == 0 {
    59  		return title, "No unassigned tickets in queue - woop!!", false
    60  	}
    61  
    62  	str := ""
    63  	for idx, data := range items {
    64  		str += widget.format(data, idx)
    65  	}
    66  
    67  	return title, str, false
    68  }
    69  
    70  func (widget *Widget) format(ticket Ticket, idx int) string {
    71  	textColor := widget.settings.Colors.Background
    72  	if idx == widget.GetSelected() {
    73  		textColor = widget.settings.Colors.BorderTheme.Focused
    74  	}
    75  
    76  	requesterName := widget.parseRequester(ticket)
    77  	str := fmt.Sprintf(" [%s:]%d - %s\n %s\n\n", textColor, ticket.Id, requesterName, ticket.Subject)
    78  	return str
    79  }
    80  
    81  // this is a nasty means of extracting the actual name of the requester from the Via interface of the Ticket.
    82  // very very open to improvements on this
    83  func (widget *Widget) parseRequester(ticket Ticket) interface{} {
    84  	viaMap := ticket.Via
    85  	via := viaMap.(map[string]interface{})
    86  	source := via["source"]
    87  	fromMap, _ := source.(map[string]interface{})
    88  	from := fromMap["from"]
    89  	fromValMap := from.(map[string]interface{})
    90  	fromName := fromValMap["name"]
    91  	return fromName
    92  }
    93  
    94  func (widget *Widget) openTicket() {
    95  	sel := widget.GetSelected()
    96  	if sel >= 0 && widget.result != nil && sel < len(widget.result.Tickets) {
    97  		issue := &widget.result.Tickets[sel]
    98  		ticketURL := fmt.Sprintf("https://%s.zendesk.com/agent/tickets/%d", widget.settings.subdomain, issue.Id)
    99  		utils.OpenFile(ticketURL)
   100  	}
   101  }