From 2fe3b3ebdf20bb0d7ad0ac1173754994e06a619b Mon Sep 17 00:00:00 2001 From: nostrbuddha Date: Thu, 21 Nov 2024 13:25:01 +0530 Subject: [PATCH 1/8] My Trades UI 1/3 --- .../bisq/mobile/domain/data/model/MyTrades.kt | 26 +++++ .../domain/data/repository/Repositories.kt | 32 +++++- .../bisq/mobile/domain/di/DomainModule.kt | 6 +- .../drawable/icon_right_arrow.png | Bin 0 -> 230 bytes .../composeResources/drawable/icon_star.png | Bin 0 -> 256 bytes .../drawable/img_no_trades.png | Bin 0 -> 29941 bytes .../composeResources/drawable/payment_ach.png | Bin 0 -> 1101 bytes .../drawable/payment_bitcoin_round.png | Bin 0 -> 2172 bytes .../drawable/payment_lightning_round.png | Bin 0 -> 1689 bytes .../drawable/payment_strike.png | Bin 0 -> 596 bytes .../drawable/payment_uspmo.png | Bin 0 -> 503 bytes .../drawable/payment_venmo.png | Bin 0 -> 1082 bytes .../drawable/payment_wise.png | Bin 0 -> 629 bytes .../drawable/payment_zelle.png | Bin 0 -> 447 bytes .../presentation/di/PresentationModule.kt | 10 ++ .../ui/components/atoms/PaymentMethods.kt | 52 ++++++++++ .../ui/components/atoms/ProfileRating.kt | 40 ++++++++ .../ui/components/molecules/OfferCard.kt | 80 +++++++++++++++ .../ui/uicases/startup/SplashPresenter.kt | 2 +- .../ui/uicases/trades/MyTrades.kt | 32 ------ .../ui/uicases/trades/MyTradesPresenter.kt | 61 ++++++++++++ .../ui/uicases/trades/MyTradesScreen.kt | 92 ++++++++++++++++++ 22 files changed, 392 insertions(+), 41 deletions(-) create mode 100644 bisqapps/shared/domain/src/commonMain/kotlin/network/bisq/mobile/domain/data/model/MyTrades.kt create mode 100644 bisqapps/shared/presentation/src/commonMain/composeResources/drawable/icon_right_arrow.png create mode 100644 bisqapps/shared/presentation/src/commonMain/composeResources/drawable/icon_star.png create mode 100644 bisqapps/shared/presentation/src/commonMain/composeResources/drawable/img_no_trades.png create mode 100644 bisqapps/shared/presentation/src/commonMain/composeResources/drawable/payment_ach.png create mode 100644 bisqapps/shared/presentation/src/commonMain/composeResources/drawable/payment_bitcoin_round.png create mode 100644 bisqapps/shared/presentation/src/commonMain/composeResources/drawable/payment_lightning_round.png create mode 100644 bisqapps/shared/presentation/src/commonMain/composeResources/drawable/payment_strike.png create mode 100644 bisqapps/shared/presentation/src/commonMain/composeResources/drawable/payment_uspmo.png create mode 100644 bisqapps/shared/presentation/src/commonMain/composeResources/drawable/payment_venmo.png create mode 100644 bisqapps/shared/presentation/src/commonMain/composeResources/drawable/payment_wise.png create mode 100644 bisqapps/shared/presentation/src/commonMain/composeResources/drawable/payment_zelle.png create mode 100644 bisqapps/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/components/atoms/PaymentMethods.kt create mode 100644 bisqapps/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/components/atoms/ProfileRating.kt create mode 100644 bisqapps/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/components/molecules/OfferCard.kt delete mode 100644 bisqapps/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/uicases/trades/MyTrades.kt create mode 100644 bisqapps/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/uicases/trades/MyTradesPresenter.kt create mode 100644 bisqapps/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/uicases/trades/MyTradesScreen.kt diff --git a/bisqapps/shared/domain/src/commonMain/kotlin/network/bisq/mobile/domain/data/model/MyTrades.kt b/bisqapps/shared/domain/src/commonMain/kotlin/network/bisq/mobile/domain/data/model/MyTrades.kt new file mode 100644 index 00000000..6de99744 --- /dev/null +++ b/bisqapps/shared/domain/src/commonMain/kotlin/network/bisq/mobile/domain/data/model/MyTrades.kt @@ -0,0 +1,26 @@ +package network.bisq.mobile.domain.data.model + +// TODO: Update later +data class BisqOffer ( + val id: String = "offer_283UANJD19A", + val isBuy: Boolean = true, + val amIMaker: Boolean = false, + val price: Number = 97000, + val currency: String = "USD", + val fiatAmount: Number = 1000, //Should be a range + val satsAmount: Number= 1030927, //Should be a range + + val partyName: String = "satoshi", + val partyRatings: Double = 4.2, + val partyDP: String = "", // Image URL +) + +class MyTrades(val trades: List = listOf()): BaseModel() + +interface MyTradesFactory { + fun createMyTrades(): MyTrades +} + +class DefaultMyTradesFactory : MyTradesFactory { + override fun createMyTrades() = MyTrades() +} \ No newline at end of file diff --git a/bisqapps/shared/domain/src/commonMain/kotlin/network/bisq/mobile/domain/data/repository/Repositories.kt b/bisqapps/shared/domain/src/commonMain/kotlin/network/bisq/mobile/domain/data/repository/Repositories.kt index 44b0504b..a762cfd4 100644 --- a/bisqapps/shared/domain/src/commonMain/kotlin/network/bisq/mobile/domain/data/repository/Repositories.kt +++ b/bisqapps/shared/domain/src/commonMain/kotlin/network/bisq/mobile/domain/data/repository/Repositories.kt @@ -1,9 +1,7 @@ package network.bisq.mobile.domain.data.repository -import network.bisq.mobile.domain.data.model.BisqStats -import network.bisq.mobile.domain.data.model.BtcPrice -import network.bisq.mobile.domain.data.model.Greeting -import network.bisq.mobile.domain.data.model.Settings +import kotlinx.coroutines.runBlocking +import network.bisq.mobile.domain.data.model.* // this way of definingsupports both platforms // add your repositories here and then in your DI module call this classes for instanciation @@ -11,3 +9,29 @@ open class GreetingRepository: SingleObjectRepository() open class BisqStatsRepository: SingleObjectRepository() open class BtcPriceRepository: SingleObjectRepository() open class SettingsRepository: SingleObjectRepository() + +open class MyTradesRepository : SingleObjectRepository() { + init { + runBlocking { + val myTrades = MyTrades( + trades = listOf( + BisqOffer(id = "offer1", isBuy = true, price = 95000, currency = "USD"), + BisqOffer(id = "offer2", isBuy = false, price = 96000, currency = "USD"), + BisqOffer(id = "offer3", isBuy = true, price = 97000, currency = "USD"), + BisqOffer(id = "offer4", isBuy = false, price = 98000, currency = "USD"), + BisqOffer(id = "offer5", isBuy = true, price = 99000, currency = "USD"), + BisqOffer(id = "offer1", isBuy = true, price = 95000, currency = "USD"), + BisqOffer(id = "offer2", isBuy = false, price = 96000, currency = "USD"), + BisqOffer(id = "offer3", isBuy = true, price = 97000, currency = "USD"), + BisqOffer(id = "offer4", isBuy = false, price = 98000, currency = "USD"), + BisqOffer(id = "offer5", isBuy = true, price = 99000, currency = "USD") + ) + ) + + // Use the create method to initialize the data + create(myTrades) + + println("MyTradeRepo :: Created") + } + } +} diff --git a/bisqapps/shared/domain/src/commonMain/kotlin/network/bisq/mobile/domain/di/DomainModule.kt b/bisqapps/shared/domain/src/commonMain/kotlin/network/bisq/mobile/domain/di/DomainModule.kt index 042a5836..e8ed8699 100644 --- a/bisqapps/shared/domain/src/commonMain/kotlin/network/bisq/mobile/domain/di/DomainModule.kt +++ b/bisqapps/shared/domain/src/commonMain/kotlin/network/bisq/mobile/domain/di/DomainModule.kt @@ -1,10 +1,7 @@ package network.bisq.mobile.domain.di import network.bisq.mobile.domain.data.model.Greeting -import network.bisq.mobile.domain.data.repository.BisqStatsRepository -import network.bisq.mobile.domain.data.repository.BtcPriceRepository -import network.bisq.mobile.domain.data.repository.GreetingRepository -import network.bisq.mobile.domain.data.repository.SettingsRepository +import network.bisq.mobile.domain.data.repository.* import org.koin.dsl.module val domainModule = module { @@ -12,4 +9,5 @@ val domainModule = module { single { BisqStatsRepository() } single { BtcPriceRepository() } single { SettingsRepository() } + single { MyTradesRepository() } } diff --git a/bisqapps/shared/presentation/src/commonMain/composeResources/drawable/icon_right_arrow.png b/bisqapps/shared/presentation/src/commonMain/composeResources/drawable/icon_right_arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..50578a06a724d46b0b5c2ad400c6913ec00cdbdf GIT binary patch literal 230 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM3?#3wJbMaA*#!86xB}^hhK5zER`vDu%>;uv zbLLE$G6hJ^o;`cUj2RGe)~s0&SvdLs|NrUgjr>6ULM1_d!3<2yoLu}u!t#o$ntS&@ zdh-0c!@>vafwGKA-tI2KJiBA20XbHlE{-7@=aUm8?ler6-EFa2!CpL!(@joM#z@D; ziRsRgQy;iK8ctSfJgpJ)$Y;l#?#sILrK7IPES+js#APEFBX3PMRKrWmC;Ubej+5i9l?^^M(7HFJANswPK12ZQVx3Ge? zu7QtlaC$~bbzMVq-=rxEJlpqP0jgn4@^*KTn4Q@w2jtj$x;Tb#$g&>fWO7hoVAv2k zX@c>e|I5u78giLEj$1Y?-Me&8u3C+y&}Z=(^IWRbBD70c%kO-zXkOi)yr1C!fAT`c VZ~I(%R{@P;@O1TaS?83{1ORxlWKIA8 literal 0 HcmV?d00001 diff --git a/bisqapps/shared/presentation/src/commonMain/composeResources/drawable/img_no_trades.png b/bisqapps/shared/presentation/src/commonMain/composeResources/drawable/img_no_trades.png new file mode 100644 index 0000000000000000000000000000000000000000..7e932a5f9ea9ae8d8345562e751dba7ff8a7b813 GIT binary patch literal 29941 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 A82|tP literal 0 HcmV?d00001 diff --git a/bisqapps/shared/presentation/src/commonMain/composeResources/drawable/payment_wise.png b/bisqapps/shared/presentation/src/commonMain/composeResources/drawable/payment_wise.png new file mode 100644 index 0000000000000000000000000000000000000000..ea11d1c5f8a326fe8ce73be1ead97fff0a1db8a6 GIT binary patch literal 629 zcmV-*0*d{KP)@chABhFfPJkYu2cI3J8@z=ZDAsB%w|{cG)S2=_V*x+Etz zJA-??HN&ojM;ZPD`Su|u45HG44FCWA2lJU285y45f5mWo^F^?Fbz=nv4lXvheim#t zI)#}sTs(A(;pP3;3~yh2WbjI~L6Lto_Z^&V>8*z%$ArrpqSBC%xN_t+!^7*(;o^V) z{AD=2{w$cy%)-o|VWvdbz&$HYfeiwCImnnnUQ-e-cmCi_hX4N|Y$GR424D!_H}LY& zI}Cdk9|IdEr7Xta9A(b%?&T+jcP~DHYD`NL_Vb P00000NkvXXu0mjffV~lC literal 0 HcmV?d00001 diff --git a/bisqapps/shared/presentation/src/commonMain/composeResources/drawable/payment_zelle.png b/bisqapps/shared/presentation/src/commonMain/composeResources/drawable/payment_zelle.png new file mode 100644 index 0000000000000000000000000000000000000000..f5f5ed035519772632c3dc108774eaaca43df271 GIT binary patch literal 447 zcmV;w0YLtVP)!SMalUt}o(s6!l}hAv=2av4rn<*iZ# zV;OA@TuKC>W+*TbGK>TOHk1V#W+=d`NQ}X=Pz27)38=2cJ{#1aw28wg6!$gw>;+qCf-1h7gOiR!TBI> zB8Mx<27(L&MFt3fA^;Q-!~m?Z98@oflFdM_MNZTpZ-cx~w1Mb(7F!;6OcBQFY8Ge_ zgpyl8NrO;nqwB_p&A<;V(DF MyTradesPresenter( + get(), + tabController = tabController, + myTradesRepository = get() + ) + } bind IMyTrades::class } \ No newline at end of file diff --git a/bisqapps/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/components/atoms/PaymentMethods.kt b/bisqapps/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/components/atoms/PaymentMethods.kt new file mode 100644 index 00000000..dbe595ef --- /dev/null +++ b/bisqapps/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/components/atoms/PaymentMethods.kt @@ -0,0 +1,52 @@ +package network.bisq.mobile.presentation.ui.components.atoms + +import androidx.compose.foundation.Image +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.size +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.unit.dp +import bisqapps.shared.presentation.generated.resources.* +import bisqapps.shared.presentation.generated.resources.Res +import org.jetbrains.compose.resources.painterResource + +// TODO: Get params and render apt +@Composable +fun PaymentMethods() { + Row(horizontalArrangement = Arrangement.spacedBy(12.dp), verticalAlignment = Alignment.CenterVertically) { + Row (horizontalArrangement = Arrangement.spacedBy(12.dp)){ + Image( + painterResource(Res.drawable.payment_ach), "", + modifier = Modifier.size(15.dp) + ) + Image( + painterResource(Res.drawable.payment_strike), "", + modifier = Modifier.size(15.dp) + ) + Image( + painterResource(Res.drawable.payment_ach), "", + modifier = Modifier.size(15.dp) + ) + Image( + painterResource(Res.drawable.payment_uspmo), "", + modifier = Modifier.size(15.dp) + ) + } + Image( + painterResource( Res.drawable.icon_right_arrow), "", + modifier = Modifier.size(24.dp) + ) + Row (horizontalArrangement = Arrangement.spacedBy(12.dp)){ + Image( + painterResource(Res.drawable.payment_bitcoin_round), "", + modifier = Modifier.size(15.dp) + ) + Image( + painterResource(Res.drawable.payment_lightning_round), "", + modifier = Modifier.size(15.dp) + ) + } + } +} \ No newline at end of file diff --git a/bisqapps/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/components/atoms/ProfileRating.kt b/bisqapps/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/components/atoms/ProfileRating.kt new file mode 100644 index 00000000..90bd9eb1 --- /dev/null +++ b/bisqapps/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/components/atoms/ProfileRating.kt @@ -0,0 +1,40 @@ +package network.bisq.mobile.presentation.ui.components.atoms + +import androidx.compose.foundation.Image +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.lazy.LazyRow +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.unit.dp +import bisqapps.shared.presentation.generated.resources.Res +import bisqapps.shared.presentation.generated.resources.icon_star +import bisqapps.shared.presentation.generated.resources.img_bot_image +import org.jetbrains.compose.resources.painterResource + +// TODO: Get params and render apt +@Composable +fun ProfileRating() { + Row(horizontalArrangement = Arrangement.spacedBy(12.dp), verticalAlignment = Alignment.CenterVertically) { + Image( + painterResource(Res.drawable.img_bot_image), "", + modifier = Modifier.size(32.dp) + ) + Column(verticalArrangement = Arrangement.spacedBy(4.dp)) { + BisqText.smallMedium( + text = "Satoshi Ninja" + ) + LazyRow(horizontalArrangement = Arrangement.spacedBy(2.dp)) { + items(5) { + Image( + painterResource(Res.drawable.icon_star), "", + modifier = Modifier.size(10.dp) + ) + } + } + } + } +} \ No newline at end of file diff --git a/bisqapps/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/components/molecules/OfferCard.kt b/bisqapps/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/components/molecules/OfferCard.kt new file mode 100644 index 00000000..036cfb47 --- /dev/null +++ b/bisqapps/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/components/molecules/OfferCard.kt @@ -0,0 +1,80 @@ +package network.bisq.mobile.presentation.ui.components.molecules + +import androidx.compose.foundation.Image +import androidx.compose.foundation.background +import androidx.compose.foundation.clickable +import androidx.compose.foundation.interaction.MutableInteractionSource +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material3.VerticalDivider +import androidx.compose.runtime.Composable +import androidx.compose.runtime.remember +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.clip +import androidx.compose.ui.unit.dp +import bisqapps.shared.presentation.generated.resources.Res +import bisqapps.shared.presentation.generated.resources.icon_chat_outlined +import network.bisq.mobile.presentation.ui.components.atoms.BisqText +import network.bisq.mobile.presentation.ui.components.atoms.PaymentMethods +import network.bisq.mobile.presentation.ui.components.atoms.ProfileRating +import network.bisq.mobile.presentation.ui.theme.BisqTheme +import org.jetbrains.compose.resources.painterResource + +@Composable +fun OfferCard( + onClick: () -> Unit +) { + Row( + modifier = Modifier.clip(shape = RoundedCornerShape(8.dp)).padding(vertical = 5.dp), + + ) { + Row( + modifier = Modifier.background(color = BisqTheme.colors.dark5).padding(12.dp).clickable( + interactionSource = remember { MutableInteractionSource() }, + indication = null, + onClick = onClick + ), + verticalAlignment = Alignment.CenterVertically + ) { + Column(verticalArrangement = Arrangement.spacedBy(12.dp)) { + ProfileRating() + PaymentMethods() + } + Column( + horizontalAlignment = Alignment.End, + verticalArrangement = Arrangement.SpaceBetween + ) { + BisqText.baseBold( + text = "1.00%", + color = BisqTheme.colors.primary + ) + BisqText.smallMedium( + text = "\$52,000 / BTC", + color = BisqTheme.colors.grey1 + ) + BisqText.baseRegular( + text = "\$50 - \$200", + color = BisqTheme.colors.light1 + ) + } + } + VerticalDivider(thickness = 2.dp, color = BisqTheme.colors.grey3, modifier = Modifier.height(98.dp)) + Column( + verticalArrangement = Arrangement.Center, + modifier = Modifier.background(color = BisqTheme.colors.dark4) + .padding(horizontal = 10.dp, vertical = 41.dp) + ) { + Image( + painterResource( + Res.drawable.icon_chat_outlined), "", + modifier = Modifier.size(16.dp), + ) + } + } +} \ No newline at end of file diff --git a/bisqapps/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/uicases/startup/SplashPresenter.kt b/bisqapps/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/uicases/startup/SplashPresenter.kt index 0edf5b30..9af901eb 100644 --- a/bisqapps/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/uicases/startup/SplashPresenter.kt +++ b/bisqapps/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/uicases/startup/SplashPresenter.kt @@ -40,7 +40,7 @@ open class SplashPresenter( // If firstTimeApp launch, goto Onboarding[clientMode] (androidNode / xClient) // If not, goto TabContainerScreen rootNavigator.navigate(Routes.Onboarding.name) { - // navController.navigate(Routes.TabContainer.name) { + // rootNavigator.navigate(Routes.TabContainer.name) { popUpTo(Routes.Splash.name) { inclusive = true } } } diff --git a/bisqapps/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/uicases/trades/MyTrades.kt b/bisqapps/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/uicases/trades/MyTrades.kt deleted file mode 100644 index f48a8b7e..00000000 --- a/bisqapps/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/uicases/trades/MyTrades.kt +++ /dev/null @@ -1,32 +0,0 @@ - -package network.bisq.mobile.presentation.ui.uicases.trades - -import androidx.compose.foundation.layout.* -import androidx.compose.runtime.Composable -import androidx.compose.ui.Alignment -import androidx.compose.ui.Modifier -import androidx.navigation.NavController -import androidx.navigation.NavHostController -import network.bisq.mobile.presentation.ui.components.atoms.BisqText -import network.bisq.mobile.presentation.ui.components.layout.BisqScrollLayout -import network.bisq.mobile.presentation.ui.theme.BisqTheme -import org.jetbrains.compose.resources.ExperimentalResourceApi -import org.koin.compose.koinInject -import org.koin.core.qualifier.named - -@OptIn(ExperimentalResourceApi::class) -@Composable -fun MyTradesScreen() { - BisqScrollLayout(verticalArrangement = Arrangement.Center) { - Box( - modifier = Modifier - .fillMaxSize(), - contentAlignment = Alignment.Center - ) { - BisqText.h2Regular( - text = "My Trades", - color = BisqTheme.colors.light1, - ) - } - } -} \ No newline at end of file diff --git a/bisqapps/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/uicases/trades/MyTradesPresenter.kt b/bisqapps/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/uicases/trades/MyTradesPresenter.kt new file mode 100644 index 00000000..55e2299a --- /dev/null +++ b/bisqapps/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/uicases/trades/MyTradesPresenter.kt @@ -0,0 +1,61 @@ +package network.bisq.mobile.presentation.ui.uicases.trades + +import androidx.navigation.NavController +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.delay +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.StateFlow +import kotlinx.coroutines.launch +import network.bisq.mobile.domain.data.BackgroundDispatcher +import network.bisq.mobile.domain.data.model.BisqOffer +import network.bisq.mobile.domain.data.repository.MyTradesRepository +import network.bisq.mobile.presentation.BasePresenter +import network.bisq.mobile.presentation.MainPresenter +import network.bisq.mobile.presentation.ui.navigation.Routes + +class MyTradesPresenter( + mainPresenter: MainPresenter, + private val tabController: NavController, + private val myTradesRepository: MyTradesRepository +) : BasePresenter(mainPresenter), IMyTrades { + + private val _myTrades = MutableStateFlow>(emptyList()) + override val myTrades: StateFlow> = _myTrades + + override fun navigateToExchange() { + // tabController.navigate(Routes.TabExchange.name) + + tabController.navigate(Routes.TabExchange.name) { + tabController.graph.startDestinationRoute?.let { route -> + popUpTo(route) { + saveState = true + } + } + launchSingleTop = true + restoreState = true + } + } + + private fun refresh() { + CoroutineScope(BackgroundDispatcher).launch { + try { + delay(1000) // TODO: To simulate loading. Yet to be handled + val trades = myTradesRepository.fetch() + _myTrades.value = trades?.trades ?: emptyList() + } catch (e: Exception) { + // Handle errors + println("Error: ${e.message}") + } + } + } + + override fun onViewAttached() { + super.onViewAttached() + refresh() + } + + override fun onResume() { + super.onResume() + refresh() + } +} \ No newline at end of file diff --git a/bisqapps/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/uicases/trades/MyTradesScreen.kt b/bisqapps/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/uicases/trades/MyTradesScreen.kt new file mode 100644 index 00000000..d135e3eb --- /dev/null +++ b/bisqapps/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/uicases/trades/MyTradesScreen.kt @@ -0,0 +1,92 @@ +package network.bisq.mobile.presentation.ui.uicases.trades + +import androidx.compose.foundation.Image +import androidx.compose.foundation.layout.* +import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.foundation.lazy.items +import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.collectAsState +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.text.style.TextAlign +import androidx.compose.ui.unit.dp +import androidx.navigation.NavHostController +import bisqapps.shared.presentation.generated.resources.Res +import bisqapps.shared.presentation.generated.resources.img_no_trades +import kotlinx.coroutines.flow.StateFlow +import network.bisq.mobile.domain.data.model.BisqOffer +import network.bisq.mobile.presentation.ViewPresenter +import network.bisq.mobile.presentation.ui.components.atoms.BisqButton +import network.bisq.mobile.presentation.ui.components.atoms.BisqText +import network.bisq.mobile.presentation.ui.components.layout.BisqScrollLayout +import network.bisq.mobile.presentation.ui.components.molecules.OfferCard +import network.bisq.mobile.presentation.ui.theme.BisqTheme +import org.jetbrains.compose.resources.painterResource +import org.koin.compose.koinInject +import org.koin.core.parameter.parametersOf +import org.koin.core.qualifier.named + +interface IMyTrades: ViewPresenter { + val myTrades: StateFlow> + + fun navigateToExchange() +} + +@Composable +fun MyTradesScreen() { + val navController: NavHostController = koinInject(named("RootNavController")) + val tabController: NavHostController = koinInject(named("TabNavController")) + + val presenter: IMyTrades = koinInject { parametersOf(navController, tabController) } + + val myTrades: List = presenter.myTrades.collectAsState().value + + LaunchedEffect(Unit) { + presenter.onViewAttached() + } + + if (myTrades.isEmpty()) { + NoTradesSection(presenter) + } else { + TradeList(presenter, myTrades) + } + +} + + +@Composable +fun TradeList(presenter: IMyTrades, myTrades: List) { + + LazyColumn(modifier = Modifier.padding(top= 48.dp)) { + items(myTrades) { offer -> + OfferCard( onClick = {} ) + } + } + +} + +@Composable +fun NoTradesSection(presenter: IMyTrades) { + BisqScrollLayout(verticalArrangement = Arrangement.Center) { + Column( + modifier = Modifier.padding(vertical = 52.dp), + horizontalAlignment = Alignment.CenterHorizontally, + verticalArrangement = Arrangement.spacedBy(64.dp) + ){ + Image( + painterResource(Res.drawable.img_no_trades), "", + modifier = Modifier.height(272.dp).width(350.dp) + ) + BisqText.h3Regular( + text = "A journey of a thousand miles begins with a first step!", + color = BisqTheme.colors.light1, + textAlign = TextAlign.Center + ) + BisqButton( + text = "Start your first trade", + onClick = { presenter.navigateToExchange() } + ) + } + } +} \ No newline at end of file From a569dcc7bd27adef86ed0adb51fd268b56384a47 Mon Sep 17 00:00:00 2001 From: nostrbuddha Date: Fri, 22 Nov 2024 08:18:11 +0530 Subject: [PATCH 2/8] Buy/Sell UI - Dialog component - Exchange screen improvements - Offerbook UI - Basic --- .../ui/components/CurrencyProfileCard.kt | 8 +- .../ui/components/layout/StaticLayout.kt | 28 ++++++ .../ui/components/molecules/BisqDialog.kt | 48 +++++++++++ .../ui/components/molecules/StateToggle.kt | 86 +++++++++++++++++++ .../BisqPagerView.kt => PagerView.kt} | 2 +- .../ui/components/organisms/TradeAlert.kt | 50 +++++++++++ .../ui/uicases/exchange/ExchangeScreen.kt | 61 +++++++------ .../ui/uicases/exchange/OffersListScreen.kt | 74 ++++++++++++++++ .../ui/uicases/startup/OnBoardingScreen.kt | 2 +- 9 files changed, 324 insertions(+), 35 deletions(-) create mode 100644 bisqapps/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/components/layout/StaticLayout.kt create mode 100644 bisqapps/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/components/molecules/BisqDialog.kt create mode 100644 bisqapps/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/components/molecules/StateToggle.kt rename bisqapps/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/components/organisms/{startup/BisqPagerView.kt => PagerView.kt} (99%) create mode 100644 bisqapps/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/components/organisms/TradeAlert.kt create mode 100644 bisqapps/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/uicases/exchange/OffersListScreen.kt diff --git a/bisqapps/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/components/CurrencyProfileCard.kt b/bisqapps/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/components/CurrencyProfileCard.kt index 3bfdcca4..ff72ce77 100644 --- a/bisqapps/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/components/CurrencyProfileCard.kt +++ b/bisqapps/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/components/CurrencyProfileCard.kt @@ -24,9 +24,13 @@ import org.jetbrains.compose.resources.painterResource @OptIn(ExperimentalResourceApi::class) @Composable -fun CurrencyProfileCard(currencyName: String, currencyShort: String, image: DrawableResource) { +fun CurrencyProfileCard( + currencyName: String, + currencyShort: String, + image: DrawableResource, + onClick: () -> Unit) { Row( - modifier = Modifier.fillMaxWidth().padding(horizontal = 14.dp, vertical = 16.dp), + modifier = Modifier.fillMaxWidth().padding(horizontal = 14.dp, vertical = 4.dp), verticalAlignment = Alignment.CenterVertically, horizontalArrangement = Arrangement.SpaceBetween ) { diff --git a/bisqapps/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/components/layout/StaticLayout.kt b/bisqapps/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/components/layout/StaticLayout.kt new file mode 100644 index 00000000..f33c8d59 --- /dev/null +++ b/bisqapps/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/components/layout/StaticLayout.kt @@ -0,0 +1,28 @@ +package network.bisq.mobile.presentation.ui.components.layout + +import androidx.compose.foundation.background +import androidx.compose.foundation.layout.* +import androidx.compose.material3.Scaffold +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.unit.dp +import network.bisq.mobile.presentation.ui.theme.BisqTheme + +@Composable +fun BisqStaticLayout( + innerPadding: PaddingValues = PaddingValues(top = 48.dp, bottom = 12.dp, start = 12.dp, end = 12.dp), + verticalArrangement: Arrangement.Vertical = Arrangement.SpaceBetween, + content: @Composable ColumnScope.() -> Unit +) { + Column( + verticalArrangement = verticalArrangement, + horizontalAlignment = Alignment.CenterHorizontally, + modifier = Modifier + .fillMaxSize() + .background(color = BisqTheme.colors.backgroundColor) + .padding(innerPadding) + ) { + content() + } +} diff --git a/bisqapps/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/components/molecules/BisqDialog.kt b/bisqapps/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/components/molecules/BisqDialog.kt new file mode 100644 index 00000000..aa93a0fa --- /dev/null +++ b/bisqapps/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/components/molecules/BisqDialog.kt @@ -0,0 +1,48 @@ +package network.bisq.mobile.presentation.ui.components.molecules + +import androidx.compose.foundation.BorderStroke +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.ColumnScope +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material3.Card +import androidx.compose.material3.CardColors +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.unit.dp +import androidx.compose.ui.window.Dialog +import network.bisq.mobile.presentation.ui.theme.BisqTheme + +@Composable +fun BisqDialog( + onDismissRequest: () -> Unit = {}, + content: @Composable ColumnScope.() -> Unit = {} +){ + Dialog(onDismissRequest = { onDismissRequest() }) { + Box( + modifier = Modifier + .fillMaxSize() + .padding(top = 86.dp) + ) { + Card( + modifier = Modifier + .align(Alignment.TopCenter) + .fillMaxWidth(), + colors = CardColors( + containerColor = BisqTheme.colors.dark3, + contentColor = Color.Unspecified, + disabledContainerColor = Color.Unspecified, + disabledContentColor = Color.Unspecified, + ), + border = BorderStroke(1.dp, color = BisqTheme.colors.grey3), + shape = RoundedCornerShape(8.dp), + ) { + content() + } + } + } +} \ No newline at end of file diff --git a/bisqapps/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/components/molecules/StateToggle.kt b/bisqapps/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/components/molecules/StateToggle.kt new file mode 100644 index 00000000..577d41cc --- /dev/null +++ b/bisqapps/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/components/molecules/StateToggle.kt @@ -0,0 +1,86 @@ +package network.bisq.mobile.presentation.ui.components.molecules + +import androidx.compose.animation.core.animateDpAsState +import androidx.compose.animation.core.tween +import androidx.compose.foundation.background +import androidx.compose.foundation.clickable +import androidx.compose.foundation.interaction.MutableInteractionSource +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.offset +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.wrapContentSize +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material3.Surface +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.alpha +import androidx.compose.ui.unit.Dp +import androidx.compose.ui.unit.dp +import network.bisq.mobile.presentation.ui.components.atoms.BisqText +import network.bisq.mobile.presentation.ui.theme.BisqTheme + +@Composable +fun StateToggle( + states: List, + transitionX: Dp +) { + var selectedOption by remember { + mutableStateOf(states[0]) + } + + val slideOffset by animateDpAsState( + targetValue = if (selectedOption == states[0]) 0.dp else transitionX, + animationSpec = tween(durationMillis = 300) + ) + + Surface( + shape = RoundedCornerShape(6.dp), + modifier = Modifier.wrapContentSize() + ) { + Box( + modifier = Modifier + .background(BisqTheme.colors.dark5) + .padding(6.dp) + ) { + Box( + modifier = Modifier + .offset(x = slideOffset) + .background(BisqTheme.colors.primary, RoundedCornerShape(4.dp)) + ) { + + BisqText.baseMedium( + text = selectedOption, + color = BisqTheme.colors.light1, + modifier = Modifier + .padding(horizontal = 32.dp, vertical = 12.dp) + .alpha(0f), + ) + } + Row( + verticalAlignment = Alignment.CenterVertically, + ) { + states.forEach { text -> + BisqText.baseMedium( + text = text, + color = BisqTheme.colors.light1, + modifier = Modifier + .padding(horizontal = 32.dp, vertical = 12.dp) + .clickable( + interactionSource = remember { MutableInteractionSource() }, + indication = null, + onClick = { + selectedOption = text + } + ) + ) + } + } + } + } +} \ No newline at end of file diff --git a/bisqapps/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/components/organisms/startup/BisqPagerView.kt b/bisqapps/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/components/organisms/PagerView.kt similarity index 99% rename from bisqapps/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/components/organisms/startup/BisqPagerView.kt rename to bisqapps/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/components/organisms/PagerView.kt index 5eb52c46..ba4959e1 100644 --- a/bisqapps/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/components/organisms/startup/BisqPagerView.kt +++ b/bisqapps/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/components/organisms/PagerView.kt @@ -1,4 +1,4 @@ -package network.bisq.mobile.presentation.ui.components.organisms.startup +package network.bisq.mobile.presentation.ui.components.organisms import androidx.compose.foundation.Image import androidx.compose.foundation.background diff --git a/bisqapps/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/components/organisms/TradeAlert.kt b/bisqapps/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/components/organisms/TradeAlert.kt new file mode 100644 index 00000000..efd6f512 --- /dev/null +++ b/bisqapps/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/components/organisms/TradeAlert.kt @@ -0,0 +1,50 @@ +package network.bisq.mobile.presentation.ui.components.organisms + +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.PaddingValues +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.padding +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.unit.dp +import androidx.navigation.NavController +import network.bisq.mobile.presentation.ui.components.atoms.BisqButton +import network.bisq.mobile.presentation.ui.components.atoms.BisqText +import network.bisq.mobile.presentation.ui.theme.BisqTheme + + +@Composable +fun TradeAlert( + onDismissRequest: () -> Unit, + rootNavController: NavController +) { + + Column( + modifier = Modifier.padding(vertical = 24.dp, horizontal = 20.dp), + horizontalAlignment = Alignment.CenterHorizontally, + verticalArrangement = Arrangement.spacedBy(20.dp) + ) { + BisqText.h6Regular( + text = "Do you want to take this trade?", + color = BisqTheme.colors.light1, + modifier = Modifier.padding(vertical = 12.dp) + ) + Row(horizontalArrangement = Arrangement.spacedBy(12.dp)) { + BisqButton( + text = "Cancel", + backgroundColor = BisqTheme.colors.dark5, + onClick = { onDismissRequest() }, + padding = PaddingValues(horizontal = 42.dp, vertical = 4.dp) + ) + BisqButton( + text = "Yes, please", + onClick = { + onDismissRequest() + }, + padding = PaddingValues(horizontal = 32.dp, vertical = 4.dp) + ) + } + } +} \ No newline at end of file diff --git a/bisqapps/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/uicases/exchange/ExchangeScreen.kt b/bisqapps/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/uicases/exchange/ExchangeScreen.kt index d35b16d0..b82ba193 100644 --- a/bisqapps/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/uicases/exchange/ExchangeScreen.kt +++ b/bisqapps/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/uicases/exchange/ExchangeScreen.kt @@ -1,16 +1,6 @@ package network.bisq.mobile.presentation.ui.uicases.exchange -import androidx.compose.foundation.layout.Arrangement -import androidx.compose.foundation.layout.Box -import androidx.compose.foundation.layout.Column -import androidx.compose.foundation.layout.Row -import androidx.compose.foundation.layout.Spacer -import androidx.compose.foundation.layout.fillMaxSize -import androidx.compose.foundation.layout.fillMaxWidth -import androidx.compose.foundation.layout.height -import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.layout.size -import androidx.compose.foundation.layout.width +import androidx.compose.foundation.layout.* import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier @@ -23,8 +13,10 @@ import bisqapps.shared.presentation.generated.resources.currency_gpb import bisqapps.shared.presentation.generated.resources.currency_usd import network.bisq.mobile.presentation.ui.components.CurrencyProfileCard import network.bisq.mobile.components.MaterialTextField +import network.bisq.mobile.presentation.ui.components.atoms.BisqButton import network.bisq.mobile.presentation.ui.components.molecules.TopBar import network.bisq.mobile.presentation.ui.components.atoms.icons.SortIcon +import network.bisq.mobile.presentation.ui.components.layout.BisqStaticLayout import org.jetbrains.compose.resources.ExperimentalResourceApi import org.koin.compose.koinInject import org.koin.core.qualifier.named @@ -33,27 +25,34 @@ import org.koin.core.qualifier.named fun ExchangeScreen() { val navController: NavHostController = koinInject(named("RootNavController")) val originDirection = LocalLayoutDirection.current - Column( - modifier = Modifier.fillMaxSize() - ) { -// TopBar("Buy/Sell") - Column(modifier = Modifier.padding(vertical = 12.dp, horizontal = 32.dp)) { - Row( - modifier = Modifier.fillMaxWidth(), - verticalAlignment = Alignment.CenterVertically, - horizontalArrangement = Arrangement.SpaceBetween - ) { - Box(modifier = Modifier.width(250.dp)) { - MaterialTextField(text = "Search", onValueChanged = {}) - } - SortIcon(modifier = Modifier.size(24.dp)) - } - Spacer(modifier = Modifier.height(12.dp)) - Column(verticalArrangement = Arrangement.spacedBy(12.dp)) { - CurrencyProfileCard("US Dollars", "USD", Res.drawable.currency_usd) - CurrencyProfileCard("Euro", "EUR", Res.drawable.currency_euro) - CurrencyProfileCard("British Pounds", "GPB", Res.drawable.currency_gpb) + BisqStaticLayout(verticalArrangement = Arrangement.Top) { + Row( + modifier = Modifier.fillMaxWidth(), + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.SpaceBetween, + ) { + Box() { + MaterialTextField(text = "Search", onValueChanged = {}) } + SortIcon(modifier = Modifier.size(24.dp)) + } + Spacer(modifier = Modifier.height(12.dp)) + Column(verticalArrangement = Arrangement.spacedBy(12.dp)) { + CurrencyProfileCard( + "US Dollars", + "USD", + Res.drawable.currency_usd, + onClick = {}) + CurrencyProfileCard( + "Euro", + "EUR", + Res.drawable.currency_euro, + onClick = {}) + CurrencyProfileCard( + "British Pounds", + "GPB", + Res.drawable.currency_gpb, + onClick = {}) } } } \ No newline at end of file diff --git a/bisqapps/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/uicases/exchange/OffersListScreen.kt b/bisqapps/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/uicases/exchange/OffersListScreen.kt new file mode 100644 index 00000000..08b2b109 --- /dev/null +++ b/bisqapps/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/uicases/exchange/OffersListScreen.kt @@ -0,0 +1,74 @@ +package network.bisq.mobile.presentation.ui.uicases.exchange + + +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.PaddingValues +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.runtime.Composable +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.blur +import androidx.compose.ui.unit.dp +import androidx.navigation.NavController +import network.bisq.mobile.presentation.ui.components.layout.BisqStaticLayout +import network.bisq.mobile.presentation.ui.components.molecules.* +import network.bisq.mobile.presentation.ui.components.organisms.TradeAlert + +@Composable +fun OffersListScreen( + rootNavController: NavController, + innerPadding: PaddingValues, +) { + val states = listOf( + "Buy from", + "Sell to" + ) + val openDialog = remember { mutableStateOf(false) } + + BisqStaticLayout { + Box(modifier = Modifier.fillMaxSize().blur(if (openDialog.value) 12.dp else 0.dp)) { + Column { + Column( + modifier = Modifier.fillMaxWidth(), + horizontalAlignment = Alignment.CenterHorizontally + ) { + StateToggle(states, 130.dp) + + Spacer(modifier = Modifier.height(32.dp)) + LazyColumn( + modifier = Modifier.padding(10.dp), + verticalArrangement = Arrangement.spacedBy(18.dp) + ) { + items(3) { + OfferCard(onClick = { + openDialog.value = !openDialog.value + }) + } + } + + if (openDialog.value) { + BisqDialog { + TradeAlert( + onDismissRequest = { + openDialog.value = !openDialog.value + }, + rootNavController = rootNavController + ) + } + } + + } + } + } + } +} + diff --git a/bisqapps/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/uicases/startup/OnBoardingScreen.kt b/bisqapps/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/uicases/startup/OnBoardingScreen.kt index 787c5cf8..6bd9c84f 100644 --- a/bisqapps/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/uicases/startup/OnBoardingScreen.kt +++ b/bisqapps/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/uicases/startup/OnBoardingScreen.kt @@ -16,7 +16,7 @@ import network.bisq.mobile.presentation.ui.components.atoms.icons.BisqLogo import network.bisq.mobile.presentation.ui.components.atoms.BisqButton import network.bisq.mobile.presentation.ui.components.atoms.BisqText import network.bisq.mobile.presentation.ui.components.layout.BisqScrollScaffold -import network.bisq.mobile.presentation.ui.components.organisms.startup.BisqPagerView +import network.bisq.mobile.presentation.ui.components.organisms.BisqPagerView import network.bisq.mobile.presentation.ui.composeModels.PagerViewItem import network.bisq.mobile.presentation.ui.helpers.RememberPresenterLifecycle import network.bisq.mobile.presentation.ui.theme.* From e1a806134b039c0f457b2f5c40477417546d8beb Mon Sep 17 00:00:00 2001 From: nostrbuddha Date: Tue, 26 Nov 2024 12:50:29 +0530 Subject: [PATCH 3/8] - CurrencyRepository; Dialog component; Improved CurrencyListScreen and OfferListScreen --- .../mobile/domain/data/model/Currencies.kt | 18 +++++ .../data/repository/CurrenciesRepository.kt | 54 ++++++++++++++ .../domain/data/repository/Repositories.kt | 1 - .../bisq/mobile/domain/di/DomainModule.kt | 1 + bisqapps/shared/presentation/build.gradle.kts | 2 + .../drawable/currency_aed.png | Bin 0 -> 2355 bytes .../drawable/currency_ars.png | Bin 0 -> 3181 bytes .../drawable/currency_aud.png | Bin 0 -> 4666 bytes .../drawable/currency_eur.png | Bin 0 -> 4199 bytes .../drawable/currency_euro.png | Bin 2010 -> 0 bytes .../drawable/currency_gbp.png | Bin 0 -> 4055 bytes .../drawable/currency_gpb.png | Bin 2358 -> 0 bytes .../drawable/currency_jpy.png | Bin 0 -> 3227 bytes .../drawable/currency_qar.png | Bin 0 -> 3820 bytes .../drawable/currency_sek.png | Bin 0 -> 2623 bytes .../drawable/currency_sgd.png | Bin 0 -> 3484 bytes .../drawable/currency_usd.png | Bin 1975 -> 4159 bytes .../presentation/di/PresentationModule.kt | 8 ++ .../ui/components/CurrencyProfileCard.kt | 62 ++++++++++------ .../ui/components/atoms/DynamicImage.kt | 29 ++++++++ .../ui/components/layout/ScrollScaffold.kt | 14 +--- .../ui/components/layout/StaticScaffold.kt | 16 +--- .../ui/components/molecules/BisqDialog.kt | 2 +- .../molecules/ConfirmationDialog.kt | 50 +++++++++++++ .../ui/components/organisms/TradeAlert.kt | 50 ------------- .../presentation/ui/composeModels/model.kt | 2 +- .../presentation/ui/navigation/Routes.kt | 3 +- .../ui/navigation/graph/RootNavGraph.kt | 10 +++ .../ui/navigation/graph/TabNavGraph.kt | 6 +- .../ui/uicases/TabContainerScreen.kt | 7 +- .../ui/uicases/exchange/ExchangeScreen.kt | 58 --------------- .../uicases/offers/CurrencyListPresenter.kt | 49 ++++++++++++ .../ui/uicases/offers/CurrencyListScreen.kt | 57 ++++++++++++++ .../ui/uicases/offers/OffersListPresenter.kt | 14 ++++ .../{exchange => offers}/OffersListScreen.kt | 70 +++++++++++------- .../ui/uicases/startup/CreateProfileScreen.kt | 3 +- .../ui/uicases/startup/OnBoardingScreen.kt | 3 +- .../ui/uicases/startup/SplashPresenter.kt | 5 +- .../ui/uicases/trades/MyTradesPresenter.kt | 5 +- .../ui/uicases/trades/MyTradesScreen.kt | 4 +- 40 files changed, 398 insertions(+), 205 deletions(-) create mode 100644 bisqapps/shared/domain/src/commonMain/kotlin/network/bisq/mobile/domain/data/model/Currencies.kt create mode 100644 bisqapps/shared/domain/src/commonMain/kotlin/network/bisq/mobile/domain/data/repository/CurrenciesRepository.kt create mode 100644 bisqapps/shared/presentation/src/commonMain/composeResources/drawable/currency_aed.png create mode 100644 bisqapps/shared/presentation/src/commonMain/composeResources/drawable/currency_ars.png create mode 100644 bisqapps/shared/presentation/src/commonMain/composeResources/drawable/currency_aud.png create mode 100644 bisqapps/shared/presentation/src/commonMain/composeResources/drawable/currency_eur.png delete mode 100644 bisqapps/shared/presentation/src/commonMain/composeResources/drawable/currency_euro.png create mode 100644 bisqapps/shared/presentation/src/commonMain/composeResources/drawable/currency_gbp.png delete mode 100644 bisqapps/shared/presentation/src/commonMain/composeResources/drawable/currency_gpb.png create mode 100644 bisqapps/shared/presentation/src/commonMain/composeResources/drawable/currency_jpy.png create mode 100644 bisqapps/shared/presentation/src/commonMain/composeResources/drawable/currency_qar.png create mode 100644 bisqapps/shared/presentation/src/commonMain/composeResources/drawable/currency_sek.png create mode 100644 bisqapps/shared/presentation/src/commonMain/composeResources/drawable/currency_sgd.png create mode 100644 bisqapps/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/components/atoms/DynamicImage.kt create mode 100644 bisqapps/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/components/molecules/ConfirmationDialog.kt delete mode 100644 bisqapps/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/components/organisms/TradeAlert.kt delete mode 100644 bisqapps/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/uicases/exchange/ExchangeScreen.kt create mode 100644 bisqapps/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/uicases/offers/CurrencyListPresenter.kt create mode 100644 bisqapps/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/uicases/offers/CurrencyListScreen.kt create mode 100644 bisqapps/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/uicases/offers/OffersListPresenter.kt rename bisqapps/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/uicases/{exchange => offers}/OffersListScreen.kt (52%) diff --git a/bisqapps/shared/domain/src/commonMain/kotlin/network/bisq/mobile/domain/data/model/Currencies.kt b/bisqapps/shared/domain/src/commonMain/kotlin/network/bisq/mobile/domain/data/model/Currencies.kt new file mode 100644 index 00000000..b5ff1b74 --- /dev/null +++ b/bisqapps/shared/domain/src/commonMain/kotlin/network/bisq/mobile/domain/data/model/Currencies.kt @@ -0,0 +1,18 @@ +package network.bisq.mobile.domain.data.model + +data class FiatCurrency( + val flagImage: String, + val name: String, + val code: String, + val offerCount: Number +) + +class Currencies(val currencies: List = listOf()): BaseModel() + +interface CurrenciesFactory { + fun createCurrencies(): Currencies +} + +class DefaultCurrenciesFactory : CurrenciesFactory { + override fun createCurrencies() = Currencies() +} \ No newline at end of file diff --git a/bisqapps/shared/domain/src/commonMain/kotlin/network/bisq/mobile/domain/data/repository/CurrenciesRepository.kt b/bisqapps/shared/domain/src/commonMain/kotlin/network/bisq/mobile/domain/data/repository/CurrenciesRepository.kt new file mode 100644 index 00000000..940e434b --- /dev/null +++ b/bisqapps/shared/domain/src/commonMain/kotlin/network/bisq/mobile/domain/data/repository/CurrenciesRepository.kt @@ -0,0 +1,54 @@ +package network.bisq.mobile.domain.data.repository + +import kotlinx.coroutines.runBlocking +import network.bisq.mobile.domain.data.model.Currencies +import network.bisq.mobile.domain.data.model.FiatCurrency + +// TODO: +// androidNode will populate List from bisq2 libs +// xClients will populate List via API +open class CurrenciesRepository : SingleObjectRepository() { + init { + runBlocking { + val currencies = Currencies( + currencies = listOf( + FiatCurrency( + flagImage = "currency_aed.png", + name = "United Arab Emirates Dirham", + code = "aed", + offerCount = 9 + ), + FiatCurrency(flagImage = "currency_ars.png", name = "Argentine Peso", code = "ars", offerCount = 0), + FiatCurrency( + flagImage = "currency_aud.png", + name = "Australian Dollar", + code = "aud", + offerCount = 12 + ), + FiatCurrency(flagImage = "currency_eur.png", name = "Euro", code = "eur", offerCount = 66), + FiatCurrency( + flagImage = "currency_gbp.png", + name = "British Pound Sterling", + code = "gbp", + offerCount = 3 + ), + + FiatCurrency(flagImage = "currency_jpy.png", name = "Japanese Yen", code = "jpy", offerCount = 2), + + FiatCurrency(flagImage = "currency_ngn.png", name = "Nigerian Naira", code = "ngn", offerCount = 23), + + FiatCurrency(flagImage = "currency_qar.png", name = "Qatari Rial", code = "qar", offerCount = 4), + FiatCurrency(flagImage = "currency_sek.png", name = "Swedish Krona", code = "sek", offerCount = 18), + FiatCurrency( + flagImage = "currency_sgd.png", + name = "Singapore Dollar", + code = "sgd", + offerCount = 16 + ), + FiatCurrency(flagImage = "currency_usd.png", name = "US Dollar", code = "usd", offerCount = 62), + ) + ) + create(currencies) + } + } +} \ No newline at end of file diff --git a/bisqapps/shared/domain/src/commonMain/kotlin/network/bisq/mobile/domain/data/repository/Repositories.kt b/bisqapps/shared/domain/src/commonMain/kotlin/network/bisq/mobile/domain/data/repository/Repositories.kt index a762cfd4..a2cc2f3d 100644 --- a/bisqapps/shared/domain/src/commonMain/kotlin/network/bisq/mobile/domain/data/repository/Repositories.kt +++ b/bisqapps/shared/domain/src/commonMain/kotlin/network/bisq/mobile/domain/data/repository/Repositories.kt @@ -28,7 +28,6 @@ open class MyTradesRepository : SingleObjectRepository() { ) ) - // Use the create method to initialize the data create(myTrades) println("MyTradeRepo :: Created") diff --git a/bisqapps/shared/domain/src/commonMain/kotlin/network/bisq/mobile/domain/di/DomainModule.kt b/bisqapps/shared/domain/src/commonMain/kotlin/network/bisq/mobile/domain/di/DomainModule.kt index e8ed8699..cd0b9c0d 100644 --- a/bisqapps/shared/domain/src/commonMain/kotlin/network/bisq/mobile/domain/di/DomainModule.kt +++ b/bisqapps/shared/domain/src/commonMain/kotlin/network/bisq/mobile/domain/di/DomainModule.kt @@ -10,4 +10,5 @@ val domainModule = module { single { BtcPriceRepository() } single { SettingsRepository() } single { MyTradesRepository() } + single { CurrenciesRepository() } } diff --git a/bisqapps/shared/presentation/build.gradle.kts b/bisqapps/shared/presentation/build.gradle.kts index 02b64446..23fde293 100644 --- a/bisqapps/shared/presentation/build.gradle.kts +++ b/bisqapps/shared/presentation/build.gradle.kts @@ -94,6 +94,8 @@ kotlin { implementation(libs.navigation.compose) implementation(libs.lyricist) + implementation(libs.coil.compose) + } val commonTest by getting { dependencies { diff --git a/bisqapps/shared/presentation/src/commonMain/composeResources/drawable/currency_aed.png b/bisqapps/shared/presentation/src/commonMain/composeResources/drawable/currency_aed.png new file mode 100644 index 0000000000000000000000000000000000000000..f33edfdc3f930496e8dbb8e4d483ab83da632ba2 GIT binary patch literal 2355 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 ZzySMNnL<}P9m)Uz002ovPDHLkV1i}uU$X!J literal 0 HcmV?d00001 diff --git a/bisqapps/shared/presentation/src/commonMain/composeResources/drawable/currency_ars.png b/bisqapps/shared/presentation/src/commonMain/composeResources/drawable/currency_ars.png new file mode 100644 index 0000000000000000000000000000000000000000..7fea323ed0f67d7b96ca6380c6483c62271bb490 GIT binary patch literal 3181 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 diff --git a/bisqapps/shared/presentation/src/commonMain/composeResources/drawable/currency_gbp.png b/bisqapps/shared/presentation/src/commonMain/composeResources/drawable/currency_gbp.png new file mode 100644 index 0000000000000000000000000000000000000000..eddcabab0ef5dd948b3d4eff489659ce151848ed GIT binary patch literal 4055 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 JPDHLkV1n9Wj;;Uz literal 0 HcmV?d00001 diff --git a/bisqapps/shared/presentation/src/commonMain/composeResources/drawable/currency_gpb.png b/bisqapps/shared/presentation/src/commonMain/composeResources/drawable/currency_gpb.png deleted file mode 100644 index 643fb3b616b4ab6e85eb985ab37b213972d36092..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2358 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�}LPC03>~@6*fJ7o9 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 literal 0 HcmV?d00001 diff --git a/bisqapps/shared/presentation/src/commonMain/composeResources/drawable/currency_sgd.png b/bisqapps/shared/presentation/src/commonMain/composeResources/drawable/currency_sgd.png new file mode 100644 index 0000000000000000000000000000000000000000..08c63538bf4795e61a5be8c05f8b90d16367ad4e GIT binary patch literal 3484 zcmV;N4P)|&P)~;* zw*#WB3f?Oh;5mB&&claLSAGP}{b%7mN1sV#FnQ6S!eB69&z?O^; z2sGRlbQuNpYIvPxuy0<0ss*3HRuYM`8jVIAJ9Z3av)OL}k+%K>cmfh%?E~$-0=;$+ zU@O6nv@vmx0D0sBszJ~XACN5xx2#QI3@Aw*{C%8v7p@^K;3H})m)Y}~cf zMMOWc@SHq1>%s4!y?ZIrN){k>RY$~R{UQX6hVjWY$k;Oy#4{?iTLXnl>H`SHv zQS`nVu)Z^!QX_qUpw{IcyrzE8_b)`+rg1p;&;_`E zh?)k()6NIMH&k~SEx-=-!26M~W|c~ zFFy_4q{m@evjmEqTLXDx>l<6;9nf@Ng4FeiP$Wf#0QUL!k+QOJ@Q@t#Jpw z!saL8_7Biu6=kBDhzXbu^BnT|`Xl$7232F&v!(tr^#KK=~i z^DRw)mxL@m3!0G+5O}*}0q!pk!nt`nf!9eRWU;Z*zG(9whWE^Q)Gl5Inb!!{|0u6p z_Ng>Rk&*^Mmk6K23H9*%iGVEBO!=1dk#xagYqdK(j`*kd!SVSgs9qd40jW@?&p`4V zm$WlYH5X#~{}w`GJVdLF3{C^*mNLq-={aI0f|T7l!Z7P4D0|*UQO^Tazn-v6`6t}R zj}u8M$#6YCoTZ473B$XuAm-lQkdZJdy4?!vtFz(S^(6u|Q`o}Dxx#Bmes4GIThG9C zGAtLEN*A_+GT!}@X6TdReCU-=q;N+&7nqiP+V#aQ)XrT2fhsVW(E#h;77+NO^qD&3 z=ltAr;yYMpd`RPT5XfrmAASPot{trcUq3`ry=Qn8$+N?w zzl~6B4KHPb)s|~`RYIQD4mFczLWna!o<*_0d~f56q0ely3LsvpfRK_*b1EZF9vMR} zVux~}wiUJw%@ROMmpu>D--Q-Q5RD+=<0@S`OcCgrTJ@tVWikyME7rkVaY3r@<+WiOmLf6Luu|?B+zB_x> zlm!BqnI`1{_51>2MP(o&kji(?fV^XRK;^}N`a38>q*A2FlsuQo5VMXz?~4Q(%~ zS_e0)0i>KS2rcHFe0=9#`05;z3;0BlM66dR>8ZcJLc4a9B&9?D;uDks4kpn{gUn!* zq69xzkA4uk$xlgR6&OZ#?%Me0c3w&oQ)B{Z$1e92r77DT3*lduDf8Hxqt-FE72??q0_&XAIRo>A)=gL zQZ$&eoI;#GTeM7@1Mh|Nlqz3@b=tqA>-jVLycKYk?WmVQM(;eq2)SYqVn?~IC4gV5 z>6WCFdG0VphlQ$cE9vW-3m|B9@Y$)zd2}dr&ptsnwFG9Tgh-~PY|)I$q4}^<9-zFv zQ^?Gfzv&F?^tq_W{S)Nvl1NLmQ9C=hHY^T+Zm5=E2WOYg1TR)r;J!{d?F%cl-^D|v z4gU;JluXtz^JVC#w&bpXaimDHML8jO-jXDq_fA(8vQsO9b%QJAY&2 zMO~C`BlwA^pO1MwxDgs}0TtZo>Hq=KcBmmJ$Tv*h>vmfiZj=_#0h5O0He>-RmMo7i zHrmO@joA2mD#EH~%$)xCT|f{NDpQr&Ad3pKX;ATtz$Hc_o zz<~q%u3WidZ_94L*huS~wAp(ZbBF*|!&9eDohK5?RVr1RC4jLVJb3WH$&)9~GUgBg z{P%J!3L7_WEN<%-P+D5L)@HN$81s+L1eu-U;^NiS)z$8{D29y5YPEXTtXcElp!qi- z;PmO!-)`Nyb&FQ3ZF2-LrtRCeZ##bc_+hnL-H?D_TexuH`}{|QK@(|9jj;t?zDWYM zY}rz}W55gHMawf)y|Z?r*>S_UoQT5}iiX zZquesrK?u0D$?uqH$4H2p{S^6{knDQ);21RO1h?lv3WX;LFO& z4(;5zGq*#B4xxglF>%bz&6Tp>uzoROHk*@|FJHcL;J|_X>a%zw2p;=9nf>RZM~@ye zZ{EBMW5#E21jRBV*#bUMi#ug7@; z&l#MbRDRE>QKLqT962)Y=+UD`BAS?mjQj=(2?>!dP?ndMH*D?Nwd-qYYFsq0&+T^m z$SQs0Dy`~#EziM?Ub{<5N=k|B5%Ok^tyZpFDdB2K5B))3q$k3nDEf+vi`Q`P+_`fO zlQC$}poemDa_%shOj=$upU4J#Z~^rzHXak~Jcgo@j)pyQ!hVp;>0NqxjdBPc1zsrqmMqq@ZrN-PC)Rdv*9q;QuiWk5*a+VLZLuF zFjZ8jXzCMCM~z6}2k9CH%9SV&2{+2{52IUpx-I*)|9t-c0t^5czx{(6Hf#U@0000< KMNUMnLSTY&z@;7l literal 0 HcmV?d00001 diff --git a/bisqapps/shared/presentation/src/commonMain/composeResources/drawable/currency_usd.png b/bisqapps/shared/presentation/src/commonMain/composeResources/drawable/currency_usd.png index f272f94e08d25d695ec26c24e9f62c7644213b71..8bfcbe53905a7972346cf39b99a99921e299de28 100644 GIT binary patch literal 4159 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 JPDHLkV1m2h`z8PY literal 1975 zcmV;o2T1sdP)f zgfwo{AC2pTqP8I)F$|+(5y2!kz1oC|l_lKLb!&OMu%0p5%UP2>Cnd$6 z(%)DEMiwLCaKse|1TIFS(Z1H!);^x+FE=za+%d>I15|jw4NL3SB6HbZm>myfIBfZ~ z6V2}b&nnzlJXj0N!zlj(2@Dz+HBKzHZQ@rI}S-vA;}tk^x!=(^Vi>x;W*A@GMkrV z{Z562QnOEuwIAVJ!g)=L_-NL)pR!-P?9 z95z)(_ZtTxB&7KO84J>!*bpl}wL=|hn(lrQ>@9cH9(+K}sC*_Ws`dm_RF|h=VoEf? z=n;)85J@we?@h-DX=pwGH-|P2%2up$Pai|!_M5-IA!XHjes<58b^UVzQL}FUayHhN zrC>!-3JQpcH!u1Tl@!#KrlWSb17E){6M~7wIZC0^8HA<~gOKhBpfIq8t_NF`(XIXIatQ*0Yf`qEUN1A!;Yk63fYsK*{m%$#a z7UXmuhhS!sVvJ+BlD`Dp&osT#@?=v}Q{o0d2loGT)0t7nuK$dR2C4c&ul0IhrlgK} zMI;mr`rlQbgzifLyx!x+#}hF`NZf*r2VcGnJZUT06qY2G?%D32dY%AXFhClk4GrwT zIpN1XC3SP0(xQi+fUb`Mc5o;kD*ZpVTjslpuB#ocK zY&Hvizdur3T>Mshd%JNC;h-#+W#{C4#UG68JKJaxTFheMa9>#}Tz<(=qCOso%1|kF z8%fkUi_9#B*&CB=vZA28qGGqx>CC*IvWLI9b8S^5r|e|!6i&bIqb)6CM|C#7x-uP= zWPnBKX8g0?hfqw$76P(mMH)7(%0Q-_N87~!TvIW`nooh{w4_s}hmw%#-jU@^RFpH?{BA)Y`m7)%93R}_i4^D_1rr@)50 z5Gu=vp_u=@>ww;PvAHh~8CR`fOK}%MggST*?m_+9NLdCvm#;x-`PS6Ssv z6Z~V-eTsIH))zPs*x- zFCsXW!-pfoFP(P{T$mlZAxB4FJX-w7!;iHIf>46bIrOa_iAIONQNMjnPft&9PC$CJ zw6tuludjcV3a4~U`+Sn8gQ1_=Bb}X{-`l-=_uDsoH`n~GuC5=fUcI`Ju0L}dnE9z4 z@9pi~zjf=@Kj5b0VJ^Sd>gwuVXlrYeS5;R2%F1xrpA}Jhkr;#e-z&qzM>;w>{)jow zs@v^z=A|c|s;?QHd`^gpC5x50{^k+8b-1S}>xswz^z1tT<}9A(H6BuT+VdzmTnPRV z3)oyW$pcvT88SZiD3m`xjiEzi$AR0=pC^1|q;`~?iNn`QE~?nT*y$}&X(9gR>SwmE zKa^_BIC;$I1&A+Pfq38yvX8%xiFyAWldLs!4ahH8&6}1>JYSd1nX9rizR1Dxsl*!- zRg{oVOE{fM{5_MZcAt>FADlqgjW06vvQrz=Y?{+)*RQe2_#g5F#WdXI#@7G<002ov JPDHLkV1fwKvU~sl diff --git a/bisqapps/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/di/PresentationModule.kt b/bisqapps/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/di/PresentationModule.kt index d78f7ff8..41371081 100644 --- a/bisqapps/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/di/PresentationModule.kt +++ b/bisqapps/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/di/PresentationModule.kt @@ -5,6 +5,10 @@ import network.bisq.mobile.presentation.MainPresenter import network.bisq.mobile.presentation.ui.AppPresenter import network.bisq.mobile.presentation.ui.uicases.GettingStartedPresenter import network.bisq.mobile.presentation.ui.uicases.IGettingStarted +import network.bisq.mobile.presentation.ui.uicases.offers.CurrencyListPresenter +import network.bisq.mobile.presentation.ui.uicases.offers.ICurrencyList +import network.bisq.mobile.presentation.ui.uicases.offers.IOffersList +import network.bisq.mobile.presentation.ui.uicases.offers.OffersListPresenter import network.bisq.mobile.presentation.ui.uicases.startup.CreateProfilePresenter import network.bisq.mobile.presentation.ui.uicases.startup.IOnboardingPresenter import network.bisq.mobile.presentation.ui.uicases.startup.ITrustedNodeSetupPresenter @@ -58,6 +62,10 @@ val presentationModule = module { ) } bind ITrustedNodeSetupPresenter::class + single { CurrencyListPresenter(get(), get()) } bind ICurrencyList::class + + single { OffersListPresenter(get()) } bind IOffersList::class + single { (navController: NavController, tabController: NavController) -> MyTradesPresenter( get(), diff --git a/bisqapps/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/components/CurrencyProfileCard.kt b/bisqapps/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/components/CurrencyProfileCard.kt index ff72ce77..b0325cbf 100644 --- a/bisqapps/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/components/CurrencyProfileCard.kt +++ b/bisqapps/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/components/CurrencyProfileCard.kt @@ -1,58 +1,76 @@ package network.bisq.mobile.presentation.ui.components import androidx.compose.foundation.Image -import androidx.compose.foundation.layout.Arrangement -import androidx.compose.foundation.layout.Column -import androidx.compose.foundation.layout.Row -import androidx.compose.foundation.layout.Spacer -import androidx.compose.foundation.layout.fillMaxWidth -import androidx.compose.foundation.layout.height -import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.layout.size -import androidx.compose.foundation.layout.width -import androidx.compose.material3.Text +import androidx.compose.foundation.clickable +import androidx.compose.foundation.interaction.MutableInteractionSource +import androidx.compose.foundation.layout.* import androidx.compose.runtime.Composable +import androidx.compose.runtime.remember import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier -import androidx.compose.ui.graphics.Color import androidx.compose.ui.unit.dp +import bisqapps.shared.presentation.generated.resources.Res +import coil3.compose.AsyncImage +import network.bisq.mobile.domain.data.model.FiatCurrency import network.bisq.mobile.presentation.ui.components.atoms.BisqText +import network.bisq.mobile.presentation.ui.components.atoms.DynamicImage import network.bisq.mobile.presentation.ui.theme.BisqTheme import org.jetbrains.compose.resources.DrawableResource import org.jetbrains.compose.resources.ExperimentalResourceApi import org.jetbrains.compose.resources.painterResource + @OptIn(ExperimentalResourceApi::class) @Composable fun CurrencyProfileCard( - currencyName: String, - currencyShort: String, - image: DrawableResource, - onClick: () -> Unit) { + currency: FiatCurrency, + onClick: (FiatCurrency) -> Unit) { + + val interactionSource = remember { MutableInteractionSource() } + Row( - modifier = Modifier.fillMaxWidth().padding(horizontal = 14.dp, vertical = 4.dp), verticalAlignment = Alignment.CenterVertically, - horizontalArrangement = Arrangement.SpaceBetween + horizontalArrangement = Arrangement.SpaceBetween, + modifier = Modifier + .fillMaxWidth() + .padding(horizontal = 14.dp, vertical = 4.dp) + .clickable( + interactionSource = interactionSource, + indication = null, + onClick = { + onClick(currency) + } + ) + , ) { Row( verticalAlignment = Alignment.CenterVertically, ) { - Image(painterResource(image), null, modifier = Modifier.size(36.dp)) + //Image(painterResource(image), null, modifier = Modifier.size(36.dp)) + //DynamicImage("drawable/${currency.flagImage}", contentDescription = null) + println(currency.flagImage) + DynamicImage("drawable/${currency.flagImage}", contentDescription = null) +// AsyncImage( +// //model = Res.getUri("drawable/${currency.flagImage}"), +// model = Res.getUri("drawable/currency_usd.png"), +// contentDescription = null, +// modifier = Modifier.size(36.dp) +// ) Spacer(modifier = Modifier.width(8.dp)) Column { BisqText.baseRegular( - text = currencyName, + text = currency.name, color = BisqTheme.colors.light1, ) - Spacer(modifier = Modifier.height(8.dp)) + Spacer(modifier = Modifier.height(0.dp)) BisqText.baseRegular( - text = currencyShort, + text = currency.code, color = BisqTheme.colors.grey2, ) } } BisqText.smallRegular( - text = "43 offers", + text = "${currency.offerCount.toString()} offers", color = BisqTheme.colors.primary, ) } diff --git a/bisqapps/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/components/atoms/DynamicImage.kt b/bisqapps/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/components/atoms/DynamicImage.kt new file mode 100644 index 00000000..bf4beb6a --- /dev/null +++ b/bisqapps/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/components/atoms/DynamicImage.kt @@ -0,0 +1,29 @@ +package network.bisq.mobile.presentation.ui.components.atoms + +import androidx.compose.foundation.layout.size +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable + +import androidx.compose.ui.Modifier +import androidx.compose.ui.unit.dp +import bisqapps.shared.presentation.generated.resources.Res +import bisqapps.shared.presentation.generated.resources.bisq_logo +import bisqapps.shared.presentation.generated.resources.currency_aed +import coil3.compose.AsyncImage +import org.jetbrains.compose.resources.ExperimentalResourceApi +import org.jetbrains.compose.resources.painterResource + +@OptIn(ExperimentalResourceApi::class) +@Composable +fun DynamicImage(path: String, contentDescription: String?, modifier: Modifier? = Modifier) { + AsyncImage( + model = Res.getUri(path), + //model = Res.getUri("drawable/currency_usd.png"), + //fallback = painterResource(Res.drawable.currency_aed), + contentDescription = null, + modifier = Modifier.size(36.dp), + onError = { + println("Error") + } + ) +} \ No newline at end of file diff --git a/bisqapps/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/components/layout/ScrollScaffold.kt b/bisqapps/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/components/layout/ScrollScaffold.kt index 608f368c..d3b9dd88 100644 --- a/bisqapps/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/components/layout/ScrollScaffold.kt +++ b/bisqapps/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/components/layout/ScrollScaffold.kt @@ -1,13 +1,8 @@ package network.bisq.mobile.presentation.ui.components.layout -import androidx.compose.foundation.background import androidx.compose.foundation.layout.* -import androidx.compose.foundation.rememberScrollState -import androidx.compose.foundation.verticalScroll import androidx.compose.material3.Scaffold import androidx.compose.runtime.Composable -import androidx.compose.ui.Alignment -import androidx.compose.ui.Modifier import androidx.compose.ui.unit.dp import network.bisq.mobile.presentation.ui.theme.BisqTheme @@ -23,14 +18,7 @@ fun BisqScrollScaffold( topBar = topBar, bottomBar = bottomBar, content = { - Column( - horizontalAlignment = Alignment.CenterHorizontally, - modifier = Modifier - .fillMaxSize() - .background(color = BisqTheme.colors.backgroundColor) - .padding(innerPadding) - .verticalScroll(rememberScrollState()) - ) { + BisqScrollLayout { content() } }, diff --git a/bisqapps/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/components/layout/StaticScaffold.kt b/bisqapps/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/components/layout/StaticScaffold.kt index f1036354..d7208b88 100644 --- a/bisqapps/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/components/layout/StaticScaffold.kt +++ b/bisqapps/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/components/layout/StaticScaffold.kt @@ -1,17 +1,14 @@ package network.bisq.mobile.presentation.ui.components.layout -import androidx.compose.foundation.background import androidx.compose.foundation.layout.* import androidx.compose.material3.Scaffold import androidx.compose.runtime.Composable -import androidx.compose.ui.Alignment -import androidx.compose.ui.Modifier import androidx.compose.ui.unit.dp import network.bisq.mobile.presentation.ui.theme.BisqTheme @Composable fun BisqStaticScaffold( - innerPadding: PaddingValues = PaddingValues(top = 48.dp, bottom = 30.dp), + innerPadding: PaddingValues = PaddingValues(top = 96.dp, bottom = 12.dp, start = 12.dp, end = 12.dp), topBar: @Composable () -> Unit = {}, bottomBar: @Composable () -> Unit = {}, content: @Composable ColumnScope.() -> Unit @@ -21,16 +18,7 @@ fun BisqStaticScaffold( topBar = topBar, bottomBar = bottomBar, content = { - Column( - verticalArrangement = Arrangement.SpaceBetween, - horizontalAlignment = Alignment.CenterHorizontally, - modifier = Modifier - .fillMaxSize() - .background(color = BisqTheme.colors.backgroundColor) - .padding(innerPadding) - ) { - content() - } + BisqStaticLayout(innerPadding = innerPadding) { content() } } ) } diff --git a/bisqapps/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/components/molecules/BisqDialog.kt b/bisqapps/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/components/molecules/BisqDialog.kt index aa93a0fa..11168f56 100644 --- a/bisqapps/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/components/molecules/BisqDialog.kt +++ b/bisqapps/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/components/molecules/BisqDialog.kt @@ -21,7 +21,7 @@ import network.bisq.mobile.presentation.ui.theme.BisqTheme fun BisqDialog( onDismissRequest: () -> Unit = {}, content: @Composable ColumnScope.() -> Unit = {} -){ +) { Dialog(onDismissRequest = { onDismissRequest() }) { Box( modifier = Modifier diff --git a/bisqapps/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/components/molecules/ConfirmationDialog.kt b/bisqapps/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/components/molecules/ConfirmationDialog.kt new file mode 100644 index 00000000..057e72bc --- /dev/null +++ b/bisqapps/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/components/molecules/ConfirmationDialog.kt @@ -0,0 +1,50 @@ +package network.bisq.mobile.presentation.ui.components.molecules + +import androidx.compose.foundation.layout.* +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.unit.dp +import androidx.navigation.NavController +import network.bisq.mobile.presentation.ui.components.atoms.BisqButton +import network.bisq.mobile.presentation.ui.components.atoms.BisqText +import network.bisq.mobile.presentation.ui.components.molecules.BisqDialog +import network.bisq.mobile.presentation.ui.theme.BisqTheme + +@Composable +fun ConfirmationDialog( + title: String = "", + message: String = "Are you sure?", + confirmButtonText: String = "Yes", + cancelButtonText: String = "No", + onDismissRequest: () -> Unit, + ) { + BisqDialog { + Column( + modifier = Modifier + .fillMaxWidth() + .padding(vertical = 24.dp, horizontal = 20.dp), + horizontalAlignment = Alignment.CenterHorizontally, + verticalArrangement = Arrangement.spacedBy(20.dp) + ) { + BisqText.h6Regular( + text = message, + color = BisqTheme.colors.light1, + modifier = Modifier.padding(vertical = 12.dp) + ) + Row(horizontalArrangement = Arrangement.spacedBy(12.dp)) { + BisqButton( + text = cancelButtonText, + backgroundColor = BisqTheme.colors.dark5, + onClick = { onDismissRequest() }, + padding = PaddingValues(horizontal = 42.dp, vertical = 4.dp) + ) + BisqButton( + text = confirmButtonText, + onClick = { onDismissRequest() }, + padding = PaddingValues(horizontal = 32.dp, vertical = 4.dp) + ) + } + } + } +} \ No newline at end of file diff --git a/bisqapps/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/components/organisms/TradeAlert.kt b/bisqapps/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/components/organisms/TradeAlert.kt deleted file mode 100644 index efd6f512..00000000 --- a/bisqapps/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/components/organisms/TradeAlert.kt +++ /dev/null @@ -1,50 +0,0 @@ -package network.bisq.mobile.presentation.ui.components.organisms - -import androidx.compose.foundation.layout.Arrangement -import androidx.compose.foundation.layout.Column -import androidx.compose.foundation.layout.PaddingValues -import androidx.compose.foundation.layout.Row -import androidx.compose.foundation.layout.padding -import androidx.compose.runtime.Composable -import androidx.compose.ui.Alignment -import androidx.compose.ui.Modifier -import androidx.compose.ui.unit.dp -import androidx.navigation.NavController -import network.bisq.mobile.presentation.ui.components.atoms.BisqButton -import network.bisq.mobile.presentation.ui.components.atoms.BisqText -import network.bisq.mobile.presentation.ui.theme.BisqTheme - - -@Composable -fun TradeAlert( - onDismissRequest: () -> Unit, - rootNavController: NavController -) { - - Column( - modifier = Modifier.padding(vertical = 24.dp, horizontal = 20.dp), - horizontalAlignment = Alignment.CenterHorizontally, - verticalArrangement = Arrangement.spacedBy(20.dp) - ) { - BisqText.h6Regular( - text = "Do you want to take this trade?", - color = BisqTheme.colors.light1, - modifier = Modifier.padding(vertical = 12.dp) - ) - Row(horizontalArrangement = Arrangement.spacedBy(12.dp)) { - BisqButton( - text = "Cancel", - backgroundColor = BisqTheme.colors.dark5, - onClick = { onDismissRequest() }, - padding = PaddingValues(horizontal = 42.dp, vertical = 4.dp) - ) - BisqButton( - text = "Yes, please", - onClick = { - onDismissRequest() - }, - padding = PaddingValues(horizontal = 32.dp, vertical = 4.dp) - ) - } - } -} \ No newline at end of file diff --git a/bisqapps/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/composeModels/model.kt b/bisqapps/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/composeModels/model.kt index 02c75966..d1d4f1b9 100644 --- a/bisqapps/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/composeModels/model.kt +++ b/bisqapps/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/composeModels/model.kt @@ -3,4 +3,4 @@ package network.bisq.mobile.presentation.ui.composeModels import org.jetbrains.compose.resources.DrawableResource data class BottomNavigationItem(val title: String, val route: String, val icon: DrawableResource) -data class PagerViewItem(val title: String, val image: DrawableResource, val desc: String) +data class PagerViewItem(val title: String, val image: DrawableResource, val desc: String) \ No newline at end of file diff --git a/bisqapps/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/navigation/Routes.kt b/bisqapps/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/navigation/Routes.kt index 25dc0b40..bd4bea4f 100644 --- a/bisqapps/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/navigation/Routes.kt +++ b/bisqapps/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/navigation/Routes.kt @@ -13,7 +13,8 @@ enum class Routes(val title: String) { TrustedNodeSetup(title = "trusted_node_setup"), TabContainer(title = "tab_container"), TabHome(title = "tab_home"), - TabExchange(title = "tab_exchange"), + TabCurrencies(title = "tab_currencies"), TabMyTrades(title = "tab_my_trades"), TabSettings(title = "tab_settings"), + OfferList(title = "offer_list"), } \ No newline at end of file diff --git a/bisqapps/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/navigation/graph/RootNavGraph.kt b/bisqapps/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/navigation/graph/RootNavGraph.kt index 5aa8d2ec..8d6c3e1b 100644 --- a/bisqapps/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/navigation/graph/RootNavGraph.kt +++ b/bisqapps/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/navigation/graph/RootNavGraph.kt @@ -11,6 +11,7 @@ import androidx.navigation.compose.composable import network.bisq.mobile.presentation.ui.navigation.* import network.bisq.mobile.presentation.ui.theme.BisqTheme import network.bisq.mobile.presentation.ui.uicases.* +import network.bisq.mobile.presentation.ui.uicases.offers.OffersListScreen import network.bisq.mobile.presentation.ui.uicases.startup.CreateProfileScreen import network.bisq.mobile.presentation.ui.uicases.startup.OnBoardingScreen import network.bisq.mobile.presentation.ui.uicases.startup.SplashScreen @@ -57,5 +58,14 @@ fun RootNavGraph() { composable(route = Routes.TabContainer.name) { TabContainerScreen() } + + composable(route = Routes.OfferList.name, enterTransition = { + slideIntoContainer( + AnimatedContentTransitionScope.SlideDirection.Left, + animationSpec = tween(300) + ) + }) { + OffersListScreen() + } } } \ No newline at end of file diff --git a/bisqapps/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/navigation/graph/TabNavGraph.kt b/bisqapps/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/navigation/graph/TabNavGraph.kt index 5b3b392c..a9e07224 100644 --- a/bisqapps/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/navigation/graph/TabNavGraph.kt +++ b/bisqapps/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/navigation/graph/TabNavGraph.kt @@ -11,7 +11,7 @@ import network.bisq.mobile.presentation.ui.navigation.Routes import network.bisq.mobile.presentation.ui.navigation.Graph import network.bisq.mobile.presentation.ui.theme.BisqTheme import network.bisq.mobile.presentation.ui.uicases.GettingStartedScreen -import network.bisq.mobile.presentation.ui.uicases.exchange.ExchangeScreen +import network.bisq.mobile.presentation.ui.uicases.offers.CurrencyListScreen import network.bisq.mobile.presentation.ui.uicases.settings.SettingsScreen import network.bisq.mobile.presentation.ui.uicases.trades.MyTradesScreen import org.koin.compose.koinInject @@ -34,8 +34,8 @@ fun TabNavGraph() { composable(route = Routes.TabHome.name) { GettingStartedScreen() } - composable(route = Routes.TabExchange.name) { - ExchangeScreen() + composable(route = Routes.TabCurrencies.name) { + CurrencyListScreen() } composable(route = Routes.TabMyTrades.name) { MyTradesScreen() diff --git a/bisqapps/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/uicases/TabContainerScreen.kt b/bisqapps/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/uicases/TabContainerScreen.kt index 6b075ec8..8222e598 100644 --- a/bisqapps/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/uicases/TabContainerScreen.kt +++ b/bisqapps/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/uicases/TabContainerScreen.kt @@ -1,6 +1,8 @@ package network.bisq.mobile.presentation.ui.uicases +import androidx.compose.foundation.layout.PaddingValues import androidx.compose.runtime.* +import androidx.compose.ui.unit.dp import androidx.navigation.NavHostController import androidx.navigation.compose.currentBackStackEntryAsState import bisqapps.shared.presentation.generated.resources.* @@ -16,7 +18,7 @@ import org.koin.core.qualifier.named val navigationListItem = listOf( BottomNavigationItem("Home", Routes.TabHome.name, Res.drawable.icon_home), - BottomNavigationItem("Buy/Sell", Routes.TabExchange.name, Res.drawable.icon_market), + BottomNavigationItem("Buy/Sell", Routes.TabCurrencies.name, Res.drawable.icon_market), BottomNavigationItem("My Trades", Routes.TabMyTrades.name, Res.drawable.icon_trades), BottomNavigationItem("Settings", Routes.TabSettings.name, Res.drawable.icon_settings), ) @@ -33,6 +35,7 @@ fun TabContainerScreen() { } BisqStaticScaffold( + innerPadding = PaddingValues(top = 48.dp, bottom = 12.dp, start = 12.dp, end = 12.dp), topBar = { // TODO: Since Topbar should go inside Scaffold // the TopBar is written here commonly for all 4 tabs. @@ -43,7 +46,7 @@ fun TabContainerScreen() { isHome = currentRoute == Routes.TabHome.name, title = when (currentRoute) { Routes.TabHome.name -> "Home" - Routes.TabExchange.name -> "Buy/Sell" + Routes.TabCurrencies.name -> "Buy/Sell" Routes.TabMyTrades.name -> "My Trades" Routes.TabSettings.name -> "Settings" else -> "App" diff --git a/bisqapps/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/uicases/exchange/ExchangeScreen.kt b/bisqapps/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/uicases/exchange/ExchangeScreen.kt deleted file mode 100644 index b82ba193..00000000 --- a/bisqapps/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/uicases/exchange/ExchangeScreen.kt +++ /dev/null @@ -1,58 +0,0 @@ -package network.bisq.mobile.presentation.ui.uicases.exchange - -import androidx.compose.foundation.layout.* -import androidx.compose.runtime.Composable -import androidx.compose.ui.Alignment -import androidx.compose.ui.Modifier -import androidx.compose.ui.platform.LocalLayoutDirection -import androidx.compose.ui.unit.dp -import androidx.navigation.NavHostController -import bisqapps.shared.presentation.generated.resources.Res -import bisqapps.shared.presentation.generated.resources.currency_euro -import bisqapps.shared.presentation.generated.resources.currency_gpb -import bisqapps.shared.presentation.generated.resources.currency_usd -import network.bisq.mobile.presentation.ui.components.CurrencyProfileCard -import network.bisq.mobile.components.MaterialTextField -import network.bisq.mobile.presentation.ui.components.atoms.BisqButton -import network.bisq.mobile.presentation.ui.components.molecules.TopBar -import network.bisq.mobile.presentation.ui.components.atoms.icons.SortIcon -import network.bisq.mobile.presentation.ui.components.layout.BisqStaticLayout -import org.jetbrains.compose.resources.ExperimentalResourceApi -import org.koin.compose.koinInject -import org.koin.core.qualifier.named - -@Composable -fun ExchangeScreen() { - val navController: NavHostController = koinInject(named("RootNavController")) - val originDirection = LocalLayoutDirection.current - BisqStaticLayout(verticalArrangement = Arrangement.Top) { - Row( - modifier = Modifier.fillMaxWidth(), - verticalAlignment = Alignment.CenterVertically, - horizontalArrangement = Arrangement.SpaceBetween, - ) { - Box() { - MaterialTextField(text = "Search", onValueChanged = {}) - } - SortIcon(modifier = Modifier.size(24.dp)) - } - Spacer(modifier = Modifier.height(12.dp)) - Column(verticalArrangement = Arrangement.spacedBy(12.dp)) { - CurrencyProfileCard( - "US Dollars", - "USD", - Res.drawable.currency_usd, - onClick = {}) - CurrencyProfileCard( - "Euro", - "EUR", - Res.drawable.currency_euro, - onClick = {}) - CurrencyProfileCard( - "British Pounds", - "GPB", - Res.drawable.currency_gpb, - onClick = {}) - } - } -} \ No newline at end of file diff --git a/bisqapps/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/uicases/offers/CurrencyListPresenter.kt b/bisqapps/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/uicases/offers/CurrencyListPresenter.kt new file mode 100644 index 00000000..6e2ddc79 --- /dev/null +++ b/bisqapps/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/uicases/offers/CurrencyListPresenter.kt @@ -0,0 +1,49 @@ +package network.bisq.mobile.presentation.ui.uicases.offers + +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.delay +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.StateFlow +import kotlinx.coroutines.launch +import network.bisq.mobile.domain.data.BackgroundDispatcher +import network.bisq.mobile.domain.data.model.FiatCurrency +import network.bisq.mobile.domain.data.repository.CurrenciesRepository +import network.bisq.mobile.presentation.BasePresenter +import network.bisq.mobile.presentation.MainPresenter +import network.bisq.mobile.presentation.ui.navigation.Routes + +class CurrencyListPresenter( + mainPresenter: MainPresenter, + private val currenciesRepository: CurrenciesRepository, +) : BasePresenter(mainPresenter), ICurrencyList { + + private val _currencies = MutableStateFlow>(emptyList()) + override val currencies: StateFlow> = _currencies + + override fun onSelectedCurrency(currency: FiatCurrency) { + rootNavigator.navigate(Routes.OfferList.name) + } + + private fun refresh() { + CoroutineScope(BackgroundDispatcher).launch { + try { + delay(1000) // TODO: To simulate loading. Yet to be handled + val currencies = currenciesRepository.fetch() + _currencies.value = currencies?.currencies ?: emptyList() + } catch (e: Exception) { + // Handle errors + println("Error: ${e.message}") + } + } + } + + override fun onViewAttached() { + super.onViewAttached() + refresh() + } + + override fun onResume() { + super.onResume() + refresh() + } +} diff --git a/bisqapps/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/uicases/offers/CurrencyListScreen.kt b/bisqapps/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/uicases/offers/CurrencyListScreen.kt new file mode 100644 index 00000000..bdd6e1ae --- /dev/null +++ b/bisqapps/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/uicases/offers/CurrencyListScreen.kt @@ -0,0 +1,57 @@ +package network.bisq.mobile.presentation.ui.uicases.offers + +import androidx.compose.foundation.layout.* +import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.foundation.lazy.items +import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.collectAsState +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.unit.dp +import kotlinx.coroutines.flow.StateFlow +import network.bisq.mobile.presentation.ui.components.CurrencyProfileCard +import network.bisq.mobile.components.MaterialTextField +import network.bisq.mobile.domain.data.model.FiatCurrency +import network.bisq.mobile.presentation.ViewPresenter +import network.bisq.mobile.presentation.ui.components.atoms.icons.SortIcon +import network.bisq.mobile.presentation.ui.components.layout.BisqStaticLayout +import org.koin.compose.koinInject + +interface ICurrencyList : ViewPresenter { + val currencies: StateFlow> + fun onSelectedCurrency(currency: FiatCurrency) +} + +@Composable +fun CurrencyListScreen() { + val presenter: ICurrencyList = koinInject() + val currencies: List = presenter.currencies.collectAsState().value + + LaunchedEffect(Unit) { + presenter.onViewAttached() + } + + BisqStaticLayout(verticalArrangement = Arrangement.Top) { + Row( + modifier = Modifier.fillMaxWidth(), + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.SpaceBetween, + ) { + Box() { + MaterialTextField(text = "Search", onValueChanged = {}) + } + SortIcon(modifier = Modifier.size(24.dp)) + } + Spacer(modifier = Modifier.height(12.dp)) + + LazyColumn() { + items(currencies) { currency -> + CurrencyProfileCard( + currency, + onClick = { presenter.onSelectedCurrency(it) }) + } + } + + } +} \ No newline at end of file diff --git a/bisqapps/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/uicases/offers/OffersListPresenter.kt b/bisqapps/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/uicases/offers/OffersListPresenter.kt new file mode 100644 index 00000000..53bd1c94 --- /dev/null +++ b/bisqapps/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/uicases/offers/OffersListPresenter.kt @@ -0,0 +1,14 @@ +package network.bisq.mobile.presentation.ui.uicases.offers + +import network.bisq.mobile.presentation.BasePresenter +import network.bisq.mobile.presentation.MainPresenter +import network.bisq.mobile.presentation.ui.navigation.Routes + +open class OffersListPresenter( + mainPresenter: MainPresenter +) : BasePresenter(mainPresenter), IOffersList { + + override fun takeOffer() { + rootNavigator.navigate(Routes.OfferList.name) + } +} diff --git a/bisqapps/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/uicases/exchange/OffersListScreen.kt b/bisqapps/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/uicases/offers/OffersListScreen.kt similarity index 52% rename from bisqapps/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/uicases/exchange/OffersListScreen.kt rename to bisqapps/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/uicases/offers/OffersListScreen.kt index 08b2b109..304d9027 100644 --- a/bisqapps/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/uicases/exchange/OffersListScreen.kt +++ b/bisqapps/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/uicases/offers/OffersListScreen.kt @@ -1,5 +1,4 @@ -package network.bisq.mobile.presentation.ui.uicases.exchange - +package network.bisq.mobile.presentation.ui.uicases.offers import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box @@ -12,6 +11,7 @@ import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.ui.Alignment @@ -19,22 +19,34 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.draw.blur import androidx.compose.ui.unit.dp import androidx.navigation.NavController -import network.bisq.mobile.presentation.ui.components.layout.BisqStaticLayout +import network.bisq.mobile.presentation.ViewPresenter +import network.bisq.mobile.presentation.ui.components.layout.BisqStaticScaffold import network.bisq.mobile.presentation.ui.components.molecules.* -import network.bisq.mobile.presentation.ui.components.organisms.TradeAlert +import org.koin.compose.koinInject + +interface IOffersList : ViewPresenter { + fun takeOffer() +} @Composable -fun OffersListScreen( - rootNavController: NavController, - innerPadding: PaddingValues, -) { +fun OffersListScreen() { + val presenter: ICurrencyList = koinInject() val states = listOf( "Buy from", "Sell to" ) val openDialog = remember { mutableStateOf(false) } + val rootNavController: NavController - BisqStaticLayout { + LaunchedEffect(Unit) { + presenter.onViewAttached() + } + + BisqStaticScaffold( + topBar = { + TopBar(title = "Offers") + }, + ) { Box(modifier = Modifier.fillMaxSize().blur(if (openDialog.value) 12.dp else 0.dp)) { Column { Column( @@ -43,28 +55,30 @@ fun OffersListScreen( ) { StateToggle(states, 130.dp) - Spacer(modifier = Modifier.height(32.dp)) - LazyColumn( - modifier = Modifier.padding(10.dp), - verticalArrangement = Arrangement.spacedBy(18.dp) - ) { - items(3) { - OfferCard(onClick = { - openDialog.value = !openDialog.value - }) - } + Spacer(modifier = Modifier.height(32.dp)) + LazyColumn( + modifier = Modifier.padding(10.dp), + verticalArrangement = Arrangement.spacedBy(18.dp) + ) { + items(3) { + OfferCard(onClick = { + openDialog.value = !openDialog.value + }) } + } - if (openDialog.value) { - BisqDialog { - TradeAlert( - onDismissRequest = { - openDialog.value = !openDialog.value - }, - rootNavController = rootNavController - ) - } + if (openDialog.value) { + BisqDialog { + ConfirmationDialog( + message = "Do you want to take this trade?", + confirmButtonText = "Yes, please", + cancelButtonText = "Cancel", + onDismissRequest = { + openDialog.value = !openDialog.value + }, + ) } + } } } diff --git a/bisqapps/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/uicases/startup/CreateProfileScreen.kt b/bisqapps/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/uicases/startup/CreateProfileScreen.kt index 34f5a1b8..5346622e 100644 --- a/bisqapps/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/uicases/startup/CreateProfileScreen.kt +++ b/bisqapps/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/uicases/startup/CreateProfileScreen.kt @@ -25,6 +25,7 @@ import network.bisq.mobile.presentation.ui.components.atoms.BisqTextField import network.bisq.mobile.presentation.ui.components.layout.BisqScrollScaffold import network.bisq.mobile.presentation.ui.helpers.RememberPresenterLifecycle import org.koin.core.parameter.parametersOf +import org.koin.core.qualifier.named @Composable fun CreateProfileScreen( @@ -85,4 +86,4 @@ fun CreateProfileScreen( backgroundColor = if (presenter.nickName.value.isEmpty()) BisqTheme.colors.primaryDisabled else BisqTheme.colors.primary ) } -} \ No newline at end of file +} diff --git a/bisqapps/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/uicases/startup/OnBoardingScreen.kt b/bisqapps/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/uicases/startup/OnBoardingScreen.kt index 6bd9c84f..2ae04fa9 100644 --- a/bisqapps/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/uicases/startup/OnBoardingScreen.kt +++ b/bisqapps/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/uicases/startup/OnBoardingScreen.kt @@ -37,8 +37,7 @@ interface IOnboardingPresenter: ViewPresenter { @Composable fun OnBoardingScreen() { val strings = LocalStrings.current - val navController: NavHostController = koinInject(named("RootNavController")) - val presenter: IOnboardingPresenter = koinInject { parametersOf(navController) } + val presenter: IOnboardingPresenter = koinInject() val coroutineScope = rememberCoroutineScope() val pagerState = rememberPagerState(pageCount = { presenter.indexesToShow.size }) diff --git a/bisqapps/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/uicases/startup/SplashPresenter.kt b/bisqapps/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/uicases/startup/SplashPresenter.kt index 9af901eb..b3d9e2da 100644 --- a/bisqapps/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/uicases/startup/SplashPresenter.kt +++ b/bisqapps/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/uicases/startup/SplashPresenter.kt @@ -1,6 +1,5 @@ package network.bisq.mobile.presentation.ui.uicases.startup -import androidx.navigation.NavController import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.flow.StateFlow @@ -39,8 +38,8 @@ open class SplashPresenter( // TODO: Conditional nav - Will implement once we got persistant storage from nish to save flags // If firstTimeApp launch, goto Onboarding[clientMode] (androidNode / xClient) // If not, goto TabContainerScreen - rootNavigator.navigate(Routes.Onboarding.name) { - // rootNavigator.navigate(Routes.TabContainer.name) { + // rootNavigator.navigate(Routes.Onboarding.name) { + rootNavigator.navigate(Routes.TabContainer.name) { popUpTo(Routes.Splash.name) { inclusive = true } } } diff --git a/bisqapps/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/uicases/trades/MyTradesPresenter.kt b/bisqapps/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/uicases/trades/MyTradesPresenter.kt index 55e2299a..c00566c9 100644 --- a/bisqapps/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/uicases/trades/MyTradesPresenter.kt +++ b/bisqapps/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/uicases/trades/MyTradesPresenter.kt @@ -22,10 +22,9 @@ class MyTradesPresenter( private val _myTrades = MutableStateFlow>(emptyList()) override val myTrades: StateFlow> = _myTrades - override fun navigateToExchange() { - // tabController.navigate(Routes.TabExchange.name) + override fun navigateToCurrencyList() { - tabController.navigate(Routes.TabExchange.name) { + tabController.navigate(Routes.TabCurrencies.name) { tabController.graph.startDestinationRoute?.let { route -> popUpTo(route) { saveState = true diff --git a/bisqapps/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/uicases/trades/MyTradesScreen.kt b/bisqapps/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/uicases/trades/MyTradesScreen.kt index d135e3eb..53dcc8a0 100644 --- a/bisqapps/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/uicases/trades/MyTradesScreen.kt +++ b/bisqapps/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/uicases/trades/MyTradesScreen.kt @@ -30,7 +30,7 @@ import org.koin.core.qualifier.named interface IMyTrades: ViewPresenter { val myTrades: StateFlow> - fun navigateToExchange() + fun navigateToCurrencyList() } @Composable @@ -85,7 +85,7 @@ fun NoTradesSection(presenter: IMyTrades) { ) BisqButton( text = "Start your first trade", - onClick = { presenter.navigateToExchange() } + onClick = { presenter.navigateToCurrencyList() } ) } } From 1d607d9cd427f579b49312ded3fd41517c1db763 Mon Sep 17 00:00:00 2001 From: nostrbuddha Date: Mon, 25 Nov 2024 10:22:52 +0530 Subject: [PATCH 4/8] - minor fixes: coil3 in .toml; Misc --- bisqapps/gradle/libs.versions.toml | 2 ++ .../bisq/mobile/domain/data/repository/CurrenciesRepository.kt | 2 -- .../network/bisq/mobile/presentation/di/PresentationModule.kt | 1 + 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/bisqapps/gradle/libs.versions.toml b/bisqapps/gradle/libs.versions.toml index 0533898c..28e56f6f 100644 --- a/bisqapps/gradle/libs.versions.toml +++ b/bisqapps/gradle/libs.versions.toml @@ -17,6 +17,7 @@ androidx-lifecycle = "2.8.2" androidx-test-compose-ver = "1.6.8" androidx-multidex = "2.0.1" bisq-core = "2.1.2" +coilCompose = "3.0.3" compose-plugin = "1.7.0" junit = "4.13.2" kotlinxDatetime = "0.4.0" @@ -64,6 +65,7 @@ lombok-lib = { strictly = '1.18.34' } typesafe-config-lib = { strictly = '1.4.3' } [libraries] +coil-compose = { module = "io.coil-kt.coil3:coil-compose", version.ref = "coilCompose" } kotlin-test = { module = "org.jetbrains.kotlin:kotlin-test", version.ref = "kotlin" } kotlin-test-junit-v180 = { module = "org.jetbrains.kotlin:kotlin-test-junit", version.ref = "kotlinTestJunit" } kotlinx-coroutines = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-core", version.ref = "kotlinx" } diff --git a/bisqapps/shared/domain/src/commonMain/kotlin/network/bisq/mobile/domain/data/repository/CurrenciesRepository.kt b/bisqapps/shared/domain/src/commonMain/kotlin/network/bisq/mobile/domain/data/repository/CurrenciesRepository.kt index 940e434b..fd699350 100644 --- a/bisqapps/shared/domain/src/commonMain/kotlin/network/bisq/mobile/domain/data/repository/CurrenciesRepository.kt +++ b/bisqapps/shared/domain/src/commonMain/kotlin/network/bisq/mobile/domain/data/repository/CurrenciesRepository.kt @@ -35,8 +35,6 @@ open class CurrenciesRepository : SingleObjectRepository() { FiatCurrency(flagImage = "currency_jpy.png", name = "Japanese Yen", code = "jpy", offerCount = 2), - FiatCurrency(flagImage = "currency_ngn.png", name = "Nigerian Naira", code = "ngn", offerCount = 23), - FiatCurrency(flagImage = "currency_qar.png", name = "Qatari Rial", code = "qar", offerCount = 4), FiatCurrency(flagImage = "currency_sek.png", name = "Swedish Krona", code = "sek", offerCount = 18), FiatCurrency( diff --git a/bisqapps/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/di/PresentationModule.kt b/bisqapps/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/di/PresentationModule.kt index 41371081..f6be9d34 100644 --- a/bisqapps/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/di/PresentationModule.kt +++ b/bisqapps/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/di/PresentationModule.kt @@ -1,5 +1,6 @@ package network.bisq.mobile.presentation.di +import androidx.navigation.NavController import androidx.navigation.NavHostController import network.bisq.mobile.presentation.MainPresenter import network.bisq.mobile.presentation.ui.AppPresenter From 69ceb42cc2886e2476bfb7ffe516fbfb0339a3ab Mon Sep 17 00:00:00 2001 From: nostrbuddha Date: Tue, 26 Nov 2024 12:11:09 +0530 Subject: [PATCH 5/8] - minor cleanups - removed dead code, updated TODO comments --- .../bisq/mobile/domain/data/model/MyTrades.kt | 2 +- .../ui/components/CurrencyProfileCard.kt | 9 -------- .../ui/components/atoms/DynamicImage.kt | 23 +++++++++++-------- .../ui/components/molecules/TopBar.kt | 2 +- .../ui/uicases/offers/CurrencyListScreen.kt | 6 ++--- .../ui/uicases/offers/OffersListScreen.kt | 18 +++++++-------- 6 files changed, 26 insertions(+), 34 deletions(-) diff --git a/bisqapps/shared/domain/src/commonMain/kotlin/network/bisq/mobile/domain/data/model/MyTrades.kt b/bisqapps/shared/domain/src/commonMain/kotlin/network/bisq/mobile/domain/data/model/MyTrades.kt index 6de99744..492fcda1 100644 --- a/bisqapps/shared/domain/src/commonMain/kotlin/network/bisq/mobile/domain/data/model/MyTrades.kt +++ b/bisqapps/shared/domain/src/commonMain/kotlin/network/bisq/mobile/domain/data/model/MyTrades.kt @@ -1,6 +1,6 @@ package network.bisq.mobile.domain.data.model -// TODO: Update later +// TODO: Update later based on model class from bisq2 lib data class BisqOffer ( val id: String = "offer_283UANJD19A", val isBuy: Boolean = true, diff --git a/bisqapps/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/components/CurrencyProfileCard.kt b/bisqapps/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/components/CurrencyProfileCard.kt index b0325cbf..ea2c7b36 100644 --- a/bisqapps/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/components/CurrencyProfileCard.kt +++ b/bisqapps/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/components/CurrencyProfileCard.kt @@ -46,16 +46,7 @@ fun CurrencyProfileCard( Row( verticalAlignment = Alignment.CenterVertically, ) { - //Image(painterResource(image), null, modifier = Modifier.size(36.dp)) - //DynamicImage("drawable/${currency.flagImage}", contentDescription = null) - println(currency.flagImage) DynamicImage("drawable/${currency.flagImage}", contentDescription = null) -// AsyncImage( -// //model = Res.getUri("drawable/${currency.flagImage}"), -// model = Res.getUri("drawable/currency_usd.png"), -// contentDescription = null, -// modifier = Modifier.size(36.dp) -// ) Spacer(modifier = Modifier.width(8.dp)) Column { BisqText.baseRegular( diff --git a/bisqapps/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/components/atoms/DynamicImage.kt b/bisqapps/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/components/atoms/DynamicImage.kt index bf4beb6a..43f004bd 100644 --- a/bisqapps/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/components/atoms/DynamicImage.kt +++ b/bisqapps/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/components/atoms/DynamicImage.kt @@ -13,17 +13,20 @@ import coil3.compose.AsyncImage import org.jetbrains.compose.resources.ExperimentalResourceApi import org.jetbrains.compose.resources.painterResource + +// The idea of this Composable is to load images at run time with a string path. +// TODO: In case the image doesn't exist, it should be handled gracefully @OptIn(ExperimentalResourceApi::class) @Composable fun DynamicImage(path: String, contentDescription: String?, modifier: Modifier? = Modifier) { - AsyncImage( - model = Res.getUri(path), - //model = Res.getUri("drawable/currency_usd.png"), - //fallback = painterResource(Res.drawable.currency_aed), - contentDescription = null, - modifier = Modifier.size(36.dp), - onError = { - println("Error") - } - ) + AsyncImage( + model = Res.getUri(path), + //model = Res.getUri("drawable/currency_usd.png"), + //fallback = painterResource(Res.drawable.currency_aed), + contentDescription = null, + modifier = Modifier.size(36.dp), + onError = { + println("Error") + } + ) } \ No newline at end of file diff --git a/bisqapps/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/components/molecules/TopBar.kt b/bisqapps/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/components/molecules/TopBar.kt index 9f0b2d01..8e40ca96 100644 --- a/bisqapps/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/components/molecules/TopBar.kt +++ b/bisqapps/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/components/molecules/TopBar.kt @@ -22,7 +22,7 @@ import org.jetbrains.compose.resources.ExperimentalResourceApi @OptIn(ExperimentalMaterial3Api::class, ExperimentalResourceApi::class) @Composable -fun TopBar(title: String = "",isHome:Boolean = false) { +fun TopBar(title: String = "", isHome:Boolean = false) { TopAppBar( modifier = Modifier.padding(horizontal = 16.dp).padding(end = 16.dp), colors = TopAppBarDefaults.topAppBarColors( diff --git a/bisqapps/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/uicases/offers/CurrencyListScreen.kt b/bisqapps/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/uicases/offers/CurrencyListScreen.kt index bdd6e1ae..aa17641c 100644 --- a/bisqapps/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/uicases/offers/CurrencyListScreen.kt +++ b/bisqapps/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/uicases/offers/CurrencyListScreen.kt @@ -9,6 +9,7 @@ import androidx.compose.runtime.collectAsState import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.unit.dp +import cafe.adriel.lyricist.LocalStrings import kotlinx.coroutines.flow.StateFlow import network.bisq.mobile.presentation.ui.components.CurrencyProfileCard import network.bisq.mobile.components.MaterialTextField @@ -25,6 +26,7 @@ interface ICurrencyList : ViewPresenter { @Composable fun CurrencyListScreen() { + val strings = LocalStrings.current val presenter: ICurrencyList = koinInject() val currencies: List = presenter.currencies.collectAsState().value @@ -38,9 +40,7 @@ fun CurrencyListScreen() { verticalAlignment = Alignment.CenterVertically, horizontalArrangement = Arrangement.SpaceBetween, ) { - Box() { - MaterialTextField(text = "Search", onValueChanged = {}) - } + MaterialTextField(text = "Search", onValueChanged = {}) SortIcon(modifier = Modifier.size(24.dp)) } Spacer(modifier = Modifier.height(12.dp)) diff --git a/bisqapps/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/uicases/offers/OffersListScreen.kt b/bisqapps/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/uicases/offers/OffersListScreen.kt index 304d9027..df48474b 100644 --- a/bisqapps/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/uicases/offers/OffersListScreen.kt +++ b/bisqapps/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/uicases/offers/OffersListScreen.kt @@ -68,16 +68,14 @@ fun OffersListScreen() { } if (openDialog.value) { - BisqDialog { - ConfirmationDialog( - message = "Do you want to take this trade?", - confirmButtonText = "Yes, please", - cancelButtonText = "Cancel", - onDismissRequest = { - openDialog.value = !openDialog.value - }, - ) - } + ConfirmationDialog( + message = "Do you want to take this trade?", + confirmButtonText = "Yes, please", + cancelButtonText = "Cancel", + onDismissRequest = { + openDialog.value = !openDialog.value + }, + ) } } From 856a08895d7d6501a420a093dad927aa33e6b1e2 Mon Sep 17 00:00:00 2001 From: nostrbuddha Date: Tue, 26 Nov 2024 12:26:38 +0530 Subject: [PATCH 6/8] - added translation keys/strings to CurrencyList/OfferList screens --- .../commonMain/kotlin/network/bisq/mobile/i18n/EnStrings.kt | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/bisqapps/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/i18n/EnStrings.kt b/bisqapps/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/i18n/EnStrings.kt index 5e432979..a2ef7743 100644 --- a/bisqapps/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/i18n/EnStrings.kt +++ b/bisqapps/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/i18n/EnStrings.kt @@ -146,4 +146,10 @@ val EnStrings = Strings( buttons_next = "Next", buttons_submit = "Submit", buttons_cancel = "Cancel", + + common_offers = "Offers", + common_search = "Search", + + offers_list_buy_from = "Buy from", + offers_list_sell_to = "Sell to", ) From 14a021c62d215cf26406397539e33406231efd73 Mon Sep 17 00:00:00 2001 From: nostrbuddha Date: Tue, 26 Nov 2024 12:47:55 +0530 Subject: [PATCH 7/8] - added translation keys/strings to CurrencyList/OfferList screens (missed staging the files) --- .../network/bisq/mobile/i18n/FrStrings.kt | 6 +++++ .../network/bisq/mobile/i18n/Strings.kt | 6 +++++ .../ui/components/CurrencyProfileCard.kt | 4 ++- .../molecules/ConfirmationDialog.kt | 1 + .../ui/uicases/offers/CurrencyListScreen.kt | 2 +- .../ui/uicases/offers/OffersListScreen.kt | 26 ++++++------------- 6 files changed, 25 insertions(+), 20 deletions(-) diff --git a/bisqapps/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/i18n/FrStrings.kt b/bisqapps/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/i18n/FrStrings.kt index c4d5d745..56df8ec3 100644 --- a/bisqapps/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/i18n/FrStrings.kt +++ b/bisqapps/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/i18n/FrStrings.kt @@ -148,4 +148,10 @@ val FRStrings = Strings( buttons_next = "[FR] Next", buttons_submit = "[FR] Submit", buttons_cancel = "[FR] Cancel", + + common_offers = "[FR] offers", + common_search = "[FR] Search", + + offers_list_buy_from = "[FR] Buy from", + offers_list_sell_to = "[FR] Sell to", ) diff --git a/bisqapps/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/i18n/Strings.kt b/bisqapps/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/i18n/Strings.kt index b23042f6..2ab2c063 100644 --- a/bisqapps/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/i18n/Strings.kt +++ b/bisqapps/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/i18n/Strings.kt @@ -144,4 +144,10 @@ data class Strings( val buttons_next: String, val buttons_submit: String, val buttons_cancel: String, + + val common_offers: String, + val common_search: String, + + val offers_list_buy_from: String, + val offers_list_sell_to: String, ) \ No newline at end of file diff --git a/bisqapps/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/components/CurrencyProfileCard.kt b/bisqapps/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/components/CurrencyProfileCard.kt index ea2c7b36..9334e7a2 100644 --- a/bisqapps/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/components/CurrencyProfileCard.kt +++ b/bisqapps/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/components/CurrencyProfileCard.kt @@ -10,6 +10,7 @@ import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.unit.dp import bisqapps.shared.presentation.generated.resources.Res +import cafe.adriel.lyricist.LocalStrings import coil3.compose.AsyncImage import network.bisq.mobile.domain.data.model.FiatCurrency import network.bisq.mobile.presentation.ui.components.atoms.BisqText @@ -26,6 +27,7 @@ fun CurrencyProfileCard( currency: FiatCurrency, onClick: (FiatCurrency) -> Unit) { + val strings = LocalStrings.current val interactionSource = remember { MutableInteractionSource() } Row( @@ -61,7 +63,7 @@ fun CurrencyProfileCard( } } BisqText.smallRegular( - text = "${currency.offerCount.toString()} offers", + text = "${currency.offerCount.toString()} ${strings.common_offers}", color = BisqTheme.colors.primary, ) } diff --git a/bisqapps/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/components/molecules/ConfirmationDialog.kt b/bisqapps/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/components/molecules/ConfirmationDialog.kt index 057e72bc..94b6722d 100644 --- a/bisqapps/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/components/molecules/ConfirmationDialog.kt +++ b/bisqapps/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/components/molecules/ConfirmationDialog.kt @@ -11,6 +11,7 @@ import network.bisq.mobile.presentation.ui.components.atoms.BisqText import network.bisq.mobile.presentation.ui.components.molecules.BisqDialog import network.bisq.mobile.presentation.ui.theme.BisqTheme +// TODO: Update default params with translation keys @Composable fun ConfirmationDialog( title: String = "", diff --git a/bisqapps/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/uicases/offers/CurrencyListScreen.kt b/bisqapps/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/uicases/offers/CurrencyListScreen.kt index aa17641c..7c4ea07a 100644 --- a/bisqapps/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/uicases/offers/CurrencyListScreen.kt +++ b/bisqapps/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/uicases/offers/CurrencyListScreen.kt @@ -40,7 +40,7 @@ fun CurrencyListScreen() { verticalAlignment = Alignment.CenterVertically, horizontalArrangement = Arrangement.SpaceBetween, ) { - MaterialTextField(text = "Search", onValueChanged = {}) + MaterialTextField(text = strings.common_search, onValueChanged = {}) SortIcon(modifier = Modifier.size(24.dp)) } Spacer(modifier = Modifier.height(12.dp)) diff --git a/bisqapps/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/uicases/offers/OffersListScreen.kt b/bisqapps/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/uicases/offers/OffersListScreen.kt index df48474b..e903a93b 100644 --- a/bisqapps/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/uicases/offers/OffersListScreen.kt +++ b/bisqapps/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/uicases/offers/OffersListScreen.kt @@ -19,6 +19,7 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.draw.blur import androidx.compose.ui.unit.dp import androidx.navigation.NavController +import cafe.adriel.lyricist.LocalStrings import network.bisq.mobile.presentation.ViewPresenter import network.bisq.mobile.presentation.ui.components.layout.BisqStaticScaffold import network.bisq.mobile.presentation.ui.components.molecules.* @@ -31,12 +32,12 @@ interface IOffersList : ViewPresenter { @Composable fun OffersListScreen() { val presenter: ICurrencyList = koinInject() + val strings = LocalStrings.current + val states = listOf( - "Buy from", - "Sell to" + strings.offers_list_buy_from, + strings.offers_list_sell_to ) - val openDialog = remember { mutableStateOf(false) } - val rootNavController: NavController LaunchedEffect(Unit) { presenter.onViewAttached() @@ -44,10 +45,10 @@ fun OffersListScreen() { BisqStaticScaffold( topBar = { - TopBar(title = "Offers") + TopBar(title = strings.common_offers) }, ) { - Box(modifier = Modifier.fillMaxSize().blur(if (openDialog.value) 12.dp else 0.dp)) { + Box(modifier = Modifier.fillMaxSize()) { Column { Column( modifier = Modifier.fillMaxWidth(), @@ -62,22 +63,11 @@ fun OffersListScreen() { ) { items(3) { OfferCard(onClick = { - openDialog.value = !openDialog.value + // TODO: Do navigation here }) } } - if (openDialog.value) { - ConfirmationDialog( - message = "Do you want to take this trade?", - confirmButtonText = "Yes, please", - cancelButtonText = "Cancel", - onDismissRequest = { - openDialog.value = !openDialog.value - }, - ) - } - } } } From c0cab9cb3c97fe70dcdf033e8a06d61c71fdfdff Mon Sep 17 00:00:00 2001 From: Rodrigo Varela Date: Tue, 26 Nov 2024 21:49:53 +1100 Subject: [PATCH 8/8] - replace attach call with custom composable RememberPresenterLifecycle which handle both attach and unattach --- .../ui/uicases/offers/CurrencyListScreen.kt | 6 ++---- .../ui/uicases/offers/OffersListScreen.kt | 11 ++--------- .../presentation/ui/uicases/trades/MyTradesScreen.kt | 6 ++---- 3 files changed, 6 insertions(+), 17 deletions(-) diff --git a/bisqapps/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/uicases/offers/CurrencyListScreen.kt b/bisqapps/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/uicases/offers/CurrencyListScreen.kt index 7c4ea07a..28319410 100644 --- a/bisqapps/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/uicases/offers/CurrencyListScreen.kt +++ b/bisqapps/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/uicases/offers/CurrencyListScreen.kt @@ -4,7 +4,6 @@ import androidx.compose.foundation.layout.* import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.items import androidx.compose.runtime.Composable -import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.collectAsState import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier @@ -17,6 +16,7 @@ import network.bisq.mobile.domain.data.model.FiatCurrency import network.bisq.mobile.presentation.ViewPresenter import network.bisq.mobile.presentation.ui.components.atoms.icons.SortIcon import network.bisq.mobile.presentation.ui.components.layout.BisqStaticLayout +import network.bisq.mobile.presentation.ui.helpers.RememberPresenterLifecycle import org.koin.compose.koinInject interface ICurrencyList : ViewPresenter { @@ -30,9 +30,7 @@ fun CurrencyListScreen() { val presenter: ICurrencyList = koinInject() val currencies: List = presenter.currencies.collectAsState().value - LaunchedEffect(Unit) { - presenter.onViewAttached() - } + RememberPresenterLifecycle(presenter) BisqStaticLayout(verticalArrangement = Arrangement.Top) { Row( diff --git a/bisqapps/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/uicases/offers/OffersListScreen.kt b/bisqapps/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/uicases/offers/OffersListScreen.kt index e903a93b..778825c8 100644 --- a/bisqapps/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/uicases/offers/OffersListScreen.kt +++ b/bisqapps/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/uicases/offers/OffersListScreen.kt @@ -3,7 +3,6 @@ package network.bisq.mobile.presentation.ui.uicases.offers import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column -import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth @@ -11,18 +10,14 @@ import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.runtime.Composable -import androidx.compose.runtime.LaunchedEffect -import androidx.compose.runtime.mutableStateOf -import androidx.compose.runtime.remember import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier -import androidx.compose.ui.draw.blur import androidx.compose.ui.unit.dp -import androidx.navigation.NavController import cafe.adriel.lyricist.LocalStrings import network.bisq.mobile.presentation.ViewPresenter import network.bisq.mobile.presentation.ui.components.layout.BisqStaticScaffold import network.bisq.mobile.presentation.ui.components.molecules.* +import network.bisq.mobile.presentation.ui.helpers.RememberPresenterLifecycle import org.koin.compose.koinInject interface IOffersList : ViewPresenter { @@ -39,9 +34,7 @@ fun OffersListScreen() { strings.offers_list_sell_to ) - LaunchedEffect(Unit) { - presenter.onViewAttached() - } + RememberPresenterLifecycle(presenter) BisqStaticScaffold( topBar = { diff --git a/bisqapps/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/uicases/trades/MyTradesScreen.kt b/bisqapps/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/uicases/trades/MyTradesScreen.kt index 53dcc8a0..ef2d6647 100644 --- a/bisqapps/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/uicases/trades/MyTradesScreen.kt +++ b/bisqapps/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/uicases/trades/MyTradesScreen.kt @@ -5,7 +5,6 @@ import androidx.compose.foundation.layout.* import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.items import androidx.compose.runtime.Composable -import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.collectAsState import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier @@ -21,6 +20,7 @@ import network.bisq.mobile.presentation.ui.components.atoms.BisqButton import network.bisq.mobile.presentation.ui.components.atoms.BisqText import network.bisq.mobile.presentation.ui.components.layout.BisqScrollLayout import network.bisq.mobile.presentation.ui.components.molecules.OfferCard +import network.bisq.mobile.presentation.ui.helpers.RememberPresenterLifecycle import network.bisq.mobile.presentation.ui.theme.BisqTheme import org.jetbrains.compose.resources.painterResource import org.koin.compose.koinInject @@ -42,9 +42,7 @@ fun MyTradesScreen() { val myTrades: List = presenter.myTrades.collectAsState().value - LaunchedEffect(Unit) { - presenter.onViewAttached() - } + RememberPresenterLifecycle(presenter) if (myTrades.isEmpty()) { NoTradesSection(presenter)