-
Notifications
You must be signed in to change notification settings - Fork 9
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Add Store5 and create a store for nft tracks (#302)
* Add Store5 and create a store for nft tracks * Add pull to refresh (#303)
- Loading branch information
1 parent
3fda1e2
commit 19a696e
Showing
9 changed files
with
114 additions
and
50 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
53 changes: 25 additions & 28 deletions
53
shared/src/commonMain/kotlin/io.newm.shared/internal/repositories/NFTRepository.kt
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,59 +1,56 @@ | ||
package io.newm.shared.internal.repositories | ||
|
||
import io.newm.shared.NewmAppLogger | ||
import io.newm.shared.internal.services.cache.NFTCacheService | ||
import io.newm.shared.internal.services.network.NFTNetworkService | ||
import io.newm.shared.internal.store.NftTrackStore | ||
import io.newm.shared.public.models.NFTTrack | ||
import kotlinx.coroutines.flow.Flow | ||
import kotlinx.coroutines.flow.MutableStateFlow | ||
import kotlinx.coroutines.flow.asStateFlow | ||
import kotlinx.coroutines.flow.combine | ||
import kotlinx.coroutines.flow.filter | ||
import kotlinx.coroutines.flow.map | ||
import kotlinx.coroutines.flow.update | ||
import org.mobilenativefoundation.store.core5.ExperimentalStoreApi | ||
import org.mobilenativefoundation.store.store5.StoreReadRequest | ||
import org.mobilenativefoundation.store.store5.impl.extensions.fresh | ||
|
||
internal class NFTRepository( | ||
private val networkService: NFTNetworkService, | ||
private val cacheService: NFTCacheService, | ||
private val logger: NewmAppLogger | ||
private val nftStore: NftTrackStore, | ||
private val cacheService: NFTCacheService | ||
) { | ||
|
||
// TODO remove this when we start returning the state of the store | ||
private val _syncedNftWallet = MutableStateFlow(false) | ||
|
||
val isSynced: Flow<Boolean> | ||
get() = _syncedNftWallet.asStateFlow() | ||
|
||
suspend fun syncNFTTracksFromNetworkToDevice(): List<NFTTrack>? { | ||
return try { | ||
_syncedNftWallet.update { false } | ||
val nfts = networkService.getWalletNFTs() | ||
cacheService.cacheNFTTracks(nfts) | ||
_syncedNftWallet.update { true } | ||
nfts | ||
} catch (e: Exception) { | ||
logger.error("NFTRepository", "Error fetching NFTs from network ${e.cause}", e) | ||
null | ||
suspend fun syncNFTTracksFromNetworkToDevice(): List<NFTTrack> { | ||
return nftStore.fresh(Unit).also { | ||
_syncedNftWallet.value = true | ||
} | ||
} | ||
|
||
fun getAllCollectableTracksFlow(): Flow<List<NFTTrack>> { | ||
return cacheService.getAllTracks() | ||
.map { tracks -> tracks.filter { !it.isStreamToken } } | ||
fun getAllCollectableTracksFlow(): Flow<List<NFTTrack>> = getAll().map { tracks -> | ||
tracks.filter { !it.isStreamToken } | ||
} | ||
|
||
fun getAllStreamTokensFlow(): Flow<List<NFTTrack>> { | ||
return cacheService.getAllTracks() | ||
.map { tracks -> tracks.filter { it.isStreamToken } } | ||
fun getAllStreamTokensFlow(): Flow<List<NFTTrack>> = getAll().map { tracks -> | ||
tracks.filter { it.isStreamToken } | ||
} | ||
|
||
fun deleteAllTracksNFTsCache() { | ||
cacheService.deleteAllNFTs() | ||
@OptIn(ExperimentalStoreApi::class) | ||
suspend fun deleteAllTracksNFTsCache() { | ||
nftStore.clear() | ||
} | ||
|
||
fun getTrack(id: String): NFTTrack? { | ||
return cacheService.getTrack(id) | ||
} | ||
|
||
fun getAll(): Flow<List<NFTTrack>> = | ||
cacheService.getAllTracks() | ||
fun getAll(refresh: Boolean = false): Flow<List<NFTTrack>> = | ||
nftStore.stream(StoreReadRequest.cached(Unit, refresh)) | ||
.map { result -> | ||
// TODO handle error, loading, etc | ||
result.dataOrNull() ?: emptyList() | ||
} | ||
} | ||
|
||
|
30 changes: 30 additions & 0 deletions
30
shared/src/commonMain/kotlin/io.newm.shared/internal/store/NftTrackStore.kt
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,30 @@ | ||
package io.newm.shared.internal.store | ||
|
||
import io.newm.shared.internal.services.cache.NFTCacheService | ||
import io.newm.shared.internal.services.network.NFTNetworkService | ||
import io.newm.shared.public.models.NFTTrack | ||
import org.mobilenativefoundation.store.store5.Fetcher | ||
import org.mobilenativefoundation.store.store5.SourceOfTruth | ||
import org.mobilenativefoundation.store.store5.Store | ||
import org.mobilenativefoundation.store.store5.StoreBuilder | ||
import org.mobilenativefoundation.store.store5.Validator | ||
|
||
internal class NftTrackStore( | ||
private val networkService: NFTNetworkService, | ||
private val cacheService: NFTCacheService, | ||
) : Store<Unit, List<NFTTrack>> by StoreBuilder.from( | ||
fetcher = Fetcher.of { _: Unit -> | ||
networkService.getWalletNFTs() | ||
}, sourceOfTruth = SourceOfTruth.of( | ||
reader = { _: Unit -> | ||
cacheService.getAllTracks() | ||
}, | ||
writer = { _: Unit, tracks: List<NFTTrack> -> cacheService.cacheNFTTracks(tracks) }, | ||
delete = { _: Unit -> | ||
cacheService.deleteAllNFTs() | ||
}, | ||
deleteAll = cacheService::deleteAllNFTs | ||
) | ||
).validator(Validator.by { it.isNotEmpty() } // If we have no data, we should always fetch | ||
).build() | ||
|