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  }