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 }