Skip to content

Commit

Permalink
Investment Portfolio Screen with Stream Tokens
Browse files Browse the repository at this point in the history
  • Loading branch information
cristhianescobar committed Jan 28, 2025
1 parent 68df72c commit f23fc76
Show file tree
Hide file tree
Showing 15 changed files with 391 additions and 33 deletions.
22 changes: 20 additions & 2 deletions android/app-newm/src/main/java/io/newm/HomeActivity.kt
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,9 @@ import io.newm.screens.forceupdate.ForceAppUpdatePresenter
import io.newm.screens.forceupdate.ForceAppUpdateState
import io.newm.screens.forceupdate.ForceAppUpdateUi
import io.newm.screens.forceupdate.openAppPlayStore
import io.newm.screens.investment.portfolio.InvestmentPortfolioPresenter
import io.newm.screens.investment.portfolio.InvestmentPortfolioState
import io.newm.screens.investment.portfolio.InvestmentPortfolioUi
import io.newm.screens.library.NFTLibraryPresenter
import io.newm.screens.library.NFTLibraryScreenUi
import io.newm.screens.library.NFTLibraryState
Expand Down Expand Up @@ -48,7 +51,7 @@ class HomeActivity : ComponentActivity() {
private val logger: NewmAppLogger by inject()
private val forceAppUpdateViewModel: ForceAppUpdateViewModel by inject()
private val eventLogger: NewmAppEventLogger by inject()
private val featureFlagManager : FeatureFlagManager by inject()
private val featureFlagManager: FeatureFlagManager by inject()

override fun onCreate(savedInstanceState: Bundle?) {
WindowCompat.setDecorFitsSystemWindows(window, false)
Expand All @@ -70,7 +73,8 @@ class HomeActivity : ComponentActivity() {
NewmApp(
logger = logger,
eventLogger = eventLogger,
showRecordStore = featureFlagManager.isEnabled(FeatureFlags.ShowRecordStore))
showRecordStore = featureFlagManager.isEnabled(FeatureFlags.ShowRecordStore),
)
}
}
}
Expand Down Expand Up @@ -127,6 +131,14 @@ class HomeActivity : ComponentActivity() {
)
}

is Screen.InvestmentPortfolio -> ui<InvestmentPortfolioState> { state, modifier ->
InvestmentPortfolioUi(
state = state,
modifier = modifier,
eventLogger = eventLogger
)
}

else -> null

}
Expand Down Expand Up @@ -166,6 +178,12 @@ class HomeActivity : ComponentActivity() {
)
}.value

is Screen.InvestmentPortfolio -> inject<InvestmentPortfolioPresenter> {
parametersOf(
navigator
)
}.value

else -> null
}
}
Expand Down
52 changes: 29 additions & 23 deletions android/app-newm/src/main/java/io/newm/NewmAppComposable.kt
Original file line number Diff line number Diff line change
Expand Up @@ -107,7 +107,7 @@ internal fun NewmApp(
context.startActivity(Intent(Intent.ACTION_VIEW, Uri.parse(url)))
}, eventLogger)

val currentRootScreen = backstack.topRecord?.screen
val currentRootScreen = backstack.topRecord?.screen as Screen

val sheetState = rememberModalBottomSheetState(
initialValue = ModalBottomSheetValue.Hidden,
Expand Down Expand Up @@ -149,31 +149,37 @@ internal fun NewmApp(
Column(
modifier = Modifier.fillMaxWidth(),
) {
MiniPlayer(
modifier = Modifier.clickable {
coroutineScope.launch {
eventLogger.logPageLoad(AppScreens.MusicPlayerScreen.name)
sheetState.show()
if (currentRootScreen.showMiniPlayer) {
MiniPlayer(
modifier = Modifier.clickable {
coroutineScope.launch {
eventLogger.logPageLoad(AppScreens.MusicPlayerScreen.name)
sheetState.show()
}
},
eventLogger = eventLogger
)
Spacer(
modifier = Modifier
.height(2.dp)
.fillMaxWidth()
.background(MaterialTheme.colors.surface)
)
}
if (currentRootScreen.showBottomBar) {
NewmBottomNavigation(
currentRootScreen = currentRootScreen,
eventLogger = eventLogger,
showRecordStore = showRecordStore,
onNavigationSelected = {
circuitNavigator.resetRoot(it)
}
},
eventLogger = eventLogger
)
Spacer(
modifier = Modifier
.height(2.dp)
.fillMaxWidth()
.background(MaterialTheme.colors.surface)
)
NewmBottomNavigation(
currentRootScreen = currentRootScreen,
eventLogger = eventLogger,
showRecordStore = showRecordStore,
onNavigationSelected = {
circuitNavigator.resetRoot(it)
}
)
)
}

}
}

}
) { padding ->
NavigableCircuitContent(
Expand Down
10 changes: 10 additions & 0 deletions android/app-newm/src/main/java/io/newm/di/android/Dependencies.kt
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ import io.newm.feature.musicplayer.service.DownloadManagerImpl
import io.newm.feature.musicplayer.service.DownloadStateManager
import io.newm.feature.musicplayer.service.DownloadStateManagerImpl
import io.newm.screens.forceupdate.ForceAppUpdatePresenter
import io.newm.screens.investment.portfolio.InvestmentPortfolioPresenter
import io.newm.screens.library.NFTLibraryPresenter
import io.newm.screens.profile.edit.ProfileEditPresenter
import io.newm.screens.profile.view.ProfilePresenter
Expand Down Expand Up @@ -89,6 +90,7 @@ val viewModule = module {
get(),
get(),
get(),
get(),
get()
)
}
Expand All @@ -111,6 +113,14 @@ val viewModule = module {
get(),
)
}
factory { params ->
InvestmentPortfolioPresenter(
params.get(),
get(),
get(),
get(),
)
}
factory { params ->
ProfileEditPresenter(
params.get(),
Expand Down
11 changes: 6 additions & 5 deletions android/app-newm/src/main/java/io/newm/screens/Screen.kt
Original file line number Diff line number Diff line change
Expand Up @@ -6,13 +6,15 @@ import kotlinx.parcelize.Parcelize
import com.slack.circuit.runtime.screen.Screen as CircuitScreen

@Parcelize
sealed class Screen(val screenName: String) : CircuitScreen {
sealed class Screen(val screenName: String, val showBottomBar: Boolean = false, val showMiniPlayer: Boolean = false) : CircuitScreen {

data object UserAccount : Screen(screenName = AppScreens.AccountScreen.name)
data object UserAccount : Screen(screenName = AppScreens.AccountScreen.name, showBottomBar = true, showMiniPlayer = true)

data object RecordStore : Screen(screenName = AppScreens.RecordStoreScreen.name)
data object RecordStore : Screen(screenName = AppScreens.RecordStoreScreen.name, showBottomBar = true, showMiniPlayer = true)

data object NFTLibrary : Screen(screenName = AppScreens.NFTLibraryScreen.name)
data object NFTLibrary : Screen(screenName = AppScreens.NFTLibraryScreen.name, showBottomBar = true, showMiniPlayer = true)

data object InvestmentPortfolio : Screen(screenName = AppScreens.InvestmentPortfolioScreen.name)

data object Welcome : Screen(screenName = AppScreens.WelcomeScreen.name)

Expand All @@ -30,7 +32,6 @@ sealed class Screen(val screenName: String) : CircuitScreen {
data object PrivacyPolicy : Screen(screenName = AppScreens.PrivacyPolicyScreen.name), WebBrowserScreen {
@IgnoredOnParcel
override val url: String = "https://newm.io/app-privacy"

}
}

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package io.newm.screens.investment.portfolio

import com.slack.circuit.runtime.CircuitUiEvent


sealed interface InvestmentPortfolioEvent : CircuitUiEvent {
data object OnBack : InvestmentPortfolioEvent
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
package io.newm.screens.investment.portfolio

import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.collectAsState
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.saveable.rememberSaveable
import androidx.compose.runtime.setValue
import com.slack.circuit.retained.collectAsRetainedState
import com.slack.circuit.runtime.Navigator
import com.slack.circuit.runtime.presenter.Presenter
import io.newm.shared.public.usecases.HasWalletConnectionsUseCase
import io.newm.shared.public.usecases.SyncWalletConnectionsUseCase
import io.newm.shared.public.usecases.WalletNFTTracksUseCase
import kotlinx.coroutines.flow.flowOf

class InvestmentPortfolioPresenter(
private val navigator: Navigator,
private val syncWalletConnectionsUseCase: SyncWalletConnectionsUseCase,
private val hasWalletConnectionsUseCase: HasWalletConnectionsUseCase,
private val walletNFTTracksUseCase: WalletNFTTracksUseCase,
) : Presenter<InvestmentPortfolioState> {
@Composable
override fun present(): InvestmentPortfolioState {

LaunchedEffect(Unit) {
syncWalletConnectionsUseCase.syncWalletConnectionsFromNetworkToDevice()
}

val isWalletConnected: Boolean? by remember { hasWalletConnectionsUseCase.hasWalletConnectionsFlow() }.collectAsRetainedState(
null
)
val isWalletSynced by remember { walletNFTTracksUseCase.walletSynced }.collectAsState(
false
)

val streamTokes by remember(isWalletConnected) {
if (isWalletConnected == true) {
walletNFTTracksUseCase.getAllStreamTokensFlow()
} else {
flowOf()
}
}.collectAsRetainedState(initial = emptyList())

return when {
streamTokes.isNotEmpty() -> {
InvestmentPortfolioState.Content(
streamTokens = streamTokes,
eventSink = { event ->
when (event) {
InvestmentPortfolioEvent.OnBack -> {
navigator.pop()
}
}
}
)
}
isWalletConnected == true && isWalletSynced -> {
InvestmentPortfolioState.ZeroState
}
else -> {
InvestmentPortfolioState.Error
}
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package io.newm.screens.investment.portfolio

import com.slack.circuit.runtime.CircuitUiState
import io.newm.shared.public.models.NFTTrack

sealed class InvestmentPortfolioState : CircuitUiState {
data class Content(
val streamTokens: List<NFTTrack>,
val eventSink: (InvestmentPortfolioEvent) -> Unit
) : InvestmentPortfolioState()

data object Loading : InvestmentPortfolioState()

data object Error : InvestmentPortfolioState()

data object ZeroState : InvestmentPortfolioState()
}
Loading

0 comments on commit f23fc76

Please sign in to comment.