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 }