github.com/status-im/status-go@v1.1.0/services/stickers/install.go (about) 1 package stickers 2 3 import ( 4 "encoding/json" 5 "errors" 6 7 "github.com/status-im/status-go/multiaccounts/settings" 8 "github.com/status-im/status-go/services/wallet/bigint" 9 ) 10 11 func (api *API) Install(chainID uint64, packID *bigint.BigInt) error { 12 installedPacks, err := api.installedStickerPacks() 13 if err != nil { 14 return err 15 } 16 17 if _, exists := installedPacks[uint(packID.Uint64())]; exists { 18 return errors.New("sticker pack is already installed") 19 } 20 21 // TODO: this does not validate if the pack is purchased. Should it? 22 23 stickerType, err := api.contractMaker.NewStickerType(chainID) 24 if err != nil { 25 return err 26 } 27 28 stickerPack, err := api.fetchPackData(stickerType, packID.Int, false) 29 if err != nil { 30 return err 31 } 32 33 installedPacks[uint(packID.Uint64())] = *stickerPack 34 35 err = api.accountsDB.SaveSettingField(settings.StickersPacksInstalled, installedPacks) 36 if err != nil { 37 return err 38 } 39 40 return nil 41 } 42 43 func (api *API) installedStickerPacks() (StickerPackCollection, error) { 44 stickerPacks := make(StickerPackCollection) 45 46 installedStickersJSON, err := api.accountsDB.GetInstalledStickerPacks() 47 if err != nil { 48 return nil, err 49 } 50 51 if installedStickersJSON == nil { 52 return stickerPacks, nil 53 } 54 55 err = json.Unmarshal(*installedStickersJSON, &stickerPacks) 56 if err != nil { 57 return nil, err 58 } 59 60 return stickerPacks, nil 61 } 62 63 func (api *API) Installed() (StickerPackCollection, error) { 64 stickerPacks, err := api.installedStickerPacks() 65 if err != nil { 66 return nil, err 67 } 68 69 for packID, stickerPack := range stickerPacks { 70 stickerPack.Status = statusInstalled 71 stickerPack.Preview = api.hashToURL(stickerPack.Preview) 72 stickerPack.Thumbnail = api.hashToURL(stickerPack.Thumbnail) 73 for i, sticker := range stickerPack.Stickers { 74 sticker.URL = api.hashToURL(sticker.Hash) 75 if err != nil { 76 return nil, err 77 } 78 stickerPack.Stickers[i] = sticker 79 } 80 stickerPacks[packID] = stickerPack 81 } 82 83 return stickerPacks, nil 84 } 85 86 func (api *API) Uninstall(packID *bigint.BigInt) error { 87 installedPacks, err := api.installedStickerPacks() 88 if err != nil { 89 return err 90 } 91 92 if _, exists := installedPacks[uint(packID.Uint64())]; !exists { 93 return errors.New("sticker pack is not installed") 94 } 95 96 delete(installedPacks, uint(packID.Uint64())) 97 98 err = api.accountsDB.SaveSettingField(settings.StickersPacksInstalled, installedPacks) 99 if err != nil { 100 return err 101 } 102 103 // Removing uninstalled pack from recent stickers 104 105 recentStickers, err := api.recentStickers() 106 if err != nil { 107 return err 108 } 109 110 idx := -1 111 for i, r := range recentStickers { 112 if r.PackID.Cmp(packID.Int) == 0 { 113 idx = i 114 break 115 } 116 } 117 118 if idx > -1 { 119 var newRecentStickers []Sticker 120 newRecentStickers = append(newRecentStickers, recentStickers[:idx]...) 121 if idx != len(recentStickers)-1 { 122 newRecentStickers = append(newRecentStickers, recentStickers[idx+1:]...) 123 } 124 return api.accountsDB.SaveSettingField(settings.StickersRecentStickers, newRecentStickers) 125 } 126 127 return nil 128 }