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

     1  package stickers
     2  
     3  import (
     4  	"encoding/json"
     5  
     6  	"github.com/status-im/status-go/multiaccounts/settings"
     7  	"github.com/status-im/status-go/services/wallet/bigint"
     8  )
     9  
    10  const maxNumberRecentStickers = 24
    11  
    12  func (api *API) recentStickers() ([]Sticker, error) {
    13  	installedStickersPacksJSON, err := api.accountsDB.GetInstalledStickerPacks()
    14  
    15  	if err != nil || installedStickersPacksJSON == nil {
    16  		return []Sticker{}, nil
    17  	}
    18  
    19  	recentStickersJSON, err := api.accountsDB.GetRecentStickers()
    20  
    21  	if err != nil || recentStickersJSON == nil {
    22  		return []Sticker{}, nil
    23  	}
    24  
    25  	recentStickersList := make([]Sticker, 0)
    26  	if err := json.Unmarshal(*recentStickersJSON, &recentStickersList); err != nil {
    27  		return []Sticker{}, err
    28  	}
    29  
    30  	var installedStickersPacks map[string]StickerPack
    31  	if err := json.Unmarshal(*installedStickersPacksJSON, &installedStickersPacks); err != nil {
    32  		return []Sticker{}, err
    33  	}
    34  
    35  	recentStickersListInExistingPacks := make([]Sticker, 0)
    36  	existingPackIDs := make(map[string]bool)
    37  
    38  	for k := range installedStickersPacks {
    39  		existingPackIDs[k] = true
    40  	}
    41  
    42  	for _, s := range recentStickersList {
    43  		packIDStr := s.PackID.String()
    44  		if _, exists := existingPackIDs[packIDStr]; exists {
    45  			recentStickersListInExistingPacks = append(recentStickersListInExistingPacks, s)
    46  		}
    47  	}
    48  
    49  	return recentStickersListInExistingPacks, nil
    50  }
    51  
    52  func (api *API) ClearRecent() error {
    53  	var recentStickersList []Sticker
    54  	return api.accountsDB.SaveSettingField(settings.StickersRecentStickers, recentStickersList)
    55  }
    56  
    57  func (api *API) Recent() ([]Sticker, error) {
    58  	recentStickersList, err := api.recentStickers()
    59  	if err != nil {
    60  		return nil, err
    61  	}
    62  
    63  	for i, sticker := range recentStickersList {
    64  		sticker.URL = api.hashToURL(sticker.Hash)
    65  		recentStickersList[i] = sticker
    66  	}
    67  
    68  	return recentStickersList, nil
    69  }
    70  
    71  func (api *API) AddRecent(packID *bigint.BigInt, hash string) error {
    72  	sticker := Sticker{
    73  		PackID: packID,
    74  		Hash:   hash,
    75  	}
    76  
    77  	recentStickersList, err := api.recentStickers()
    78  	if err != nil {
    79  		return err
    80  	}
    81  
    82  	// Remove duplicated
    83  	idx := -1
    84  	for i, currSticker := range recentStickersList {
    85  		if currSticker.PackID.Cmp(sticker.PackID.Int) == 0 && currSticker.Hash == sticker.Hash {
    86  			idx = i
    87  		}
    88  	}
    89  	if idx > -1 {
    90  		recentStickersList = append(recentStickersList[:idx], recentStickersList[idx+1:]...)
    91  	}
    92  
    93  	sticker.URL = ""
    94  
    95  	if len(recentStickersList) >= maxNumberRecentStickers {
    96  		recentStickersList = append([]Sticker{sticker}, recentStickersList[:maxNumberRecentStickers-1]...)
    97  	} else {
    98  		recentStickersList = append([]Sticker{sticker}, recentStickersList...)
    99  	}
   100  
   101  	return api.accountsDB.SaveSettingField(settings.StickersRecentStickers, recentStickersList)
   102  }