github.com/status-im/status-go@v1.1.0/services/stickers/pending.go (about)

     1  package stickers
     2  
     3  import (
     4  	"encoding/json"
     5  	"errors"
     6  	"math/big"
     7  
     8  	"github.com/status-im/status-go/multiaccounts/settings"
     9  	"github.com/status-im/status-go/services/wallet/bigint"
    10  )
    11  
    12  func (api *API) AddPending(chainID uint64, packID *bigint.BigInt) error {
    13  	pendingPacks, err := api.pendingStickerPacks()
    14  	if err != nil {
    15  		return err
    16  	}
    17  
    18  	if _, exists := pendingPacks[uint(packID.Uint64())]; exists {
    19  		return errors.New("sticker pack is already pending")
    20  	}
    21  
    22  	stickerType, err := api.contractMaker.NewStickerType(chainID)
    23  	if err != nil {
    24  		return err
    25  	}
    26  
    27  	stickerPack, err := api.fetchPackData(stickerType, packID.Int, false)
    28  	if err != nil {
    29  		return err
    30  	}
    31  
    32  	pendingPacks[uint(packID.Uint64())] = *stickerPack
    33  
    34  	return api.accountsDB.SaveSettingField(settings.StickersPacksPending, pendingPacks)
    35  }
    36  
    37  func (api *API) pendingStickerPacks() (StickerPackCollection, error) {
    38  	stickerPacks := make(StickerPackCollection)
    39  
    40  	pendingStickersJSON, err := api.accountsDB.GetPendingStickerPacks()
    41  	if err != nil {
    42  		return nil, err
    43  	}
    44  
    45  	if pendingStickersJSON == nil {
    46  		return stickerPacks, nil
    47  	}
    48  
    49  	err = json.Unmarshal(*pendingStickersJSON, &stickerPacks)
    50  	if err != nil {
    51  		return nil, err
    52  	}
    53  
    54  	return stickerPacks, nil
    55  }
    56  
    57  func (api *API) Pending() (StickerPackCollection, error) {
    58  	stickerPacks, err := api.pendingStickerPacks()
    59  	if err != nil {
    60  		return nil, err
    61  	}
    62  
    63  	for packID, stickerPack := range stickerPacks {
    64  		stickerPack.Status = statusPending
    65  		stickerPack.Preview = api.hashToURL(stickerPack.Preview)
    66  		stickerPack.Thumbnail = api.hashToURL(stickerPack.Thumbnail)
    67  		for i, sticker := range stickerPack.Stickers {
    68  			sticker.URL = api.hashToURL(sticker.Hash)
    69  			stickerPack.Stickers[i] = sticker
    70  		}
    71  		stickerPacks[packID] = stickerPack
    72  	}
    73  
    74  	return stickerPacks, nil
    75  }
    76  
    77  func (api *API) ProcessPending(chainID uint64) (pendingChanged StickerPackCollection, err error) {
    78  	pendingStickerPacks, err := api.pendingStickerPacks()
    79  	if err != nil {
    80  		return nil, err
    81  	}
    82  
    83  	accs, err := api.accountsDB.GetActiveAccounts()
    84  	if err != nil {
    85  		return nil, err
    86  	}
    87  
    88  	purchasedPacks := make(map[uint]struct{})
    89  	purchasedPackChan := make(chan *big.Int)
    90  	errChan := make(chan error)
    91  	doneChan := make(chan struct{}, 1)
    92  	go api.getAccountsPurchasedPack(chainID, accs, purchasedPackChan, errChan, doneChan)
    93  	for {
    94  		select {
    95  		case err := <-errChan:
    96  			if err != nil {
    97  				return nil, err
    98  			}
    99  		case packID := <-purchasedPackChan:
   100  			if packID != nil {
   101  				purchasedPacks[uint(packID.Uint64())] = struct{}{}
   102  			}
   103  		case <-doneChan:
   104  			result := make(StickerPackCollection)
   105  			for _, stickerPack := range pendingStickerPacks {
   106  				packID := uint(stickerPack.ID.Uint64())
   107  				if _, exists := purchasedPacks[packID]; !exists {
   108  					continue
   109  				}
   110  				delete(pendingStickerPacks, packID)
   111  				stickerPack.Status = statusPurchased
   112  				result[packID] = stickerPack
   113  			}
   114  			err = api.accountsDB.SaveSettingField(settings.StickersPacksPending, pendingStickerPacks)
   115  			return result, err
   116  		}
   117  	}
   118  }
   119  
   120  func (api *API) RemovePending(packID *bigint.BigInt) error {
   121  	pendingPacks, err := api.pendingStickerPacks()
   122  	if err != nil {
   123  		return err
   124  	}
   125  
   126  	if _, exists := pendingPacks[uint(packID.Uint64())]; !exists {
   127  		return nil
   128  	}
   129  
   130  	delete(pendingPacks, uint(packID.Uint64()))
   131  
   132  	return api.accountsDB.SaveSettingField(settings.StickersPacksPending, pendingPacks)
   133  }