github.com/keybase/client/go@v0.0.0-20240309051027-028f7c731f8b/invitefriends/api.go (about)

     1  package invitefriends
     2  
     3  import (
     4  	"sync"
     5  
     6  	"github.com/keybase/client/go/libkb"
     7  	"github.com/keybase/client/go/protocol/keybase1"
     8  )
     9  
    10  var (
    11  	countsCache   *keybase1.InviteCounts
    12  	countsCacheMu sync.Mutex // mutex isn't rw due to low call frequency
    13  )
    14  
    15  func GetCounts(mctx libkb.MetaContext) (counts keybase1.InviteCounts, err error) {
    16  	type apiRes struct {
    17  		NumInvites       int     `json:"numInvites"`
    18  		PercentageChange float64 `json:"percentageChange"`
    19  		ShowNumInvites   bool    `json:"showNumInvites"`
    20  		ShowFire         bool    `json:"showFire"`
    21  		TooltipMarkdown  string  `json:"tooltipMarkdown"`
    22  		libkb.AppStatusEmbed
    23  	}
    24  	apiArg := libkb.APIArg{
    25  		Endpoint:    "invite_friends/num_invites",
    26  		SessionType: libkb.APISessionTypeNONE,
    27  	}
    28  	var res apiRes
    29  	err = mctx.G().API.GetDecode(mctx, apiArg, &res)
    30  	if err != nil {
    31  		return counts, err
    32  	}
    33  	newCounts := keybase1.InviteCounts{
    34  		InviteCount:      res.NumInvites,
    35  		PercentageChange: res.PercentageChange,
    36  		ShowNumInvites:   res.ShowNumInvites,
    37  		ShowFire:         res.ShowFire,
    38  		TooltipMarkdown:  res.TooltipMarkdown,
    39  	}
    40  	countsCacheMu.Lock()
    41  	countsCache = &newCounts
    42  	countsCacheMu.Unlock()
    43  	return newCounts, nil
    44  }
    45  
    46  func RequestNotification(mctx libkb.MetaContext) error {
    47  	// noop if there's no home ui present
    48  	if ui, err := mctx.G().UIRouter.GetHomeUI(); ui == nil || err != nil {
    49  		return nil
    50  	}
    51  
    52  	// we only need to grab the pointer during the lock
    53  	countsCacheMu.Lock()
    54  	counts := countsCache
    55  	countsCacheMu.Unlock()
    56  
    57  	if counts == nil {
    58  		freshCounts, err := GetCounts(mctx)
    59  		if err != nil {
    60  			return err
    61  		}
    62  		counts = &freshCounts
    63  	}
    64  	mctx.G().NotifyRouter.HandleUpdateInviteCounts(mctx.Ctx(), *counts)
    65  	return nil
    66  }