diff --git a/bisqapps/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/uicases/offers/TakeOfferReviewTradeScreen.kt b/bisqapps/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/uicases/offers/TakeOfferReviewTradeScreen.kt
new file mode 100644
index 00000000..0c851386
--- /dev/null
+++ b/bisqapps/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/uicases/offers/TakeOfferReviewTradeScreen.kt
@@ -0,0 +1,173 @@
+package network.bisq.mobile.presentation.ui.uicases.offers
+
+import androidx.compose.foundation.layout.*
+import androidx.compose.material3.HorizontalDivider
+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.navigation.NavHostController
+import network.bisq.mobile.presentation.ui.components.atoms.BisqButton
+import network.bisq.mobile.presentation.ui.components.atoms.BisqText
+import network.bisq.mobile.presentation.ui.navigation.Routes
+import network.bisq.mobile.presentation.ui.theme.BisqTheme
+import org.koin.compose.koinInject
+import org.koin.core.qualifier.named
+
+@Composable
+fun TakeOfferReviewTradeScreen() {
+ val navController: NavHostController = koinInject(named("RootNavController"))
+ TakeOfferScaffold {
+ Column(modifier = Modifier.padding(horizontal = 32.dp, vertical = 24.dp)) {
+ BisqText.h3Regular(
+ text = "Review trade",
+ color = BisqTheme.colors.light1
+ )
+ Spacer(modifier = Modifier.height(32.dp))
+ Column(
+ verticalArrangement = Arrangement.spacedBy(32.dp)
+ ) {
+ Row(
+ modifier = Modifier.fillMaxWidth(),
+ horizontalArrangement = Arrangement.SpaceBetween
+ ) {
+ Column(verticalArrangement = Arrangement.spacedBy(12.dp)) {
+ BisqText.largeRegular(
+ text = "I WANT TO",
+ color = BisqTheme.colors.grey2
+ )
+ BisqText.h5Regular(
+ text = "BUY Bitcoin"
+ )
+ }
+ Column(
+ verticalArrangement = Arrangement.spacedBy(12.dp),
+ horizontalAlignment = Alignment.End
+ ) {
+ BisqText.largeRegular(
+ text = "FIAT PAYMENT METHOD",
+ color = BisqTheme.colors.grey2
+ )
+ BisqText.h5Regular(
+ text = "Strike"
+ )
+ }
+ }
+
+ Row(
+ modifier = Modifier.fillMaxWidth(),
+ horizontalArrangement = Arrangement.SpaceBetween
+ ) {
+ Column(verticalArrangement = Arrangement.spacedBy(12.dp)) {
+ BisqText.largeRegular(
+ text = "AMOUNT TO PAY",
+ color = BisqTheme.colors.grey2
+ )
+ BisqText.h5Regular(
+ text = "900.00"
+ )
+ }
+ Column(
+ verticalArrangement = Arrangement.spacedBy(12.dp),
+ horizontalAlignment = Alignment.End
+ ) {
+ BisqText.largeRegular(
+ text = "AMOUNT TO RECEIVE",
+ color = BisqTheme.colors.grey2
+ )
+ BisqText.h5Regular(
+ text = "0.00918367 btc"
+ )
+ }
+ }
+ }
+ HorizontalDivider(
+ thickness = 1.dp,
+ modifier = Modifier.padding(vertical = 28.dp),
+ color = Color(0XFF2B2B2B)
+ )
+ Column(
+ verticalArrangement = Arrangement.spacedBy(32.dp)
+ ) {
+ Column(verticalArrangement = Arrangement.spacedBy(12.dp)) {
+ BisqText.largeRegular(
+ text = "Trade price",
+ color = BisqTheme.colors.grey2
+ )
+ Column(verticalArrangement = Arrangement.spacedBy(4.dp)) {
+ Row(
+ verticalAlignment = Alignment.Bottom,
+ horizontalArrangement = Arrangement.spacedBy(4.dp)
+ ) {
+ BisqText.h5Regular(
+ text = "98,000.68"
+ )
+ BisqText.baseRegular(
+ text = "BTC/USD",
+ color = BisqTheme.colors.grey2
+ )
+ }
+ BisqText.smallRegular(
+ text = "Float price 1.00% above market price of 60,000 BTC/USD",
+ color = BisqTheme.colors.grey4
+ )
+ }
+ }
+ Row(
+ modifier = Modifier.fillMaxWidth(),
+ horizontalArrangement = Arrangement.SpaceBetween
+ ) {
+ Column(verticalArrangement = Arrangement.spacedBy(12.dp)) {
+ BisqText.largeRegular(
+ text = "Bitcoin settlement method",
+ color = BisqTheme.colors.grey2
+ )
+ BisqText.h5Regular(
+ text = "Lightning"
+ )
+ }
+ Column(
+ verticalArrangement = Arrangement.spacedBy(12.dp),
+ horizontalAlignment = Alignment.End
+ ) {
+ BisqText.largeRegular(
+ text = "Fiat payment",
+ color = BisqTheme.colors.grey2
+ )
+ BisqText.h5Regular(
+ text = "Strike"
+ )
+ }
+ }
+ Column(verticalArrangement = Arrangement.spacedBy(12.dp)) {
+ BisqText.largeRegular(
+ text = "Fees",
+ color = BisqTheme.colors.grey2
+ )
+ BisqText.h5Regular(
+ text = "No trade fees in Bisq Easy :-)"
+ )
+ }
+ }
+ }
+ Row(
+ horizontalArrangement = Arrangement.SpaceBetween,
+ modifier = Modifier.fillMaxWidth().padding(horizontal = 32.dp)
+ ) {
+ BisqButton(
+ text = "Back",
+ backgroundColor = BisqTheme.colors.dark5,
+ onClick = { },
+ padding = PaddingValues(horizontal = 64.dp, vertical = 4.dp)
+ )
+ BisqButton(
+ text = "Next",
+ onClick = {
+ navController.navigate(Routes.TradeFlow.name)
+ },
+ padding = PaddingValues(horizontal = 64.dp, vertical = 4.dp)
+ )
+ }
+ }
+}
\ No newline at end of file
diff --git a/shared/presentation/src/commonMain/composeResources/drawable/exchange_h_arrow.png b/shared/presentation/src/commonMain/composeResources/drawable/exchange_h_arrow.png
new file mode 100644
index 00000000..ec73a7ea
Binary files /dev/null and b/shared/presentation/src/commonMain/composeResources/drawable/exchange_h_arrow.png differ
diff --git a/shared/presentation/src/commonMain/composeResources/drawable/exchange_v_arrow.png b/shared/presentation/src/commonMain/composeResources/drawable/exchange_v_arrow.png
new file mode 100644
index 00000000..8f4d5df6
Binary files /dev/null and b/shared/presentation/src/commonMain/composeResources/drawable/exchange_v_arrow.png differ
diff --git a/shared/presentation/src/commonMain/composeResources/drawable/img_bitcoin_payment_confirmation.png b/shared/presentation/src/commonMain/composeResources/drawable/img_bitcoin_payment_confirmation.png
new file mode 100644
index 00000000..daeacaa3
Binary files /dev/null and b/shared/presentation/src/commonMain/composeResources/drawable/img_bitcoin_payment_confirmation.png differ
diff --git a/shared/presentation/src/commonMain/composeResources/drawable/img_bitcoin_payment_waiting.png b/shared/presentation/src/commonMain/composeResources/drawable/img_bitcoin_payment_waiting.png
new file mode 100644
index 00000000..5feae0df
Binary files /dev/null and b/shared/presentation/src/commonMain/composeResources/drawable/img_bitcoin_payment_waiting.png differ
diff --git a/shared/presentation/src/commonMain/composeResources/drawable/img_fiat_payment_waiting.png b/shared/presentation/src/commonMain/composeResources/drawable/img_fiat_payment_waiting.png
new file mode 100644
index 00000000..80d7c624
Binary files /dev/null and b/shared/presentation/src/commonMain/composeResources/drawable/img_fiat_payment_waiting.png differ
diff --git a/shared/presentation/src/commonMain/composeResources/drawable/svg_back_button.svg b/shared/presentation/src/commonMain/composeResources/drawable/svg_back_button.svg
new file mode 100644
index 00000000..3f2e907e
--- /dev/null
+++ b/shared/presentation/src/commonMain/composeResources/drawable/svg_back_button.svg
@@ -0,0 +1,3 @@
+
diff --git a/shared/presentation/src/commonMain/composeResources/drawable/svg_exchange_h_arrow.svg b/shared/presentation/src/commonMain/composeResources/drawable/svg_exchange_h_arrow.svg
new file mode 100644
index 00000000..9e61003e
--- /dev/null
+++ b/shared/presentation/src/commonMain/composeResources/drawable/svg_exchange_h_arrow.svg
@@ -0,0 +1,3 @@
+
diff --git a/shared/presentation/src/commonMain/composeResources/drawable/svg_exchange_v_arrow.svg b/shared/presentation/src/commonMain/composeResources/drawable/svg_exchange_v_arrow.svg
new file mode 100644
index 00000000..50eafa00
--- /dev/null
+++ b/shared/presentation/src/commonMain/composeResources/drawable/svg_exchange_v_arrow.svg
@@ -0,0 +1,3 @@
+
diff --git a/shared/presentation/src/commonMain/composeResources/drawable/svg_info.svg b/shared/presentation/src/commonMain/composeResources/drawable/svg_info.svg
new file mode 100644
index 00000000..9cb975ad
--- /dev/null
+++ b/shared/presentation/src/commonMain/composeResources/drawable/svg_info.svg
@@ -0,0 +1,3 @@
+
diff --git a/shared/presentation/src/commonMain/composeResources/drawable/svg_star.svg b/shared/presentation/src/commonMain/composeResources/drawable/svg_star.svg
new file mode 100644
index 00000000..0fe9d3a5
--- /dev/null
+++ b/shared/presentation/src/commonMain/composeResources/drawable/svg_star.svg
@@ -0,0 +1,3 @@
+
diff --git a/shared/presentation/src/commonMain/composeResources/drawable/svg_up_arrow.svg b/shared/presentation/src/commonMain/composeResources/drawable/svg_up_arrow.svg
new file mode 100644
index 00000000..c51a18f5
--- /dev/null
+++ b/shared/presentation/src/commonMain/composeResources/drawable/svg_up_arrow.svg
@@ -0,0 +1,3 @@
+
diff --git a/shared/presentation/src/commonMain/composeResources/drawable/up_arrow.png b/shared/presentation/src/commonMain/composeResources/drawable/up_arrow.png
new file mode 100644
index 00000000..222eda69
Binary files /dev/null and b/shared/presentation/src/commonMain/composeResources/drawable/up_arrow.png differ
diff --git a/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/i18n/ApplicationStrings.kt b/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/i18n/ApplicationStrings.kt
new file mode 100644
index 00000000..44e3dfd0
--- /dev/null
+++ b/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/i18n/ApplicationStrings.kt
@@ -0,0 +1,143 @@
+package network.bisq.mobile.i18n
+
+// From application.properties
+data class ApplicationStrings(
+ val splash_details_tooltip: String,
+ val splash_applicationServiceState_INITIALIZE_APP: String,
+ val splash_applicationServiceState_INITIALIZE_NETWORK: String,
+ val splash_applicationServiceState_INITIALIZE_WALLET: String,
+ val splash_applicationServiceState_INITIALIZE_SERVICES: String,
+ val splash_applicationServiceState_APP_INITIALIZED: String,
+ val splash_applicationServiceState_FAILED: String,
+ val splash_bootstrapState_service_CLEAR: String,
+ val splash_bootstrapState_service_TOR: String,
+ val splash_bootstrapState_service_I2P: String,
+ val splash_bootstrapState_network_CLEAR: String,
+ val splash_bootstrapState_network_TOR: String,
+ val splash_bootstrapState_network_I2P: String,
+ val splash_bootstrapState_BOOTSTRAP_TO_NETWORK: (String) -> String,
+ val splash_bootstrapState_START_PUBLISH_SERVICE: String,
+ val splash_bootstrapState_SERVICE_PUBLISHED: String,
+ val splash_bootstrapState_CONNECTED_TO_PEERS: String,
+ val tac_headline: String,
+ val tac_confirm: String,
+ val tac_accept: String,
+ val tac_reject: String,
+ val unlock_headline: String,
+ val unlock_button: String,
+ val unlock_failed: String,
+ val updater_headline: String,
+ val updater_headline_isLauncherUpdate: String,
+ val updater_releaseNotesHeadline: String,
+ val updater_furtherInfo: String,
+ val updater_furtherInfo_isLauncherUpdate: String,
+ val updater_download: String,
+ val updater_downloadLater: String,
+ val updater_ignore: String,
+ val updater_shutDown: String,
+ val updater_shutDown_isLauncherUpdate: String,
+ val updater_downloadAndVerify_headline: String,
+ val updater_downloadAndVerify_info: String,
+ val updater_downloadAndVerify_info_isLauncherUpdate: String,
+ val updater_table_file: String,
+ val updater_table_progress: String,
+ val updater_table_progress_completed: String,
+ val updater_table_verified: String,
+ val notificationPanel_trades_headline_single: String,
+ val notificationPanel_trades_headline_multiple: String,
+ val notificationPanel_trades_button: String,
+ val notificationPanel_mediationCases_headline_single: String,
+ val notificationPanel_mediationCases_headline_multiple: String,
+ val notificationPanel_mediationCases_button: String,
+ val onboarding_bisq2_headline: String,
+ val onboarding_bisq2_teaserHeadline1: String,
+ val onboarding_bisq2_line1: String,
+ val onboarding_bisq2_teaserHeadline2: String,
+ val onboarding_bisq2_line2: String,
+ val onboarding_bisq2_teaserHeadline3: String,
+ val onboarding_bisq2_line3: String,
+ val onboarding_button_create_profile: String,
+ val onboarding_createProfile_headline: String,
+ val onboarding_createProfile_subTitle: String,
+ val onboarding_createProfile_nym: String,
+ val onboarding_createProfile_regenerate: String,
+ val onboarding_createProfile_nym_generating: String,
+ val onboarding_createProfile_createProfile: String,
+ val onboarding_createProfile_createProfile_busy: String,
+ val onboarding_createProfile_nickName_prompt: String,
+ val onboarding_createProfile_nickName: String,
+ val onboarding_createProfile_nickName_tooLong: String,
+ val onboarding_password_button_skip: String,
+ val onboarding_password_subTitle: String,
+ val onboarding_password_headline_setPassword: String,
+ val onboarding_password_button_savePassword: String,
+ val onboarding_password_enterPassword: String,
+ val onboarding_password_confirmPassword: String,
+ val onboarding_password_savePassword_success: String,
+ val navigation_dashboard: String,
+ val navigation_bisqEasy: String,
+ val navigation_reputation: String,
+ val navigation_tradeApps: String,
+ val navigation_wallet: String,
+ val navigation_academy: String,
+ val navigation_chat: String,
+ val navigation_support: String,
+ val navigation_userOptions: String,
+ val navigation_settings: String,
+ val navigation_network: String,
+ val navigation_authorizedRole: String,
+ val navigation_expandIcon_tooltip: String,
+ val navigation_collapseIcon_tooltip: String,
+ val navigation_vertical_expandIcon_tooltip: String,
+ val navigation_vertical_collapseIcon_tooltip: String,
+ val navigation_network_info_clearNet: String,
+ val navigation_network_info_tor: String,
+ val navigation_network_info_i2p: String,
+ val navigation_network_info_tooltip: String,
+ val navigation_network_info_inventoryRequest_requesting: String,
+ val navigation_network_info_inventoryRequest_completed: String,
+ val navigation_network_info_inventoryRequests_tooltip: String,
+ val topPanel_wallet_balance: String,
+ val dashboard_marketPrice: String,
+ val dashboard_offersOnline: String,
+ val dashboard_activeUsers: String,
+ val dashboard_activeUsers_tooltip: String,
+ val dashboard_main_headline: String,
+ val dashboard_main_content1: String,
+ val dashboard_main_content2: String,
+ val dashboard_main_content3: String,
+ val dashboard_main_button: String,
+ val dashboard_second_headline: String,
+ val dashboard_second_content: String,
+ val dashboard_second_button: String,
+ val dashboard_third_headline: String,
+ val dashboard_third_content: String,
+ val dashboard_third_button: String,
+ val popup_headline_instruction: String,
+ val popup_headline_attention: String,
+ val popup_headline_backgroundInfo: String,
+ val popup_headline_feedback: String,
+ val popup_headline_confirmation: String,
+ val popup_headline_information: String,
+ val popup_headline_warning: String,
+ val popup_headline_invalid: String,
+ val popup_headline_error: String,
+ val popup_reportBug: String,
+ val popup_reportError: String,
+ val popup_reportBug_report: String,
+ val popup_reportError_log: String,
+ val popup_reportError_zipLogs: String,
+ val popup_reportError_gitHub: String,
+ val popup_startup_error: String,
+ val popup_shutdown: String,
+ val popup_shutdown_error: String,
+ val popup_hyperlink_openInBrowser_tooltip: String,
+ val popup_hyperlink_copy_tooltip: String,
+ val hyperlinks_openInBrowser_attention_headline: String,
+ val hyperlinks_openInBrowser_attention: String,
+ val hyperlinks_openInBrowser_no: String,
+ val hyperlinks_copiedToClipboard: String,
+ val video_mp4NotSupported_warning_headline: String,
+ val video_mp4NotSupported_warning: String,
+ val version_versionAndCommitHash: String,
+ )
diff --git a/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/i18n/EnStrings.kt b/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/i18n/ApplicationStringsEn.kt
similarity index 96%
rename from shared/presentation/src/commonMain/kotlin/network/bisq/mobile/i18n/EnStrings.kt
rename to shared/presentation/src/commonMain/kotlin/network/bisq/mobile/i18n/ApplicationStringsEn.kt
index a2ef7743..0660eff9 100644
--- a/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/i18n/EnStrings.kt
+++ b/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/i18n/ApplicationStringsEn.kt
@@ -2,8 +2,8 @@ package network.bisq.mobile.i18n
import cafe.adriel.lyricist.LyricistStrings
-@LyricistStrings(languageTag = Locales.EN, default = true)
-val EnStrings = Strings(
+// @LyricistStrings(languageTag = Locales.EN, default = true)
+val EnApplicationStrings = ApplicationStrings(
splash_details_tooltip = "Click to toggle details",
splash_applicationServiceState_INITIALIZE_APP = "Starting Bisq",
splash_applicationServiceState_INITIALIZE_NETWORK = "Initialize P2P network",
@@ -142,14 +142,4 @@ val EnStrings = Strings(
video_mp4NotSupported_warning_headline = "Embedded video cannot be played",
video_mp4NotSupported_warning = "You can watch the video in your browser at: [HYPERLINK:{0}]",
version_versionAndCommitHash = "Version: v{0} / Commit hash: {1}",
-
- 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",
)
diff --git a/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/i18n/FrStrings.kt b/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/i18n/ApplicationStringsFr.kt
similarity index 96%
rename from shared/presentation/src/commonMain/kotlin/network/bisq/mobile/i18n/FrStrings.kt
rename to shared/presentation/src/commonMain/kotlin/network/bisq/mobile/i18n/ApplicationStringsFr.kt
index 56df8ec3..247f2eb0 100644
--- a/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/i18n/FrStrings.kt
+++ b/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/i18n/ApplicationStringsFr.kt
@@ -2,10 +2,8 @@ package network.bisq.mobile.i18n
import cafe.adriel.lyricist.LyricistStrings
-
-// Generated Locales.FR strings
-@LyricistStrings(languageTag = Locales.FR)
-val FRStrings = Strings(
+// @LyricistStrings(languageTag = Locales.FR)
+val FrApplicationStrings = ApplicationStrings(
splash_details_tooltip = "[FR] Click to toggle details",
splash_applicationServiceState_INITIALIZE_APP = "[FR] Starting Bisq",
splash_applicationServiceState_INITIALIZE_NETWORK = "[FR] Initialize P2P network",
@@ -144,14 +142,4 @@ val FRStrings = Strings(
video_mp4NotSupported_warning_headline = "[FR] Embedded video cannot be played",
video_mp4NotSupported_warning = "[FR] You can watch the video in your browser at: [HYPERLINK:{0}]",
version_versionAndCommitHash = "[FR] Version: v{0} / Commit hash: {1}",
-
- 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/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/i18n/BisqEasyStrings.kt b/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/i18n/BisqEasyStrings.kt
new file mode 100644
index 00000000..2c8805ce
--- /dev/null
+++ b/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/i18n/BisqEasyStrings.kt
@@ -0,0 +1,245 @@
+package network.bisq.mobile.i18n
+
+// From bisq_easy.properties
+data class BisqEasyStrings(
+ val bisqEasy_offerBookChannel_description: String,
+ val bisqEasy_mediator: String,
+ val bisqEasy_dashboard: String,
+ val bisqEasy_offerbook: String,
+ val bisqEasy_openTrades: String,
+ val bisqEasy_onboarding_top_headline: String,
+ val bisqEasy_onboarding_top_content1: String,
+ val bisqEasy_onboarding_top_content2: String,
+ val bisqEasy_onboarding_top_content3: String,
+ val bisqEasy_onboarding_openTradeGuide: String,
+ val bisqEasy_onboarding_watchVideo: String,
+ val bisqEasy_onboarding_watchVideo_tooltip: String,
+ val bisqEasy_onboarding_left_headline: String,
+ val bisqEasy_onboarding_left_info: String,
+ val bisqEasy_onboarding_left_button: String,
+ val bisqEasy_onboarding_right_headline: String,
+ val bisqEasy_onboarding_right_info: String,
+ val bisqEasy_onboarding_right_button: String,
+ val bisqEasy_takeOffer_progress_amount: String,
+ val bisqEasy_takeOffer_progress_method: String,
+ val bisqEasy_takeOffer_progress_review: String,
+ val bisqEasy_takeOffer_amount_headline_buyer: String,
+ val bisqEasy_takeOffer_amount_headline_seller: String,
+ val bisqEasy_takeOffer_amount_description: (Double, Double) -> String,
+ val bisqEasy_takeOffer_amount_description_limitedByTakersReputation: String,
+ val bisqEasy_takeOffer_amount_buyer_limitInfo_tooHighMax: String,
+ val bisqEasy_takeOffer_amount_buyer_limitInfoAmount: String,
+ val bisqEasy_takeOffer_amount_buyer_limitInfo_tooHighMax_overlay_info: String,
+ val bisqEasy_takeOffer_amount_buyer_limitInfo_minAmountCovered: String,
+ val bisqEasy_takeOffer_amount_buyer_limitInfo_minAmountCovered_overlay_info: String,
+ val bisqEasy_takeOffer_amount_buyer_limitInfo_minAmountNotCovered: String,
+ val bisqEasy_takeOffer_amount_buyer_limitInfo_tooHighMin_overlay_info: String,
+ val bisqEasy_takeOffer_amount_buyer_limitInfo_learnMore: String,
+ val bisqEasy_takeOffer_amount_buyer_limitInfo_overlay_linkToWikiText: String,
+ val bisqEasy_takeOffer_paymentMethods_headline_fiat: String,
+ val bisqEasy_takeOffer_paymentMethods_headline_fiatAndBitcoin: String,
+ val bisqEasy_takeOffer_paymentMethods_headline_bitcoin: String,
+ val bisqEasy_takeOffer_paymentMethods_subtitle_fiat_buyer: (String) -> String,
+ val bisqEasy_takeOffer_paymentMethods_subtitle_fiat_seller: (String) -> String,
+ val bisqEasy_takeOffer_paymentMethods_subtitle_bitcoin_buyer: String,
+ val bisqEasy_takeOffer_paymentMethods_subtitle_bitcoin_seller: String,
+ val bisqEasy_takeOffer_review_headline: String,
+ val bisqEasy_takeOffer_review_detailsHeadline: String,
+ val bisqEasy_takeOffer_review_method_fiat: String,
+ val bisqEasy_takeOffer_review_method_bitcoin: String,
+ val bisqEasy_takeOffer_review_price_price: String,
+ val bisqEasy_takeOffer_review_noTradeFees: String,
+ val bisqEasy_takeOffer_review_sellerPaysMinerFeeLong: String,
+ val bisqEasy_takeOffer_review_sellerPaysMinerFee: String,
+ val bisqEasy_takeOffer_review_noTradeFeesLong: String,
+ val bisqEasy_takeOffer_review_takeOffer: String,
+ val bisqEasy_takeOffer_review_sendTakeOfferMessageFeedback_headline: String,
+ val bisqEasy_takeOffer_review_sendTakeOfferMessageFeedback_subTitle: String,
+ val bisqEasy_takeOffer_review_sendTakeOfferMessageFeedback_info: String,
+ val bisqEasy_takeOffer_review_takeOfferSuccess_headline: String,
+ val bisqEasy_takeOffer_review_takeOfferSuccess_subTitle: String,
+ val bisqEasy_takeOffer_review_takeOfferSuccessButton: String,
+ val bisqEasy_takeOffer_tradeLogMessage: String,
+ val bisqEasy_takeOffer_noMediatorAvailable_warning: String,
+ val bisqEasy_takeOffer_makerBanned_warning: String,
+ val bisqEasy_takeOffer_bitcoinPaymentData_warning_MAIN_CHAIN: String,
+ val bisqEasy_takeOffer_bitcoinPaymentData_warning_LN: String,
+ val bisqEasy_takeOffer_bitcoinPaymentData_warning_proceed: String,
+ val bisqEasy_tradeGuide_tabs_headline: String,
+ val bisqEasy_tradeGuide_welcome: String,
+ val bisqEasy_tradeGuide_security: String,
+ val bisqEasy_tradeGuide_process: String,
+ val bisqEasy_tradeGuide_rules: String,
+ val bisqEasy_tradeGuide_welcome_headline: String,
+ val bisqEasy_tradeGuide_welcome_content: String,
+ val bisqEasy_tradeGuide_security_headline: String,
+ val bisqEasy_tradeGuide_security_content: String,
+ val bisqEasy_tradeGuide_process_headline: String,
+ val bisqEasy_tradeGuide_process_content: String,
+ val bisqEasy_tradeGuide_process_steps: String,
+ val bisqEasy_tradeGuide_rules_headline: String,
+ val bisqEasy_tradeGuide_rules_content: String,
+ val bisqEasy_tradeGuide_rules_confirm: String,
+ val bisqEasy_tradeGuide_notConfirmed_warn: String,
+ val bisqEasy_tradeGuide_open: String,
+ val bisqEasy_walletGuide_open: String,
+ val bisqEasy_walletGuide_tabs_headline: String,
+ val bisqEasy_walletGuide_intro: String,
+ val bisqEasy_walletGuide_download: String,
+ val bisqEasy_walletGuide_createWallet: String,
+ val bisqEasy_walletGuide_receive: String,
+ val bisqEasy_walletGuide_intro_headline: String,
+ val bisqEasy_walletGuide_intro_content: String,
+ val bisqEasy_walletGuide_download_headline: String,
+ val bisqEasy_walletGuide_download_content: String,
+ val bisqEasy_walletGuide_download_link: String,
+ val bisqEasy_walletGuide_createWallet_headline: String,
+ val bisqEasy_walletGuide_createWallet_content: String,
+ val bisqEasy_walletGuide_receive_headline: String,
+ val bisqEasy_walletGuide_receive_content: String,
+ val bisqEasy_walletGuide_receive_link1: String,
+ val bisqEasy_walletGuide_receive_link2: String,
+ val bisqEasy_offerbook_markets: String,
+ val bisqEasy_offerbook_markets_CollapsedList_Tooltip: String,
+ val bisqEasy_offerbook_markets_ExpandedList_Tooltip: String,
+ val bisqEasy_offerbook_marketListCell_numOffers_one: String,
+ val bisqEasy_offerbook_marketListCell_numOffers_many: String,
+ val bisqEasy_offerbook_marketListCell_numOffers_tooltip_none: String,
+ val bisqEasy_offerbook_marketListCell_numOffers_tooltip_one: String,
+ val bisqEasy_offerbook_marketListCell_numOffers_tooltip_many: String,
+ val bisqEasy_offerbook_marketListCell_favourites_tooltip_addToFavourites: String,
+ val bisqEasy_offerbook_marketListCell_favourites_tooltip_removeFromFavourites: String,
+ val bisqEasy_offerbook_marketListCell_favourites_maxReached_popup: String,
+ val bisqEasy_offerbook_dropdownMenu_sortAndFilterMarkets_tooltip: String,
+ val bisqEasy_offerbook_dropdownMenu_sortAndFilterMarkets_sortTitle: String,
+ val bisqEasy_offerbook_dropdownMenu_sortAndFilterMarkets_mostOffers: String,
+ val bisqEasy_offerbook_dropdownMenu_sortAndFilterMarkets_nameAZ: String,
+ val bisqEasy_offerbook_dropdownMenu_sortAndFilterMarkets_nameZA: String,
+ val bisqEasy_offerbook_dropdownMenu_sortAndFilterMarkets_filterTitle: String,
+ val bisqEasy_offerbook_dropdownMenu_sortAndFilterMarkets_withOffers: String,
+ val bisqEasy_offerbook_dropdownMenu_sortAndFilterMarkets_favourites: String,
+ val bisqEasy_offerbook_dropdownMenu_sortAndFilterMarkets_all: String,
+ val bisqEasy_offerbook_dropdownMenu_messageTypeFilter_tooltip: String,
+ val bisqEasy_offerbook_dropdownMenu_messageTypeFilter_all: String,
+ val bisqEasy_offerbook_dropdownMenu_messageTypeFilter_offers: String,
+ val bisqEasy_offerbook_dropdownMenu_messageTypeFilter_text: String,
+ val bisqEasy_offerbook_chatMessage_deleteOffer_confirmation: String,
+ val bisqEasy_offerbook_chatMessage_deleteMessage_confirmation: String,
+ val bisqEasy_offerbook_offerList: String,
+ val bisqEasy_offerbook_offerList_collapsedList_tooltip: String,
+ val bisqEasy_offerbook_offerList_expandedList_tooltip: String,
+ val bisqEasy_offerbook_offerList_table_columns_peerProfile: String,
+ val bisqEasy_offerbook_offerList_table_columns_price: String,
+ val bisqEasy_offerbook_offerList_table_columns_fiatAmount: String,
+ val bisqEasy_offerbook_offerList_table_columns_paymentMethod: String,
+ val bisqEasy_offerbook_offerList_table_columns_settlementMethod: String,
+ val bisqEasy_offerbook_offerList_table_filters_offerDirection_buyFrom: String,
+ val bisqEasy_offerbook_offerList_table_filters_offerDirection_sellTo: String,
+ val bisqEasy_offerbook_offerList_table_filters_paymentMethods_title: String,
+ val bisqEasy_offerbook_offerList_table_filters_paymentMethods_title_all: String,
+ val bisqEasy_offerbook_offerList_table_filters_paymentMethods_customPayments: String,
+ val bisqEasy_offerbook_offerList_table_filters_paymentMethods_clearFilters: String,
+ val bisqEasy_offerbook_offerList_table_filters_showMyOffersOnly: String,
+ val bisqEasy_offerbook_offerList_table_columns_price_tooltip_fixPrice: String,
+ val bisqEasy_offerbook_offerList_table_columns_price_tooltip_marketPrice: String,
+ val bisqEasy_offerbook_offerList_table_columns_price_tooltip_floatPrice: String,
+ val bisqEasy_openTrades_table_headline: String,
+ val bisqEasy_openTrades_noTrades: String,
+ val bisqEasy_openTrades_rejectTrade: String,
+ val bisqEasy_openTrades_cancelTrade: String,
+ val bisqEasy_openTrades_tradeLogMessage_rejected: String,
+ val bisqEasy_openTrades_tradeLogMessage_cancelled: String,
+ val bisqEasy_openTrades_rejectTrade_warning: String,
+ val bisqEasy_openTrades_cancelTrade_warning_buyer: String,
+ val bisqEasy_openTrades_cancelTrade_warning_seller: String,
+ val bisqEasy_openTrades_cancelTrade_warning_part2: String,
+ val bisqEasy_openTrades_closeTrade_warning_interrupted: String,
+ val bisqEasy_openTrades_closeTrade_warning_completed: String,
+ val bisqEasy_openTrades_closeTrade: String,
+ val bisqEasy_openTrades_confirmCloseTrade: String,
+ val bisqEasy_openTrades_exportTrade: String,
+ val bisqEasy_openTrades_reportToMediator: String,
+ val bisqEasy_openTrades_rejected_self: String,
+ val bisqEasy_openTrades_rejected_peer: String,
+ val bisqEasy_openTrades_cancelled_self: String,
+ val bisqEasy_openTrades_cancelled_peer: String,
+ val bisqEasy_openTrades_inMediation_info: String,
+ val bisqEasy_openTrades_failed: String,
+ val bisqEasy_openTrades_failed_popup: String,
+ val bisqEasy_openTrades_failedAtPeer: String,
+ val bisqEasy_openTrades_failedAtPeer_popup: String,
+ val bisqEasy_openTrades_table_tradePeer: String,
+ val bisqEasy_openTrades_table_me: String,
+ val bisqEasy_openTrades_table_mediator: String,
+ val bisqEasy_openTrades_table_tradeId: String,
+ val bisqEasy_openTrades_table_price: String,
+ val bisqEasy_openTrades_table_baseAmount: String,
+ val bisqEasy_openTrades_table_quoteAmount: String,
+ val bisqEasy_openTrades_table_paymentMethod: String,
+ val bisqEasy_openTrades_table_paymentMethod_tooltip: String,
+ val bisqEasy_openTrades_table_settlementMethod: String,
+ val bisqEasy_openTrades_table_settlementMethod_tooltip: String,
+ val bisqEasy_openTrades_table_makerTakerRole: String,
+ val bisqEasy_openTrades_table_direction_buyer: String,
+ val bisqEasy_openTrades_table_direction_seller: String,
+ val bisqEasy_openTrades_table_makerTakerRole_maker: String,
+ val bisqEasy_openTrades_table_makerTakerRole_taker: String,
+ val bisqEasy_openTrades_csv_quoteAmount: String,
+ val bisqEasy_openTrades_csv_txIdOrPreimage: String,
+ val bisqEasy_openTrades_csv_receiverAddressOrInvoice: String,
+ val bisqEasy_openTrades_csv_paymentMethod: String,
+ val bisqEasy_openTrades_chat_peer_description: String,
+ val bisqEasy_openTrades_chat_detach: String,
+ val bisqEasy_openTrades_chat_detach_tooltip: String,
+ val bisqEasy_openTrades_chat_attach: String,
+ val bisqEasy_openTrades_chat_attach_tooltip: String,
+ val bisqEasy_openTrades_chat_window_title: String,
+ val bisqEasy_openTrades_chat_peerLeft_headline: String,
+ val bisqEasy_openTrades_chat_peerLeft_subHeadline: String,
+ val bisqEasy_openTrades_tradeDetails_open: String,
+ val bisqEasy_openTrades_tradeDetails_headline: String,
+ val bisqEasy_openTrades_tradeDetails_tradeDate: String,
+ val bisqEasy_openTrades_tradeDetails_tradersAndRole: String,
+ val bisqEasy_openTrades_tradeDetails_tradersAndRole_me: String,
+ val bisqEasy_openTrades_tradeDetails_tradersAndRole_peer: String,
+ val bisqEasy_openTrades_tradeDetails_tradersAndRole_copy: String,
+ val bisqEasy_openTrades_tradeDetails_offerTypeAndMarket: String,
+ val bisqEasy_openTrades_tradeDetails_offerTypeAndMarket_buyOffer: String,
+ val bisqEasy_openTrades_tradeDetails_offerTypeAndMarket_sellOffer: String,
+ val bisqEasy_openTrades_tradeDetails_offerTypeAndMarket_fiatMarket: String,
+ val bisqEasy_openTrades_tradeDetails_amountAndPrice: String,
+ val bisqEasy_openTrades_tradeDetails_paymentAndSettlementMethods: String,
+ val bisqEasy_openTrades_tradeDetails_tradeId: String,
+ val bisqEasy_openTrades_tradeDetails_tradeId_copy: String,
+ val bisqEasy_openTrades_tradeDetails_peerNetworkAddress: String,
+ val bisqEasy_openTrades_tradeDetails_peerNetworkAddress_copy: String,
+ val bisqEasy_openTrades_tradeDetails_btcPaymentAddress: String,
+ val bisqEasy_openTrades_tradeDetails_lightningInvoice: String,
+ val bisqEasy_openTrades_tradeDetails_btcPaymentAddress_copy: String,
+ val bisqEasy_openTrades_tradeDetails_lightningInvoice_copy: String,
+ val bisqEasy_openTrades_tradeDetails_paymentAccountData: String,
+ val bisqEasy_openTrades_tradeDetails_paymentAccountData_copy: String,
+ val bisqEasy_openTrades_tradeDetails_assignedMediator: String,
+ val bisqEasy_openTrades_tradeDetails_dataNotYetProvided: String,
+ val bisqEasy_privateChats_leave: String,
+ val bisqEasy_privateChats_table_myUser: String,
+ val bisqEasy_topPane_filter: String,
+ val bisqEasy_topPane_closeFilter: String,
+ val bisqEasy_offerDetails_headline: String,
+ val bisqEasy_offerDetails_buy: String,
+ val bisqEasy_offerDetails_sell: String,
+ val bisqEasy_offerDetails_direction: String,
+ val bisqEasy_offerDetails_baseSideAmount: String,
+ val bisqEasy_offerDetails_quoteSideAmount: String,
+ val bisqEasy_offerDetails_price: String,
+ val bisqEasy_offerDetails_priceValue: String,
+ val bisqEasy_offerDetails_paymentMethods: String,
+ val bisqEasy_offerDetails_id: String,
+ val bisqEasy_offerDetails_date: String,
+ val bisqEasy_offerDetails_makersTradeTerms: String,
+ val bisqEasy_openTrades_welcome_headline: String,
+ val bisqEasy_openTrades_welcome_info: String,
+ val bisqEasy_openTrades_welcome_line1: String,
+ val bisqEasy_openTrades_welcome_line2: String,
+ val bisqEasy_openTrades_welcome_line3: String,
+)
diff --git a/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/i18n/BisqEasyStringsEn.kt b/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/i18n/BisqEasyStringsEn.kt
new file mode 100644
index 00000000..4675e3b1
--- /dev/null
+++ b/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/i18n/BisqEasyStringsEn.kt
@@ -0,0 +1,244 @@
+package network.bisq.mobile.i18n
+
+val EnBisqEasyStrings = BisqEasyStrings(
+ bisqEasy_offerBookChannel_description = "Market channel for trading {0}",
+ bisqEasy_mediator = "Mediator",
+ bisqEasy_dashboard = "Getting started",
+ bisqEasy_offerbook = "Offerbook",
+ bisqEasy_openTrades = "My open trades",
+ bisqEasy_onboarding_top_headline = "Bisq Easy in 3 minutes",
+ bisqEasy_onboarding_top_content1 = "Get a quick introduction into Bisq Easy",
+ bisqEasy_onboarding_top_content2 = "See how the trade process works",
+ bisqEasy_onboarding_top_content3 = "Learn about the simple trade rules",
+ bisqEasy_onboarding_openTradeGuide = "Read the trade guide",
+ bisqEasy_onboarding_watchVideo = "Watch video",
+ bisqEasy_onboarding_watchVideo_tooltip = "Watch embedded introduction video",
+ bisqEasy_onboarding_left_headline = "Best for beginners",
+ bisqEasy_onboarding_left_info = "The trade wizard guides you through your first Bitcoin trade. The Bitcoin sellers will help you if you have any questions.",
+ bisqEasy_onboarding_left_button = "Start trade wizard",
+ bisqEasy_onboarding_right_headline = "For experienced traders",
+ bisqEasy_onboarding_right_info = "Browse the offerbook for the best offers or create your own offer.",
+ bisqEasy_onboarding_right_button = "Open offerbook",
+ bisqEasy_takeOffer_progress_amount = "Trade amount",
+ bisqEasy_takeOffer_progress_method = "Payment method",
+ bisqEasy_takeOffer_progress_review = "Review trade",
+ bisqEasy_takeOffer_amount_headline_buyer = "How much do you want to spend?",
+ bisqEasy_takeOffer_amount_headline_seller = "How much do you want to trade?",
+ bisqEasy_takeOffer_amount_description = { min, max -> "The offer allows you can choose a trade amount\n between $min and $max" },
+ bisqEasy_takeOffer_amount_description_limitedByTakersReputation = "Your reputation score of {0} allows you can choose a trade amount\n between {1} and {2}",
+ bisqEasy_takeOffer_amount_buyer_limitInfo_tooHighMax = "Seller''s reputation score is only {0}. It is not recommended to trade more than",
+ bisqEasy_takeOffer_amount_buyer_limitInfoAmount = "{0}.",
+ bisqEasy_takeOffer_amount_buyer_limitInfo_tooHighMax_overlay_info = "Seller''s reputation score of {0} does not provide sufficient security. However, for lower trade amounts (up to {1}), reputation requirements are more lenient.\n\n If you decide to proceed despite the lack of the seller''s reputation, ensure that you are fully aware of the associated risks. Bisq Easy''s security model relies on the seller''s reputation, as the buyer is required to send fiat currency first.",
+ bisqEasy_takeOffer_amount_buyer_limitInfo_minAmountCovered = "Seller''s reputation score of {0} provides security up to",
+ bisqEasy_takeOffer_amount_buyer_limitInfo_minAmountCovered_overlay_info = "Seller''s reputation score of {0} provides security for up to {1}.\n\n If you choose a higher amount, ensure that you are fully aware of the associated risks. Bisq Easy''s security model relies on the seller''s reputation, as the buyer is required to send fiat currency first.",
+ bisqEasy_takeOffer_amount_buyer_limitInfo_minAmountNotCovered = "Seller''s reputation score of {0} does not provide sufficient security for that offer.",
+ bisqEasy_takeOffer_amount_buyer_limitInfo_tooHighMin_overlay_info = "Seller''s reputation score of {0} does not provide sufficient security for that offer.\n\n It is recommended to trade lower amounts with repeated trades or with sellers who have higher reputation. If you decide to proceed despite the lack of the seller''s reputation, ensure that you are fully aware of the associated risks. Bisq Easy''s security model relies on the seller''s reputation, as the buyer is required to send fiat currency first.",
+ bisqEasy_takeOffer_amount_buyer_limitInfo_learnMore = "Learn more",
+ bisqEasy_takeOffer_amount_buyer_limitInfo_overlay_linkToWikiText = "To learn more about the reputation system, visit:",
+ bisqEasy_takeOffer_paymentMethods_headline_fiat = "Which payment method do you want to use?",
+ bisqEasy_takeOffer_paymentMethods_headline_fiatAndBitcoin = "Which payment and settlement method do you want to use?",
+ bisqEasy_takeOffer_paymentMethods_headline_bitcoin = "Which settlement method do you want to use?",
+ bisqEasy_takeOffer_paymentMethods_subtitle_fiat_buyer = { fiat -> "Choose a payment method to transfer $fiat" },
+ bisqEasy_takeOffer_paymentMethods_subtitle_fiat_seller = { fiat -> "Choose a payment method to receive $fiat" },
+ bisqEasy_takeOffer_paymentMethods_subtitle_bitcoin_buyer = "Choose a settlement method to receive Bitcoin",
+ bisqEasy_takeOffer_paymentMethods_subtitle_bitcoin_seller = "Choose a settlement method to send Bitcoin",
+ bisqEasy_takeOffer_review_headline = "Review trade",
+ bisqEasy_takeOffer_review_detailsHeadline = "Trade details",
+ bisqEasy_takeOffer_review_method_fiat = "Fiat payment method",
+ bisqEasy_takeOffer_review_method_bitcoin = "Bitcoin settlement method",
+ bisqEasy_takeOffer_review_price_price = "Trade price",
+ bisqEasy_takeOffer_review_noTradeFees = "No trade fees in Bisq Easy",
+ bisqEasy_takeOffer_review_sellerPaysMinerFeeLong = "The seller pays the mining fee",
+ bisqEasy_takeOffer_review_sellerPaysMinerFee = "Seller pays the mining fee",
+ bisqEasy_takeOffer_review_noTradeFeesLong = "There are no trade fees in Bisq Easy",
+ bisqEasy_takeOffer_review_takeOffer = "Confirm take offer",
+ bisqEasy_takeOffer_review_sendTakeOfferMessageFeedback_headline = "Sending take-offer message",
+ bisqEasy_takeOffer_review_sendTakeOfferMessageFeedback_subTitle = "Sending the take-offer message can take up to 2 minutes",
+ bisqEasy_takeOffer_review_sendTakeOfferMessageFeedback_info = "Do not close the window or the application until you see the confirmation that the take-offer request was successfully sent.",
+ bisqEasy_takeOffer_review_takeOfferSuccess_headline = "You have successfully taken the offer",
+ bisqEasy_takeOffer_review_takeOfferSuccess_subTitle = "Please get in touch with the trade peer at 'Open Trades'.\n You will find further information for the next steps over there.\n\n Be sure to regularly check the Bisq application for new messages from your trade peer.",
+ bisqEasy_takeOffer_review_takeOfferSuccessButton = "Show trade in 'Open Trades'",
+ bisqEasy_takeOffer_tradeLogMessage = "{0} has sent a message for taking {1}''s offer",
+ bisqEasy_takeOffer_noMediatorAvailable_warning = "There is no mediator available. You have to use the support chat instead.",
+ bisqEasy_takeOffer_makerBanned_warning = "The maker of this offer is banned. Please try to use a different offer.",
+ bisqEasy_takeOffer_bitcoinPaymentData_warning_MAIN_CHAIN = "The Bitcoin address that you have entered appears to be invalid.\n\n If you are sure the address is valid you can ignore this warning and proceed.",
+ bisqEasy_takeOffer_bitcoinPaymentData_warning_LN = "The Lightning invoice that you have entered appears to be invalid.\n\n If you are sure the invoice is valid you can ignore this warning and proceed.",
+ bisqEasy_takeOffer_bitcoinPaymentData_warning_proceed = "Ignore warning",
+ bisqEasy_tradeGuide_tabs_headline = "Trade guide",
+ bisqEasy_tradeGuide_welcome = "Overview",
+ bisqEasy_tradeGuide_security = "Security",
+ bisqEasy_tradeGuide_process = "Process",
+ bisqEasy_tradeGuide_rules = "Trade rules",
+ bisqEasy_tradeGuide_welcome_headline = "How to trade on Bisq Easy",
+ bisqEasy_tradeGuide_welcome_content = "This guide provides an overview of essential aspects for buying or selling Bitcoin with Bisq Easy.\n In this guide, you'll learn about the security model used at Bisq Easy, gain insights into the trade process, and familiarize yourself with the trade rules.\n\n For any additional questions, feel free to visit the chat rooms available under the 'Support' menu.",
+ bisqEasy_tradeGuide_security_headline = "How safe is it to trade on Bisq Easy?",
+ bisqEasy_tradeGuide_security_content = " - Bisq Easy's security model is optimized for small trade amounts.\n - The model relies on the reputation of the seller, who is usually an experienced Bisq user and is expected to provide helpful support to new users.\n - Building up reputation can be costly, leading to a common 5-15% price premium to cover extra expenses and compensate for the seller's service.\n - Trading with sellers lacking reputation carries significant risks and should only be undertaken if the risks are thoroughly understood and managed.",
+ bisqEasy_tradeGuide_process_headline = "How does the trade process works?",
+ bisqEasy_tradeGuide_process_content = " When you decide to take an offer, you'll have the flexibility to choose from the available options provided by the offer. Before starting the trade, you'll be presented with a summary overview for your review.\n Once the trade is initiated, the user interface will guide you through the trade process, which consists of the following steps:",
+ bisqEasy_tradeGuide_process_steps = " 1. The seller and the buyer exchange account details. The seller sends their payment data (e.g., bank account number) to the buyer and the buyer sends their Bitcoin address (or Lightning invoice) to the seller.\n 2. Next, the buyer initiates the Fiat payment to the seller's account. Upon receiving the payment, the seller will confirm the receipt.\n 3. The seller then sends the Bitcoin to the buyer's address and shares the transaction ID (of optionally the preimage in case Lightning is used). The user interface will display the confirmation state. Once confirmed, the trade is successfully completed.",
+ bisqEasy_tradeGuide_rules_headline = "What do I need to know about the trade rules?",
+ bisqEasy_tradeGuide_rules_content = " - Prior to the exchange of account details between the seller and the buyer, any party can cancel the trade without providing justification.\n - Traders should regularly check their trades for new messages and must respond within 24 hours.\n - Once account details are exchanged, failing to meet trade obligations is considered a breach of the trade contract and may result in a ban from the Bisq network. This does not apply if the trade peer is unresponsive.\n - During Fiat payment, the buyer MUST NOT include terms like 'Bisq' or 'Bitcoin' in the 'reason for payment' field. Traders can agree on an identifier, such as a random string like 'H3TJAPD', to associate the bank transfer with the trade.\n - If the trade cannot be completed instantly due to longer Fiat transfer times, both traders must be online at least once a day to monitor the trade progress.\n - In the event that traders encounter unresolved issues, they have the option to invite a mediator into the trade chat for assistance.\n\n Should you have any questions or need assistance, don't hesitate to visit the chat rooms accessible under the 'Support' menu. Happy trading!",
+ bisqEasy_tradeGuide_rules_confirm = "I have read and understood",
+ bisqEasy_tradeGuide_notConfirmed_warn = "Please read the trade guide and confirm that you have read and understood the trade rules.",
+ bisqEasy_tradeGuide_open = "Open trade guide",
+ bisqEasy_walletGuide_open = "Open wallet guide",
+ bisqEasy_walletGuide_tabs_headline = "Wallet guide",
+ bisqEasy_walletGuide_intro = "Intro",
+ bisqEasy_walletGuide_download = "Download",
+ bisqEasy_walletGuide_createWallet = "New wallet",
+ bisqEasy_walletGuide_receive = "Receiving",
+ bisqEasy_walletGuide_intro_headline = "Get ready to receive your first Bitcoin",
+ bisqEasy_walletGuide_intro_content = "In Bisq Easy, the Bitcoin you receive goes straight to your pocket without any intermediaries. That's a great advantage, but it also means you need to have a wallet that you control yourself to receive it!\n\n In this quick wallet guide, we will show you in a few simple steps how you can create a simple wallet. With it, you will be able to receive and store your freshly purchased bitcoin.\n\n If you are already familiar with on-chain wallets and have one, you can skip this guide and simply use your wallet.",
+ bisqEasy_walletGuide_download_headline = "Downloading your wallet",
+ bisqEasy_walletGuide_download_content = "There are many wallets out there that you can use. In this guide, we will show you how to use Bluewallet. Bluewallet is great and, at the same time, very simple, and you can use it to receive your bitcoin from Bisq Easy.\n\n You can download Bluewallet on your phone, regardless of whether you have an Android or iOS device. To do so, you can visit the official webpage at 'bluewallet.io'. Once you are there, click on App Store or Google Play depending on the device you are using.\n\n Important note: for your safety, make sure that you download the app from the official app store of your device. The official app is provided by 'Bluewallet Services, S.R.L.', and you should be able to see this in your app store. Downloading a malicious wallet could put your funds at risk.\n\n Finally, a quick note: Bisq is not affiliated with Bluewallet in any way. We suggest using Bluewallet due to its quality and simplicity, but there are many other options on the market. You should feel absolutely free to compare, try and choose whichever wallet fits your needs best.",
+ bisqEasy_walletGuide_download_link = "Click here to visit Bluewallet's page",
+ bisqEasy_walletGuide_createWallet_headline = "Creating your new wallet",
+ bisqEasy_walletGuide_createWallet_content = "Bluewallet allows you to create several wallets for different purposes. For now, you only need to have one wallet. Once you enter Bluewallet, you will see a message suggesting you add a new wallet. Once you do that, enter a name for your wallet and pick the option *Bitcoin* under the *Type* section. You can leave all other options as they appear and click on *Create*.\n\n When you move to the next step, you will be presented with 12 words. These 12 words are the backup that allows you to recover your wallet if something happens to your phone. Write them down on a piece of paper (not digitally) in the same order in which they are presented, store this paper safely and make sure only you have access to it. You can read more about how to secure your wallet in the Learn sections of Bisq 2 dedicated to wallets and security.\n\n Once you are done, click on 'Ok, I wrote it down'.\n Congratulations! You have created your wallet! Let's move on to how to receive your bitcoin in it.",
+ bisqEasy_walletGuide_receive_headline = "Receiving bitcoin in your wallet",
+ bisqEasy_walletGuide_receive_content = "To receive your Bitcoin, you need an address from your wallet. To get it, click on your newly created wallet, and afterwards click on the 'Receive' button at the bottom of the screen.\n\n Bluewallet will display an unused address, both as a QR code and as text. This address is what you will need to provide to your peer in Bisq Easy so that he can send you the Bitcoin you are buying. You can move the address to your PC by scanning the QR code with a camera, by sending the address with an email or chat message, or even by simply typing it.\n\n Once you complete the trade, Bluewallet will notice the incoming Bitcoin and update your balance with the new funds. Everytime you do a new trade, get a fresh address to protect your privacy.\n\n These are the basics you need to know to start receiving Bitcoin in your own wallet. If you want to learn more about Bluewallet, we recommend checking out the videos listed below.",
+ bisqEasy_walletGuide_receive_link1 = "Bluewallet tutorial by Anita Posch",
+ bisqEasy_walletGuide_receive_link2 = "Bluewallet tutorial by BTC Sessions",
+ bisqEasy_offerbook_markets = "Markets",
+ bisqEasy_offerbook_markets_CollapsedList_Tooltip = "Expand Markets",
+ bisqEasy_offerbook_markets_ExpandedList_Tooltip = "Collapse Markets",
+ bisqEasy_offerbook_marketListCell_numOffers_one = "{0} offer",
+ bisqEasy_offerbook_marketListCell_numOffers_many = "{0} offers",
+ bisqEasy_offerbook_marketListCell_numOffers_tooltip_none = "No offers yet available in the {0} market",
+ bisqEasy_offerbook_marketListCell_numOffers_tooltip_one = "{0} offer is available in the {1} market",
+ bisqEasy_offerbook_marketListCell_numOffers_tooltip_many = "{0} offers are available in the {1} market",
+ bisqEasy_offerbook_marketListCell_favourites_tooltip_addToFavourites = "Add to favourites",
+ bisqEasy_offerbook_marketListCell_favourites_tooltip_removeFromFavourites = "Remove from favourites",
+ bisqEasy_offerbook_marketListCell_favourites_maxReached_popup = "There's only space for 5 favourites. Remove a favourite and try again.",
+ bisqEasy_offerbook_dropdownMenu_sortAndFilterMarkets_tooltip = "Sort and filter markets",
+ bisqEasy_offerbook_dropdownMenu_sortAndFilterMarkets_sortTitle = "Sort by:",
+ bisqEasy_offerbook_dropdownMenu_sortAndFilterMarkets_mostOffers = "Most offers",
+ bisqEasy_offerbook_dropdownMenu_sortAndFilterMarkets_nameAZ = "Name A-Z",
+ bisqEasy_offerbook_dropdownMenu_sortAndFilterMarkets_nameZA = "Name Z-A",
+ bisqEasy_offerbook_dropdownMenu_sortAndFilterMarkets_filterTitle = "Show markets:",
+ bisqEasy_offerbook_dropdownMenu_sortAndFilterMarkets_withOffers = "With offers",
+ bisqEasy_offerbook_dropdownMenu_sortAndFilterMarkets_favourites = "Only favourites",
+ bisqEasy_offerbook_dropdownMenu_sortAndFilterMarkets_all = "All",
+ bisqEasy_offerbook_dropdownMenu_messageTypeFilter_tooltip = "Filter by chat activity",
+ bisqEasy_offerbook_dropdownMenu_messageTypeFilter_all = "All activity",
+ bisqEasy_offerbook_dropdownMenu_messageTypeFilter_offers = "Only offers",
+ bisqEasy_offerbook_dropdownMenu_messageTypeFilter_text = "Only messages",
+ bisqEasy_offerbook_chatMessage_deleteOffer_confirmation = "Are you sure you want to delete this offer?",
+ bisqEasy_offerbook_chatMessage_deleteMessage_confirmation = "Are you sure you want to delete this message?",
+ bisqEasy_offerbook_offerList = "Offer List",
+ bisqEasy_offerbook_offerList_collapsedList_tooltip = "Expand Offer List",
+ bisqEasy_offerbook_offerList_expandedList_tooltip = "Collapse Offer List",
+ bisqEasy_offerbook_offerList_table_columns_peerProfile = "Peer profile",
+ bisqEasy_offerbook_offerList_table_columns_price = "Price",
+ bisqEasy_offerbook_offerList_table_columns_fiatAmount = "{0} amount",
+ bisqEasy_offerbook_offerList_table_columns_paymentMethod = "Payment",
+ bisqEasy_offerbook_offerList_table_columns_settlementMethod = "Settlement",
+ bisqEasy_offerbook_offerList_table_filters_offerDirection_buyFrom = "Buy from",
+ bisqEasy_offerbook_offerList_table_filters_offerDirection_sellTo = "Sell to",
+ bisqEasy_offerbook_offerList_table_filters_paymentMethods_title = "Payments ({0})",
+ bisqEasy_offerbook_offerList_table_filters_paymentMethods_title_all = "All",
+ bisqEasy_offerbook_offerList_table_filters_paymentMethods_customPayments = "Custom payments",
+ bisqEasy_offerbook_offerList_table_filters_paymentMethods_clearFilters = "Clear filters",
+ bisqEasy_offerbook_offerList_table_filters_showMyOffersOnly = "My offers only",
+ bisqEasy_offerbook_offerList_table_columns_price_tooltip_fixPrice = "Fixed price: {0}\nPercentage from current market price: {1}",
+ bisqEasy_offerbook_offerList_table_columns_price_tooltip_marketPrice = "Market price: {0}",
+ bisqEasy_offerbook_offerList_table_columns_price_tooltip_floatPrice = "Percentage price {0}\nWith current market price: {1}",
+ bisqEasy_openTrades_table_headline = "My open trades",
+ bisqEasy_openTrades_noTrades = "You don't have any open trades",
+ bisqEasy_openTrades_rejectTrade = "Reject trade",
+ bisqEasy_openTrades_cancelTrade = "Cancel trade",
+ bisqEasy_openTrades_tradeLogMessage_rejected = "{0} rejected the trade",
+ bisqEasy_openTrades_tradeLogMessage_cancelled = "{0} cancelled the trade",
+ bisqEasy_openTrades_rejectTrade_warning = "Since the exchange of account details has not yet started, rejecting the trade does not constitute a violation of the trade rules.\n\n If you have any questions or encounter issues, please don't hesitate to contact your trade peer or seek assistance in the 'Support section'.\n\n Are you sure you want to reject the trade?",
+ bisqEasy_openTrades_cancelTrade_warning_buyer = "Since the exchange of account details has commenced, canceling the trade without the seller''s {0}",
+ bisqEasy_openTrades_cancelTrade_warning_seller = "Since the exchange of account details has commenced, canceling the trade without the buyer''s {0}",
+ bisqEasy_openTrades_cancelTrade_warning_part2 = "consent could be considered a violation of the trading rules and may result in your profile being banned from the network.\n\n If the peer has been unresponsive for more than 24 hours and no payment has been made, you may reject the trade without consequences. The liability will rest with the unresponsive party.\n\n If you have any questions or encounter issues, please do not hesitate to contact your trade peer or seek assistance in the 'Support section'.\n\n If you believe that your trade peer has violated the trade rules, you have the option to initiate a mediation request. A mediator will join the trade chat and work toward finding a cooperative solution.\n\n Are you sure you want to cancel the trade?",
+ bisqEasy_openTrades_closeTrade_warning_interrupted = "Before closing the trade you can back up the trade data as csv file if needed.\n\n Once the trade is closed all data related to the trade is gone, and you cannot communicate with the trade peer in the trade chat anymore.\n\n Do you want to close the trade now?",
+ bisqEasy_openTrades_closeTrade_warning_completed = "Your trade has been completed.\n\n You can now close the trade or back up the trade data on your computer if needed.\n\n Once the trade is closed all data related to the trade are gone, and you cannot communicate with the trade peer in the trade chat anymore.",
+ bisqEasy_openTrades_closeTrade = "Close trade",
+ bisqEasy_openTrades_confirmCloseTrade = "Confirm close trade",
+ bisqEasy_openTrades_exportTrade = "Export trade data",
+ bisqEasy_openTrades_reportToMediator = "Report to mediator",
+ bisqEasy_openTrades_rejected_self = "You have rejected the trade",
+ bisqEasy_openTrades_rejected_peer = "Your trade peer has rejected the trade",
+ bisqEasy_openTrades_cancelled_self = "You have cancelled the trade",
+ bisqEasy_openTrades_cancelled_peer = "Your trade peer has cancelled the trade",
+ bisqEasy_openTrades_inMediation_info = "A mediator has joined the trade chat. Please use the trade chat below to get assistance from the mediator.",
+ bisqEasy_openTrades_failed = "The trade failed with error message: {0}",
+ bisqEasy_openTrades_failed_popup = "The trade failed due an error.\n Error message: {0}\n\n Stack trace: {1}",
+ bisqEasy_openTrades_failedAtPeer = "The peer''s trade failed with an error caused by: {0}",
+ bisqEasy_openTrades_failedAtPeer_popup = "The peer''s trade failed due an error.\n Error caused by: {0}\n\n Stack trace: {1}",
+ bisqEasy_openTrades_table_tradePeer = "Peer",
+ bisqEasy_openTrades_table_me = "Me",
+ bisqEasy_openTrades_table_mediator = "Mediator",
+ bisqEasy_openTrades_table_tradeId = "Trade ID",
+ bisqEasy_openTrades_table_price = "Price",
+ bisqEasy_openTrades_table_baseAmount = "Amount in BTC",
+ bisqEasy_openTrades_table_quoteAmount = "Amount",
+ bisqEasy_openTrades_table_paymentMethod = "Payment",
+ bisqEasy_openTrades_table_paymentMethod_tooltip = "Fiat payment method: {0}",
+ bisqEasy_openTrades_table_settlementMethod = "Settlement",
+ bisqEasy_openTrades_table_settlementMethod_tooltip = "Bitcoin settlement method: {0}",
+ bisqEasy_openTrades_table_makerTakerRole = "My role",
+ bisqEasy_openTrades_table_direction_buyer = "Buying from:",
+ bisqEasy_openTrades_table_direction_seller = "Selling to:",
+ bisqEasy_openTrades_table_makerTakerRole_maker = "Maker",
+ bisqEasy_openTrades_table_makerTakerRole_taker = "Taker",
+ bisqEasy_openTrades_csv_quoteAmount = "Amount in {0}",
+ bisqEasy_openTrades_csv_txIdOrPreimage = "Transaction ID/Preimage",
+ bisqEasy_openTrades_csv_receiverAddressOrInvoice = "Receiver address/Invoice",
+ bisqEasy_openTrades_csv_paymentMethod = "Payment method",
+ bisqEasy_openTrades_chat_peer_description = "Chat peer",
+ bisqEasy_openTrades_chat_detach = "Detach",
+ bisqEasy_openTrades_chat_detach_tooltip = "Open chat in new window",
+ bisqEasy_openTrades_chat_attach = "Restore",
+ bisqEasy_openTrades_chat_attach_tooltip = "Restore chat back to main window",
+ bisqEasy_openTrades_chat_window_title = "{0} - Chat with {1} / Trade ID: {2}",
+ bisqEasy_openTrades_chat_peerLeft_headline = "{0} has left the trade",
+ bisqEasy_openTrades_chat_peerLeft_subHeadline = "If the trade is not completed on your side and if you need assistance, contact the mediator or visit the support chat.",
+ bisqEasy_openTrades_tradeDetails_open = "Open trade details",
+ bisqEasy_openTrades_tradeDetails_headline = "Trade Details",
+ bisqEasy_openTrades_tradeDetails_tradeDate = "Trade date",
+ bisqEasy_openTrades_tradeDetails_tradersAndRole = "Traders / Role",
+ bisqEasy_openTrades_tradeDetails_tradersAndRole_me = "Me:",
+ bisqEasy_openTrades_tradeDetails_tradersAndRole_peer = "Peer:",
+ bisqEasy_openTrades_tradeDetails_tradersAndRole_copy = "Copy peer username",
+ bisqEasy_openTrades_tradeDetails_offerTypeAndMarket = "Offer type / Market",
+ bisqEasy_openTrades_tradeDetails_offerTypeAndMarket_buyOffer = "Buy offer",
+ bisqEasy_openTrades_tradeDetails_offerTypeAndMarket_sellOffer = "Sell offer",
+ bisqEasy_openTrades_tradeDetails_offerTypeAndMarket_fiatMarket = "{0} market",
+ bisqEasy_openTrades_tradeDetails_amountAndPrice = "Amount @ Price",
+ bisqEasy_openTrades_tradeDetails_paymentAndSettlementMethods = "Payment methods",
+ bisqEasy_openTrades_tradeDetails_tradeId = "Trade ID",
+ bisqEasy_openTrades_tradeDetails_tradeId_copy = "Copy trade ID",
+ bisqEasy_openTrades_tradeDetails_peerNetworkAddress = "Peer network address",
+ bisqEasy_openTrades_tradeDetails_peerNetworkAddress_copy = "Copy peer network address",
+ bisqEasy_openTrades_tradeDetails_btcPaymentAddress = "BTC payment address",
+ bisqEasy_openTrades_tradeDetails_lightningInvoice = "Lighting invoice",
+ bisqEasy_openTrades_tradeDetails_btcPaymentAddress_copy = "Copy BTC payment address",
+ bisqEasy_openTrades_tradeDetails_lightningInvoice_copy = "Copy lighting invoice",
+ bisqEasy_openTrades_tradeDetails_paymentAccountData = "Payment account data",
+ bisqEasy_openTrades_tradeDetails_paymentAccountData_copy = "Copy payment account data",
+ bisqEasy_openTrades_tradeDetails_assignedMediator = "Assigned mediator",
+ bisqEasy_openTrades_tradeDetails_dataNotYetProvided = "Data not yet provided",
+ bisqEasy_privateChats_leave = "Leave chat",
+ bisqEasy_privateChats_table_myUser = "My profile",
+ bisqEasy_topPane_filter = "Filter offerbook",
+ bisqEasy_topPane_closeFilter = "Close filter",
+ bisqEasy_offerDetails_headline = "Offer details",
+ bisqEasy_offerDetails_buy = "Offer for buying Bitcoin",
+ bisqEasy_offerDetails_sell = "Offer for selling Bitcoin",
+ bisqEasy_offerDetails_direction = "Offer type",
+ bisqEasy_offerDetails_baseSideAmount = "Bitcoin amount",
+ bisqEasy_offerDetails_quoteSideAmount = "{0} amount",
+ bisqEasy_offerDetails_price = "{0} offer price",
+ bisqEasy_offerDetails_priceValue = "{0} (premium: {1})",
+ bisqEasy_offerDetails_paymentMethods = "Supported payment method(s)",
+ bisqEasy_offerDetails_id = "Offer ID",
+ bisqEasy_offerDetails_date = "Creation date",
+ bisqEasy_offerDetails_makersTradeTerms = "Makers trade terms",
+ bisqEasy_openTrades_welcome_headline = "Welcome to your first Bisq Easy trade!",
+ bisqEasy_openTrades_welcome_info = "Please make yourself familiar with the concept, process and rules for trading on Bisq Easy.\n After you have read and accepted the trade rules you can start the trade.",
+ bisqEasy_openTrades_welcome_line1 = "Learn about the security model of Bisq easy",
+ bisqEasy_openTrades_welcome_line2 = "See how the trade process works",
+ bisqEasy_openTrades_welcome_line3 = "Make yourself familiar with the trade rules",
+)
diff --git a/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/i18n/BisqEasyStringsFr.kt b/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/i18n/BisqEasyStringsFr.kt
new file mode 100644
index 00000000..1fa5f167
--- /dev/null
+++ b/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/i18n/BisqEasyStringsFr.kt
@@ -0,0 +1,244 @@
+package network.bisq.mobile.i18n
+
+val FrBisqEasyStrings = BisqEasyStrings(
+ bisqEasy_offerBookChannel_description = "[FR] Market channel for trading {0}",
+ bisqEasy_mediator = "[FR] Mediator",
+ bisqEasy_dashboard = "[FR] Getting started",
+ bisqEasy_offerbook = "[FR] Offerbook",
+ bisqEasy_openTrades = "[FR] My open trades",
+ bisqEasy_onboarding_top_headline = "[FR] Bisq Easy in 3 minutes",
+ bisqEasy_onboarding_top_content1 = "[FR] Get a quick introduction into Bisq Easy",
+ bisqEasy_onboarding_top_content2 = "[FR] See how the trade process works",
+ bisqEasy_onboarding_top_content3 = "[FR] Learn about the simple trade rules",
+ bisqEasy_onboarding_openTradeGuide = "[FR] Read the trade guide",
+ bisqEasy_onboarding_watchVideo = "[FR] Watch video",
+ bisqEasy_onboarding_watchVideo_tooltip = "[FR] Watch embedded introduction video",
+ bisqEasy_onboarding_left_headline = "[FR] Best for beginners",
+ bisqEasy_onboarding_left_info = "[FR] The trade wizard guides you through your first Bitcoin trade. The Bitcoin sellers will help you if you have any questions.",
+ bisqEasy_onboarding_left_button = "[FR] Start trade wizard",
+ bisqEasy_onboarding_right_headline = "[FR] For experienced traders",
+ bisqEasy_onboarding_right_info = "[FR] Browse the offerbook for the best offers or create your own offer.",
+ bisqEasy_onboarding_right_button = "[FR] Open offerbook",
+ bisqEasy_takeOffer_progress_amount = "[FR] Trade amount",
+ bisqEasy_takeOffer_progress_method = "[FR] Payment method",
+ bisqEasy_takeOffer_progress_review = "[FR] Review trade",
+ bisqEasy_takeOffer_amount_headline_buyer = "[FR] How much do you want to spend?",
+ bisqEasy_takeOffer_amount_headline_seller = "[FR] How much do you want to trade?",
+ bisqEasy_takeOffer_amount_description = { min, max -> "[FR] The offer allows you can choose a trade amount\n between $min and $max" },
+ bisqEasy_takeOffer_amount_description_limitedByTakersReputation = "[FR] Your reputation score of {0} allows you can choose a trade amount\n between {1} and {2}",
+ bisqEasy_takeOffer_amount_buyer_limitInfo_tooHighMax = "[FR] Seller''s reputation score is only {0}. It is not recommended to trade more than",
+ bisqEasy_takeOffer_amount_buyer_limitInfoAmount = "[FR] {0}.",
+ bisqEasy_takeOffer_amount_buyer_limitInfo_tooHighMax_overlay_info = "[FR] Seller''s reputation score of {0} does not provide sufficient security. However, for lower trade amounts (up to {1}), reputation requirements are more lenient.\n\n If you decide to proceed despite the lack of the seller''s reputation, ensure that you are fully aware of the associated risks. Bisq Easy''s security model relies on the seller''s reputation, as the buyer is required to send fiat currency first.",
+ bisqEasy_takeOffer_amount_buyer_limitInfo_minAmountCovered = "[FR] Seller''s reputation score of {0} provides security up to",
+ bisqEasy_takeOffer_amount_buyer_limitInfo_minAmountCovered_overlay_info = "[FR] Seller''s reputation score of {0} provides security for up to {1}.\n\n If you choose a higher amount, ensure that you are fully aware of the associated risks. Bisq Easy''s security model relies on the seller''s reputation, as the buyer is required to send fiat currency first.",
+ bisqEasy_takeOffer_amount_buyer_limitInfo_minAmountNotCovered = "[FR] Seller''s reputation score of {0} does not provide sufficient security for that offer.",
+ bisqEasy_takeOffer_amount_buyer_limitInfo_tooHighMin_overlay_info = "[FR] Seller''s reputation score of {0} does not provide sufficient security for that offer.\n\n It is recommended to trade lower amounts with repeated trades or with sellers who have higher reputation. If you decide to proceed despite the lack of the seller''s reputation, ensure that you are fully aware of the associated risks. Bisq Easy''s security model relies on the seller''s reputation, as the buyer is required to send fiat currency first.",
+ bisqEasy_takeOffer_amount_buyer_limitInfo_learnMore = "[FR] Learn more",
+ bisqEasy_takeOffer_amount_buyer_limitInfo_overlay_linkToWikiText = "[FR] To learn more about the reputation system, visit:",
+ bisqEasy_takeOffer_paymentMethods_headline_fiat = "[FR] Which payment method do you want to use?",
+ bisqEasy_takeOffer_paymentMethods_headline_fiatAndBitcoin = "[FR] Which payment and settlement method do you want to use?",
+ bisqEasy_takeOffer_paymentMethods_headline_bitcoin = "[FR] Which settlement method do you want to use?",
+ bisqEasy_takeOffer_paymentMethods_subtitle_fiat_buyer = { fiat -> "[FR] Choose a payment method to transfer $fiat" },
+ bisqEasy_takeOffer_paymentMethods_subtitle_fiat_seller = { fiat -> "[FR] Choose a payment method to receive $fiat" },
+ bisqEasy_takeOffer_paymentMethods_subtitle_bitcoin_buyer = "[FR] Choose a settlement method to receive Bitcoin",
+ bisqEasy_takeOffer_paymentMethods_subtitle_bitcoin_seller = "[FR] Choose a settlement method to send Bitcoin",
+ bisqEasy_takeOffer_review_headline = "[FR] Review trade",
+ bisqEasy_takeOffer_review_detailsHeadline = "[FR] Trade details",
+ bisqEasy_takeOffer_review_method_fiat = "[FR] Fiat payment method",
+ bisqEasy_takeOffer_review_method_bitcoin = "[FR] Bitcoin settlement method",
+ bisqEasy_takeOffer_review_price_price = "[FR] Trade price",
+ bisqEasy_takeOffer_review_noTradeFees = "[FR] No trade fees in Bisq Easy",
+ bisqEasy_takeOffer_review_sellerPaysMinerFeeLong = "[FR] The seller pays the mining fee",
+ bisqEasy_takeOffer_review_sellerPaysMinerFee = "[FR] Seller pays the mining fee",
+ bisqEasy_takeOffer_review_noTradeFeesLong = "[FR] There are no trade fees in Bisq Easy",
+ bisqEasy_takeOffer_review_takeOffer = "[FR] Confirm take offer",
+ bisqEasy_takeOffer_review_sendTakeOfferMessageFeedback_headline = "[FR] Sending take-offer message",
+ bisqEasy_takeOffer_review_sendTakeOfferMessageFeedback_subTitle = "[FR] Sending the take-offer message can take up to 2 minutes",
+ bisqEasy_takeOffer_review_sendTakeOfferMessageFeedback_info = "[FR] Do not close the window or the application until you see the confirmation that the take-offer request was successfully sent.",
+ bisqEasy_takeOffer_review_takeOfferSuccess_headline = "[FR] You have successfully taken the offer",
+ bisqEasy_takeOffer_review_takeOfferSuccess_subTitle = "[FR] Please get in touch with the trade peer at 'Open Trades'.\n You will find further information for the next steps over there.\n\n Be sure to regularly check the Bisq application for new messages from your trade peer.",
+ bisqEasy_takeOffer_review_takeOfferSuccessButton = "[FR] Show trade in 'Open Trades'",
+ bisqEasy_takeOffer_tradeLogMessage = "[FR] {0} has sent a message for taking {1}''s offer",
+ bisqEasy_takeOffer_noMediatorAvailable_warning = "[FR] There is no mediator available. You have to use the support chat instead.",
+ bisqEasy_takeOffer_makerBanned_warning = "[FR] The maker of this offer is banned. Please try to use a different offer.",
+ bisqEasy_takeOffer_bitcoinPaymentData_warning_MAIN_CHAIN = "[FR] The Bitcoin address that you have entered appears to be invalid.\n\n If you are sure the address is valid you can ignore this warning and proceed.",
+ bisqEasy_takeOffer_bitcoinPaymentData_warning_LN = "[FR] The Lightning invoice that you have entered appears to be invalid.\n\n If you are sure the invoice is valid you can ignore this warning and proceed.",
+ bisqEasy_takeOffer_bitcoinPaymentData_warning_proceed = "[FR] Ignore warning",
+ bisqEasy_tradeGuide_tabs_headline = "[FR] Trade guide",
+ bisqEasy_tradeGuide_welcome = "[FR] Overview",
+ bisqEasy_tradeGuide_security = "[FR] Security",
+ bisqEasy_tradeGuide_process = "[FR] Process",
+ bisqEasy_tradeGuide_rules = "[FR] Trade rules",
+ bisqEasy_tradeGuide_welcome_headline = "[FR] How to trade on Bisq Easy",
+ bisqEasy_tradeGuide_welcome_content = "[FR] This guide provides an overview of essential aspects for buying or selling Bitcoin with Bisq Easy.\n In this guide, you'll learn about the security model used at Bisq Easy, gain insights into the trade process, and familiarize yourself with the trade rules.\n\n For any additional questions, feel free to visit the chat rooms available under the 'Support' menu.",
+ bisqEasy_tradeGuide_security_headline = "[FR] How safe is it to trade on Bisq Easy?",
+ bisqEasy_tradeGuide_security_content = "[FR] - Bisq Easy's security model is optimized for small trade amounts.\n - The model relies on the reputation of the seller, who is usually an experienced Bisq user and is expected to provide helpful support to new users.\n - Building up reputation can be costly, leading to a common 5-15% price premium to cover extra expenses and compensate for the seller's service.\n - Trading with sellers lacking reputation carries significant risks and should only be undertaken if the risks are thoroughly understood and managed.",
+ bisqEasy_tradeGuide_process_headline = "[FR] How does the trade process works?",
+ bisqEasy_tradeGuide_process_content = "[FR] When you decide to take an offer, you'll have the flexibility to choose from the available options provided by the offer. Before starting the trade, you'll be presented with a summary overview for your review.\n Once the trade is initiated, the user interface will guide you through the trade process, which consists of the following steps:",
+ bisqEasy_tradeGuide_process_steps = "[FR] 1. The seller and the buyer exchange account details. The seller sends their payment data (e.g., bank account number) to the buyer and the buyer sends their Bitcoin address (or Lightning invoice) to the seller.\n 2. Next, the buyer initiates the Fiat payment to the seller's account. Upon receiving the payment, the seller will confirm the receipt.\n 3. The seller then sends the Bitcoin to the buyer's address and shares the transaction ID (of optionally the preimage in case Lightning is used). The user interface will display the confirmation state. Once confirmed, the trade is successfully completed.",
+ bisqEasy_tradeGuide_rules_headline = "[FR] What do I need to know about the trade rules?",
+ bisqEasy_tradeGuide_rules_content = "[FR] - Prior to the exchange of account details between the seller and the buyer, any party can cancel the trade without providing justification.\n - Traders should regularly check their trades for new messages and must respond within 24 hours.\n - Once account details are exchanged, failing to meet trade obligations is considered a breach of the trade contract and may result in a ban from the Bisq network. This does not apply if the trade peer is unresponsive.\n - During Fiat payment, the buyer MUST NOT include terms like 'Bisq' or 'Bitcoin' in the 'reason for payment' field. Traders can agree on an identifier, such as a random string like 'H3TJAPD', to associate the bank transfer with the trade.\n - If the trade cannot be completed instantly due to longer Fiat transfer times, both traders must be online at least once a day to monitor the trade progress.\n - In the event that traders encounter unresolved issues, they have the option to invite a mediator into the trade chat for assistance.\n\n Should you have any questions or need assistance, don't hesitate to visit the chat rooms accessible under the 'Support' menu. Happy trading!",
+ bisqEasy_tradeGuide_rules_confirm = "[FR] I have read and understood",
+ bisqEasy_tradeGuide_notConfirmed_warn = "[FR] Please read the trade guide and confirm that you have read and understood the trade rules.",
+ bisqEasy_tradeGuide_open = "[FR] Open trade guide",
+ bisqEasy_walletGuide_open = "[FR] Open wallet guide",
+ bisqEasy_walletGuide_tabs_headline = "[FR] Wallet guide",
+ bisqEasy_walletGuide_intro = "[FR] Intro",
+ bisqEasy_walletGuide_download = "[FR] Download",
+ bisqEasy_walletGuide_createWallet = "[FR] New wallet",
+ bisqEasy_walletGuide_receive = "[FR] Receiving",
+ bisqEasy_walletGuide_intro_headline = "[FR] Get ready to receive your first Bitcoin",
+ bisqEasy_walletGuide_intro_content = "[FR] In Bisq Easy, the Bitcoin you receive goes straight to your pocket without any intermediaries. That's a great advantage, but it also means you need to have a wallet that you control yourself to receive it!\n\n In this quick wallet guide, we will show you in a few simple steps how you can create a simple wallet. With it, you will be able to receive and store your freshly purchased bitcoin.\n\n If you are already familiar with on-chain wallets and have one, you can skip this guide and simply use your wallet.",
+ bisqEasy_walletGuide_download_headline = "[FR] Downloading your wallet",
+ bisqEasy_walletGuide_download_content = "[FR] There are many wallets out there that you can use. In this guide, we will show you how to use Bluewallet. Bluewallet is great and, at the same time, very simple, and you can use it to receive your bitcoin from Bisq Easy.\n\n You can download Bluewallet on your phone, regardless of whether you have an Android or iOS device. To do so, you can visit the official webpage at 'bluewallet.io'. Once you are there, click on App Store or Google Play depending on the device you are using.\n\n Important note: for your safety, make sure that you download the app from the official app store of your device. The official app is provided by 'Bluewallet Services, S.R.L.', and you should be able to see this in your app store. Downloading a malicious wallet could put your funds at risk.\n\n Finally, a quick note: Bisq is not affiliated with Bluewallet in any way. We suggest using Bluewallet due to its quality and simplicity, but there are many other options on the market. You should feel absolutely free to compare, try and choose whichever wallet fits your needs best.",
+ bisqEasy_walletGuide_download_link = "[FR] Click here to visit Bluewallet's page",
+ bisqEasy_walletGuide_createWallet_headline = "[FR] Creating your new wallet",
+ bisqEasy_walletGuide_createWallet_content = "[FR] Bluewallet allows you to create several wallets for different purposes. For now, you only need to have one wallet. Once you enter Bluewallet, you will see a message suggesting you add a new wallet. Once you do that, enter a name for your wallet and pick the option *Bitcoin* under the *Type* section. You can leave all other options as they appear and click on *Create*.\n\n When you move to the next step, you will be presented with 12 words. These 12 words are the backup that allows you to recover your wallet if something happens to your phone. Write them down on a piece of paper (not digitally) in the same order in which they are presented, store this paper safely and make sure only you have access to it. You can read more about how to secure your wallet in the Learn sections of Bisq 2 dedicated to wallets and security.\n\n Once you are done, click on 'Ok, I wrote it down'.\n Congratulations! You have created your wallet! Let's move on to how to receive your bitcoin in it.",
+ bisqEasy_walletGuide_receive_headline = "[FR] Receiving bitcoin in your wallet",
+ bisqEasy_walletGuide_receive_content = "[FR] To receive your Bitcoin, you need an address from your wallet. To get it, click on your newly created wallet, and afterwards click on the 'Receive' button at the bottom of the screen.\n\n Bluewallet will display an unused address, both as a QR code and as text. This address is what you will need to provide to your peer in Bisq Easy so that he can send you the Bitcoin you are buying. You can move the address to your PC by scanning the QR code with a camera, by sending the address with an email or chat message, or even by simply typing it.\n\n Once you complete the trade, Bluewallet will notice the incoming Bitcoin and update your balance with the new funds. Everytime you do a new trade, get a fresh address to protect your privacy.\n\n These are the basics you need to know to start receiving Bitcoin in your own wallet. If you want to learn more about Bluewallet, we recommend checking out the videos listed below.",
+ bisqEasy_walletGuide_receive_link1 = "[FR] Bluewallet tutorial by Anita Posch",
+ bisqEasy_walletGuide_receive_link2 = "[FR] Bluewallet tutorial by BTC Sessions",
+ bisqEasy_offerbook_markets = "[FR] Markets",
+ bisqEasy_offerbook_markets_CollapsedList_Tooltip = "[FR] Expand Markets",
+ bisqEasy_offerbook_markets_ExpandedList_Tooltip = "[FR] Collapse Markets",
+ bisqEasy_offerbook_marketListCell_numOffers_one = "[FR] {0} offer",
+ bisqEasy_offerbook_marketListCell_numOffers_many = "[FR] {0} offers",
+ bisqEasy_offerbook_marketListCell_numOffers_tooltip_none = "[FR] No offers yet available in the {0} market",
+ bisqEasy_offerbook_marketListCell_numOffers_tooltip_one = "[FR] {0} offer is available in the {1} market",
+ bisqEasy_offerbook_marketListCell_numOffers_tooltip_many = "[FR] {0} offers are available in the {1} market",
+ bisqEasy_offerbook_marketListCell_favourites_tooltip_addToFavourites = "[FR] Add to favourites",
+ bisqEasy_offerbook_marketListCell_favourites_tooltip_removeFromFavourites = "[FR] Remove from favourites",
+ bisqEasy_offerbook_marketListCell_favourites_maxReached_popup = "[FR] There's only space for 5 favourites. Remove a favourite and try again.",
+ bisqEasy_offerbook_dropdownMenu_sortAndFilterMarkets_tooltip = "[FR] Sort and filter markets",
+ bisqEasy_offerbook_dropdownMenu_sortAndFilterMarkets_sortTitle = "[FR] Sort by:",
+ bisqEasy_offerbook_dropdownMenu_sortAndFilterMarkets_mostOffers = "[FR] Most offers",
+ bisqEasy_offerbook_dropdownMenu_sortAndFilterMarkets_nameAZ = "[FR] Name A-Z",
+ bisqEasy_offerbook_dropdownMenu_sortAndFilterMarkets_nameZA = "[FR] Name Z-A",
+ bisqEasy_offerbook_dropdownMenu_sortAndFilterMarkets_filterTitle = "[FR] Show markets:",
+ bisqEasy_offerbook_dropdownMenu_sortAndFilterMarkets_withOffers = "[FR] With offers",
+ bisqEasy_offerbook_dropdownMenu_sortAndFilterMarkets_favourites = "[FR] Only favourites",
+ bisqEasy_offerbook_dropdownMenu_sortAndFilterMarkets_all = "[FR] All",
+ bisqEasy_offerbook_dropdownMenu_messageTypeFilter_tooltip = "[FR] Filter by chat activity",
+ bisqEasy_offerbook_dropdownMenu_messageTypeFilter_all = "[FR] All activity",
+ bisqEasy_offerbook_dropdownMenu_messageTypeFilter_offers = "[FR] Only offers",
+ bisqEasy_offerbook_dropdownMenu_messageTypeFilter_text = "[FR] Only messages",
+ bisqEasy_offerbook_chatMessage_deleteOffer_confirmation = "[FR] Are you sure you want to delete this offer?",
+ bisqEasy_offerbook_chatMessage_deleteMessage_confirmation = "[FR] Are you sure you want to delete this message?",
+ bisqEasy_offerbook_offerList = "[FR] Offer List",
+ bisqEasy_offerbook_offerList_collapsedList_tooltip = "[FR] Expand Offer List",
+ bisqEasy_offerbook_offerList_expandedList_tooltip = "[FR] Collapse Offer List",
+ bisqEasy_offerbook_offerList_table_columns_peerProfile = "[FR] Peer profile",
+ bisqEasy_offerbook_offerList_table_columns_price = "[FR] Price",
+ bisqEasy_offerbook_offerList_table_columns_fiatAmount = "[FR] {0} amount",
+ bisqEasy_offerbook_offerList_table_columns_paymentMethod = "[FR] Payment",
+ bisqEasy_offerbook_offerList_table_columns_settlementMethod = "[FR] Settlement",
+ bisqEasy_offerbook_offerList_table_filters_offerDirection_buyFrom = "[FR] Buy from",
+ bisqEasy_offerbook_offerList_table_filters_offerDirection_sellTo = "[FR] Sell to",
+ bisqEasy_offerbook_offerList_table_filters_paymentMethods_title = "[FR] Payments ({0})",
+ bisqEasy_offerbook_offerList_table_filters_paymentMethods_title_all = "[FR] All",
+ bisqEasy_offerbook_offerList_table_filters_paymentMethods_customPayments = "[FR] Custom payments",
+ bisqEasy_offerbook_offerList_table_filters_paymentMethods_clearFilters = "[FR] Clear filters",
+ bisqEasy_offerbook_offerList_table_filters_showMyOffersOnly = "[FR] My offers only",
+ bisqEasy_offerbook_offerList_table_columns_price_tooltip_fixPrice = "[FR] Fixed price: {0}\nPercentage from current market price: {1}",
+ bisqEasy_offerbook_offerList_table_columns_price_tooltip_marketPrice = "[FR] Market price: {0}",
+ bisqEasy_offerbook_offerList_table_columns_price_tooltip_floatPrice = "[FR] Percentage price {0}\nWith current market price: {1}",
+ bisqEasy_openTrades_table_headline = "[FR] My open trades",
+ bisqEasy_openTrades_noTrades = "[FR] You don't have any open trades",
+ bisqEasy_openTrades_rejectTrade = "[FR] Reject trade",
+ bisqEasy_openTrades_cancelTrade = "[FR] Cancel trade",
+ bisqEasy_openTrades_tradeLogMessage_rejected = "[FR] {0} rejected the trade",
+ bisqEasy_openTrades_tradeLogMessage_cancelled = "[FR] {0} cancelled the trade",
+ bisqEasy_openTrades_rejectTrade_warning = "[FR] Since the exchange of account details has not yet started, rejecting the trade does not constitute a violation of the trade rules.\n\n If you have any questions or encounter issues, please don't hesitate to contact your trade peer or seek assistance in the 'Support section'.\n\n Are you sure you want to reject the trade?",
+ bisqEasy_openTrades_cancelTrade_warning_buyer = "[FR] Since the exchange of account details has commenced, canceling the trade without the seller''s {0}",
+ bisqEasy_openTrades_cancelTrade_warning_seller = "[FR] Since the exchange of account details has commenced, canceling the trade without the buyer''s {0}",
+ bisqEasy_openTrades_cancelTrade_warning_part2 = "[FR] consent could be considered a violation of the trading rules and may result in your profile being banned from the network.\n\n If the peer has been unresponsive for more than 24 hours and no payment has been made, you may reject the trade without consequences. The liability will rest with the unresponsive party.\n\n If you have any questions or encounter issues, please do not hesitate to contact your trade peer or seek assistance in the 'Support section'.\n\n If you believe that your trade peer has violated the trade rules, you have the option to initiate a mediation request. A mediator will join the trade chat and work toward finding a cooperative solution.\n\n Are you sure you want to cancel the trade?",
+ bisqEasy_openTrades_closeTrade_warning_interrupted = "[FR] Before closing the trade you can back up the trade data as csv file if needed.\n\n Once the trade is closed all data related to the trade is gone, and you cannot communicate with the trade peer in the trade chat anymore.\n\n Do you want to close the trade now?",
+ bisqEasy_openTrades_closeTrade_warning_completed = "[FR] Your trade has been completed.\n\n You can now close the trade or back up the trade data on your computer if needed.\n\n Once the trade is closed all data related to the trade are gone, and you cannot communicate with the trade peer in the trade chat anymore.",
+ bisqEasy_openTrades_closeTrade = "[FR] Close trade",
+ bisqEasy_openTrades_confirmCloseTrade = "[FR] Confirm close trade",
+ bisqEasy_openTrades_exportTrade = "[FR] Export trade data",
+ bisqEasy_openTrades_reportToMediator = "[FR] Report to mediator",
+ bisqEasy_openTrades_rejected_self = "[FR] You have rejected the trade",
+ bisqEasy_openTrades_rejected_peer = "[FR] Your trade peer has rejected the trade",
+ bisqEasy_openTrades_cancelled_self = "[FR] You have cancelled the trade",
+ bisqEasy_openTrades_cancelled_peer = "[FR] Your trade peer has cancelled the trade",
+ bisqEasy_openTrades_inMediation_info = "[FR] A mediator has joined the trade chat. Please use the trade chat below to get assistance from the mediator.",
+ bisqEasy_openTrades_failed = "[FR] The trade failed with error message: {0}",
+ bisqEasy_openTrades_failed_popup = "[FR] The trade failed due an error.\n Error message: {0}\n\n Stack trace: {1}",
+ bisqEasy_openTrades_failedAtPeer = "[FR] The peer''s trade failed with an error caused by: {0}",
+ bisqEasy_openTrades_failedAtPeer_popup = "[FR] The peer''s trade failed due an error.\n Error caused by: {0}\n\n Stack trace: {1}",
+ bisqEasy_openTrades_table_tradePeer = "[FR] Peer",
+ bisqEasy_openTrades_table_me = "[FR] Me",
+ bisqEasy_openTrades_table_mediator = "[FR] Mediator",
+ bisqEasy_openTrades_table_tradeId = "[FR] Trade ID",
+ bisqEasy_openTrades_table_price = "[FR] Price",
+ bisqEasy_openTrades_table_baseAmount = "[FR] Amount in BTC",
+ bisqEasy_openTrades_table_quoteAmount = "[FR] Amount",
+ bisqEasy_openTrades_table_paymentMethod = "[FR] Payment",
+ bisqEasy_openTrades_table_paymentMethod_tooltip = "[FR] Fiat payment method: {0}",
+ bisqEasy_openTrades_table_settlementMethod = "[FR] Settlement",
+ bisqEasy_openTrades_table_settlementMethod_tooltip = "[FR] Bitcoin settlement method: {0}",
+ bisqEasy_openTrades_table_makerTakerRole = "[FR] My role",
+ bisqEasy_openTrades_table_direction_buyer = "[FR] Buying from:",
+ bisqEasy_openTrades_table_direction_seller = "[FR] Selling to:",
+ bisqEasy_openTrades_table_makerTakerRole_maker = "[FR] Maker",
+ bisqEasy_openTrades_table_makerTakerRole_taker = "[FR] Taker",
+ bisqEasy_openTrades_csv_quoteAmount = "[FR] Amount in {0}",
+ bisqEasy_openTrades_csv_txIdOrPreimage = "[FR] Transaction ID/Preimage",
+ bisqEasy_openTrades_csv_receiverAddressOrInvoice = "[FR] Receiver address/Invoice",
+ bisqEasy_openTrades_csv_paymentMethod = "[FR] Payment method",
+ bisqEasy_openTrades_chat_peer_description = "[FR] Chat peer",
+ bisqEasy_openTrades_chat_detach = "[FR] Detach",
+ bisqEasy_openTrades_chat_detach_tooltip = "[FR] Open chat in new window",
+ bisqEasy_openTrades_chat_attach = "[FR] Restore",
+ bisqEasy_openTrades_chat_attach_tooltip = "[FR] Restore chat back to main window",
+ bisqEasy_openTrades_chat_window_title = "[FR] {0} - Chat with {1} / Trade ID: {2}",
+ bisqEasy_openTrades_chat_peerLeft_headline = "[FR] {0} has left the trade",
+ bisqEasy_openTrades_chat_peerLeft_subHeadline = "[FR] If the trade is not completed on your side and if you need assistance, contact the mediator or visit the support chat.",
+ bisqEasy_openTrades_tradeDetails_open = "[FR] Open trade details",
+ bisqEasy_openTrades_tradeDetails_headline = "[FR] Trade Details",
+ bisqEasy_openTrades_tradeDetails_tradeDate = "[FR] Trade date",
+ bisqEasy_openTrades_tradeDetails_tradersAndRole = "[FR] Traders / Role",
+ bisqEasy_openTrades_tradeDetails_tradersAndRole_me = "[FR] Me:",
+ bisqEasy_openTrades_tradeDetails_tradersAndRole_peer = "[FR] Peer:",
+ bisqEasy_openTrades_tradeDetails_tradersAndRole_copy = "[FR] Copy peer username",
+ bisqEasy_openTrades_tradeDetails_offerTypeAndMarket = "[FR] Offer type / Market",
+ bisqEasy_openTrades_tradeDetails_offerTypeAndMarket_buyOffer = "[FR] Buy offer",
+ bisqEasy_openTrades_tradeDetails_offerTypeAndMarket_sellOffer = "[FR] Sell offer",
+ bisqEasy_openTrades_tradeDetails_offerTypeAndMarket_fiatMarket = "[FR] {0} market",
+ bisqEasy_openTrades_tradeDetails_amountAndPrice = "[FR] Amount @ Price",
+ bisqEasy_openTrades_tradeDetails_paymentAndSettlementMethods = "[FR] Payment methods",
+ bisqEasy_openTrades_tradeDetails_tradeId = "[FR] Trade ID",
+ bisqEasy_openTrades_tradeDetails_tradeId_copy = "[FR] Copy trade ID",
+ bisqEasy_openTrades_tradeDetails_peerNetworkAddress = "[FR] Peer network address",
+ bisqEasy_openTrades_tradeDetails_peerNetworkAddress_copy = "[FR] Copy peer network address",
+ bisqEasy_openTrades_tradeDetails_btcPaymentAddress = "[FR] BTC payment address",
+ bisqEasy_openTrades_tradeDetails_lightningInvoice = "[FR] Lighting invoice",
+ bisqEasy_openTrades_tradeDetails_btcPaymentAddress_copy = "[FR] Copy BTC payment address",
+ bisqEasy_openTrades_tradeDetails_lightningInvoice_copy = "[FR] Copy lighting invoice",
+ bisqEasy_openTrades_tradeDetails_paymentAccountData = "[FR] Payment account data",
+ bisqEasy_openTrades_tradeDetails_paymentAccountData_copy = "[FR] Copy payment account data",
+ bisqEasy_openTrades_tradeDetails_assignedMediator = "[FR] Assigned mediator",
+ bisqEasy_openTrades_tradeDetails_dataNotYetProvided = "[FR] Data not yet provided",
+ bisqEasy_privateChats_leave = "[FR] Leave chat",
+ bisqEasy_privateChats_table_myUser = "[FR] My profile",
+ bisqEasy_topPane_filter = "[FR] Filter offerbook",
+ bisqEasy_topPane_closeFilter = "[FR] Close filter",
+ bisqEasy_offerDetails_headline = "[FR] Offer details",
+ bisqEasy_offerDetails_buy = "[FR] Offer for buying Bitcoin",
+ bisqEasy_offerDetails_sell = "[FR] Offer for selling Bitcoin",
+ bisqEasy_offerDetails_direction = "[FR] Offer type",
+ bisqEasy_offerDetails_baseSideAmount = "[FR] Bitcoin amount",
+ bisqEasy_offerDetails_quoteSideAmount = "[FR] {0} amount",
+ bisqEasy_offerDetails_price = "[FR] {0} offer price",
+ bisqEasy_offerDetails_priceValue = "[FR] {0} (premium: {1})",
+ bisqEasy_offerDetails_paymentMethods = "[FR] Supported payment method(s)",
+ bisqEasy_offerDetails_id = "[FR] Offer ID",
+ bisqEasy_offerDetails_date = "[FR] Creation date",
+ bisqEasy_offerDetails_makersTradeTerms = "[FR] Makers trade terms",
+ bisqEasy_openTrades_welcome_headline = "[FR] Welcome to your first Bisq Easy trade!",
+ bisqEasy_openTrades_welcome_info = "[FR] Please make yourself familiar with the concept, process and rules for trading on Bisq Easy.\n After you have read and accepted the trade rules you can start the trade.",
+ bisqEasy_openTrades_welcome_line1 = "[FR] Learn about the security model of Bisq easy",
+ bisqEasy_openTrades_welcome_line2 = "[FR] See how the trade process works",
+ bisqEasy_openTrades_welcome_line3 = "[FR] Make yourself familiar with the trade rules",
+)
diff --git a/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/i18n/BisqEasyTradeStateStrings.kt b/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/i18n/BisqEasyTradeStateStrings.kt
new file mode 100644
index 00000000..23d6a1a0
--- /dev/null
+++ b/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/i18n/BisqEasyTradeStateStrings.kt
@@ -0,0 +1,152 @@
+package network.bisq.mobile.i18n
+
+// Can't have 500+ (or even less) keys in a single class. So splitting it up
+// Partial from BisqEasyStrings.kt
+data class BisqEasyTradeStateStrings(
+ val bisqEasy_tradeState_requestMediation: String,
+ val bisqEasy_tradeState_reportToMediator: String,
+ val bisqEasy_tradeState_acceptOrRejectSellersPrice_title: String,
+ val bisqEasy_tradeState_acceptOrRejectSellersPrice_description_buyersPrice: String,
+ val bisqEasy_tradeState_acceptOrRejectSellersPrice_description_sellersPrice: String,
+ val bisqEasy_tradeState_acceptOrRejectSellersPrice_description_question: String,
+ val bisqEasy_tradeState_acceptOrRejectSellersPrice_description_disclaimer: String,
+ val bisqEasy_tradeState_acceptOrRejectSellersPrice_button_accept: String,
+ val bisqEasy_tradeState_header_peer: String,
+ val bisqEasy_tradeState_header_direction: String,
+ val bisqEasy_tradeState_header_send: String,
+ val bisqEasy_tradeState_header_pay: String,
+ val bisqEasy_tradeState_header_receive: String,
+ val bisqEasy_tradeState_header_tradeId: String,
+ val bisqEasy_tradeState_phase1: String,
+ val bisqEasy_tradeState_phase2: String,
+ val bisqEasy_tradeState_phase3: String,
+ val bisqEasy_tradeState_phase4: String,
+ val bisqEasy_tradeState_info_phase3b_balance_help_explorerLookup: String,
+ val bisqEasy_tradeState_info_phase3b_balance_help_notConfirmed: String,
+ val bisqEasy_tradeState_info_phase3b_balance_help_confirmed: String,
+ val bisqEasy_tradeState_info_phase3b_txId_failed: String,
+ val bisqEasy_tradeState_info_phase3b_button_skip: String,
+ val bisqEasy_tradeState_info_phase3b_balance_invalid_noOutputsForAddress: String,
+ val bisqEasy_tradeState_info_phase3b_balance_invalid_multipleOutputsForAddress: String,
+ val bisqEasy_tradeState_info_phase3b_balance_invalid_amountNotMatching: String,
+ val bisqEasy_tradeState_info_phase3b_button_next: String,
+ val bisqEasy_tradeState_info_phase3b_button_next_amountNotMatching: String,
+ val bisqEasy_tradeState_info_phase3b_button_next_noOutputForAddress: String,
+ val bisqEasy_tradeState_info_phase3b_button_next_amountNotMatching_resolved: String,
+ val bisqEasy_tradeState_info_phase3b_txId: String,
+ val bisqEasy_tradeState_info_phase3b_txId_tooltip: String,
+ val bisqEasy_tradeState_info_phase3b_lightning_preimage: String,
+ val bisqEasy_tradeState_info_phase4_txId_tooltip: String,
+ val bisqEasy_tradeState_info_phase4_exportTrade: String,
+ val bisqEasy_tradeState_info_phase4_leaveChannel: String,
+ val bisqEasy_tradeState_bitcoinPaymentData_MAIN_CHAIN: String,
+ val bisqEasy_tradeState_bitcoinPaymentData_LN: String,
+ val bisqEasy_tradeState_paymentProof_MAIN_CHAIN: String,
+ val bisqEasy_tradeState_paymentProof_LN: String,
+ val bisqEasy_tradeState_info_buyer_phase1a_bitcoinPayment_headline_MAIN_CHAIN: String,
+ val bisqEasy_tradeState_info_buyer_phase1a_bitcoinPayment_description_MAIN_CHAIN: String,
+ val bisqEasy_tradeState_info_buyer_phase1a_bitcoinPayment_prompt_MAIN_CHAIN: String,
+ val bisqEasy_tradeState_info_buyer_phase1a_tradeLogMessage_MAIN_CHAIN: String,
+ val bisqEasy_tradeState_info_buyer_phase1a_bitcoinPayment_headline_LN: String,
+ val bisqEasy_tradeState_info_buyer_phase1a_bitcoinPayment_description_LN: String,
+ val bisqEasy_tradeState_info_buyer_phase1a_bitcoinPayment_prompt_LN: String,
+ val bisqEasy_tradeState_info_buyer_phase1a_tradeLogMessage_LN: String,
+ val bisqEasy_tradeState_info_buyer_phase1a_bitcoinPayment_walletHelp: String,
+ val bisqEasy_tradeState_info_buyer_phase1a_walletHelpButton: String,
+ val bisqEasy_tradeState_info_buyer_phase1a_send: String,
+ val bisqEasy_tradeState_info_buyer_phase1a_scanQrCode_tooltip: String,
+ val bisqEasy_tradeState_info_buyer_phase1a_scanQrCode_webcamState_description: String,
+ val bisqEasy_tradeState_info_buyer_phase1a_scanQrCode_webcamState_connecting: String,
+ val bisqEasy_tradeState_info_buyer_phase1a_scanQrCode_webcamState_imageRecognized: String,
+ val bisqEasy_tradeState_info_buyer_phase1a_scanQrCode_webcamState_failed: String,
+ val bisqEasy_tradeState_info_buyer_phase1b_headline: String,
+ val bisqEasy_tradeState_info_buyer_phase1b_info: String,
+ val bisqEasy_tradeState_info_buyer_phase2a_headline: (String) -> String,
+ val bisqEasy_tradeState_info_buyer_phase2a_quoteAmount: String,
+ val bisqEasy_tradeState_info_buyer_phase2a_sellersAccount: String,
+ val bisqEasy_tradeState_info_buyer_phase2a_reasonForPaymentInfo: String,
+ val bisqEasy_tradeState_info_buyer_phase2a_confirmFiatSent: (String) -> String,
+ val bisqEasy_tradeState_info_buyer_phase2a_tradeLogMessage: String,
+ val bisqEasy_tradeState_info_buyer_phase2b_headline: String,
+ val bisqEasy_tradeState_info_buyer_phase2b_info: (String, String) -> String,
+ val bisqEasy_tradeState_info_buyer_phase3a_headline: String,
+ val bisqEasy_tradeState_info_buyer_phase3a_info: (String) -> String,
+ val bisqEasy_tradeState_info_buyer_phase3b_headline_ln: String,
+ val bisqEasy_tradeState_info_buyer_phase3b_info_ln: String,
+ val bisqEasy_tradeState_info_buyer_phase3b_confirmButton_ln: String,
+ val bisqEasy_tradeState_info_buyer_phase3b_tradeLogMessage_ln: String,
+ val bisqEasy_tradeState_info_buyer_phase3b_headline_MAIN_CHAIN: String,
+ val bisqEasy_tradeState_info_buyer_phase3b_info_MAIN_CHAIN: String,
+ val bisqEasy_tradeState_info_buyer_phase3b_balance: String,
+ val bisqEasy_tradeState_info_buyer_phase3b_balance_prompt: String,
+ val bisqEasy_tradeState_info_seller_phase1_headline: String,
+ val bisqEasy_tradeState_info_seller_phase1_accountData: String,
+ val bisqEasy_tradeState_info_seller_phase1_accountData_prompt: String,
+ val bisqEasy_tradeState_info_seller_phase1_buttonText: String,
+ val bisqEasy_tradeState_info_seller_phase1_note: String,
+ val bisqEasy_tradeState_info_seller_phase1_tradeLogMessage: String,
+ val bisqEasy_tradeState_info_seller_phase2a_waitForPayment_headline: String,
+ val bisqEasy_tradeState_info_seller_phase2a_waitForPayment_info: String,
+ val bisqEasy_tradeState_info_seller_phase2b_headline: String,
+ val bisqEasy_tradeState_info_seller_phase2b_info: String,
+ val bisqEasy_tradeState_info_seller_phase2b_fiatReceivedButton: String,
+ val bisqEasy_tradeState_info_seller_phase2b_tradeLogMessage: String,
+ val bisqEasy_tradeState_info_seller_phase3a_fiatPaymentReceivedCheckBox: String,
+ val bisqEasy_tradeState_info_seller_phase3a_sendBtc: String,
+ val bisqEasy_tradeState_info_seller_phase3a_baseAmount: String,
+ val bisqEasy_tradeState_info_seller_phase3a_qrCodeDisplay_openWindow: String,
+ val bisqEasy_tradeState_info_seller_phase3a_qrCodeDisplay_window_title: String,
+ val bisqEasy_tradeState_info_seller_phase3b_headline_MAIN_CHAIN: String,
+ val bisqEasy_tradeState_info_seller_phase3b_info_MAIN_CHAIN: String,
+ val bisqEasy_tradeState_info_seller_phase3b_balance: String,
+ val bisqEasy_tradeState_info_seller_phase3b_balance_prompt: String,
+ val bisqEasy_tradeState_info_seller_phase3a_bitcoinPayment_description_MAIN_CHAIN: String,
+ val bisqEasy_tradeState_info_seller_phase3a_paymentProof_description_MAIN_CHAIN: String,
+ val bisqEasy_tradeState_info_seller_phase3a_paymentProof_prompt_MAIN_CHAIN: String,
+ val bisqEasy_tradeState_info_seller_phase3a_tradeLogMessage_paymentProof_MAIN_CHAIN: String,
+ val bisqEasy_tradeState_info_seller_phase3a_bitcoinPayment_description_LN: String,
+ val bisqEasy_tradeState_info_seller_phase3a_paymentProof_description_LN: String,
+ val bisqEasy_tradeState_info_seller_phase3a_paymentProof_prompt_LN: String,
+ val bisqEasy_tradeState_info_seller_phase3a_tradeLogMessage_paymentProof_LN: String,
+ val bisqEasy_tradeState_info_seller_phase3a_btcSentButton: String,
+ val bisqEasy_tradeState_info_seller_phase3a_tradeLogMessage: String,
+ val bisqEasy_tradeState_info_seller_phase3a_tradeLogMessage_noProofProvided: String,
+ val bisqEasy_tradeState_info_seller_phase3a_paymentProof_warning_MAIN_CHAIN: String,
+ val bisqEasy_tradeState_info_seller_phase3a_paymentProof_warning_LN: String,
+ val bisqEasy_tradeState_info_seller_phase3a_paymentProof_warning_proceed: String,
+ val bisqEasy_tradeState_info_seller_phase3b_headline_ln: String,
+ val bisqEasy_tradeState_info_seller_phase3b_info_ln: String,
+ val bisqEasy_tradeState_info_seller_phase3b_confirmButton_ln: String,
+ val bisqEasy_tradeCompleted_title: String,
+ val bisqEasy_tradeCompleted_tableTitle: String,
+ val bisqEasy_tradeCompleted_header_tradeWith: String,
+ val bisqEasy_tradeCompleted_header_myDirection_seller: String,
+ val bisqEasy_tradeCompleted_header_myDirection_buyer: String,
+ val bisqEasy_tradeCompleted_header_myDirection_btc: String,
+ val bisqEasy_tradeCompleted_header_myOutcome_seller: String,
+ val bisqEasy_tradeCompleted_header_myOutcome_buyer: String,
+ val bisqEasy_tradeCompleted_header_paymentMethod: String,
+ val bisqEasy_tradeCompleted_header_tradeId: String,
+ val bisqEasy_tradeCompleted_body_date: String,
+ val bisqEasy_tradeCompleted_body_tradePrice: String,
+ val bisqEasy_tradeCompleted_body_tradeFee: String,
+ val bisqEasy_tradeCompleted_body_tradeFee_value: String,
+ val bisqEasy_tradeCompleted_body_copy_txId_tooltip: String,
+ val bisqEasy_tradeCompleted_body_copy_explorerLink_tooltip: String,
+ val bisqEasy_tradeCompleted_body_txId_tooltip: String,
+ val bisqEasy_mediation_request_confirm_headline: String,
+ val bisqEasy_mediation_request_confirm_msg: String,
+ val bisqEasy_mediation_request_confirm_openMediation: String,
+ val bisqEasy_mediation_request_feedback_headline: String,
+ val bisqEasy_mediation_request_feedback_msg: String,
+ val bisqEasy_mediation_request_feedback_noMediatorAvailable: String,
+ val bisqEasy_mediation_requester_tradeLogMessage: String,
+
+ // Mobile app specific
+ val bisqEasy_tradeState_info_buyer_phase1a_seller_wait_message: String,
+ val bisqEasy_tradeState_info_buyer_phase1a_wallet_prompt_prefix: String,
+ val bisqEasy_tradeState_info_buyer_phase2a_seller_wait_message: String,
+ val bisqEasy_tradeState_info_buyer_phase3a_seller_wait_message: String,
+ val bisqEasy_tradeCompleted_body_you_have_receveid: String,
+ val bisqEasy_tradeCompleted_body_you_have_sold: String,
+)
diff --git a/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/i18n/BisqEasyTradeStateStringsEn.kt b/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/i18n/BisqEasyTradeStateStringsEn.kt
new file mode 100644
index 00000000..99e5ea29
--- /dev/null
+++ b/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/i18n/BisqEasyTradeStateStringsEn.kt
@@ -0,0 +1,149 @@
+package network.bisq.mobile.i18n
+
+val EnBisqEasyTradeStateStrings = BisqEasyTradeStateStrings(
+ bisqEasy_tradeState_requestMediation = "Request mediation",
+ bisqEasy_tradeState_reportToMediator = "Report to mediator",
+ bisqEasy_tradeState_acceptOrRejectSellersPrice_title = "Attention to Price Change!",
+ bisqEasy_tradeState_acceptOrRejectSellersPrice_description_buyersPrice = "Your offer price to buy Bitcoin was {0}.",
+ bisqEasy_tradeState_acceptOrRejectSellersPrice_description_sellersPrice = "However, the seller is offering you a different price: {0}.",
+ bisqEasy_tradeState_acceptOrRejectSellersPrice_description_question = "Do you want to accept this new price or do you want to reject/cancel* the trade?",
+ bisqEasy_tradeState_acceptOrRejectSellersPrice_description_disclaimer = "(*Note that in this specific case, cancelling the trade will NOT be considered a violation of the trading rules.)",
+ bisqEasy_tradeState_acceptOrRejectSellersPrice_button_accept = "Accept price",
+ bisqEasy_tradeState_header_peer = "Trade peer",
+ bisqEasy_tradeState_header_direction = "I want to",
+ bisqEasy_tradeState_header_send = "Amount to send",
+ bisqEasy_tradeState_header_pay = "Amount to pay",
+ bisqEasy_tradeState_header_receive = "Amount to receive",
+ bisqEasy_tradeState_header_tradeId = "Trade ID",
+ bisqEasy_tradeState_phase1 = "Account details",
+ bisqEasy_tradeState_phase2 = "Fiat payment",
+ bisqEasy_tradeState_phase3 = "Bitcoin transfer",
+ bisqEasy_tradeState_phase4 = "Trade completed",
+ bisqEasy_tradeState_info_phase3b_balance_help_explorerLookup = "Looking up transaction at block explorer ''{0}''",
+ bisqEasy_tradeState_info_phase3b_balance_help_notConfirmed = "Transaction seen in mempool but not confirmed yet",
+ bisqEasy_tradeState_info_phase3b_balance_help_confirmed = "Transaction is confirmed",
+ bisqEasy_tradeState_info_phase3b_txId_failed = "Transaction lookup to ''{0}'' failed with {1}: ''{2}''",
+ bisqEasy_tradeState_info_phase3b_button_skip = "Skip waiting for block confirmation",
+ bisqEasy_tradeState_info_phase3b_balance_invalid_noOutputsForAddress = "No matching outputs found in transaction",
+ bisqEasy_tradeState_info_phase3b_balance_invalid_multipleOutputsForAddress = "Multiple matching outputs found in transaction",
+ bisqEasy_tradeState_info_phase3b_balance_invalid_amountNotMatching = "Output amount from transaction is not matching trade amount",
+ bisqEasy_tradeState_info_phase3b_button_next = "Next",
+ bisqEasy_tradeState_info_phase3b_button_next_amountNotMatching = "The output amount for the address ''{0}'' in transaction ''{1}'' is ''{2}'', which does not match the trade amount of ''{3}''.\n\n Have you been able to resolve this issue with your trade peer?\n If not, you may consider requesting mediation to help settle the matter.",
+ bisqEasy_tradeState_info_phase3b_button_next_noOutputForAddress = "No output matching the address ''{0}'' in transaction ''{1}'' is found.\n\n Have you been able to resolve this issue with your trade peer?\n If not, you may consider requesting mediation to help settle the matter.",
+ bisqEasy_tradeState_info_phase3b_button_next_amountNotMatching_resolved = "I have resolved it",
+ bisqEasy_tradeState_info_phase3b_txId = "Transaction ID",
+ bisqEasy_tradeState_info_phase3b_txId_tooltip = "Open transaction in block explorer",
+ bisqEasy_tradeState_info_phase3b_lightning_preimage = "Preimage",
+ bisqEasy_tradeState_info_phase4_txId_tooltip = "Open transaction in block explorer",
+ bisqEasy_tradeState_info_phase4_exportTrade = "Export trade data",
+ bisqEasy_tradeState_info_phase4_leaveChannel = "Close trade",
+ bisqEasy_tradeState_bitcoinPaymentData_MAIN_CHAIN = "Bitcoin address",
+ bisqEasy_tradeState_bitcoinPaymentData_LN = "Lightning invoice",
+ bisqEasy_tradeState_paymentProof_MAIN_CHAIN = "Transaction ID",
+ bisqEasy_tradeState_paymentProof_LN = "Preimage",
+ bisqEasy_tradeState_info_buyer_phase1a_bitcoinPayment_headline_MAIN_CHAIN = "Fill in your Bitcoin address",
+ bisqEasy_tradeState_info_buyer_phase1a_bitcoinPayment_description_MAIN_CHAIN = "Bitcoin address",
+ bisqEasy_tradeState_info_buyer_phase1a_bitcoinPayment_prompt_MAIN_CHAIN = "Fill in your Bitcoin address",
+ bisqEasy_tradeState_info_buyer_phase1a_tradeLogMessage_MAIN_CHAIN = "{0} has sent the Bitcoin address ''{1}''",
+ bisqEasy_tradeState_info_buyer_phase1a_bitcoinPayment_headline_LN = "Fill in your Lightning invoice",
+ bisqEasy_tradeState_info_buyer_phase1a_bitcoinPayment_description_LN = "Lightning invoice",
+ bisqEasy_tradeState_info_buyer_phase1a_bitcoinPayment_prompt_LN = "Fill in your Lightning invoice",
+ bisqEasy_tradeState_info_buyer_phase1a_tradeLogMessage_LN = "{0} has sent the Lightning invoice ''{1}''",
+ bisqEasy_tradeState_info_buyer_phase1a_bitcoinPayment_walletHelp = "If you have not set up a wallet yet, you can find help at the wallet guide",
+ bisqEasy_tradeState_info_buyer_phase1a_walletHelpButton = "Open wallet guide",
+ bisqEasy_tradeState_info_buyer_phase1a_send = "Send to seller",
+ bisqEasy_tradeState_info_buyer_phase1a_scanQrCode_tooltip = "Scan QR code using your webcam",
+ bisqEasy_tradeState_info_buyer_phase1a_scanQrCode_webcamState_description = "Webcam connection state",
+ bisqEasy_tradeState_info_buyer_phase1a_scanQrCode_webcamState_connecting = "Connecting to webcam...",
+ bisqEasy_tradeState_info_buyer_phase1a_scanQrCode_webcamState_imageRecognized = "Webcam connected",
+ bisqEasy_tradeState_info_buyer_phase1a_scanQrCode_webcamState_failed = "Connecting to webcam failed",
+ bisqEasy_tradeState_info_buyer_phase1b_headline = "Wait for the seller's payment account data",
+ bisqEasy_tradeState_info_buyer_phase1b_info = "You can use the chat below for getting in touch with the seller.",
+ bisqEasy_tradeState_info_buyer_phase2a_headline = { fiat -> "Send $fiat to the seller''s payment account" },
+ bisqEasy_tradeState_info_buyer_phase2a_quoteAmount = "Amount to transfer",
+ bisqEasy_tradeState_info_buyer_phase2a_sellersAccount = "Payment account of seller",
+ bisqEasy_tradeState_info_buyer_phase2a_reasonForPaymentInfo = "Please leave the 'Reason for payment' field empty, in case you make a bank transfer",
+ bisqEasy_tradeState_info_buyer_phase2a_confirmFiatSent = { fiat -> "Confirm payment of $fiat" },
+ bisqEasy_tradeState_info_buyer_phase2a_tradeLogMessage = "{0} initiated the {1} payment",
+ bisqEasy_tradeState_info_buyer_phase2b_headline = "Wait for the seller to confirm receipt of payment",
+ bisqEasy_tradeState_info_buyer_phase2b_info = { fiat, settlement -> "Once the seller has received your payment of $fiat, they will start the Bitcoin transfer to your provided $settlement." },
+ bisqEasy_tradeState_info_buyer_phase3a_headline = "Wait for the seller's Bitcoin settlement",
+ bisqEasy_tradeState_info_buyer_phase3a_info = { method -> "The seller need to start the Bitcoin transfer to your provided $method."},
+ bisqEasy_tradeState_info_buyer_phase3b_headline_ln = "The seller has sent the Bitcoin via Lightning network",
+ bisqEasy_tradeState_info_buyer_phase3b_info_ln = "Transfers via the Lightning Network are typically near-instant. If you haven't received the payment within one minute, please contact the seller in the trade chat. Occasionally, payments may fail and need to be retried.",
+ bisqEasy_tradeState_info_buyer_phase3b_confirmButton_ln = "Confirm receipt",
+ bisqEasy_tradeState_info_buyer_phase3b_tradeLogMessage_ln = "{0} has confirmed to have received the Bitcoin payment",
+ bisqEasy_tradeState_info_buyer_phase3b_headline_MAIN_CHAIN = "The seller has started the Bitcoin payment",
+ bisqEasy_tradeState_info_buyer_phase3b_info_MAIN_CHAIN = "As soon the Bitcoin transaction is visible in the Bitcoin network you will see the payment. After 1 blockchain confirmation the payment can be considered as completed.",
+ bisqEasy_tradeState_info_buyer_phase3b_balance = "Received Bitcoin",
+ bisqEasy_tradeState_info_buyer_phase3b_balance_prompt = "Waiting for blockchain data...",
+ bisqEasy_tradeState_info_seller_phase1_headline = "Send your payment account data to the buyer",
+ bisqEasy_tradeState_info_seller_phase1_accountData = "My payment account data",
+ bisqEasy_tradeState_info_seller_phase1_accountData_prompt = "Fill in your payment account data. E.g. IBAN, BIC and account owner name",
+ bisqEasy_tradeState_info_seller_phase1_buttonText = "Send account data",
+ bisqEasy_tradeState_info_seller_phase1_note = "Note: You can use the chat below for getting in touch with the buyer before revealing your account data.",
+ bisqEasy_tradeState_info_seller_phase1_tradeLogMessage = "{0} has sent the payment account data:\n{1}",
+ bisqEasy_tradeState_info_seller_phase2a_waitForPayment_headline = "Wait for the buyer''s {0} payment",
+ bisqEasy_tradeState_info_seller_phase2a_waitForPayment_info = "Once the buyer has initiated the payment of {0}, you will get notified.",
+ bisqEasy_tradeState_info_seller_phase2b_headline = "Check if you have received {0}",
+ bisqEasy_tradeState_info_seller_phase2b_info = "Visit your bank account or payment provider app to confirm receipt of the buyer's payment.",
+ bisqEasy_tradeState_info_seller_phase2b_fiatReceivedButton = "Confirm receipt of {0}",
+ bisqEasy_tradeState_info_seller_phase2b_tradeLogMessage = "{0} has confirmed the receipt of {1}",
+ bisqEasy_tradeState_info_seller_phase3a_fiatPaymentReceivedCheckBox = "I confirmed to have received {0}",
+ bisqEasy_tradeState_info_seller_phase3a_sendBtc = "Send {0} to the buyer",
+ bisqEasy_tradeState_info_seller_phase3a_baseAmount = "Amount to send",
+ bisqEasy_tradeState_info_seller_phase3a_qrCodeDisplay_openWindow = "Open larger display",
+ bisqEasy_tradeState_info_seller_phase3a_qrCodeDisplay_window_title = "Scan QR Code for trade ''{0}''",
+ bisqEasy_tradeState_info_seller_phase3b_headline_MAIN_CHAIN = "Waiting for blockchain confirmation",
+ bisqEasy_tradeState_info_seller_phase3b_info_MAIN_CHAIN = "The Bitcoin payment require at least 1 blockchain confirmation to be considered complete.",
+ bisqEasy_tradeState_info_seller_phase3b_balance = "Bitcoin payment",
+ bisqEasy_tradeState_info_seller_phase3b_balance_prompt = "Waiting for blockchain data...",
+ bisqEasy_tradeState_info_seller_phase3a_bitcoinPayment_description_MAIN_CHAIN = "Bitcoin address",
+ bisqEasy_tradeState_info_seller_phase3a_paymentProof_description_MAIN_CHAIN = "Transaction ID",
+ bisqEasy_tradeState_info_seller_phase3a_paymentProof_prompt_MAIN_CHAIN = "Fill in the Bitcoin transaction ID",
+ bisqEasy_tradeState_info_seller_phase3a_tradeLogMessage_paymentProof_MAIN_CHAIN = "Transaction ID",
+ bisqEasy_tradeState_info_seller_phase3a_bitcoinPayment_description_LN = "Lightning invoice",
+ bisqEasy_tradeState_info_seller_phase3a_paymentProof_description_LN = "Preimage (optional)",
+ bisqEasy_tradeState_info_seller_phase3a_paymentProof_prompt_LN = "Fill in the preimage if available",
+ bisqEasy_tradeState_info_seller_phase3a_tradeLogMessage_paymentProof_LN = "Preimage",
+ bisqEasy_tradeState_info_seller_phase3a_btcSentButton = "I confirm to have sent {0}",
+ bisqEasy_tradeState_info_seller_phase3a_tradeLogMessage = "{0} initiated the Bitcoin transfer. {1}: ''{2}''",
+ bisqEasy_tradeState_info_seller_phase3a_tradeLogMessage_noProofProvided = "{0} initiated the Bitcoin transfer.",
+ bisqEasy_tradeState_info_seller_phase3a_paymentProof_warning_MAIN_CHAIN = "The Transaction ID that you have entered appears to be invalid.\n\n If you are sure the Transaction ID is valid you can ignore this warning and proceed.",
+ bisqEasy_tradeState_info_seller_phase3a_paymentProof_warning_LN = "The preimage that you have entered appears to be invalid.\n\n If you are sure the preimage is valid you can ignore this warning and proceed.",
+ bisqEasy_tradeState_info_seller_phase3a_paymentProof_warning_proceed = "Ignore warning",
+ bisqEasy_tradeState_info_seller_phase3b_headline_ln = "Wait for buyer confirming Bitcoin receipt",
+ bisqEasy_tradeState_info_seller_phase3b_info_ln = "Transfers via the Lightning Network are usually near-instant and reliable. However, in some cases, payments may fail and need to be repeated.\n\n To avoid any issues, please wait for the buyer to confirm receipt in the trade chat before closing the trade, as communication will no longer be possible afterward.",
+ bisqEasy_tradeState_info_seller_phase3b_confirmButton_ln = "Complete trade",
+ bisqEasy_tradeCompleted_title = "Trade was successfully completed",
+ bisqEasy_tradeCompleted_tableTitle = "Summary",
+ bisqEasy_tradeCompleted_header_tradeWith = "Trade with",
+ bisqEasy_tradeCompleted_header_myDirection_seller = "I sold",
+ bisqEasy_tradeCompleted_header_myDirection_buyer = "I bought",
+ bisqEasy_tradeCompleted_header_myDirection_btc = "btc",
+ bisqEasy_tradeCompleted_header_myOutcome_seller = "I received",
+ bisqEasy_tradeCompleted_header_myOutcome_buyer = "I paid",
+ bisqEasy_tradeCompleted_header_paymentMethod = "Payment method",
+ bisqEasy_tradeCompleted_header_tradeId = "Trade ID",
+ bisqEasy_tradeCompleted_body_date = "Date",
+ bisqEasy_tradeCompleted_body_tradePrice = "Trade price",
+ bisqEasy_tradeCompleted_body_tradeFee = "Trade fee",
+ bisqEasy_tradeCompleted_body_tradeFee_value = "No trade fees in Bisq Easy",
+ bisqEasy_tradeCompleted_body_copy_txId_tooltip = "Copy transaction ID to clipboard",
+ bisqEasy_tradeCompleted_body_copy_explorerLink_tooltip = "Copy block explorer transaction link",
+ bisqEasy_tradeCompleted_body_txId_tooltip = "Open block explorer transaction",
+ bisqEasy_mediation_request_confirm_headline = "Request mediation",
+ bisqEasy_mediation_request_confirm_msg = "If you have problems which you cannot resolve with your trade partner you can request assistance from a mediator.\n\n Please do not request mediation for general questions. In the support section there are chat rooms where you can get general advice and help.",
+ bisqEasy_mediation_request_confirm_openMediation = "Open mediation",
+ bisqEasy_mediation_request_feedback_headline = "Mediation requested",
+ bisqEasy_mediation_request_feedback_msg = "A request to the registered mediators has been sent.\n\n Please have patience until a mediator is online to join the trade chat and help to resolve any problems.",
+ bisqEasy_mediation_request_feedback_noMediatorAvailable = "There is no mediator available. Please use the support chat instead.",
+ bisqEasy_mediation_requester_tradeLogMessage = "{0} requested mediation",
+
+ bisqEasy_tradeState_info_buyer_phase1a_seller_wait_message= "Waiting for the seller to provide their account information. Meanwhile you can provide your settlement details.",
+ bisqEasy_tradeState_info_buyer_phase1a_wallet_prompt_prefix = "If you don’t have a wallet yet, refer to our",
+ bisqEasy_tradeState_info_buyer_phase2a_seller_wait_message = "Waiting for the seller to confirm receipt of payment",
+ bisqEasy_tradeState_info_buyer_phase3a_seller_wait_message = "Waiting for the seller’s Bitcoin settlement",
+ bisqEasy_tradeCompleted_body_you_have_receveid = "You have received",
+ bisqEasy_tradeCompleted_body_you_have_sold = "You have sold",
+)
diff --git a/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/i18n/BisqEasyTradeStateStringsFr.kt b/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/i18n/BisqEasyTradeStateStringsFr.kt
new file mode 100644
index 00000000..7c87cd09
--- /dev/null
+++ b/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/i18n/BisqEasyTradeStateStringsFr.kt
@@ -0,0 +1,149 @@
+package network.bisq.mobile.i18n
+
+val FrBisqEasyTradeStateStrings = BisqEasyTradeStateStrings(
+ bisqEasy_tradeState_requestMediation = "[FR] Request mediation",
+ bisqEasy_tradeState_reportToMediator = "[FR] Report to mediator",
+ bisqEasy_tradeState_acceptOrRejectSellersPrice_title = "[FR] Attention to Price Change!",
+ bisqEasy_tradeState_acceptOrRejectSellersPrice_description_buyersPrice = "[FR] Your offer price to buy Bitcoin was {0}.",
+ bisqEasy_tradeState_acceptOrRejectSellersPrice_description_sellersPrice = "[FR] However, the seller is offering you a different price: {0}.",
+ bisqEasy_tradeState_acceptOrRejectSellersPrice_description_question = "[FR] Do you want to accept this new price or do you want to reject/cancel* the trade?",
+ bisqEasy_tradeState_acceptOrRejectSellersPrice_description_disclaimer = "[FR] (*Note that in this specific case, cancelling the trade will NOT be considered a violation of the trading rules.)",
+ bisqEasy_tradeState_acceptOrRejectSellersPrice_button_accept = "[FR] Accept price",
+ bisqEasy_tradeState_header_peer = "[FR] Trade peer",
+ bisqEasy_tradeState_header_direction = "[FR] I want to",
+ bisqEasy_tradeState_header_send = "[FR] Amount to send",
+ bisqEasy_tradeState_header_pay = "[FR] Amount to pay",
+ bisqEasy_tradeState_header_receive = "[FR] Amount to receive",
+ bisqEasy_tradeState_header_tradeId = "[FR] Trade ID",
+ bisqEasy_tradeState_phase1 = "[FR] Account details",
+ bisqEasy_tradeState_phase2 = "[FR] Fiat payment",
+ bisqEasy_tradeState_phase3 = "[FR] Bitcoin transfer",
+ bisqEasy_tradeState_phase4 = "[FR] Trade completed",
+ bisqEasy_tradeState_info_phase3b_balance_help_explorerLookup = "[FR] Looking up transaction at block explorer ''{0}''",
+ bisqEasy_tradeState_info_phase3b_balance_help_notConfirmed = "[FR] Transaction seen in mempool but not confirmed yet",
+ bisqEasy_tradeState_info_phase3b_balance_help_confirmed = "[FR] Transaction is confirmed",
+ bisqEasy_tradeState_info_phase3b_txId_failed = "[FR] Transaction lookup to ''{0}'' failed with {1}: ''{2}''",
+ bisqEasy_tradeState_info_phase3b_button_skip = "[FR] Skip waiting for block confirmation",
+ bisqEasy_tradeState_info_phase3b_balance_invalid_noOutputsForAddress = "[FR] No matching outputs found in transaction",
+ bisqEasy_tradeState_info_phase3b_balance_invalid_multipleOutputsForAddress = "[FR] Multiple matching outputs found in transaction",
+ bisqEasy_tradeState_info_phase3b_balance_invalid_amountNotMatching = "[FR] Output amount from transaction is not matching trade amount",
+ bisqEasy_tradeState_info_phase3b_button_next = "[FR] Next",
+ bisqEasy_tradeState_info_phase3b_button_next_amountNotMatching = "[FR] The output amount for the address ''{0}'' in transaction ''{1}'' is ''{2}'', which does not match the trade amount of ''{3}''.\n\n Have you been able to resolve this issue with your trade peer?\n If not, you may consider requesting mediation to help settle the matter.",
+ bisqEasy_tradeState_info_phase3b_button_next_noOutputForAddress = "[FR] No output matching the address ''{0}'' in transaction ''{1}'' is found.\n\n Have you been able to resolve this issue with your trade peer?\n If not, you may consider requesting mediation to help settle the matter.",
+ bisqEasy_tradeState_info_phase3b_button_next_amountNotMatching_resolved = "[FR] I have resolved it",
+ bisqEasy_tradeState_info_phase3b_txId = "[FR] Transaction ID",
+ bisqEasy_tradeState_info_phase3b_txId_tooltip = "[FR] Open transaction in block explorer",
+ bisqEasy_tradeState_info_phase3b_lightning_preimage = "[FR] Preimage",
+ bisqEasy_tradeState_info_phase4_txId_tooltip = "[FR] Open transaction in block explorer",
+ bisqEasy_tradeState_info_phase4_exportTrade = "[FR] Export trade data",
+ bisqEasy_tradeState_info_phase4_leaveChannel = "[FR] Close trade",
+ bisqEasy_tradeState_bitcoinPaymentData_MAIN_CHAIN = "[FR] Bitcoin address",
+ bisqEasy_tradeState_bitcoinPaymentData_LN = "[FR] Lightning invoice",
+ bisqEasy_tradeState_paymentProof_MAIN_CHAIN = "[FR] Transaction ID",
+ bisqEasy_tradeState_paymentProof_LN = "[FR] Preimage",
+ bisqEasy_tradeState_info_buyer_phase1a_bitcoinPayment_headline_MAIN_CHAIN = "[FR] Fill in your Bitcoin address",
+ bisqEasy_tradeState_info_buyer_phase1a_bitcoinPayment_description_MAIN_CHAIN = "[FR] Bitcoin address",
+ bisqEasy_tradeState_info_buyer_phase1a_bitcoinPayment_prompt_MAIN_CHAIN = "[FR] Fill in your Bitcoin address",
+ bisqEasy_tradeState_info_buyer_phase1a_tradeLogMessage_MAIN_CHAIN = "[FR] {0} has sent the Bitcoin address ''{1}''",
+ bisqEasy_tradeState_info_buyer_phase1a_bitcoinPayment_headline_LN = "[FR] Fill in your Lightning invoice",
+ bisqEasy_tradeState_info_buyer_phase1a_bitcoinPayment_description_LN = "[FR] Lightning invoice",
+ bisqEasy_tradeState_info_buyer_phase1a_bitcoinPayment_prompt_LN = "[FR] Fill in your Lightning invoice",
+ bisqEasy_tradeState_info_buyer_phase1a_tradeLogMessage_LN = "[FR] {0} has sent the Lightning invoice ''{1}''",
+ bisqEasy_tradeState_info_buyer_phase1a_bitcoinPayment_walletHelp = "[FR] If you have not set up a wallet yet, you can find help at the wallet guide",
+ bisqEasy_tradeState_info_buyer_phase1a_walletHelpButton = "[FR] Open wallet guide",
+ bisqEasy_tradeState_info_buyer_phase1a_send = "[FR] Send to seller",
+ bisqEasy_tradeState_info_buyer_phase1a_scanQrCode_tooltip = "[FR] Scan QR code using your webcam",
+ bisqEasy_tradeState_info_buyer_phase1a_scanQrCode_webcamState_description = "[FR] Webcam connection state",
+ bisqEasy_tradeState_info_buyer_phase1a_scanQrCode_webcamState_connecting = "[FR] Connecting to webcam...",
+ bisqEasy_tradeState_info_buyer_phase1a_scanQrCode_webcamState_imageRecognized = "[FR] Webcam connected",
+ bisqEasy_tradeState_info_buyer_phase1a_scanQrCode_webcamState_failed = "[FR] Connecting to webcam failed",
+ bisqEasy_tradeState_info_buyer_phase1b_headline = "[FR] Wait for the seller's payment account data",
+ bisqEasy_tradeState_info_buyer_phase1b_info = "[FR] You can use the chat below for getting in touch with the seller.",
+ bisqEasy_tradeState_info_buyer_phase2a_headline = { fiat -> "[FR] Send $fiat to the seller''s payment account" },
+ bisqEasy_tradeState_info_buyer_phase2a_quoteAmount = "[FR] Amount to transfer",
+ bisqEasy_tradeState_info_buyer_phase2a_sellersAccount = "[FR] Payment account of seller",
+ bisqEasy_tradeState_info_buyer_phase2a_reasonForPaymentInfo = "[FR] Please leave the 'Reason for payment' field empty, in case you make a bank transfer",
+ bisqEasy_tradeState_info_buyer_phase2a_confirmFiatSent = { fiat -> "[FR] Confirm payment of $fiat" },
+ bisqEasy_tradeState_info_buyer_phase2a_tradeLogMessage = "[FR] {0} initiated the {1} payment",
+ bisqEasy_tradeState_info_buyer_phase2b_headline = "[FR] Wait for the seller to confirm receipt of payment",
+ bisqEasy_tradeState_info_buyer_phase2b_info = { fiat, settlement -> "[FR] Once the seller has received your payment of $fiat, they will start the Bitcoin transfer to your provided $settlement." },
+ bisqEasy_tradeState_info_buyer_phase3a_headline = "[FR] Wait for the seller's Bitcoin settlement",
+ bisqEasy_tradeState_info_buyer_phase3a_info = { method -> "[FR] The seller need to start the Bitcoin transfer to your provided $method."},
+ bisqEasy_tradeState_info_buyer_phase3b_headline_ln = "[FR] The seller has sent the Bitcoin via Lightning network",
+ bisqEasy_tradeState_info_buyer_phase3b_info_ln = "[FR] Transfers via the Lightning Network are typically near-instant. If you haven't received the payment within one minute, please contact the seller in the trade chat. Occasionally, payments may fail and need to be retried.",
+ bisqEasy_tradeState_info_buyer_phase3b_confirmButton_ln = "[FR] Confirm receipt",
+ bisqEasy_tradeState_info_buyer_phase3b_tradeLogMessage_ln = "[FR] {0} has confirmed to have received the Bitcoin payment",
+ bisqEasy_tradeState_info_buyer_phase3b_headline_MAIN_CHAIN = "[FR] The seller has started the Bitcoin payment",
+ bisqEasy_tradeState_info_buyer_phase3b_info_MAIN_CHAIN = "[FR] As soon the Bitcoin transaction is visible in the Bitcoin network you will see the payment. After 1 blockchain confirmation the payment can be considered as completed.",
+ bisqEasy_tradeState_info_buyer_phase3b_balance = "[FR] Received Bitcoin",
+ bisqEasy_tradeState_info_buyer_phase3b_balance_prompt = "[FR] Waiting for blockchain data...",
+ bisqEasy_tradeState_info_seller_phase1_headline = "[FR] Send your payment account data to the buyer",
+ bisqEasy_tradeState_info_seller_phase1_accountData = "[FR] My payment account data",
+ bisqEasy_tradeState_info_seller_phase1_accountData_prompt = "[FR] Fill in your payment account data. E.g. IBAN, BIC and account owner name",
+ bisqEasy_tradeState_info_seller_phase1_buttonText = "[FR] Send account data",
+ bisqEasy_tradeState_info_seller_phase1_note = "[FR] Note: You can use the chat below for getting in touch with the buyer before revealing your account data.",
+ bisqEasy_tradeState_info_seller_phase1_tradeLogMessage = "[FR] {0} has sent the payment account data:\n{1}",
+ bisqEasy_tradeState_info_seller_phase2a_waitForPayment_headline = "[FR] Wait for the buyer''s {0} payment",
+ bisqEasy_tradeState_info_seller_phase2a_waitForPayment_info = "[FR] Once the buyer has initiated the payment of {0}, you will get notified.",
+ bisqEasy_tradeState_info_seller_phase2b_headline = "[FR] Check if you have received {0}",
+ bisqEasy_tradeState_info_seller_phase2b_info = "[FR] Visit your bank account or payment provider app to confirm receipt of the buyer's payment.",
+ bisqEasy_tradeState_info_seller_phase2b_fiatReceivedButton = "[FR] Confirm receipt of {0}",
+ bisqEasy_tradeState_info_seller_phase2b_tradeLogMessage = "[FR] {0} has confirmed the receipt of {1}",
+ bisqEasy_tradeState_info_seller_phase3a_fiatPaymentReceivedCheckBox = "[FR] I confirmed to have received {0}",
+ bisqEasy_tradeState_info_seller_phase3a_sendBtc = "[FR] Send {0} to the buyer",
+ bisqEasy_tradeState_info_seller_phase3a_baseAmount = "[FR] Amount to send",
+ bisqEasy_tradeState_info_seller_phase3a_qrCodeDisplay_openWindow = "[FR] Open larger display",
+ bisqEasy_tradeState_info_seller_phase3a_qrCodeDisplay_window_title = "[FR] Scan QR Code for trade ''{0}''",
+ bisqEasy_tradeState_info_seller_phase3b_headline_MAIN_CHAIN = "[FR] Waiting for blockchain confirmation",
+ bisqEasy_tradeState_info_seller_phase3b_info_MAIN_CHAIN = "[FR] The Bitcoin payment require at least 1 blockchain confirmation to be considered complete.",
+ bisqEasy_tradeState_info_seller_phase3b_balance = "[FR] Bitcoin payment",
+ bisqEasy_tradeState_info_seller_phase3b_balance_prompt = "[FR] Waiting for blockchain data...",
+ bisqEasy_tradeState_info_seller_phase3a_bitcoinPayment_description_MAIN_CHAIN = "[FR] Bitcoin address",
+ bisqEasy_tradeState_info_seller_phase3a_paymentProof_description_MAIN_CHAIN = "[FR] Transaction ID",
+ bisqEasy_tradeState_info_seller_phase3a_paymentProof_prompt_MAIN_CHAIN = "[FR] Fill in the Bitcoin transaction ID",
+ bisqEasy_tradeState_info_seller_phase3a_tradeLogMessage_paymentProof_MAIN_CHAIN = "[FR] Transaction ID",
+ bisqEasy_tradeState_info_seller_phase3a_bitcoinPayment_description_LN = "[FR] Lightning invoice",
+ bisqEasy_tradeState_info_seller_phase3a_paymentProof_description_LN = "[FR] Preimage (optional)",
+ bisqEasy_tradeState_info_seller_phase3a_paymentProof_prompt_LN = "[FR] Fill in the preimage if available",
+ bisqEasy_tradeState_info_seller_phase3a_tradeLogMessage_paymentProof_LN = "[FR] Preimage",
+ bisqEasy_tradeState_info_seller_phase3a_btcSentButton = "[FR] I confirm to have sent {0}",
+ bisqEasy_tradeState_info_seller_phase3a_tradeLogMessage = "[FR] {0} initiated the Bitcoin transfer. {1}: ''{2}''",
+ bisqEasy_tradeState_info_seller_phase3a_tradeLogMessage_noProofProvided = "[FR] {0} initiated the Bitcoin transfer.",
+ bisqEasy_tradeState_info_seller_phase3a_paymentProof_warning_MAIN_CHAIN = "[FR] The Transaction ID that you have entered appears to be invalid.\n\n If you are sure the Transaction ID is valid you can ignore this warning and proceed.",
+ bisqEasy_tradeState_info_seller_phase3a_paymentProof_warning_LN = "[FR] The preimage that you have entered appears to be invalid.\n\n If you are sure the preimage is valid you can ignore this warning and proceed.",
+ bisqEasy_tradeState_info_seller_phase3a_paymentProof_warning_proceed = "[FR] Ignore warning",
+ bisqEasy_tradeState_info_seller_phase3b_headline_ln = "[FR] Wait for buyer confirming Bitcoin receipt",
+ bisqEasy_tradeState_info_seller_phase3b_info_ln = "[FR] Transfers via the Lightning Network are usually near-instant and reliable. However, in some cases, payments may fail and need to be repeated.\n\n To avoid any issues, please wait for the buyer to confirm receipt in the trade chat before closing the trade, as communication will no longer be possible afterward.",
+ bisqEasy_tradeState_info_seller_phase3b_confirmButton_ln = "[FR] Complete trade",
+ bisqEasy_tradeCompleted_title = "[FR] Trade was successfully completed",
+ bisqEasy_tradeCompleted_tableTitle = "[FR] Summary",
+ bisqEasy_tradeCompleted_header_tradeWith = "[FR] Trade with",
+ bisqEasy_tradeCompleted_header_myDirection_seller = "[FR] I sold",
+ bisqEasy_tradeCompleted_header_myDirection_buyer = "[FR] I bought",
+ bisqEasy_tradeCompleted_header_myDirection_btc = "[FR] btc",
+ bisqEasy_tradeCompleted_header_myOutcome_seller = "[FR] I received",
+ bisqEasy_tradeCompleted_header_myOutcome_buyer = "[FR] I paid",
+ bisqEasy_tradeCompleted_header_paymentMethod = "[FR] Payment method",
+ bisqEasy_tradeCompleted_header_tradeId = "[FR] Trade ID",
+ bisqEasy_tradeCompleted_body_date = "[FR] Date",
+ bisqEasy_tradeCompleted_body_tradePrice = "[FR] Trade price",
+ bisqEasy_tradeCompleted_body_tradeFee = "[FR] Trade fee",
+ bisqEasy_tradeCompleted_body_tradeFee_value = "[FR] No trade fees in Bisq Easy",
+ bisqEasy_tradeCompleted_body_copy_txId_tooltip = "[FR] Copy transaction ID to clipboard",
+ bisqEasy_tradeCompleted_body_copy_explorerLink_tooltip = "[FR] Copy block explorer transaction link",
+ bisqEasy_tradeCompleted_body_txId_tooltip = "[FR] Open block explorer transaction",
+ bisqEasy_mediation_request_confirm_headline = "[FR] Request mediation",
+ bisqEasy_mediation_request_confirm_msg = "[FR] If you have problems which you cannot resolve with your trade partner you can request assistance from a mediator.\n\n Please do not request mediation for general questions. In the support section there are chat rooms where you can get general advice and help.",
+ bisqEasy_mediation_request_confirm_openMediation = "[FR] Open mediation",
+ bisqEasy_mediation_request_feedback_headline = "[FR] Mediation requested",
+ bisqEasy_mediation_request_feedback_msg = "[FR] A request to the registered mediators has been sent.\n\n Please have patience until a mediator is online to join the trade chat and help to resolve any problems.",
+ bisqEasy_mediation_request_feedback_noMediatorAvailable = "[FR] There is no mediator available. Please use the support chat instead.",
+ bisqEasy_mediation_requester_tradeLogMessage = "[FR] {0} requested mediation",
+
+ bisqEasy_tradeState_info_buyer_phase1a_seller_wait_message= "[FR] Waiting for the seller to provide their account information. Meanwhile you can provide your settlement details.",
+ bisqEasy_tradeState_info_buyer_phase1a_wallet_prompt_prefix = "[FR] If you don’t have a wallet yet, refer to our",
+ bisqEasy_tradeState_info_buyer_phase2a_seller_wait_message= "[FR] Waiting for the seller to confirm receipt of payment",
+ bisqEasy_tradeState_info_buyer_phase3a_seller_wait_message = "[FR] Waiting for the seller’s Bitcoin settlement",
+ bisqEasy_tradeCompleted_body_you_have_receveid = "[FR] You have received",
+ bisqEasy_tradeCompleted_body_you_have_sold = "[FR] You have sold",
+)
diff --git a/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/i18n/BisqEasyTradeWizardStrings.kt b/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/i18n/BisqEasyTradeWizardStrings.kt
new file mode 100644
index 00000000..f9000db2
--- /dev/null
+++ b/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/i18n/BisqEasyTradeWizardStrings.kt
@@ -0,0 +1,174 @@
+package network.bisq.mobile.i18n
+
+// Can't have 500+ (or even less) keys in a single class. So splitting it up
+// Partial from BisqEasyStrings.kt
+data class BisqEasyTradeWizardStrings(
+ val bisqEasy_tradeWizard_progress_directionAndMarket: String,
+ val bisqEasy_tradeWizard_progress_price: String,
+ val bisqEasy_tradeWizard_progress_amount: String,
+ val bisqEasy_tradeWizard_progress_paymentMethods: String,
+ val bisqEasy_tradeWizard_progress_takeOffer: String,
+ val bisqEasy_tradeWizard_progress_review: String,
+ val bisqEasy_tradeWizard_directionAndMarket_headline: String,
+ val bisqEasy_tradeWizard_directionAndMarket_buy: String,
+ val bisqEasy_tradeWizard_directionAndMarket_sell: String,
+ val bisqEasy_tradeWizard_directionAndMarket_feedback_headline: String,
+ val bisqEasy_tradeWizard_directionAndMarket_feedback_subTitle1: String,
+ val bisqEasy_tradeWizard_directionAndMarket_feedback_gainReputation: String,
+ val bisqEasy_tradeWizard_directionAndMarket_feedback_subTitle2: String,
+ val bisqEasy_tradeWizard_directionAndMarket_feedback_tradeWithoutReputation: String,
+ val bisqEasy_tradeWizard_directionAndMarket_feedback_backToBuy: String,
+ val bisqEasy_tradeWizard_market_headline_buyer: String,
+ val bisqEasy_tradeWizard_market_headline_seller: String,
+ val bisqEasy_tradeWizard_market_subTitle: String,
+ val bisqEasy_tradeWizard_market_columns_name: String,
+ val bisqEasy_tradeWizard_market_columns_numOffers: String,
+ val bisqEasy_tradeWizard_market_columns_numPeers: String,
+ val bisqEasy_price_headline: String,
+ val bisqEasy_tradeWizard_price_subtitle: String,
+ val bisqEasy_price_percentage_title: String,
+ val bisqEasy_price_percentage_inputBoxText: String,
+ val bisqEasy_price_tradePrice_title: String,
+ val bisqEasy_price_tradePrice_inputBoxText: String,
+ val bisqEasy_price_feedback_sentence: String,
+ val bisqEasy_price_feedback_sentence_veryLow: String,
+ val bisqEasy_price_feedback_sentence_low: String,
+ val bisqEasy_price_feedback_sentence_some: String,
+ val bisqEasy_price_feedback_sentence_good: String,
+ val bisqEasy_price_feedback_sentence_veryGood: String,
+ val bisqEasy_price_feedback_learnWhySection_openButton: String,
+ val bisqEasy_price_feedback_learnWhySection_closeButton: String,
+ val bisqEasy_price_feedback_learnWhySection_title: String,
+ val bisqEasy_price_feedback_learnWhySection_description_intro: String,
+ val bisqEasy_price_feedback_learnWhySection_description_exposition: String,
+ val bisqEasy_price_warn_invalidPrice_outOfRange: String,
+ val bisqEasy_price_warn_invalidPrice_numberFormatException: String,
+ val bisqEasy_price_warn_invalidPrice_exception: String,
+ val bisqEasy_tradeWizard_amount_headline_buyer: String,
+ val bisqEasy_tradeWizard_amount_headline_seller: String,
+ val bisqEasy_tradeWizard_amount_description_minAmount: String,
+ val bisqEasy_tradeWizard_amount_description_maxAmount: String,
+ val bisqEasy_tradeWizard_amount_description_fixAmount: String,
+ val bisqEasy_tradeWizard_amount_addMinAmountOption: String,
+ val bisqEasy_tradeWizard_amount_removeMinAmountOption: String,
+ val bisqEasy_component_amount_minRangeValue: String,
+ val bisqEasy_component_amount_maxRangeValue: String,
+ val bisqEasy_component_amount_baseSide_tooltip_btcAmount_marketPrice: String,
+ val bisqEasy_component_amount_baseSide_tooltip_btcAmount_selectedPrice: String,
+ val bisqEasy_component_amount_baseSide_tooltip_buyerInfo: String,
+ val bisqEasy_component_amount_baseSide_tooltip_bestOfferPrice: String,
+ val bisqEasy_component_amount_baseSide_tooltip_buyer_btcAmount: String,
+ val bisqEasy_component_amount_baseSide_tooltip_seller_btcAmount: String,
+ val bisqEasy_component_amount_baseSide_tooltip_taker_offerPrice: String,
+ val bisqEasy_tradeWizard_amount_limitInfo_overlay_headline: String,
+ val bisqEasy_tradeWizard_amount_limitInfo_overlay_close: String,
+ val bisqEasy_tradeWizard_amount_seller_wizard_numMatchingOffers_info: String,
+ val bisqEasy_tradeWizard_amount_seller_wizard_limitInfo: String,
+ val bisqEasy_tradeWizard_amount_seller_wizard_limitInfo_overlay_info: String,
+ val bisqEasy_tradeWizard_amount_seller_limitInfo_scoreTooLow: String,
+ val bisqEasy_tradeWizard_amount_seller_limitInfo_overlay_info_scoreTooLow: String,
+ val bisqEasy_takeOffer_amount_seller_limitInfo_lowToleratedAmount: String,
+ val bisqEasy_takeOffer_amount_seller_limitInfo_scoreTooLow: String,
+ val bisqEasy_takeOffer_amount_seller_limitInfo_overlay_info_scoreTooLow: String,
+ val bisqEasy_tradeWizard_amount_seller_limitInfo_sufficientScore: String,
+ val bisqEasy_tradeWizard_amount_seller_limitInfo_overlay_info_sufficientScore: String,
+ val bisqEasy_tradeWizard_amount_seller_limitInfo_inSufficientScore: String,
+ val bisqEasy_tradeWizard_amount_seller_limitInfo_overlay_info_inSufficientScore: String,
+ val bisqEasy_tradeWizard_amount_seller_limitInfoAmount: String,
+ val bisqEasy_tradeWizard_amount_seller_limitInfo_link: String,
+ val bisqEasy_tradeWizard_amount_seller_limitInfo_overlay_linkToWikiText: String,
+ val bisqEasy_tradeWizard_amount_seller_limitInfo_noReputationNeededForMaxOrFixedAmount: String,
+ val bisqEasy_tradeWizard_amount_seller_limitInfo_noReputationNeededForMaxOrFixedAmount_overlay_info_scoreTooLow: String,
+ val bisqEasy_tradeWizard_amount_buyer_limitInfo_learnMore: String,
+ val bisqEasy_tradeWizard_amount_buyer_numSellers_0: String,
+ val bisqEasy_tradeWizard_amount_buyer_numSellers_1: String,
+ val bisqEasy_tradeWizard_amount_buyer_numSellers_many: String,
+ val bisqEasy_tradeWizard_amount_numOffers_0: String,
+ val bisqEasy_tradeWizard_amount_numOffers_1: String,
+ val bisqEasy_tradeWizard_amount_numOffers_many: String,
+ val bisqEasy_tradeWizard_amount_buyer_limitInfo: String,
+ val bisqEasy_tradeWizard_amount_buyer_limitInfo_overlay_info: String,
+ val bisqEasy_tradeWizard_amount_buyer_limitInfo_wizard_info_leadLine: String,
+ val bisqEasy_tradeWizard_amount_buyer_limitInfo_wizard_info: String,
+ val bisqEasy_tradeWizard_amount_buyer_limitInfo_wizard_overlay_info: String,
+ val bisqEasy_tradeWizard_amount_buyer_limitInfo_noReputationNeededForMaxOrFixedAmount: String,
+ val bisqEasy_tradeWizard_amount_buyer_limitInfo_noReputationNeededForMaxOrFixedAmount_riskInfo: String,
+ val bisqEasy_tradeWizard_amount_buyer_limitInfo_overlay_noReputationNeededForMaxOrFixedAmount_info: String,
+ val bisqEasy_tradeWizard_amount_buyer_limitInfo_overlay_linkToWikiText: String,
+ val bisqEasy_tradeWizard_amount_buyer_noReputationNeededForMinAmount_limitInfo_leadLine: String,
+ val bisqEasy_tradeWizard_amount_buyer_noReputationNeededForMinAmount_limitInfo: String,
+ val bisqEasy_tradeWizard_amount_buyer_noReputationNeededForMinAmount_limitInfo_overlay_info: String,
+ val bisqEasy_tradeWizard_paymentMethods_headline: String,
+ val bisqEasy_tradeWizard_paymentMethods_fiat_subTitle_buyer: String,
+ val bisqEasy_tradeWizard_paymentMethods_fiat_subTitle_seller: String,
+ val bisqEasy_tradeWizard_paymentMethods_bitcoin_subTitle_buyer: String,
+ val bisqEasy_tradeWizard_paymentMethods_bitcoin_subTitle_seller: String,
+ val bisqEasy_tradeWizard_paymentMethods_noneFound: String,
+ val bisqEasy_tradeWizard_paymentMethods_customMethod_prompt: String,
+ val bisqEasy_tradeWizard_paymentMethods_warn_maxMethodsReached: String,
+ val bisqEasy_tradeWizard_paymentMethods_warn_tooLong: String,
+ val bisqEasy_tradeWizard_paymentMethods_warn_customPaymentMethodAlreadyExists: String,
+ val bisqEasy_tradeWizard_paymentMethods_warn_customNameMatchesPredefinedMethod: String,
+ val bisqEasy_tradeWizard_paymentMethods_warn_noFiatPaymentMethodSelected: String,
+ val bisqEasy_tradeWizard_paymentMethods_warn_noBtcSettlementMethodSelected: String,
+ val bisqEasy_tradeWizard_selectOffer_headline_buyer: String,
+ val bisqEasy_tradeWizard_selectOffer_headline_seller: String,
+ val bisqEasy_tradeWizard_selectOffer_subHeadline: String,
+ val bisqEasy_tradeWizard_selectOffer_noMatchingOffers_headline: String,
+ val bisqEasy_tradeWizard_selectOffer_noMatchingOffers_subHeadline: String,
+ val bisqEasy_tradeWizard_selectOffer_noMatchingOffers_goBack: String,
+ val bisqEasy_tradeWizard_selectOffer_noMatchingOffers_goBack_info: String,
+ val bisqEasy_tradeWizard_selectOffer_noMatchingOffers_browseOfferbook: String,
+ val bisqEasy_tradeWizard_selectOffer_noMatchingOffers_browseOfferbook_info: String,
+ val bisqEasy_tradeWizard_review_headline_maker: String,
+ val bisqEasy_tradeWizard_review_headline_taker: String,
+ val bisqEasy_tradeWizard_review_detailsHeadline_taker: String,
+ val bisqEasy_tradeWizard_review_detailsHeadline_maker: String,
+ val bisqEasy_tradeWizard_review_feeDescription: String,
+ val bisqEasy_tradeWizard_review_noTradeFees: String,
+ val bisqEasy_tradeWizard_review_sellerPaysMinerFeeLong: String,
+ val bisqEasy_tradeWizard_review_sellerPaysMinerFee: String,
+ val bisqEasy_tradeWizard_review_noTradeFeesLong: String,
+ val bisqEasy_tradeWizard_review_toPay: String,
+ val bisqEasy_tradeWizard_review_toSend: String,
+ val bisqEasy_tradeWizard_review_toReceive: String,
+ val bisqEasy_tradeWizard_review_direction: String,
+ val bisqEasy_tradeWizard_review_paymentMethodDescription_btc: String,
+ val bisqEasy_tradeWizard_review_paymentMethodDescriptions_btc_maker: String,
+ val bisqEasy_tradeWizard_review_paymentMethodDescriptions_btc_taker: String,
+ val bisqEasy_tradeWizard_review_paymentMethodDescription_fiat: String,
+ val bisqEasy_tradeWizard_review_paymentMethodDescriptions_fiat_maker: String,
+ val bisqEasy_tradeWizard_review_paymentMethodDescriptions_fiat_taker: String,
+ val bisqEasy_tradeWizard_review_price: String,
+ val bisqEasy_tradeWizard_review_priceDescription_taker: String,
+ val bisqEasy_tradeWizard_review_priceDescription_maker: String,
+ val bisqEasy_tradeWizard_review_priceDetails_fix: String,
+ val bisqEasy_tradeWizard_review_priceDetails_fix_atMarket: String,
+ val bisqEasy_tradeWizard_review_priceDetails_float: (String, String, String) -> String,
+ val bisqEasy_tradeWizard_review_priceDetails: String,
+ val bisqEasy_tradeWizard_review_nextButton_createOffer: String,
+ val bisqEasy_tradeWizard_review_nextButton_takeOffer: String,
+ val bisqEasy_tradeWizard_review_createOfferSuccess_headline: String,
+ val bisqEasy_tradeWizard_review_createOfferSuccess_subTitle: String,
+ val bisqEasy_tradeWizard_review_createOfferSuccessButton: String,
+ val bisqEasy_tradeWizard_review_takeOfferSuccess_headline: String,
+ val bisqEasy_tradeWizard_review_takeOfferSuccess_subTitle: String,
+ val bisqEasy_tradeWizard_review_takeOfferSuccessButton: String,
+ val bisqEasy_tradeWizard_review_table_baseAmount_buyer: String,
+ val bisqEasy_tradeWizard_review_table_baseAmount_seller: String,
+ val bisqEasy_tradeWizard_review_table_price: String,
+ val bisqEasy_tradeWizard_review_table_reputation: String,
+ val bisqEasy_tradeWizard_review_chatMessage_fixPrice: String,
+ val bisqEasy_tradeWizard_review_chatMessage_floatPrice_above: String,
+ val bisqEasy_tradeWizard_review_chatMessage_floatPrice_plus: String,
+ val bisqEasy_tradeWizard_review_chatMessage_floatPrice_below: String,
+ val bisqEasy_tradeWizard_review_chatMessage_floatPrice_minus: String,
+ val bisqEasy_tradeWizard_review_chatMessage_marketPrice: String,
+ val bisqEasy_tradeWizard_review_chatMessage_price: String,
+ val bisqEasy_tradeWizard_review_chatMessage_peerMessage_sell: String,
+ val bisqEasy_tradeWizard_review_chatMessage_peerMessage_buy: String,
+ val bisqEasy_tradeWizard_review_chatMessage_offerDetails: String,
+ val bisqEasy_tradeWizard_review_chatMessage_peerMessageTitle_sell: String,
+ val bisqEasy_tradeWizard_review_chatMessage_peerMessageTitle_buy: String,
+ val bisqEasy_tradeWizard_review_chatMessage_myMessageTitle: String,
+)
diff --git a/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/i18n/BisqEasyTradeWizardStringsEn.kt b/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/i18n/BisqEasyTradeWizardStringsEn.kt
new file mode 100644
index 00000000..41b0f3ac
--- /dev/null
+++ b/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/i18n/BisqEasyTradeWizardStringsEn.kt
@@ -0,0 +1,175 @@
+package network.bisq.mobile.i18n
+
+import cafe.adriel.lyricist.LyricistStrings
+
+// @LyricistStrings(languageTag = Locales.EN, default = true)
+val EnBisqEasyTradeWizardStrings = BisqEasyTradeWizardStrings(
+ bisqEasy_tradeWizard_progress_directionAndMarket = "Offer type",
+ bisqEasy_tradeWizard_progress_price = "Price",
+ bisqEasy_tradeWizard_progress_amount = "Amount",
+ bisqEasy_tradeWizard_progress_paymentMethods = "Payment methods",
+ bisqEasy_tradeWizard_progress_takeOffer = "Select offer",
+ bisqEasy_tradeWizard_progress_review = "Review",
+ bisqEasy_tradeWizard_directionAndMarket_headline = "Do you want to buy or sell Bitcoin with",
+ bisqEasy_tradeWizard_directionAndMarket_buy = "Buy Bitcoin",
+ bisqEasy_tradeWizard_directionAndMarket_sell = "Sell Bitcoin",
+ bisqEasy_tradeWizard_directionAndMarket_feedback_headline = "How to build up reputation?",
+ bisqEasy_tradeWizard_directionAndMarket_feedback_subTitle1 = "You haven't established any reputation yet. For Bitcoin sellers, building reputation is crucial because buyers are required to send fiat currency first in the trade process, relying on the seller's integrity.\n\n This reputation-building process is better suited for experienced Bisq users, and you can find detailed information about it in the 'Reputation' section.",
+ bisqEasy_tradeWizard_directionAndMarket_feedback_gainReputation = "Learn how to build up reputation",
+ bisqEasy_tradeWizard_directionAndMarket_feedback_subTitle2 = "While it''s possible for sellers to trade without (or insufficient) reputation for relatively low amounts up to {0}, the likelihood of finding a trading partner is considerably reduced. This is because buyers tend to avoid engaging with sellers who lack reputation due to security risks.",
+ bisqEasy_tradeWizard_directionAndMarket_feedback_tradeWithoutReputation = "Continue without reputation",
+ bisqEasy_tradeWizard_directionAndMarket_feedback_backToBuy = "Back",
+ bisqEasy_tradeWizard_market_headline_buyer = "In which currency do you want to pay?",
+ bisqEasy_tradeWizard_market_headline_seller = "In which currency do you want to get paid?",
+ bisqEasy_tradeWizard_market_subTitle = "Choose your trade currency",
+ bisqEasy_tradeWizard_market_columns_name = "Fiat currency",
+ bisqEasy_tradeWizard_market_columns_numOffers = "Num. offers",
+ bisqEasy_tradeWizard_market_columns_numPeers = "Online peers",
+ bisqEasy_price_headline = "What is your trade price?",
+ bisqEasy_tradeWizard_price_subtitle = "This can be defined as a percentage price which floats with the market price or fixed price.",
+ bisqEasy_price_percentage_title = "Percentage price",
+ bisqEasy_price_percentage_inputBoxText = "Market price percentage between -10% and 50%",
+ bisqEasy_price_tradePrice_title = "Fixed price",
+ bisqEasy_price_tradePrice_inputBoxText = "Trade price in {0}",
+ bisqEasy_price_feedback_sentence = "Your offer has {0} chances to be taken at this price.",
+ bisqEasy_price_feedback_sentence_veryLow = "very low",
+ bisqEasy_price_feedback_sentence_low = "low",
+ bisqEasy_price_feedback_sentence_some = "some",
+ bisqEasy_price_feedback_sentence_good = "good",
+ bisqEasy_price_feedback_sentence_veryGood = "very good",
+ bisqEasy_price_feedback_learnWhySection_openButton = "Why?",
+ bisqEasy_price_feedback_learnWhySection_closeButton = "Back to Trade Price",
+ bisqEasy_price_feedback_learnWhySection_title = "Why should I pay a higher price to the seller?",
+ bisqEasy_price_feedback_learnWhySection_description_intro = "The reason for that is that the seller has to cover extra expenses and compensate for the seller's service, specifically:",
+ bisqEasy_price_feedback_learnWhySection_description_exposition = " - Build up reputation which can be costly - The seller has to pay for miner fees - The seller is the helpful guide in the trade process thus investing more time",
+ bisqEasy_price_warn_invalidPrice_outOfRange = "The price you entered is outside the permitted range of -10% to 50%.",
+ bisqEasy_price_warn_invalidPrice_numberFormatException = "The price you entered is not a valid number.",
+ bisqEasy_price_warn_invalidPrice_exception = "The price you entered is invalid.\n\n Error message: {0}",
+ bisqEasy_tradeWizard_amount_headline_buyer = "How much do you want to spend?",
+ bisqEasy_tradeWizard_amount_headline_seller = "How much do you want to receive?",
+ bisqEasy_tradeWizard_amount_description_minAmount = "Set the minimum value for the amount range",
+ bisqEasy_tradeWizard_amount_description_maxAmount = "Set the maximum value for the amount range",
+ bisqEasy_tradeWizard_amount_description_fixAmount = "Set the amount you want to trade",
+ bisqEasy_tradeWizard_amount_addMinAmountOption = "Add min/max range for amount",
+ bisqEasy_tradeWizard_amount_removeMinAmountOption = "Use fix value amount",
+ bisqEasy_component_amount_minRangeValue = "Min {0}",
+ bisqEasy_component_amount_maxRangeValue = "Max {0}",
+ bisqEasy_component_amount_baseSide_tooltip_btcAmount_marketPrice = "This is the Bitcoin amount with current market price.",
+ bisqEasy_component_amount_baseSide_tooltip_btcAmount_selectedPrice = "This is the Bitcoin amount with your selected price.",
+ bisqEasy_component_amount_baseSide_tooltip_buyerInfo = "Sellers may ask for a higher price as they have costs for acquiring reputation.\n 5-15% price premium is common.",
+ bisqEasy_component_amount_baseSide_tooltip_bestOfferPrice = "This is the Bitcoin amount with the best price\n from matching offers: {0}",
+ bisqEasy_component_amount_baseSide_tooltip_buyer_btcAmount = "This is the Bitcoin amount to receive",
+ bisqEasy_component_amount_baseSide_tooltip_seller_btcAmount = "This is the Bitcoin amount to spend",
+ bisqEasy_component_amount_baseSide_tooltip_taker_offerPrice = "with the offer price: {0}",
+ bisqEasy_tradeWizard_amount_limitInfo_overlay_headline = "Reputation-based trade amount limits",
+ bisqEasy_tradeWizard_amount_limitInfo_overlay_close = "Close overlay",
+ bisqEasy_tradeWizard_amount_seller_wizard_numMatchingOffers_info = "There {0} matching the chosen trade amount.",
+ bisqEasy_tradeWizard_amount_seller_wizard_limitInfo = "With your reputation score of {0}, you can trade up to",
+ bisqEasy_tradeWizard_amount_seller_wizard_limitInfo_overlay_info = "With a reputation score of {0}, you can trade up to {1}.\n\n You can find information on how to increase your reputation at ''Reputation/Build Reputation''.",
+ bisqEasy_tradeWizard_amount_seller_limitInfo_scoreTooLow = "With your reputation score of {0}, your trade amount should not exceed",
+ bisqEasy_tradeWizard_amount_seller_limitInfo_overlay_info_scoreTooLow = "Your reputation score of {0} doesn''t offer sufficient security for buyers.\n\n Buyers who consider to take your offer will receive a warning about potential risks when taking your offer.\n\n You can find information on how to increase your reputation at ''Reputation/Build Reputation''.",
+ bisqEasy_takeOffer_amount_seller_limitInfo_lowToleratedAmount = "As the trade amount is below {0}, reputation requirements are relaxed.",
+ bisqEasy_takeOffer_amount_seller_limitInfo_scoreTooLow = "As your reputation score is only {0} your trade amount is restricted to",
+ bisqEasy_takeOffer_amount_seller_limitInfo_overlay_info_scoreTooLow = "For amounts up to {0} the reputation requirements are relaxed.\n\n Your reputation score of {1} doesn''t offer sufficient security for the buyer. However, given the low trade amount the buyer accepted to take the risk.\n\n You can find information on how to increase your reputation at ''Reputation/Build Reputation''.",
+ bisqEasy_tradeWizard_amount_seller_limitInfo_sufficientScore = "Your reputation score of {0} provides security for offers up to",
+ bisqEasy_tradeWizard_amount_seller_limitInfo_overlay_info_sufficientScore = "With a reputation score of {0}, you provide security for trades up to {1}.",
+ bisqEasy_tradeWizard_amount_seller_limitInfo_inSufficientScore = "The security provided by your reputation score of {0} is insufficient for offers over",
+ bisqEasy_tradeWizard_amount_seller_limitInfo_overlay_info_inSufficientScore = "With a reputation score of {0}, the security you provide is insufficient for trades over {1}.\n\n You can still create such offers, but buyers will be warned about potential risks when attempting to take your offer.\n\n You can find information on how to increase your reputation at ''Reputation/Build Reputation''.",
+ bisqEasy_tradeWizard_amount_seller_limitInfoAmount = "{0}.",
+ bisqEasy_tradeWizard_amount_seller_limitInfo_link = "Learn more",
+ bisqEasy_tradeWizard_amount_seller_limitInfo_overlay_linkToWikiText = "For more details about the reputation system, visit the Bisq Wiki at:",
+ bisqEasy_tradeWizard_amount_seller_limitInfo_noReputationNeededForMaxOrFixedAmount = "For amounts up to {0} no reputation is required.",
+ bisqEasy_tradeWizard_amount_seller_limitInfo_noReputationNeededForMaxOrFixedAmount_overlay_info_scoreTooLow = "For amounts up to {0} the reputation requirements are relaxed.\n\n Your reputation score of {1} doesn''t offer sufficient security for buyers. However, given the low amount involved, buyers might still consider accepting the offer once they are made aware of the associated risks.\n\n You can find information on how to increase your reputation at ''Reputation/Build Reputation''.",
+ bisqEasy_tradeWizard_amount_buyer_limitInfo_learnMore = "Learn more",
+ bisqEasy_tradeWizard_amount_buyer_numSellers_0 = "is no seller",
+ bisqEasy_tradeWizard_amount_buyer_numSellers_1 = "is one seller",
+ bisqEasy_tradeWizard_amount_buyer_numSellers_many = "are {0} sellers",
+ bisqEasy_tradeWizard_amount_numOffers_0 = "is no offer",
+ bisqEasy_tradeWizard_amount_numOffers_1 = "is one offer",
+ bisqEasy_tradeWizard_amount_numOffers_many = "are {0} offers",
+ bisqEasy_tradeWizard_amount_buyer_limitInfo = "There {0} in the network with sufficient reputation to take an offer of {1}.",
+ bisqEasy_tradeWizard_amount_buyer_limitInfo_overlay_info = "A seller who wants to take your offer of {0}, must have a reputation score of at least {1}.\n By reducing the maximum trade amount, you make your offer accessible to more sellers.",
+ bisqEasy_tradeWizard_amount_buyer_limitInfo_wizard_info_leadLine = "There {0} matching the chosen trade amount.",
+ bisqEasy_tradeWizard_amount_buyer_limitInfo_wizard_info = "For offers up to {0}, reputation requirements are relaxed.",
+ bisqEasy_tradeWizard_amount_buyer_limitInfo_wizard_overlay_info = "Given the low min. amount of {0}, the reputation requirements are relaxed.\n For amounts up to {1}, sellers do not need reputation.\n\n At the ''Select Offer'' screen it is recommended to choose sellers with higher reputation.",
+ bisqEasy_tradeWizard_amount_buyer_limitInfo_noReputationNeededForMaxOrFixedAmount = "Sellers with no reputation can take offers up to {0}.",
+ bisqEasy_tradeWizard_amount_buyer_limitInfo_noReputationNeededForMaxOrFixedAmount_riskInfo = "Be sure you fully understand the risks involved.",
+ bisqEasy_tradeWizard_amount_buyer_limitInfo_overlay_noReputationNeededForMaxOrFixedAmount_info = "Given the low amount of {0}, reputation requirements are relaxed.\n For amounts up to {1}, sellers with insufficient or no reputation can take the offer.\n\n Be sure to fully understand the risks when trading with a seller without or insufficient reputation. If you do not want to be exposed to that risk, choose an amount above {2}.",
+ bisqEasy_tradeWizard_amount_buyer_limitInfo_overlay_linkToWikiText = "To learn more about the reputation system, visit:",
+ bisqEasy_tradeWizard_amount_buyer_noReputationNeededForMinAmount_limitInfo_leadLine = "Since your min. amount is below {0}, sellers without reputation can take your offer.",
+ bisqEasy_tradeWizard_amount_buyer_noReputationNeededForMinAmount_limitInfo = "For the max. amount of {0} there {1} with enough reputation to take your offer.",
+ bisqEasy_tradeWizard_amount_buyer_noReputationNeededForMinAmount_limitInfo_overlay_info = "Given the low trade amount of {0}, the reputation requirements are relaxed.\n For amounts up to {1}, sellers with insufficient or no reputation can take your offer.\n\n Sellers who wants to take your offer with the max. amount of {2}, must have a reputation score of at least {3}.\n By reducing the maximum trade amount, you make your offer accessible to more sellers.",
+ bisqEasy_tradeWizard_paymentMethods_headline = "Which payment and settlement methods do you want to use?",
+ bisqEasy_tradeWizard_paymentMethods_fiat_subTitle_buyer = "Choose the payment methods to transfer {0}",
+ bisqEasy_tradeWizard_paymentMethods_fiat_subTitle_seller = "Choose the payment methods to receive {0}",
+ bisqEasy_tradeWizard_paymentMethods_bitcoin_subTitle_buyer = "Choose the settlement methods to receive Bitcoin",
+ bisqEasy_tradeWizard_paymentMethods_bitcoin_subTitle_seller = "Choose the settlement methods to send Bitcoin",
+ bisqEasy_tradeWizard_paymentMethods_noneFound = "For the selected market there are no default payment methods provided.\n Please add in the text field below the custom payment you want to use.",
+ bisqEasy_tradeWizard_paymentMethods_customMethod_prompt = "Custom payment",
+ bisqEasy_tradeWizard_paymentMethods_warn_maxMethodsReached = "You cannot add more than 4 payment methods.",
+ bisqEasy_tradeWizard_paymentMethods_warn_tooLong = "A custom payment method name must not be longer than 20 characters.",
+ bisqEasy_tradeWizard_paymentMethods_warn_customPaymentMethodAlreadyExists = "A custom payment method with name {0} already exists.",
+ bisqEasy_tradeWizard_paymentMethods_warn_customNameMatchesPredefinedMethod = "The name of your custom payment method must not be the same as one of the predefined.",
+ bisqEasy_tradeWizard_paymentMethods_warn_noFiatPaymentMethodSelected = "Please choose at least one fiat payment method.",
+ bisqEasy_tradeWizard_paymentMethods_warn_noBtcSettlementMethodSelected = "Please choose at least one Bitcoin settlement method.",
+ bisqEasy_tradeWizard_selectOffer_headline_buyer = "Buy Bitcoin for {0}",
+ bisqEasy_tradeWizard_selectOffer_headline_seller = "Sell Bitcoin for {0}",
+ bisqEasy_tradeWizard_selectOffer_subHeadline = "It is recommended to trade with users with high reputation.",
+ bisqEasy_tradeWizard_selectOffer_noMatchingOffers_headline = "No matching offers found",
+ bisqEasy_tradeWizard_selectOffer_noMatchingOffers_subHeadline = "There are no offers available for your selection criteria.",
+ bisqEasy_tradeWizard_selectOffer_noMatchingOffers_goBack = "Change selection",
+ bisqEasy_tradeWizard_selectOffer_noMatchingOffers_goBack_info = "Go back to the previous screens and change the selection",
+ bisqEasy_tradeWizard_selectOffer_noMatchingOffers_browseOfferbook = "Browse offerbook",
+ bisqEasy_tradeWizard_selectOffer_noMatchingOffers_browseOfferbook_info = "Close the trade wizard and browse the offer book",
+ bisqEasy_tradeWizard_review_headline_maker = "Review offer",
+ bisqEasy_tradeWizard_review_headline_taker = "Review trade",
+ bisqEasy_tradeWizard_review_detailsHeadline_taker = "Trade details",
+ bisqEasy_tradeWizard_review_detailsHeadline_maker = "Offer details",
+ bisqEasy_tradeWizard_review_feeDescription = "Fees",
+ bisqEasy_tradeWizard_review_noTradeFees = "No trade fees in Bisq Easy",
+ bisqEasy_tradeWizard_review_sellerPaysMinerFeeLong = "The seller pays the mining fee",
+ bisqEasy_tradeWizard_review_sellerPaysMinerFee = "Seller pays the mining fee",
+ bisqEasy_tradeWizard_review_noTradeFeesLong = "There are no trade fees in Bisq Easy",
+ bisqEasy_tradeWizard_review_toPay = "Amount to pay",
+ bisqEasy_tradeWizard_review_toSend = "Amount to send",
+ bisqEasy_tradeWizard_review_toReceive = "Amount to receive",
+ bisqEasy_tradeWizard_review_direction = "{0} Bitcoin",
+ bisqEasy_tradeWizard_review_paymentMethodDescription_btc = "Bitcoin settlement",
+ bisqEasy_tradeWizard_review_paymentMethodDescriptions_btc_maker = "Bitcoin settlement methods",
+ bisqEasy_tradeWizard_review_paymentMethodDescriptions_btc_taker = "Select Bitcoin settlement method",
+ bisqEasy_tradeWizard_review_paymentMethodDescription_fiat = "Fiat payment",
+ bisqEasy_tradeWizard_review_paymentMethodDescriptions_fiat_maker = "Fiat payment methods",
+ bisqEasy_tradeWizard_review_paymentMethodDescriptions_fiat_taker = "Select fiat payment method",
+ bisqEasy_tradeWizard_review_price = "{0} <{1} style=trade-wizard-review-code>",
+ bisqEasy_tradeWizard_review_priceDescription_taker = "Trade price",
+ bisqEasy_tradeWizard_review_priceDescription_maker = "Offer price",
+ bisqEasy_tradeWizard_review_priceDetails_fix = "Fix price. {0} {1} market price of {2}",
+ bisqEasy_tradeWizard_review_priceDetails_fix_atMarket = "Fix price. Same as market price of {0}",
+ bisqEasy_tradeWizard_review_priceDetails_float = { percentage, direction, rate -> "Float price. $percentage $direction market price of $rate" },
+ bisqEasy_tradeWizard_review_priceDetails = "Floats with the market price",
+ bisqEasy_tradeWizard_review_nextButton_createOffer = "Create offer",
+ bisqEasy_tradeWizard_review_nextButton_takeOffer = "Confirm trade",
+ bisqEasy_tradeWizard_review_createOfferSuccess_headline = "Offer successfully published",
+ bisqEasy_tradeWizard_review_createOfferSuccess_subTitle = "Your offer is now listed in the offerbook. When a Bisq user takes your offer, you will find a new trade in the 'Open Trades' section.\n\n Be sure to regularly check the Bisq application for new messages from a taker.",
+ bisqEasy_tradeWizard_review_createOfferSuccessButton = "Show my offer in 'Offerbook'",
+ bisqEasy_tradeWizard_review_takeOfferSuccess_headline = "You have successfully taken the offer",
+ bisqEasy_tradeWizard_review_takeOfferSuccess_subTitle = "Please get in touch with the trade peer at 'Open Trades'.\n You will find further information for the next steps over there.\n\n Be sure to regularly check the Bisq application for new messages from your trade peer.",
+ bisqEasy_tradeWizard_review_takeOfferSuccessButton = "Show trade in 'Open Trades'",
+ bisqEasy_tradeWizard_review_table_baseAmount_buyer = "You receive",
+ bisqEasy_tradeWizard_review_table_baseAmount_seller = "You spend",
+ bisqEasy_tradeWizard_review_table_price = "Price in {0}",
+ bisqEasy_tradeWizard_review_table_reputation = "Reputation",
+ bisqEasy_tradeWizard_review_chatMessage_fixPrice = "{0}",
+ bisqEasy_tradeWizard_review_chatMessage_floatPrice_above = "{0} above market price",
+ bisqEasy_tradeWizard_review_chatMessage_floatPrice_plus = "+{0}",
+ bisqEasy_tradeWizard_review_chatMessage_floatPrice_below = "{0} below market price",
+ bisqEasy_tradeWizard_review_chatMessage_floatPrice_minus = "-{0}",
+ bisqEasy_tradeWizard_review_chatMessage_marketPrice = "Market price",
+ bisqEasy_tradeWizard_review_chatMessage_price = "Price:",
+ bisqEasy_tradeWizard_review_chatMessage_peerMessage_sell = "Sell Bitcoin to {0}\n Amount: {1}\n Bitcoin settlement method(s): {2}\n Fiat payment method(s): {3}\n {4}",
+ bisqEasy_tradeWizard_review_chatMessage_peerMessage_buy = "Buy Bitcoin from {0}\n Amount: {1}\n Bitcoin settlement method(s): {2}\n Fiat payment method(s): {3}\n {4}",
+ bisqEasy_tradeWizard_review_chatMessage_offerDetails = "Amount: {0}\n Bitcoin settlement method(s): {1}\n Fiat payment method(s): {2}\n {3}",
+ bisqEasy_tradeWizard_review_chatMessage_peerMessageTitle_sell = "Sell Bitcoin to",
+ bisqEasy_tradeWizard_review_chatMessage_peerMessageTitle_buy = "Buy Bitcoin from",
+ bisqEasy_tradeWizard_review_chatMessage_myMessageTitle = "My Offer to {0} Bitcoin",
+)
diff --git a/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/i18n/BisqEasyTradeWizardStringsFr.kt b/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/i18n/BisqEasyTradeWizardStringsFr.kt
new file mode 100644
index 00000000..c3abf74f
--- /dev/null
+++ b/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/i18n/BisqEasyTradeWizardStringsFr.kt
@@ -0,0 +1,172 @@
+package network.bisq.mobile.i18n
+
+val FrBisqEasyTradeWizardStrings = BisqEasyTradeWizardStrings(
+ bisqEasy_tradeWizard_progress_directionAndMarket = "[FR] Offer type",
+ bisqEasy_tradeWizard_progress_price = "[FR] Price",
+ bisqEasy_tradeWizard_progress_amount = "[FR] Amount",
+ bisqEasy_tradeWizard_progress_paymentMethods = "[FR] Payment methods",
+ bisqEasy_tradeWizard_progress_takeOffer = "[FR] Select offer",
+ bisqEasy_tradeWizard_progress_review = "[FR] Review",
+ bisqEasy_tradeWizard_directionAndMarket_headline = "[FR] Do you want to buy or sell Bitcoin with",
+ bisqEasy_tradeWizard_directionAndMarket_buy = "[FR] Buy Bitcoin",
+ bisqEasy_tradeWizard_directionAndMarket_sell = "[FR] Sell Bitcoin",
+ bisqEasy_tradeWizard_directionAndMarket_feedback_headline = "[FR] How to build up reputation?",
+ bisqEasy_tradeWizard_directionAndMarket_feedback_subTitle1 = "[FR] You haven't established any reputation yet. For Bitcoin sellers, building reputation is crucial because buyers are required to send fiat currency first in the trade process, relying on the seller's integrity.\n\n This reputation-building process is better suited for experienced Bisq users, and you can find detailed information about it in the 'Reputation' section.",
+ bisqEasy_tradeWizard_directionAndMarket_feedback_gainReputation = "[FR] Learn how to build up reputation",
+ bisqEasy_tradeWizard_directionAndMarket_feedback_subTitle2 = "[FR] While it''s possible for sellers to trade without (or insufficient) reputation for relatively low amounts up to {0}, the likelihood of finding a trading partner is considerably reduced. This is because buyers tend to avoid engaging with sellers who lack reputation due to security risks.",
+ bisqEasy_tradeWizard_directionAndMarket_feedback_tradeWithoutReputation = "[FR] Continue without reputation",
+ bisqEasy_tradeWizard_directionAndMarket_feedback_backToBuy = "[FR] Back",
+ bisqEasy_tradeWizard_market_headline_buyer = "[FR] In which currency do you want to pay?",
+ bisqEasy_tradeWizard_market_headline_seller = "[FR] In which currency do you want to get paid?",
+ bisqEasy_tradeWizard_market_subTitle = "[FR] Choose your trade currency",
+ bisqEasy_tradeWizard_market_columns_name = "[FR] Fiat currency",
+ bisqEasy_tradeWizard_market_columns_numOffers = "[FR] Num. offers",
+ bisqEasy_tradeWizard_market_columns_numPeers = "[FR] Online peers",
+ bisqEasy_price_headline = "[FR] What is your trade price?",
+ bisqEasy_tradeWizard_price_subtitle = "[FR] This can be defined as a percentage price which floats with the market price or fixed price.",
+ bisqEasy_price_percentage_title = "[FR] Percentage price",
+ bisqEasy_price_percentage_inputBoxText = "[FR] Market price percentage between -10% and 50%",
+ bisqEasy_price_tradePrice_title = "[FR] Fixed price",
+ bisqEasy_price_tradePrice_inputBoxText = "[FR] Trade price in {0}",
+ bisqEasy_price_feedback_sentence = "[FR] Your offer has {0} chances to be taken at this price.",
+ bisqEasy_price_feedback_sentence_veryLow = "[FR] very low",
+ bisqEasy_price_feedback_sentence_low = "[FR] low",
+ bisqEasy_price_feedback_sentence_some = "[FR] some",
+ bisqEasy_price_feedback_sentence_good = "[FR] good",
+ bisqEasy_price_feedback_sentence_veryGood = "[FR] very good",
+ bisqEasy_price_feedback_learnWhySection_openButton = "[FR] Why?",
+ bisqEasy_price_feedback_learnWhySection_closeButton = "[FR] Back to Trade Price",
+ bisqEasy_price_feedback_learnWhySection_title = "[FR] Why should I pay a higher price to the seller?",
+ bisqEasy_price_feedback_learnWhySection_description_intro = "[FR] The reason for that is that the seller has to cover extra expenses and compensate for the seller's service, specifically:",
+ bisqEasy_price_feedback_learnWhySection_description_exposition = "[FR] - Build up reputation which can be costly - The seller has to pay for miner fees - The seller is the helpful guide in the trade process thus investing more time",
+ bisqEasy_price_warn_invalidPrice_outOfRange = "[FR] The price you entered is outside the permitted range of -10% to 50%.",
+ bisqEasy_price_warn_invalidPrice_numberFormatException = "[FR] The price you entered is not a valid number.",
+ bisqEasy_price_warn_invalidPrice_exception = "[FR] The price you entered is invalid.\n\n Error message: {0}",
+ bisqEasy_tradeWizard_amount_headline_buyer = "[FR] How much do you want to spend?",
+ bisqEasy_tradeWizard_amount_headline_seller = "[FR] How much do you want to receive?",
+ bisqEasy_tradeWizard_amount_description_minAmount = "[FR] Set the minimum value for the amount range",
+ bisqEasy_tradeWizard_amount_description_maxAmount = "[FR] Set the maximum value for the amount range",
+ bisqEasy_tradeWizard_amount_description_fixAmount = "[FR] Set the amount you want to trade",
+ bisqEasy_tradeWizard_amount_addMinAmountOption = "[FR] Add min/max range for amount",
+ bisqEasy_tradeWizard_amount_removeMinAmountOption = "[FR] Use fix value amount",
+ bisqEasy_component_amount_minRangeValue = "[FR] Min {0}",
+ bisqEasy_component_amount_maxRangeValue = "[FR] Max {0}",
+ bisqEasy_component_amount_baseSide_tooltip_btcAmount_marketPrice = "[FR] This is the Bitcoin amount with current market price.",
+ bisqEasy_component_amount_baseSide_tooltip_btcAmount_selectedPrice = "[FR] This is the Bitcoin amount with your selected price.",
+ bisqEasy_component_amount_baseSide_tooltip_buyerInfo = "[FR] Sellers may ask for a higher price as they have costs for acquiring reputation.\n 5-15% price premium is common.",
+ bisqEasy_component_amount_baseSide_tooltip_bestOfferPrice = "[FR] This is the Bitcoin amount with the best price\n from matching offers: {0}",
+ bisqEasy_component_amount_baseSide_tooltip_buyer_btcAmount = "[FR] This is the Bitcoin amount to receive",
+ bisqEasy_component_amount_baseSide_tooltip_seller_btcAmount = "[FR] This is the Bitcoin amount to spend",
+ bisqEasy_component_amount_baseSide_tooltip_taker_offerPrice = "[FR] with the offer price: {0}",
+ bisqEasy_tradeWizard_amount_limitInfo_overlay_headline = "[FR] Reputation-based trade amount limits",
+ bisqEasy_tradeWizard_amount_limitInfo_overlay_close = "[FR] Close overlay",
+ bisqEasy_tradeWizard_amount_seller_wizard_numMatchingOffers_info = "[FR] There {0} matching the chosen trade amount.",
+ bisqEasy_tradeWizard_amount_seller_wizard_limitInfo = "[FR] With your reputation score of {0}, you can trade up to",
+ bisqEasy_tradeWizard_amount_seller_wizard_limitInfo_overlay_info = "[FR] With a reputation score of {0}, you can trade up to {1}.\n\n You can find information on how to increase your reputation at ''Reputation/Build Reputation''.",
+ bisqEasy_tradeWizard_amount_seller_limitInfo_scoreTooLow = "[FR] With your reputation score of {0}, your trade amount should not exceed",
+ bisqEasy_tradeWizard_amount_seller_limitInfo_overlay_info_scoreTooLow = "[FR] Your reputation score of {0} doesn''t offer sufficient security for buyers.\n\n Buyers who consider to take your offer will receive a warning about potential risks when taking your offer.\n\n You can find information on how to increase your reputation at ''Reputation/Build Reputation''.",
+ bisqEasy_takeOffer_amount_seller_limitInfo_lowToleratedAmount = "[FR] As the trade amount is below {0}, reputation requirements are relaxed.",
+ bisqEasy_takeOffer_amount_seller_limitInfo_scoreTooLow = "[FR] As your reputation score is only {0} your trade amount is restricted to",
+ bisqEasy_takeOffer_amount_seller_limitInfo_overlay_info_scoreTooLow = "[FR] For amounts up to {0} the reputation requirements are relaxed.\n\n Your reputation score of {1} doesn''t offer sufficient security for the buyer. However, given the low trade amount the buyer accepted to take the risk.\n\n You can find information on how to increase your reputation at ''Reputation/Build Reputation''.",
+ bisqEasy_tradeWizard_amount_seller_limitInfo_sufficientScore = "[FR] Your reputation score of {0} provides security for offers up to",
+ bisqEasy_tradeWizard_amount_seller_limitInfo_overlay_info_sufficientScore = "[FR] With a reputation score of {0}, you provide security for trades up to {1}.",
+ bisqEasy_tradeWizard_amount_seller_limitInfo_inSufficientScore = "[FR] The security provided by your reputation score of {0} is insufficient for offers over",
+ bisqEasy_tradeWizard_amount_seller_limitInfo_overlay_info_inSufficientScore = "[FR] With a reputation score of {0}, the security you provide is insufficient for trades over {1}.\n\n You can still create such offers, but buyers will be warned about potential risks when attempting to take your offer.\n\n You can find information on how to increase your reputation at ''Reputation/Build Reputation''.",
+ bisqEasy_tradeWizard_amount_seller_limitInfoAmount = "[FR] {0}.",
+ bisqEasy_tradeWizard_amount_seller_limitInfo_link = "[FR] Learn more",
+ bisqEasy_tradeWizard_amount_seller_limitInfo_overlay_linkToWikiText = "[FR] For more details about the reputation system, visit the Bisq Wiki at:",
+ bisqEasy_tradeWizard_amount_seller_limitInfo_noReputationNeededForMaxOrFixedAmount = "[FR] For amounts up to {0} no reputation is required.",
+ bisqEasy_tradeWizard_amount_seller_limitInfo_noReputationNeededForMaxOrFixedAmount_overlay_info_scoreTooLow = "[FR] For amounts up to {0} the reputation requirements are relaxed.\n\n Your reputation score of {1} doesn''t offer sufficient security for buyers. However, given the low amount involved, buyers might still consider accepting the offer once they are made aware of the associated risks.\n\n You can find information on how to increase your reputation at ''Reputation/Build Reputation''.",
+ bisqEasy_tradeWizard_amount_buyer_limitInfo_learnMore = "[FR] Learn more",
+ bisqEasy_tradeWizard_amount_buyer_numSellers_0 = "[FR] is no seller",
+ bisqEasy_tradeWizard_amount_buyer_numSellers_1 = "[FR] is one seller",
+ bisqEasy_tradeWizard_amount_buyer_numSellers_many = "[FR] are {0} sellers",
+ bisqEasy_tradeWizard_amount_numOffers_0 = "[FR] is no offer",
+ bisqEasy_tradeWizard_amount_numOffers_1 = "[FR] is one offer",
+ bisqEasy_tradeWizard_amount_numOffers_many = "[FR] are {0} offers",
+ bisqEasy_tradeWizard_amount_buyer_limitInfo = "[FR] There {0} in the network with sufficient reputation to take an offer of {1}.",
+ bisqEasy_tradeWizard_amount_buyer_limitInfo_overlay_info = "[FR] A seller who wants to take your offer of {0}, must have a reputation score of at least {1}.\n By reducing the maximum trade amount, you make your offer accessible to more sellers.",
+ bisqEasy_tradeWizard_amount_buyer_limitInfo_wizard_info_leadLine = "[FR] There {0} matching the chosen trade amount.",
+ bisqEasy_tradeWizard_amount_buyer_limitInfo_wizard_info = "[FR] For offers up to {0}, reputation requirements are relaxed.",
+ bisqEasy_tradeWizard_amount_buyer_limitInfo_wizard_overlay_info = "[FR] Given the low min. amount of {0}, the reputation requirements are relaxed.\n For amounts up to {1}, sellers do not need reputation.\n\n At the ''Select Offer'' screen it is recommended to choose sellers with higher reputation.",
+ bisqEasy_tradeWizard_amount_buyer_limitInfo_noReputationNeededForMaxOrFixedAmount = "[FR] Sellers with no reputation can take offers up to {0}.",
+ bisqEasy_tradeWizard_amount_buyer_limitInfo_noReputationNeededForMaxOrFixedAmount_riskInfo = "[FR] Be sure you fully understand the risks involved.",
+ bisqEasy_tradeWizard_amount_buyer_limitInfo_overlay_noReputationNeededForMaxOrFixedAmount_info = "[FR] Given the low amount of {0}, reputation requirements are relaxed.\n For amounts up to {1}, sellers with insufficient or no reputation can take the offer.\n\n Be sure to fully understand the risks when trading with a seller without or insufficient reputation. If you do not want to be exposed to that risk, choose an amount above {2}.",
+ bisqEasy_tradeWizard_amount_buyer_limitInfo_overlay_linkToWikiText = "[FR] To learn more about the reputation system, visit:",
+ bisqEasy_tradeWizard_amount_buyer_noReputationNeededForMinAmount_limitInfo_leadLine = "[FR] Since your min. amount is below {0}, sellers without reputation can take your offer.",
+ bisqEasy_tradeWizard_amount_buyer_noReputationNeededForMinAmount_limitInfo = "[FR] For the max. amount of {0} there {1} with enough reputation to take your offer.",
+ bisqEasy_tradeWizard_amount_buyer_noReputationNeededForMinAmount_limitInfo_overlay_info = "[FR] Given the low trade amount of {0}, the reputation requirements are relaxed.\n For amounts up to {1}, sellers with insufficient or no reputation can take your offer.\n\n Sellers who wants to take your offer with the max. amount of {2}, must have a reputation score of at least {3}.\n By reducing the maximum trade amount, you make your offer accessible to more sellers.",
+ bisqEasy_tradeWizard_paymentMethods_headline = "[FR] Which payment and settlement methods do you want to use?",
+ bisqEasy_tradeWizard_paymentMethods_fiat_subTitle_buyer = "[FR] Choose the payment methods to transfer {0}",
+ bisqEasy_tradeWizard_paymentMethods_fiat_subTitle_seller = "[FR] Choose the payment methods to receive {0}",
+ bisqEasy_tradeWizard_paymentMethods_bitcoin_subTitle_buyer = "[FR] Choose the settlement methods to receive Bitcoin",
+ bisqEasy_tradeWizard_paymentMethods_bitcoin_subTitle_seller = "[FR] Choose the settlement methods to send Bitcoin",
+ bisqEasy_tradeWizard_paymentMethods_noneFound = "[FR] For the selected market there are no default payment methods provided.\n Please add in the text field below the custom payment you want to use.",
+ bisqEasy_tradeWizard_paymentMethods_customMethod_prompt = "[FR] Custom payment",
+ bisqEasy_tradeWizard_paymentMethods_warn_maxMethodsReached = "[FR] You cannot add more than 4 payment methods.",
+ bisqEasy_tradeWizard_paymentMethods_warn_tooLong = "[FR] A custom payment method name must not be longer than 20 characters.",
+ bisqEasy_tradeWizard_paymentMethods_warn_customPaymentMethodAlreadyExists = "[FR] A custom payment method with name {0} already exists.",
+ bisqEasy_tradeWizard_paymentMethods_warn_customNameMatchesPredefinedMethod = "[FR] The name of your custom payment method must not be the same as one of the predefined.",
+ bisqEasy_tradeWizard_paymentMethods_warn_noFiatPaymentMethodSelected = "[FR] Please choose at least one fiat payment method.",
+ bisqEasy_tradeWizard_paymentMethods_warn_noBtcSettlementMethodSelected = "[FR] Please choose at least one Bitcoin settlement method.",
+ bisqEasy_tradeWizard_selectOffer_headline_buyer = "[FR] Buy Bitcoin for {0}",
+ bisqEasy_tradeWizard_selectOffer_headline_seller = "[FR] Sell Bitcoin for {0}",
+ bisqEasy_tradeWizard_selectOffer_subHeadline = "[FR] It is recommended to trade with users with high reputation.",
+ bisqEasy_tradeWizard_selectOffer_noMatchingOffers_headline = "[FR] No matching offers found",
+ bisqEasy_tradeWizard_selectOffer_noMatchingOffers_subHeadline = "[FR] There are no offers available for your selection criteria.",
+ bisqEasy_tradeWizard_selectOffer_noMatchingOffers_goBack = "[FR] Change selection",
+ bisqEasy_tradeWizard_selectOffer_noMatchingOffers_goBack_info = "[FR] Go back to the previous screens and change the selection",
+ bisqEasy_tradeWizard_selectOffer_noMatchingOffers_browseOfferbook = "[FR] Browse offerbook",
+ bisqEasy_tradeWizard_selectOffer_noMatchingOffers_browseOfferbook_info = "[FR] Close the trade wizard and browse the offer book",
+ bisqEasy_tradeWizard_review_headline_maker = "[FR] Review offer",
+ bisqEasy_tradeWizard_review_headline_taker = "[FR] Review trade",
+ bisqEasy_tradeWizard_review_detailsHeadline_taker = "[FR] Trade details",
+ bisqEasy_tradeWizard_review_detailsHeadline_maker = "[FR] Offer details",
+ bisqEasy_tradeWizard_review_feeDescription = "[FR] Fees",
+ bisqEasy_tradeWizard_review_noTradeFees = "[FR] No trade fees in Bisq Easy",
+ bisqEasy_tradeWizard_review_sellerPaysMinerFeeLong = "[FR] The seller pays the mining fee",
+ bisqEasy_tradeWizard_review_sellerPaysMinerFee = "[FR] Seller pays the mining fee",
+ bisqEasy_tradeWizard_review_noTradeFeesLong = "[FR] There are no trade fees in Bisq Easy",
+ bisqEasy_tradeWizard_review_toPay = "[FR] Amount to pay",
+ bisqEasy_tradeWizard_review_toSend = "[FR] Amount to send",
+ bisqEasy_tradeWizard_review_toReceive = "[FR] Amount to receive",
+ bisqEasy_tradeWizard_review_direction = "[FR] {0} Bitcoin",
+ bisqEasy_tradeWizard_review_paymentMethodDescription_btc = "[FR] Bitcoin settlement method",
+ bisqEasy_tradeWizard_review_paymentMethodDescriptions_btc_maker = "[FR] Bitcoin settlement methods",
+ bisqEasy_tradeWizard_review_paymentMethodDescriptions_btc_taker = "[FR] Select Bitcoin settlement method",
+ bisqEasy_tradeWizard_review_paymentMethodDescription_fiat = "[FR] Fiat payment method",
+ bisqEasy_tradeWizard_review_paymentMethodDescriptions_fiat_maker = "[FR] Fiat payment methods",
+ bisqEasy_tradeWizard_review_paymentMethodDescriptions_fiat_taker = "[FR] Select fiat payment method",
+ bisqEasy_tradeWizard_review_price = "[FR] {0} <{1} style=trade-wizard-review-code>",
+ bisqEasy_tradeWizard_review_priceDescription_taker = "[FR] Trade price",
+ bisqEasy_tradeWizard_review_priceDescription_maker = "[FR] Offer price",
+ bisqEasy_tradeWizard_review_priceDetails_fix = "[FR] Fix price. {0} {1} market price of {2}",
+ bisqEasy_tradeWizard_review_priceDetails_fix_atMarket = "[FR] Fix price. Same as market price of {0}",
+ bisqEasy_tradeWizard_review_priceDetails_float = { percentage, direction, rate -> "[FR] Float price. $percentage $direction market price of $rate" },
+ bisqEasy_tradeWizard_review_priceDetails = "[FR] Floats with the market price",
+ bisqEasy_tradeWizard_review_nextButton_createOffer = "[FR] Create offer",
+ bisqEasy_tradeWizard_review_nextButton_takeOffer = "[FR] Confirm trade",
+ bisqEasy_tradeWizard_review_createOfferSuccess_headline = "[FR] Offer successfully published",
+ bisqEasy_tradeWizard_review_createOfferSuccess_subTitle = "[FR] Your offer is now listed in the offerbook. When a Bisq user takes your offer, you will find a new trade in the 'Open Trades' section.\n\n Be sure to regularly check the Bisq application for new messages from a taker.",
+ bisqEasy_tradeWizard_review_createOfferSuccessButton = "[FR] Show my offer in 'Offerbook'",
+ bisqEasy_tradeWizard_review_takeOfferSuccess_headline = "[FR] You have successfully taken the offer",
+ bisqEasy_tradeWizard_review_takeOfferSuccess_subTitle = "[FR] Please get in touch with the trade peer at 'Open Trades'.\n You will find further information for the next steps over there.\n\n Be sure to regularly check the Bisq application for new messages from your trade peer.",
+ bisqEasy_tradeWizard_review_takeOfferSuccessButton = "[FR] Show trade in 'Open Trades'",
+ bisqEasy_tradeWizard_review_table_baseAmount_buyer = "[FR] You receive",
+ bisqEasy_tradeWizard_review_table_baseAmount_seller = "[FR] You spend",
+ bisqEasy_tradeWizard_review_table_price = "[FR] Price in {0}",
+ bisqEasy_tradeWizard_review_table_reputation = "[FR] Reputation",
+ bisqEasy_tradeWizard_review_chatMessage_fixPrice = "[FR] {0}",
+ bisqEasy_tradeWizard_review_chatMessage_floatPrice_above = "[FR] {0} above market price",
+ bisqEasy_tradeWizard_review_chatMessage_floatPrice_plus = "[FR] +{0}",
+ bisqEasy_tradeWizard_review_chatMessage_floatPrice_below = "[FR] {0} below market price",
+ bisqEasy_tradeWizard_review_chatMessage_floatPrice_minus = "[FR] -{0}",
+ bisqEasy_tradeWizard_review_chatMessage_marketPrice = "[FR] Market price",
+ bisqEasy_tradeWizard_review_chatMessage_price = "[FR] Price:",
+ bisqEasy_tradeWizard_review_chatMessage_peerMessage_sell = "[FR] Sell Bitcoin to {0}\n Amount: {1}\n Bitcoin settlement method(s): {2}\n Fiat payment method(s): {3}\n {4}",
+ bisqEasy_tradeWizard_review_chatMessage_peerMessage_buy = "[FR] Buy Bitcoin from {0}\n Amount: {1}\n Bitcoin settlement method(s): {2}\n Fiat payment method(s): {3}\n {4}",
+ bisqEasy_tradeWizard_review_chatMessage_offerDetails = "[FR] Amount: {0}\n Bitcoin settlement method(s): {1}\n Fiat payment method(s): {2}\n {3}",
+ bisqEasy_tradeWizard_review_chatMessage_peerMessageTitle_sell = "[FR] Sell Bitcoin to",
+ bisqEasy_tradeWizard_review_chatMessage_peerMessageTitle_buy = "[FR] Buy Bitcoin from",
+ bisqEasy_tradeWizard_review_chatMessage_myMessageTitle = "[FR] My Offer to {0} Bitcoin",
+)
diff --git a/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/i18n/CommonStrings.kt b/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/i18n/CommonStrings.kt
new file mode 100644
index 00000000..972e884c
--- /dev/null
+++ b/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/i18n/CommonStrings.kt
@@ -0,0 +1,16 @@
+package network.bisq.mobile.i18n
+
+data class CommonStrings(
+ val buttons_back: String,
+ 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,
+
+ val take_offer: String,
+)
\ No newline at end of file
diff --git a/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/i18n/CommonStringsEn.kt b/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/i18n/CommonStringsEn.kt
new file mode 100644
index 00000000..9d8c437e
--- /dev/null
+++ b/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/i18n/CommonStringsEn.kt
@@ -0,0 +1,20 @@
+package network.bisq.mobile.i18n
+
+import cafe.adriel.lyricist.LyricistStrings
+
+// @LyricistStrings(languageTag = Locales.EN, default = true)
+val EnCommonStrings = CommonStrings(
+ buttons_back = "Back",
+ 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",
+
+ take_offer = "Take offer",
+
+)
\ No newline at end of file
diff --git a/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/i18n/CommonStringsFr.kt b/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/i18n/CommonStringsFr.kt
new file mode 100644
index 00000000..4746c273
--- /dev/null
+++ b/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/i18n/CommonStringsFr.kt
@@ -0,0 +1,20 @@
+package network.bisq.mobile.i18n
+
+import cafe.adriel.lyricist.LyricistStrings
+
+//@LyricistStrings(languageTag = Locales.FR)
+val FrCommonStrings = CommonStrings(
+
+ buttons_back = "[FR] Back",
+ 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",
+
+ take_offer = "[FR] Take offer"
+)
\ No newline at end of file
diff --git a/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/i18n/PaymentMethodStrings.kt b/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/i18n/PaymentMethodStrings.kt
new file mode 100644
index 00000000..abc74e75
--- /dev/null
+++ b/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/i18n/PaymentMethodStrings.kt
@@ -0,0 +1,87 @@
+package network.bisq.mobile.i18n
+
+// From payment_method.properties
+data class PaymentMethodStrings(
+ val NATIONAL_BANK: String,
+ val INTERNATIONAL_BANK: String,
+ val SAME_BANK: String,
+ val SPECIFIC_BANKS: String,
+ val US_POSTAL_MONEY_ORDER: String,
+ val CASH_DEPOSIT: String,
+ val CASH_BY_MAIL: String,
+ val MONEY_GRAM: String,
+ val WESTERN_UNION: String,
+ val F2F: String,
+ val JAPAN_BANK: String,
+ val PAY_ID: String,
+ val NATIONAL_BANK_SHORT: String,
+ val INTERNATIONAL_BANK_SHORT: String,
+ val SAME_BANK_SHORT: String,
+ val SPECIFIC_BANKS_SHORT: String,
+ val US_POSTAL_MONEY_ORDER_SHORT: String,
+ val CASH_DEPOSIT_SHORT: String,
+ val CASH_BY_MAIL_SHORT: String,
+ val MONEY_GRAM_SHORT: String,
+ val WESTERN_UNION_SHORT: String,
+ val F2F_SHORT: String,
+ val JAPAN_BANK_SHORT: String,
+ val UPHOLD: String,
+ val MONEY_BEAM: String,
+ val POPMONEY: String,
+ val REVOLUT: String,
+ val CASH_APP: String,
+ val PERFECT_MONEY: String,
+ val ALI_PAY: String,
+ val WECHAT_PAY: String,
+ val SEPA: String,
+ val SEPA_INSTANT: String,
+ val FASTER_PAYMENTS: String,
+ val SWISH: String,
+ val ZELLE: String,
+ val CHASE_QUICK_PAY: String,
+ val INTERAC_E_TRANSFER: String,
+ val HAL_CASH: String,
+ val PROMPT_PAY: String,
+ val ADVANCED_CASH: String,
+ val WISE: String,
+ val WISE_USD: String,
+ val PAYSERA: String,
+ val PAXUM: String,
+ val NEFT: String,
+ val RTGS: String,
+ val IMPS: String,
+ val UPI: String,
+ val PAYTM: String,
+ val NEQUI: String,
+ val BIZUM: String,
+ val PIX: String,
+ val AMAZON_GIFT_CARD: String,
+ val CAPITUAL: String,
+ val CELPAY: String,
+ val MONESE: String,
+ val SATISPAY: String,
+ val TIKKIE: String,
+ val VERSE: String,
+ val STRIKE: String,
+ val SWIFT: String,
+ val SWIFT_SHORT: String,
+ val ACH_TRANSFER: String,
+ val ACH_TRANSFER_SHORT: String,
+ val DOMESTIC_WIRE_TRANSFER: String,
+ val DOMESTIC_WIRE_TRANSFER_SHORT: String,
+ val CIPS: String,
+ val CIPS_SHORT: String,
+ val NATIVE_CHAIN: String,
+ val NATIVE_CHAIN_SHORT: String,
+ val MAIN_CHAIN: String,
+ val MAIN_CHAIN_SHORT: String,
+ val LN: String,
+ val LN_SHORT: String,
+ val LBTC: String,
+ val LBTC_SHORT: String,
+ val RBTC: String,
+ val RBTC_SHORT: String,
+ val WBTC: String,
+ val WBTC_SHORT: String,
+ val OTHER: String,
+ )
diff --git a/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/i18n/PaymentMethodStringsEn.kt b/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/i18n/PaymentMethodStringsEn.kt
new file mode 100644
index 00000000..f351321c
--- /dev/null
+++ b/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/i18n/PaymentMethodStringsEn.kt
@@ -0,0 +1,90 @@
+package network.bisq.mobile.i18n
+
+import cafe.adriel.lyricist.LyricistStrings
+
+// @LyricistStrings(languageTag = Locales.EN, default = true)
+val EnPaymentMethodStrings = PaymentMethodStrings(
+ NATIONAL_BANK = "National bank transfer",
+ INTERNATIONAL_BANK = "International bank transfer",
+ SAME_BANK = "Transfer with same bank",
+ SPECIFIC_BANKS = "Transfers with specific banks",
+ US_POSTAL_MONEY_ORDER = "US Postal Money Order",
+ CASH_DEPOSIT = "Cash Deposit",
+ CASH_BY_MAIL = "Cash By Mail",
+ MONEY_GRAM = "MoneyGram",
+ WESTERN_UNION = "Western Union",
+ F2F = "Face to face (in person)",
+ JAPAN_BANK = "Japan Bank Furikomi",
+ PAY_ID = "PayID",
+ NATIONAL_BANK_SHORT = "National banks",
+ INTERNATIONAL_BANK_SHORT = "International banks",
+ SAME_BANK_SHORT = "Same bank",
+ SPECIFIC_BANKS_SHORT = "Specific banks",
+ US_POSTAL_MONEY_ORDER_SHORT = "US Money Order",
+ CASH_DEPOSIT_SHORT = "Cash Deposit",
+ CASH_BY_MAIL_SHORT = "Cash By Mail",
+ MONEY_GRAM_SHORT = "MoneyGram",
+ WESTERN_UNION_SHORT = "Western Union",
+ F2F_SHORT = "F2F",
+ JAPAN_BANK_SHORT = "Japan Furikomi",
+ UPHOLD = "Uphold",
+ MONEY_BEAM = "MoneyBeam (N26)",
+ POPMONEY = "Popmoney",
+ REVOLUT = "Revolut",
+ CASH_APP = "Cash App",
+ PERFECT_MONEY = "Perfect Money",
+ ALI_PAY = "AliPay",
+ WECHAT_PAY = "WeChat Pay",
+ SEPA = "SEPA",
+ SEPA_INSTANT = "SEPA Instant",
+ FASTER_PAYMENTS = "Faster Payments",
+ SWISH = "Swish",
+ ZELLE = "Zelle",
+ CHASE_QUICK_PAY = "Chase QuickPay",
+ INTERAC_E_TRANSFER = "Interac e-Transfer",
+ HAL_CASH = "HalCash",
+ PROMPT_PAY = "PromptPay",
+ ADVANCED_CASH = "Advanced Cash",
+ WISE = "Wise",
+ WISE_USD = "Wise-USD",
+ PAYSERA = "Paysera",
+ PAXUM = "Paxum",
+ NEFT = "India/NEFT",
+ RTGS = "India/RTGS",
+ IMPS = "India/IMPS",
+ UPI = "India/UPI",
+ PAYTM = "India/PayTM",
+ NEQUI = "Nequi",
+ BIZUM = "Bizum",
+ PIX = "Pix",
+ AMAZON_GIFT_CARD = "Amazon eGift Card",
+ CAPITUAL = "Capitual",
+ CELPAY = "CelPay",
+ MONESE = "Monese",
+ SATISPAY = "Satispay",
+ TIKKIE = "Tikkie",
+ VERSE = "Verse",
+ STRIKE = "Strike",
+ SWIFT = "SWIFT International Wire Transfer",
+ SWIFT_SHORT = "SWIFT",
+ ACH_TRANSFER = "ACH Transfer",
+ ACH_TRANSFER_SHORT = "ACH",
+ DOMESTIC_WIRE_TRANSFER = "Domestic Wire Transfer",
+ DOMESTIC_WIRE_TRANSFER_SHORT = "Wire",
+ CIPS = "Cross-Border Interbank Payment System",
+ CIPS_SHORT = "CIPS",
+ NATIVE_CHAIN = "Native chain",
+ NATIVE_CHAIN_SHORT = "Native chain",
+ MAIN_CHAIN = "Bitcoin (onchain)",
+ MAIN_CHAIN_SHORT = "Onchain",
+ LN = "BTC over Lightning Network",
+ LN_SHORT = "Lightning",
+ LBTC = "L-BTC (Pegged BTC on Liquid side chain)",
+ LBTC_SHORT = "Liquid",
+ RBTC = "RBTC (Pegged BTC on RSK side chain)",
+ RBTC_SHORT = "RSK",
+ WBTC = "WBTC (wrapped BTC as ERC20 token)",
+ WBTC_SHORT = "WBTC",
+ OTHER = "Other",
+)
+
diff --git a/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/i18n/PaymentMethodStringsFr.kt b/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/i18n/PaymentMethodStringsFr.kt
new file mode 100644
index 00000000..104f1c0e
--- /dev/null
+++ b/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/i18n/PaymentMethodStringsFr.kt
@@ -0,0 +1,90 @@
+package network.bisq.mobile.i18n
+
+import cafe.adriel.lyricist.LyricistStrings
+
+// @LyricistStrings(languageTag = Locales.FR)
+val FrPaymentMethodStrings = PaymentMethodStrings(
+ NATIONAL_BANK = "[FR] National bank transfer",
+ INTERNATIONAL_BANK = "[FR] International bank transfer",
+ SAME_BANK = "[FR] Transfer with same bank",
+ SPECIFIC_BANKS = "[FR] Transfers with specific banks",
+ US_POSTAL_MONEY_ORDER = "[FR] US Postal Money Order",
+ CASH_DEPOSIT = "[FR] Cash Deposit",
+ CASH_BY_MAIL = "[FR] Cash By Mail",
+ MONEY_GRAM = "[FR] MoneyGram",
+ WESTERN_UNION = "[FR] Western Union",
+ F2F = "[FR] Face to face (in person)",
+ JAPAN_BANK = "[FR] Japan Bank Furikomi",
+ PAY_ID = "[FR] PayID",
+ NATIONAL_BANK_SHORT = "[FR] National banks",
+ INTERNATIONAL_BANK_SHORT = "[FR] International banks",
+ SAME_BANK_SHORT = "[FR] Same bank",
+ SPECIFIC_BANKS_SHORT = "[FR] Specific banks",
+ US_POSTAL_MONEY_ORDER_SHORT = "[FR] US Money Order",
+ CASH_DEPOSIT_SHORT = "[FR] Cash Deposit",
+ CASH_BY_MAIL_SHORT = "[FR] Cash By Mail",
+ MONEY_GRAM_SHORT = "[FR] MoneyGram",
+ WESTERN_UNION_SHORT = "[FR] Western Union",
+ F2F_SHORT = "[FR] F2F",
+ JAPAN_BANK_SHORT = "[FR] Japan Furikomi",
+ UPHOLD = "[FR] Uphold",
+ MONEY_BEAM = "[FR] MoneyBeam (N26)",
+ POPMONEY = "[FR] Popmoney",
+ REVOLUT = "[FR] Revolut",
+ CASH_APP = "[FR] Cash App",
+ PERFECT_MONEY = "[FR] Perfect Money",
+ ALI_PAY = "[FR] AliPay",
+ WECHAT_PAY = "[FR] WeChat Pay",
+ SEPA = "[FR] SEPA",
+ SEPA_INSTANT = "[FR] SEPA Instant",
+ FASTER_PAYMENTS = "[FR] Faster Payments",
+ SWISH = "[FR] Swish",
+ ZELLE = "[FR] Zelle",
+ CHASE_QUICK_PAY = "[FR] Chase QuickPay",
+ INTERAC_E_TRANSFER = "[FR] Interac e-Transfer",
+ HAL_CASH = "[FR] HalCash",
+ PROMPT_PAY = "[FR] PromptPay",
+ ADVANCED_CASH = "[FR] Advanced Cash",
+ WISE = "[FR] Wise",
+ WISE_USD = "[FR] Wise-USD",
+ PAYSERA = "[FR] Paysera",
+ PAXUM = "[FR] Paxum",
+ NEFT = "[FR] India/NEFT",
+ RTGS = "[FR] India/RTGS",
+ IMPS = "[FR] India/IMPS",
+ UPI = "[FR] India/UPI",
+ PAYTM = "[FR] India/PayTM",
+ NEQUI = "[FR] Nequi",
+ BIZUM = "[FR] Bizum",
+ PIX = "[FR] Pix",
+ AMAZON_GIFT_CARD = "[FR] Amazon eGift Card",
+ CAPITUAL = "[FR] Capitual",
+ CELPAY = "[FR] CelPay",
+ MONESE = "[FR] Monese",
+ SATISPAY = "[FR] Satispay",
+ TIKKIE = "[FR] Tikkie",
+ VERSE = "[FR] Verse",
+ STRIKE = "[FR] Strike",
+ SWIFT = "[FR] SWIFT International Wire Transfer",
+ SWIFT_SHORT = "[FR] SWIFT",
+ ACH_TRANSFER = "[FR] ACH Transfer",
+ ACH_TRANSFER_SHORT = "[FR] ACH",
+ DOMESTIC_WIRE_TRANSFER = "[FR] Domestic Wire Transfer",
+ DOMESTIC_WIRE_TRANSFER_SHORT = "[FR] Wire",
+ CIPS = "[FR] Cross-Border Interbank Payment System",
+ CIPS_SHORT = "[FR] CIPS",
+ NATIVE_CHAIN = "[FR] Native chain",
+ NATIVE_CHAIN_SHORT = "[FR] Native chain",
+ MAIN_CHAIN = "[FR] Bitcoin (onchain)",
+ MAIN_CHAIN_SHORT = "[FR] Onchain",
+ LN = "[FR] BTC over Lightning Network",
+ LN_SHORT = "[FR] Lightning",
+ LBTC = "[FR] L-BTC (Pegged BTC on Liquid side chain)",
+ LBTC_SHORT = "[FR] Liquid",
+ RBTC = "[FR] RBTC (Pegged BTC on RSK side chain)",
+ RBTC_SHORT = "[FR] RSK",
+ WBTC = "[FR] WBTC (wrapped BTC as ERC20 token)",
+ WBTC_SHORT = "[FR] WBTC",
+ OTHER = "[FR] Other",
+)
+
diff --git a/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/i18n/Strings.kt b/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/i18n/Strings.kt
index 2ab2c063..17693bd9 100644
--- a/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/i18n/Strings.kt
+++ b/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/i18n/Strings.kt
@@ -1,153 +1,10 @@
package network.bisq.mobile.i18n
-// TODO: Breakdown this later
-data class Strings(
- val splash_details_tooltip: String,
- val splash_applicationServiceState_INITIALIZE_APP: String,
- val splash_applicationServiceState_INITIALIZE_NETWORK: String,
- val splash_applicationServiceState_INITIALIZE_WALLET: String,
- val splash_applicationServiceState_INITIALIZE_SERVICES: String,
- val splash_applicationServiceState_APP_INITIALIZED: String,
- val splash_applicationServiceState_FAILED: String,
- val splash_bootstrapState_service_CLEAR: String,
- val splash_bootstrapState_service_TOR: String,
- val splash_bootstrapState_service_I2P: String,
- val splash_bootstrapState_network_CLEAR: String,
- val splash_bootstrapState_network_TOR: String,
- val splash_bootstrapState_network_I2P: String,
- val splash_bootstrapState_BOOTSTRAP_TO_NETWORK: (String) -> String,
- val splash_bootstrapState_START_PUBLISH_SERVICE: String,
- val splash_bootstrapState_SERVICE_PUBLISHED: String,
- val splash_bootstrapState_CONNECTED_TO_PEERS: String,
- val tac_headline: String,
- val tac_confirm: String,
- val tac_accept: String,
- val tac_reject: String,
- val unlock_headline: String,
- val unlock_button: String,
- val unlock_failed: String,
- val updater_headline: String,
- val updater_headline_isLauncherUpdate: String,
- val updater_releaseNotesHeadline: String,
- val updater_furtherInfo: String,
- val updater_furtherInfo_isLauncherUpdate: String,
- val updater_download: String,
- val updater_downloadLater: String,
- val updater_ignore: String,
- val updater_shutDown: String,
- val updater_shutDown_isLauncherUpdate: String,
- val updater_downloadAndVerify_headline: String,
- val updater_downloadAndVerify_info: String,
- val updater_downloadAndVerify_info_isLauncherUpdate: String,
- val updater_table_file: String,
- val updater_table_progress: String,
- val updater_table_progress_completed: String,
- val updater_table_verified: String,
- val notificationPanel_trades_headline_single: String,
- val notificationPanel_trades_headline_multiple: String,
- val notificationPanel_trades_button: String,
- val notificationPanel_mediationCases_headline_single: String,
- val notificationPanel_mediationCases_headline_multiple: String,
- val notificationPanel_mediationCases_button: String,
- val onboarding_bisq2_headline: String,
- val onboarding_bisq2_teaserHeadline1: String,
- val onboarding_bisq2_line1: String,
- val onboarding_bisq2_teaserHeadline2: String,
- val onboarding_bisq2_line2: String,
- val onboarding_bisq2_teaserHeadline3: String,
- val onboarding_bisq2_line3: String,
- val onboarding_button_create_profile: String,
- val onboarding_createProfile_headline: String,
- val onboarding_createProfile_subTitle: String,
- val onboarding_createProfile_nym: String,
- val onboarding_createProfile_regenerate: String,
- val onboarding_createProfile_nym_generating: String,
- val onboarding_createProfile_createProfile: String,
- val onboarding_createProfile_createProfile_busy: String,
- val onboarding_createProfile_nickName_prompt: String,
- val onboarding_createProfile_nickName: String,
- val onboarding_createProfile_nickName_tooLong: String,
- val onboarding_password_button_skip: String,
- val onboarding_password_subTitle: String,
- val onboarding_password_headline_setPassword: String,
- val onboarding_password_button_savePassword: String,
- val onboarding_password_enterPassword: String,
- val onboarding_password_confirmPassword: String,
- val onboarding_password_savePassword_success: String,
- val navigation_dashboard: String,
- val navigation_bisqEasy: String,
- val navigation_reputation: String,
- val navigation_tradeApps: String,
- val navigation_wallet: String,
- val navigation_academy: String,
- val navigation_chat: String,
- val navigation_support: String,
- val navigation_userOptions: String,
- val navigation_settings: String,
- val navigation_network: String,
- val navigation_authorizedRole: String,
- val navigation_expandIcon_tooltip: String,
- val navigation_collapseIcon_tooltip: String,
- val navigation_vertical_expandIcon_tooltip: String,
- val navigation_vertical_collapseIcon_tooltip: String,
- val navigation_network_info_clearNet: String,
- val navigation_network_info_tor: String,
- val navigation_network_info_i2p: String,
- val navigation_network_info_tooltip: String,
- val navigation_network_info_inventoryRequest_requesting: String,
- val navigation_network_info_inventoryRequest_completed: String,
- val navigation_network_info_inventoryRequests_tooltip: String,
- val topPanel_wallet_balance: String,
- val dashboard_marketPrice: String,
- val dashboard_offersOnline: String,
- val dashboard_activeUsers: String,
- val dashboard_activeUsers_tooltip: String,
- val dashboard_main_headline: String,
- val dashboard_main_content1: String,
- val dashboard_main_content2: String,
- val dashboard_main_content3: String,
- val dashboard_main_button: String,
- val dashboard_second_headline: String,
- val dashboard_second_content: String,
- val dashboard_second_button: String,
- val dashboard_third_headline: String,
- val dashboard_third_content: String,
- val dashboard_third_button: String,
- val popup_headline_instruction: String,
- val popup_headline_attention: String,
- val popup_headline_backgroundInfo: String,
- val popup_headline_feedback: String,
- val popup_headline_confirmation: String,
- val popup_headline_information: String,
- val popup_headline_warning: String,
- val popup_headline_invalid: String,
- val popup_headline_error: String,
- val popup_reportBug: String,
- val popup_reportError: String,
- val popup_reportBug_report: String,
- val popup_reportError_log: String,
- val popup_reportError_zipLogs: String,
- val popup_reportError_gitHub: String,
- val popup_startup_error: String,
- val popup_shutdown: String,
- val popup_shutdown_error: String,
- val popup_hyperlink_openInBrowser_tooltip: String,
- val popup_hyperlink_copy_tooltip: String,
- val hyperlinks_openInBrowser_attention_headline: String,
- val hyperlinks_openInBrowser_attention: String,
- val hyperlinks_openInBrowser_no: String,
- val hyperlinks_copiedToClipboard: String,
- val video_mp4NotSupported_warning_headline: String,
- val video_mp4NotSupported_warning: String,
- val version_versionAndCommitHash: String,
-
- 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,
+data class AppStrings(
+ val application: ApplicationStrings,
+ val paymentMethod: PaymentMethodStrings,
+ val bisqEasy: BisqEasyStrings,
+ val bisqEasyTradeState: BisqEasyTradeStateStrings,
+ val bisqEasyTradeWizard: BisqEasyTradeWizardStrings,
+ val common: CommonStrings
)
\ No newline at end of file
diff --git a/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/i18n/StringsEn.kt b/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/i18n/StringsEn.kt
new file mode 100644
index 00000000..62ba50db
--- /dev/null
+++ b/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/i18n/StringsEn.kt
@@ -0,0 +1,13 @@
+package network.bisq.mobile.i18n
+
+import cafe.adriel.lyricist.LyricistStrings
+
+@LyricistStrings(languageTag = Locales.EN, default = true)
+val EnAppStrings = AppStrings(
+ application = EnApplicationStrings,
+ paymentMethod = EnPaymentMethodStrings,
+ bisqEasy = EnBisqEasyStrings,
+ bisqEasyTradeWizard = EnBisqEasyTradeWizardStrings,
+ bisqEasyTradeState = EnBisqEasyTradeStateStrings,
+ common = EnCommonStrings
+)
diff --git a/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/i18n/StringsFr.kt b/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/i18n/StringsFr.kt
new file mode 100644
index 00000000..17180ef0
--- /dev/null
+++ b/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/i18n/StringsFr.kt
@@ -0,0 +1,13 @@
+package network.bisq.mobile.i18n
+
+import cafe.adriel.lyricist.LyricistStrings
+
+@LyricistStrings(languageTag = Locales.FR)
+val FrAppStrings = AppStrings(
+ application= FrApplicationStrings,
+ paymentMethod = FrPaymentMethodStrings,
+ bisqEasy = FrBisqEasyStrings,
+ bisqEasyTradeWizard = FrBisqEasyTradeWizardStrings,
+ bisqEasyTradeState = FrBisqEasyTradeStateStrings,
+ common = FrCommonStrings
+)
\ No newline at end of file
diff --git a/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/di/PresentationModule.kt b/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/di/PresentationModule.kt
index 3f00d944..66662bd6 100644
--- a/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/di/PresentationModule.kt
+++ b/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/di/PresentationModule.kt
@@ -9,8 +9,10 @@ import network.bisq.mobile.presentation.ui.components.molecules.ITopBarPresenter
import network.bisq.mobile.presentation.ui.components.molecules.TopBarPresenter
import network.bisq.mobile.presentation.ui.uicases.GettingStartedPresenter
import network.bisq.mobile.presentation.ui.uicases.IGettingStarted
+import network.bisq.mobile.presentation.ui.uicases.offers.IOffersListPresenter
import network.bisq.mobile.presentation.ui.uicases.offers.MarketListPresenter
import network.bisq.mobile.presentation.ui.uicases.offers.OffersListPresenter
+import network.bisq.mobile.presentation.ui.uicases.offers.takeOffer.*
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
@@ -18,7 +20,9 @@ import network.bisq.mobile.presentation.ui.uicases.startup.OnBoardingPresenter
import network.bisq.mobile.presentation.ui.uicases.startup.SplashPresenter
import network.bisq.mobile.presentation.ui.uicases.startup.TrustedNodeSetupPresenter
import network.bisq.mobile.presentation.ui.uicases.trades.IMyTrades
+import network.bisq.mobile.presentation.ui.uicases.trades.ITradeFlowPresenter
import network.bisq.mobile.presentation.ui.uicases.trades.MyTradesPresenter
+import network.bisq.mobile.presentation.ui.uicases.trades.TradeFlowPresenter
import org.koin.core.qualifier.named
import org.koin.dsl.bind
import org.koin.dsl.module
@@ -39,11 +43,7 @@ val presentationModule = module {
)
}
- single {
- OnBoardingPresenter(
- get()
- )
- } bind IOnboardingPresenter::class
+ single { OnBoardingPresenter(get()) } bind IOnboardingPresenter::class
single {
GettingStartedPresenter(
@@ -70,7 +70,13 @@ val presentationModule = module {
single { MarketListPresenter(get(), get()) }
- single { OffersListPresenter(get(), get()) }
+ single { OffersListPresenter(get(), get()) } bind IOffersListPresenter::class
+
+ single { TradeAmountPresenter(get(), get()) } bind ITakeOfferTradeAmountPresenter::class
+
+ single { PaymentMethodPresenter(get(), get()) } bind ITakeOfferPaymentMethodPresenter::class
+
+ single{ ReviewTradePresenter(get(), get()) } bind ITakeOfferReviewTradePresenter::class
single { (navController: NavController, tabController: NavController) ->
MyTradesPresenter(
@@ -79,4 +85,6 @@ val presentationModule = module {
myTradesRepository = get()
)
} bind IMyTrades::class
+
+ single{ TradeFlowPresenter(get(), get()) } bind ITradeFlowPresenter::class
}
\ No newline at end of file
diff --git a/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/components/atoms/BisqHDivider.kt b/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/components/atoms/BisqHDivider.kt
new file mode 100644
index 00000000..dea42767
--- /dev/null
+++ b/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/components/atoms/BisqHDivider.kt
@@ -0,0 +1,20 @@
+package network.bisq.mobile.presentation.ui.components.atoms
+
+import androidx.compose.foundation.layout.height
+import androidx.compose.foundation.layout.padding
+import androidx.compose.material3.HorizontalDivider
+import androidx.compose.material3.VerticalDivider
+import androidx.compose.runtime.Composable
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.unit.dp
+import network.bisq.mobile.presentation.ui.theme.BisqTheme
+
+@Composable
+fun BisqHDivider() {
+ HorizontalDivider(
+ thickness = 1.dp,
+ modifier = Modifier.padding(vertical = 28.dp),
+ color = Color(0XFF2B2B2B)
+ )
+}
\ No newline at end of file
diff --git a/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/components/atoms/BisqVDivider.kt b/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/components/atoms/BisqVDivider.kt
new file mode 100644
index 00000000..b57a5aa6
--- /dev/null
+++ b/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/components/atoms/BisqVDivider.kt
@@ -0,0 +1,24 @@
+package network.bisq.mobile.presentation.ui.components.atoms
+
+import androidx.compose.foundation.layout.fillMaxHeight
+import androidx.compose.foundation.layout.height
+import androidx.compose.foundation.layout.padding
+import androidx.compose.material3.HorizontalDivider
+import androidx.compose.material3.VerticalDivider
+import androidx.compose.runtime.Composable
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.unit.dp
+import network.bisq.mobile.presentation.ui.theme.BisqTheme
+
+
+
+@Composable
+fun BisqVDivider() {
+ VerticalDivider(
+ thickness = 2.dp,
+ color = BisqTheme.colors.grey3,
+ modifier = Modifier.height(108.dp)
+ // modifier = Modifier.fillMaxHeight()
+ )
+}
diff --git a/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/components/atoms/Button.kt b/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/components/atoms/Button.kt
index de281570..f31adab6 100644
--- a/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/components/atoms/Button.kt
+++ b/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/components/atoms/Button.kt
@@ -1,5 +1,6 @@
package network.bisq.mobile.presentation.ui.components.atoms
+import androidx.compose.foundation.BorderStroke
import androidx.compose.foundation.layout.*
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.material3.Button
@@ -28,7 +29,9 @@ fun BisqButton(
leftIcon: (@Composable () -> Unit)? = null,
rightIcon: (@Composable () -> Unit)? = null,
modifier: Modifier = Modifier,
- cornerRadius: Dp = 8.dp
+ cornerRadius: Dp = 8.dp,
+ disabled: Boolean = false,
+ border: BorderStroke? = null
) {
Button(
@@ -40,6 +43,8 @@ fun BisqButton(
contentColor = color,
disabledContentColor = color),
shape = RoundedCornerShape(cornerRadius),
+ enabled = !disabled,
+ border = border
) {
if (iconOnly == null && text == null) {
BisqText.baseMedium("Error: Pass either text or icon")
diff --git a/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/components/atoms/CircularLoadingImage.kt b/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/components/atoms/CircularLoadingImage.kt
new file mode 100644
index 00000000..9fc5f911
--- /dev/null
+++ b/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/components/atoms/CircularLoadingImage.kt
@@ -0,0 +1,39 @@
+package network.bisq.mobile.presentation.ui.components.atoms
+
+import androidx.compose.foundation.Image
+import androidx.compose.foundation.layout.Box
+import androidx.compose.foundation.layout.height
+import androidx.compose.foundation.layout.size
+import androidx.compose.foundation.layout.width
+import androidx.compose.material3.CircularProgressIndicator
+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
+import org.jetbrains.compose.resources.DrawableResource
+import org.jetbrains.compose.resources.painterResource
+
+@Composable
+fun CircularLoadingImage(
+ image: DrawableResource,
+ isLoading: Boolean
+) {
+ Box(
+ contentAlignment = Alignment.Center
+ ) {
+ Image(
+ painterResource(image), "",
+ modifier = Modifier.height(36.dp).width(30.dp)
+ )
+ if (isLoading) {
+ CircularProgressIndicator(
+ modifier = Modifier
+ .align(Alignment.Center)
+ .size(60.dp),
+ color = BisqTheme.colors.primaryDisabled,
+ strokeWidth = 2.dp
+ )
+ }
+ }
+}
\ No newline at end of file
diff --git a/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/components/atoms/PaymentMethods.kt b/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/components/atoms/PaymentMethods.kt
index 05674c62..30c13dd5 100644
--- a/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/components/atoms/PaymentMethods.kt
+++ b/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/components/atoms/PaymentMethods.kt
@@ -28,13 +28,13 @@ fun PaymentMethods(item: OfferListItem) {
.replace("-", "_")
}.png",
fallbackPath = "drawable/payment/fiat/custom_payment_${customMethodCounter++}.png",
- modifier = Modifier.size(15.dp),
+ modifier = Modifier.size(16.dp),
)
}
}
DynamicImage(
"drawable/payment/interchangeable_grey.png",
- modifier = Modifier.size(12.dp)
+ modifier = Modifier.size(14.dp)
)
Row(horizontalArrangement = Arrangement.spacedBy(5.dp)) {
baseSidePaymentMethods.forEach { paymentMethod ->
@@ -44,7 +44,7 @@ fun PaymentMethods(item: OfferListItem) {
.lowercase()
.replace("-", "_")
}.png",
- modifier = Modifier.size(15.dp)
+ modifier = Modifier.size(16.dp)
)
}
}
diff --git a/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/components/atoms/ProfileRating.kt b/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/components/atoms/ProfileRating.kt
index 21814b55..e8391026 100644
--- a/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/components/atoms/ProfileRating.kt
+++ b/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/components/atoms/ProfileRating.kt
@@ -14,28 +14,29 @@ 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 network.bisq.mobile.domain.data.model.OfferListItem
+import network.bisq.mobile.presentation.ui.components.atoms.icons.StarEmptyIcon
+import network.bisq.mobile.presentation.ui.components.atoms.icons.StarFillIcon
import org.jetbrains.compose.resources.painterResource
// TODO: Get params and render apt
@Composable
fun ProfileRating(item: OfferListItem) {
- val fiveSystemScore:Int = item.reputationScore.fiveSystemScore.toInt()
+ val fiveSystemScore:Int = 3 // item.reputationScore.fiveSystemScore.toInt()
Row(horizontalArrangement = Arrangement.spacedBy(12.dp), verticalAlignment = Alignment.CenterVertically) {
Image(
painterResource(Res.drawable.img_bot_image), "",
- modifier = Modifier.size(32.dp)
+ modifier = Modifier.size(48.dp)
)
Column(verticalArrangement = Arrangement.spacedBy(4.dp)) {
- BisqText.smallMedium(
- text = item.userName
- )
- LazyRow(horizontalArrangement = Arrangement.spacedBy(2.dp)) {
- items(fiveSystemScore) {
- Image(
- painterResource(Res.drawable.icon_star), "",
- modifier = Modifier.size(10.dp)
- )
+ BisqText.largeRegular(text = item.userName)
+ Row(horizontalArrangement = Arrangement.spacedBy(2.dp)) {
+ // TODO: Find right icons from Bisq2 and update
+ repeat(fiveSystemScore) {
+ StarFillIcon()
+ }
+ repeat(5 - fiveSystemScore) {
+ StarEmptyIcon()
}
}
}
diff --git a/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/components/atoms/Slider.kt b/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/components/atoms/Slider.kt
new file mode 100644
index 00000000..22d731ce
--- /dev/null
+++ b/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/components/atoms/Slider.kt
@@ -0,0 +1,63 @@
+package network.bisq.mobile.presentation.ui.components.atoms
+
+import androidx.compose.foundation.interaction.MutableInteractionSource
+import androidx.compose.foundation.layout.fillMaxWidth
+import androidx.compose.foundation.layout.height
+import androidx.compose.material3.ExperimentalMaterial3Api
+import androidx.compose.material3.Slider
+import androidx.compose.material3.SliderColors
+import androidx.compose.material3.SliderDefaults
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.remember
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.unit.DpSize
+import androidx.compose.ui.unit.dp
+import network.bisq.mobile.presentation.ui.theme.BisqTheme
+
+@OptIn(ExperimentalMaterial3Api::class)
+@Composable
+fun BisqSlider(
+ minAmount: Float,
+ maxAmount: Float,
+ tradeValue: Float,
+ onValueChange: (Float) -> Unit
+) {
+
+ val colors = SliderColors(
+ thumbColor = BisqTheme.colors.primary,
+ activeTrackColor = BisqTheme.colors.grey2,
+ activeTickColor = Color.Unspecified,
+ inactiveTrackColor = BisqTheme.colors.grey2,
+ inactiveTickColor = Color.Unspecified,
+ disabledThumbColor = Color.Unspecified,
+ disabledActiveTrackColor = Color.Unspecified,
+ disabledActiveTickColor = Color.Unspecified,
+ disabledInactiveTrackColor = Color.Unspecified,
+ disabledInactiveTickColor = Color.Unspecified
+ )
+
+ Slider(
+ modifier = Modifier.fillMaxWidth(),
+ value = tradeValue,
+ onValueChange = { onValueChange(it) },
+ valueRange = minAmount..maxAmount,
+ thumb = {
+ SliderDefaults.Thumb(
+ interactionSource = remember { MutableInteractionSource() },
+ thumbSize = DpSize(16.dp, 16.dp),
+ colors = colors
+ )
+ },
+ track = { sliderState ->
+ SliderDefaults.Track(
+ trackInsideCornerSize = 0.dp,
+ thumbTrackGapSize = 0.dp,
+ modifier = Modifier.height(2.dp),
+ sliderState = sliderState,
+ colors = colors,
+ drawStopIndicator = null
+ )
+ }
+ )
+}
\ No newline at end of file
diff --git a/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/components/atoms/SvgImages.kt b/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/components/atoms/SvgImages.kt
new file mode 100644
index 00000000..ffb53b0d
--- /dev/null
+++ b/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/components/atoms/SvgImages.kt
@@ -0,0 +1,33 @@
+package network.bisq.mobile.presentation.ui.components.atoms
+
+import androidx.compose.runtime.Composable
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.graphics.ColorFilter
+import bisqapps.shared.presentation.generated.resources.Res
+import coil3.compose.AsyncImage
+import org.jetbrains.compose.resources.ExperimentalResourceApi
+
+@OptIn(ExperimentalResourceApi::class)
+@Composable
+fun SvgImage(
+ image: String,
+ modifier: Modifier,
+ colorFilter: ColorFilter = ColorFilter.tint(Color.White) // can be switched based on Theme
+){
+ AsyncImage(
+ model = Res.getUri("drawable/$image"),
+ contentDescription = null,
+ modifier = modifier,
+ colorFilter = colorFilter
+ )
+}
+
+object SvgImageNames {
+ const val BACK_BUTTON = "svg_back_button.svg"
+ const val STAR = "svg_star.svg"
+ const val INFO = "svg_info.svg"
+ const val EXCHANGE_VERTICAL_ARROW = "svg_exchange_v_arrow.svg"
+ const val EXCHANGE_HORIZONTAL_ARROW = "svg_exchange_h_arrow.svg"
+ const val UP_ARROW = "svg_up_arrow.svg"
+}
\ No newline at end of file
diff --git a/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/components/atoms/Text.kt b/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/components/atoms/Text.kt
index f26ac43c..b5ca9957 100644
--- a/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/components/atoms/Text.kt
+++ b/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/components/atoms/Text.kt
@@ -9,6 +9,7 @@ import org.jetbrains.compose.resources.Font
import androidx.compose.ui.text.font.FontFamily
import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.unit.TextUnit
+import androidx.compose.ui.unit.TextUnitType
import bisqapps.shared.presentation.generated.resources.Res
import bisqapps.shared.presentation.generated.resources.ibm_plex_sans_light
import bisqapps.shared.presentation.generated.resources.ibm_plex_sans_regular
@@ -44,6 +45,7 @@ object BisqText {
fontSize: FontSize = FontSize.BASE,
fontWeight: FontWeight = FontWeight.REGULAR,
textAlign: TextAlign = TextAlign.Start,
+ lineHeight: TextUnit = TextUnit.Unspecified,
modifier: Modifier = Modifier,
) {
@@ -60,6 +62,7 @@ object BisqText {
fontSize = fontSize.size,
fontFamily = fontFamily,
textAlign = textAlign,
+ lineHeight = lineHeight,
modifier = modifier,
)
}
@@ -215,6 +218,7 @@ object BisqText {
fontWeight = FontWeight.LIGHT,
color=color,
textAlign = textAlign,
+ lineHeight = TextUnit(16.0f, TextUnitType.Sp),
modifier = modifier,
)
}
@@ -232,6 +236,7 @@ object BisqText {
fontWeight = FontWeight.REGULAR,
color=color,
textAlign = textAlign,
+ lineHeight = TextUnit(16.0f, TextUnitType.Sp),
modifier = modifier,
)
}
@@ -249,6 +254,7 @@ object BisqText {
fontWeight = FontWeight.MEDIUM,
color=color,
textAlign = textAlign,
+ lineHeight = TextUnit(16.0f, TextUnitType.Sp),
modifier = modifier,
)
}
@@ -266,6 +272,7 @@ object BisqText {
fontWeight = FontWeight.BOLD,
color=color,
textAlign = textAlign,
+ lineHeight = TextUnit(16.0f, TextUnitType.Sp),
modifier = modifier,
)
}
diff --git a/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/components/atoms/TextField.kt b/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/components/atoms/TextField.kt
index fa7c62bb..27809acd 100644
--- a/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/components/atoms/TextField.kt
+++ b/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/components/atoms/TextField.kt
@@ -26,10 +26,11 @@ fun BisqTextField(
label: String,
value: String,
onValueChanged: (String) -> Unit,
- placeholder: String?,
+ placeholder: String? = null,
labelRightSuffix: (@Composable () -> Unit)? = null,
+ disabled: Boolean = false,
modifier: Modifier = Modifier,
- ) {
+) {
var isFocused by remember { mutableStateOf(false) }
Column(modifier = modifier) {
if (label.isNotEmpty()) {
@@ -41,7 +42,7 @@ fun BisqTextField(
BisqText.baseRegular(
text = label,
color = BisqTheme.colors.light2,
- )
+ )
if (labelRightSuffix != null) {
labelRightSuffix()
}
@@ -59,7 +60,7 @@ fun BisqTextField(
modifier = Modifier.fillMaxWidth().clickable { isFocused = true }
.onFocusChanged { focusState ->
isFocused = focusState.isFocused
- },
+ },
textStyle = TextStyle(fontSize = 22.sp),
onValueChange = onValueChanged,
colors = TextFieldDefaults.colors(
@@ -76,9 +77,10 @@ fun BisqTextField(
BisqText.h5Regular(
text = placeholder,
color = BisqTheme.colors.secondaryHover,
- )
+ )
}
- }
+ },
+ enabled = !disabled,
)
if (isFocused) {
Box(
diff --git a/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/components/atoms/icons/Icons.kt b/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/components/atoms/icons/Icons.kt
index 61df3399..5dfe2abc 100644
--- a/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/components/atoms/icons/Icons.kt
+++ b/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/components/atoms/icons/Icons.kt
@@ -1,9 +1,11 @@
package network.bisq.mobile.presentation.ui.components.atoms.icons
import androidx.compose.foundation.Image
+import androidx.compose.foundation.layout.size
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.painter.Painter
+import androidx.compose.ui.unit.dp
import bisqapps.shared.presentation.generated.resources.Res
import bisqapps.shared.presentation.generated.resources.*
import network.bisq.mobile.domain.PlatformImage
@@ -12,15 +14,30 @@ import org.jetbrains.compose.resources.painterResource
expect fun rememberPlatformImagePainter(platformImage: PlatformImage): Painter
@Composable
-fun BellIcon(modifier: Modifier = Modifier) {
+fun BellIcon(modifier: Modifier = Modifier.size(30.dp)) {
Image(painterResource(Res.drawable.icon_bell), "Bell icon", modifier = modifier)
}
+@Composable
+fun ChatIcon(modifier: Modifier = Modifier) {
+ Image(painterResource(Res.drawable.icon_chat_outlined), "Chat icon", modifier = modifier)
+}
+
@Composable
fun CopyIcon(modifier: Modifier = Modifier) {
Image(painterResource(Res.drawable.icon_copy), "Copy icon", modifier = modifier)
}
+@Composable
+fun SwapHArrowIcon(modifier: Modifier = Modifier.size(16.dp)) {
+ Image(painterResource(Res.drawable.exchange_h_arrow), "Swap horizontal icon", modifier = modifier)
+}
+
+@Composable
+fun SwapVArrowIcon(modifier: Modifier = Modifier.size(16.dp)) {
+ Image(painterResource(Res.drawable.exchange_v_arrow), "Swap vertical icon", modifier = modifier)
+}
+
@Composable
fun QuestionIcon(modifier: Modifier = Modifier) {
Image(painterResource(Res.drawable.icon_question_mark), "Question icon", modifier = modifier)
@@ -36,6 +53,22 @@ fun SortIcon(modifier: Modifier = Modifier) {
Image(painterResource(Res.drawable.icon_sort), "Sort icon", modifier = modifier)
}
+@Composable
+fun StarEmptyIcon(modifier: Modifier = Modifier.size(16.dp)) {
+ // TODO: Import right resource for this
+ Image(painterResource(Res.drawable.icon_star), "Empty star icon", modifier = modifier)
+}
+
+@Composable
+fun StarFillIcon(modifier: Modifier = Modifier.size(16.dp)) {
+ Image(painterResource(Res.drawable.icon_star), "Filled star icon", modifier = modifier)
+}
+
+@Composable
+fun UpIcon(modifier: Modifier = Modifier.size(30.dp)) {
+ Image(painterResource(Res.drawable.up_arrow), "Up icon", modifier = modifier)
+}
+
@Composable
fun UserIcon(platformImage: PlatformImage?, modifier: Modifier = Modifier) {
if (platformImage == null) {
diff --git a/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/components/layout/MultiScreenWizardScaffold.kt b/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/components/layout/MultiScreenWizardScaffold.kt
new file mode 100644
index 00000000..199f50b4
--- /dev/null
+++ b/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/components/layout/MultiScreenWizardScaffold.kt
@@ -0,0 +1,96 @@
+package network.bisq.mobile.presentation.ui.components.layout
+
+import androidx.compose.foundation.layout.*
+import androidx.compose.material3.BottomAppBar
+import androidx.compose.runtime.*
+import androidx.compose.ui.Alignment
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.unit.dp
+import cafe.adriel.lyricist.LocalStrings
+import network.bisq.mobile.presentation.ui.components.atoms.*
+import network.bisq.mobile.presentation.ui.components.molecules.TopBar
+import network.bisq.mobile.presentation.ui.theme.BisqTheme
+import network.bisq.mobile.presentation.ui.theme.BisqUIConstants
+
+@Composable
+fun MultiScreenWizardScaffold(
+ title: String,
+ stepIndex: Int,
+ stepsLength: Int,
+ prevButtonText: String = LocalStrings.current.common.buttons_back,
+ nextButtonText: String = LocalStrings.current.common.buttons_next,
+ prevOnClick: (() -> Unit)? = null,
+ nextOnClick: (() -> Unit)? = null,
+ content: @Composable ColumnScope.() -> Unit
+) {
+ BisqScrollScaffold(
+ padding = PaddingValues(all = 0.dp),
+ topBar = {
+ TopBar(title, isFlowScreen = true, stepText = "$stepIndex/$stepsLength")
+ },
+ bottomBar = {
+ // TODO: This takes up too much height
+ BottomAppBar(
+ containerColor = BisqTheme.colors.backgroundColor,
+ contentPadding = PaddingValues(horizontal = BisqUIConstants.ScreenPadding2X, vertical = 0.dp),
+ windowInsets = WindowInsets(top = 0.dp, bottom = 0.dp)
+ ) {
+ Row(
+ modifier = Modifier.fillMaxWidth(),
+ horizontalArrangement = Arrangement.SpaceBetween
+ ) {
+ BisqButton(
+ text = prevButtonText,
+ backgroundColor = BisqTheme.colors.dark5,
+ onClick = {
+ if (prevOnClick != null) {
+ prevOnClick()
+ }
+ },
+ padding = PaddingValues(horizontal = 48.dp, vertical = 4.dp),
+ disabled = prevOnClick == null
+ )
+ BisqButton(
+ text = nextButtonText,
+ onClick = {
+ if (nextOnClick != null) {
+ nextOnClick()
+ }
+ },
+ padding = PaddingValues(horizontal = 48.dp, vertical = 4.dp),
+ disabled = nextOnClick == null
+ )
+ }
+ }
+
+ }
+ ) {
+ // TODO: Get correct full width
+ val screenSize = remember { mutableStateOf(320) }
+
+ BisqProgressBar(
+ stepIndex.toFloat() * screenSize.value / stepsLength.toFloat(),
+ modifier = Modifier.fillMaxWidth().padding(top = 16.dp)
+ )
+
+ // TODO: Should pass these values to the column deep inside BisqScrollLayout
+ // as BissScrollScaffold's params, rather than creating a column here?
+ // 2X screen padding for Flow screens
+ Column(
+ modifier = Modifier.fillMaxHeight().padding(
+ horizontal = BisqUIConstants.ScreenPadding2X,
+ vertical = BisqUIConstants.ScreenPadding2X
+ ),
+ verticalArrangement = Arrangement.Top,
+ horizontalAlignment = Alignment.CenterHorizontally
+ ) {
+ content()
+ }
+
+ }
+}
+
+
+
+
+
diff --git a/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/components/layout/ScrollLayout.kt b/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/components/layout/ScrollLayout.kt
index 67208daf..8776b836 100644
--- a/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/components/layout/ScrollLayout.kt
+++ b/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/components/layout/ScrollLayout.kt
@@ -4,23 +4,22 @@ 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
import network.bisq.mobile.presentation.ui.theme.BisqUIConstants
@Composable
fun BisqScrollLayout(
padding: PaddingValues = PaddingValues(all = BisqUIConstants.ScreenPadding),
+ horizontalAlignment: Alignment.Horizontal = Alignment.CenterHorizontally,
verticalArrangement: Arrangement.Vertical = Arrangement.Top,
content: @Composable ColumnScope.() -> Unit
) {
Column(
- horizontalAlignment = Alignment.CenterHorizontally,
- verticalArrangement = verticalArrangement ?: Arrangement.Top,
+ horizontalAlignment = horizontalAlignment,
+ verticalArrangement = verticalArrangement,
modifier = Modifier
.fillMaxSize()
.background(color = BisqTheme.colors.backgroundColor)
diff --git a/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/components/layout/StaticScaffold.kt b/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/components/layout/StaticScaffold.kt
index 79a4f5f9..a40c0b05 100644
--- a/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/components/layout/StaticScaffold.kt
+++ b/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/components/layout/StaticScaffold.kt
@@ -4,6 +4,8 @@ import androidx.compose.foundation.layout.*
import androidx.compose.material3.Scaffold
import androidx.compose.material3.TopAppBar
import androidx.compose.runtime.Composable
+import androidx.compose.ui.Alignment
+import androidx.compose.ui.Modifier
import network.bisq.mobile.presentation.ui.theme.BisqTheme
import network.bisq.mobile.presentation.ui.theme.BisqUIConstants
@@ -17,14 +19,33 @@ fun BisqStaticScaffold(
),
topBar: @Composable (() -> Unit)? = null,
bottomBar: @Composable (() -> Unit)? = null,
+ verticalArrangement: Arrangement.Vertical = Arrangement.Top,
content: @Composable ColumnScope.() -> Unit
) {
Scaffold(
containerColor = BisqTheme.colors.backgroundColor,
topBar = topBar ?: {},
bottomBar = bottomBar ?: {},
- content = {
- BisqStaticLayout(padding = if (topBar != null) it else padding) { content() }
+ content = { it ->
+ BisqStaticLayout(
+ padding = if (topBar != null) it else padding,
+ verticalArrangement = verticalArrangement
+ ) {
+ // Padding logic:
+ // when topBar is set, Scaffold.content.it provides the padding
+ // to offset topBar height, which is passed to BisqStaticLayout
+ // But then the content()'s get attached to the screen edges.
+ // So in that case, we add another column to provde ScreenPadding on all sides.
+ if (topBar != null)
+ Column(
+ modifier = Modifier.padding(all = BisqUIConstants.ScreenPadding),
+ horizontalAlignment = Alignment.CenterHorizontally
+ ) {
+ content()
+ }
+ else
+ content()
+ }
}
)
}
diff --git a/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/components/molecules/AmountSelector.kt b/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/components/molecules/AmountSelector.kt
new file mode 100644
index 00000000..84ab0e41
--- /dev/null
+++ b/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/components/molecules/AmountSelector.kt
@@ -0,0 +1,96 @@
+package network.bisq.mobile.presentation.ui.components.molecules
+
+import androidx.compose.foundation.layout.*
+import androidx.compose.material3.ExperimentalMaterial3Api
+import androidx.compose.runtime.*
+import androidx.compose.ui.Alignment
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.graphics.ColorFilter
+import androidx.compose.ui.unit.dp
+import network.bisq.mobile.presentation.ui.components.atoms.BisqSlider
+import network.bisq.mobile.presentation.ui.components.atoms.BisqText
+import network.bisq.mobile.presentation.ui.components.atoms.SvgImage
+import network.bisq.mobile.presentation.ui.components.atoms.SvgImageNames
+import network.bisq.mobile.presentation.ui.theme.BisqTheme
+import kotlin.math.roundToInt
+
+@OptIn(ExperimentalMaterial3Api::class)
+@Composable
+fun BisqAmountSelector(
+ minAmount: Float,
+ maxAmount: Float,
+ exchangeRate: Double,
+ currency: String
+) {
+ var sliderPosition by remember { mutableFloatStateOf((minAmount + maxAmount) * 0.5f) }
+ val roundedNumber = (sliderPosition * 100).roundToInt() / 100.0
+ val price = if (roundedNumber.toString().split(".").getOrNull(1)?.length == 1)
+ "${roundedNumber}0" // to make 3.1 to 3.10
+ else
+ roundedNumber.toString() // if it's 3.14, keep the same
+
+ val satsValue = (price.toDouble() / exchangeRate).toString()
+
+ Column(
+ verticalArrangement = Arrangement.Top
+ ) {
+ Column(
+ modifier = Modifier.fillMaxWidth().padding(horizontal = 24.dp),
+ verticalArrangement = Arrangement.spacedBy(16.dp),
+ horizontalAlignment = Alignment.CenterHorizontally
+ ) {
+ Row(
+ horizontalArrangement = Arrangement.spacedBy(24.dp),
+ verticalAlignment = Alignment.Bottom
+ ) {
+ BisqText.h1Regular(
+ text = price,
+ )
+ BisqText.h5Regular(
+ text = currency
+ )
+ }
+ Row(
+ horizontalArrangement = Arrangement.spacedBy(8.dp),
+ verticalAlignment = Alignment.Top
+ ) {
+ // TODO: Do the btc-sats display control, as suggested by cbeams
+ BisqText.h5Regular(
+ text = "$satsValue btc",
+ color = BisqTheme.colors.grey2
+ )
+ SvgImage(
+ image = SvgImageNames.INFO,
+ modifier = Modifier.size(16.dp),
+ colorFilter = ColorFilter.tint(BisqTheme.colors.grey2)
+ )
+ }
+ }
+
+ Column(modifier = Modifier.padding(horizontal = 24.dp)) {
+ BisqSlider(
+ minAmount,
+ maxAmount,
+ sliderPosition,
+ onValueChange = { sliderPosition = it }
+ )
+ Row(
+ verticalAlignment = Alignment.CenterVertically,
+ horizontalArrangement = Arrangement.SpaceBetween,
+ modifier = Modifier.fillMaxWidth().padding(horizontal = 6.dp)
+ ) {
+
+ val minString = minAmount // Do precision rounding to 2 decimals
+ val maxString = maxAmount // Do precision rounding to 2 decimals
+ BisqText.smallRegular(
+ text = "Min $minString $currency",
+ color = BisqTheme.colors.grey2
+ )
+ BisqText.smallRegular(
+ text = "Max $maxString $currency",
+ color = BisqTheme.colors.grey2
+ )
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/components/molecules/BisqDialog.kt b/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/components/molecules/BisqDialog.kt
index 11168f56..49465224 100644
--- a/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/components/molecules/BisqDialog.kt
+++ b/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/components/molecules/BisqDialog.kt
@@ -1,6 +1,5 @@
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
@@ -38,8 +37,7 @@ fun BisqDialog(
disabledContainerColor = Color.Unspecified,
disabledContentColor = Color.Unspecified,
),
- border = BorderStroke(1.dp, color = BisqTheme.colors.grey3),
- shape = RoundedCornerShape(8.dp),
+ shape = RoundedCornerShape(16.dp),
) {
content()
}
diff --git a/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/components/molecules/DirectionToggle.kt b/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/components/molecules/DirectionToggle.kt
index 22485aea..21db242d 100644
--- a/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/components/molecules/DirectionToggle.kt
+++ b/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/components/molecules/DirectionToggle.kt
@@ -22,6 +22,8 @@ import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.alpha
import androidx.compose.ui.unit.Dp
import androidx.compose.ui.unit.dp
+import cafe.adriel.lyricist.LocalStrings
+import kotlinx.coroutines.selects.select
import network.bisq.mobile.client.replicated_model.offer.Direction
import network.bisq.mobile.presentation.ui.components.atoms.BisqText
import network.bisq.mobile.presentation.ui.theme.BisqTheme
@@ -33,6 +35,7 @@ fun DirectionToggle(
transitionX: Dp,
onStateChange: (Direction) -> Unit
) {
+ val strings = LocalStrings.current.common
var selectedDirection by remember {
mutableStateOf(initialDirection)
}
@@ -42,6 +45,8 @@ fun DirectionToggle(
animationSpec = tween(durationMillis = 300)
)
+ val toggleText = if (selectedDirection.isBuy) strings.offers_list_buy_from else strings.offers_list_sell_to
+
Surface(
shape = RoundedCornerShape(6.dp),
modifier = Modifier.wrapContentSize()
@@ -58,7 +63,7 @@ fun DirectionToggle(
) {
BisqText.baseMedium(
- text = toDisplayString(selectedDirection),
+ text = toggleText,
color = BisqTheme.colors.light1,
modifier = Modifier
.padding(horizontal = 32.dp, vertical = 12.dp)
@@ -68,10 +73,8 @@ fun DirectionToggle(
Row(
verticalAlignment = Alignment.CenterVertically,
) {
- directions.forEach { direction ->
- BisqText.baseMedium(
- text = toDisplayString(direction),
- color = BisqTheme.colors.light1,
+ directions.forEach{ direction ->
+ Box(
modifier = Modifier
.padding(horizontal = 32.dp, vertical = 12.dp)
.clickable(
@@ -82,13 +85,14 @@ fun DirectionToggle(
onStateChange.invoke(direction)
}
)
- )
+ ) {
+ BisqText.baseMedium(
+ text = toggleText,
+ color = BisqTheme.colors.light1,
+ )
+ }
}
}
}
}
-}
-
-fun toDisplayString(direction: Direction): String {
- return if (direction.mirror().isBuy) "Buy from" else "Sell to"
-}
+}
\ No newline at end of file
diff --git a/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/components/molecules/OfferCard.kt b/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/components/molecules/OfferCard.kt
index 0a0a9703..6efac1f9 100644
--- a/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/components/molecules/OfferCard.kt
+++ b/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/components/molecules/OfferCard.kt
@@ -4,42 +4,52 @@ 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.layout.*
import androidx.compose.foundation.shape.RoundedCornerShape
+import androidx.compose.material3.IconButton
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.graphics.Color
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.domain.data.model.OfferListItem
import network.bisq.mobile.presentation.ui.components.atoms.BisqText
+import network.bisq.mobile.presentation.ui.components.atoms.BisqVDivider
import network.bisq.mobile.presentation.ui.components.atoms.PaymentMethods
import network.bisq.mobile.presentation.ui.components.atoms.ProfileRating
+import network.bisq.mobile.presentation.ui.components.atoms.icons.ChatIcon
import network.bisq.mobile.presentation.ui.theme.BisqTheme
import org.jetbrains.compose.resources.painterResource
@Composable
-fun OfferCard(item: OfferListItem, onClick: () -> Unit) {
+fun OfferCard(
+ item: OfferListItem,
+ onClick: () -> Unit,
+ onChatClick: () -> Unit,
+ ) {
Row(
- modifier = Modifier.clip(shape = RoundedCornerShape(8.dp)).padding(vertical = 5.dp),
-
- ) {
+ modifier = Modifier
+ .fillMaxWidth()
+ .clip(shape = RoundedCornerShape(8.dp))
+ .background(color = BisqTheme.colors.dark5)
+ ) {
Row(
- modifier = Modifier.background(color = BisqTheme.colors.dark5).padding(12.dp).clickable(
- interactionSource = remember { MutableInteractionSource() },
- indication = null,
- onClick = onClick
- ),
- verticalAlignment = Alignment.CenterVertically
+ modifier = Modifier
+ .weight(1f)
+ .fillMaxWidth()
+ .padding(12.dp)
+ .clickable(
+ interactionSource = remember { MutableInteractionSource() },
+ indication = null,
+ onClick = onClick
+ ),
+ verticalAlignment = Alignment.CenterVertically,
+ horizontalArrangement = Arrangement.SpaceBetween
) {
Column(verticalArrangement = Arrangement.spacedBy(12.dp)) {
ProfileRating(item)
@@ -49,34 +59,30 @@ fun OfferCard(item: OfferListItem, onClick: () -> Unit) {
horizontalAlignment = Alignment.End,
verticalArrangement = Arrangement.SpaceBetween
) {
- BisqText.baseRegular(
- // text = "\$50 - \$200",
- text = item.formattedQuoteAmount,
- color = BisqTheme.colors.light1
- )
BisqText.smallMedium(
// text = "\$52,000 / BTC",
text = item.formattedPrice,
+ color = BisqTheme.colors.primary
+ )
+ BisqText.largeRegular(
+ text = "\$98,000 / BTC",
color = BisqTheme.colors.grey1
)
-
+ BisqText.baseRegular(
+ text = item.formattedQuoteAmount,
+ color = BisqTheme.colors.light1
+ )
}
}
- VerticalDivider(
- thickness = 2.dp,
- color = BisqTheme.colors.grey3,
- modifier = Modifier.height(98.dp)
- )
+ BisqVDivider()
Column(
verticalArrangement = Arrangement.Center,
- modifier = Modifier.background(color = BisqTheme.colors.dark4)
- .padding(horizontal = 10.dp, vertical = 41.dp)
+ horizontalAlignment = Alignment.CenterHorizontally,
+ modifier = Modifier.width(36.dp).height(108.dp).background(color = BisqTheme.colors.dark4)
) {
- Image(
- painterResource(Res.drawable.icon_chat_outlined),
- "",
- modifier = Modifier.size(16.dp),
- )
+ IconButton(onClick = onChatClick) {
+ ChatIcon(modifier = Modifier.size(24.dp))
+ }
}
}
}
\ No newline at end of file
diff --git a/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/components/molecules/TopBar.kt b/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/components/molecules/TopBar.kt
index 45a33f90..4e00e2c5 100644
--- a/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/components/molecules/TopBar.kt
+++ b/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/components/molecules/TopBar.kt
@@ -1,11 +1,6 @@
package network.bisq.mobile.presentation.ui.components.molecules
-import androidx.compose.foundation.layout.Row
-import androidx.compose.foundation.layout.Spacer
-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.material.icons.Icons
import androidx.compose.material.icons.automirrored.filled.ArrowBack
import androidx.compose.material3.*
@@ -18,6 +13,10 @@ import kotlinx.coroutines.flow.StateFlow
import network.bisq.mobile.domain.PlatformImage
import network.bisq.mobile.presentation.ViewPresenter
import network.bisq.mobile.presentation.ui.components.atoms.BisqText
+import androidx.compose.material3.ExperimentalMaterial3Api
+import androidx.compose.material3.IconButton
+import androidx.compose.material3.TopAppBar
+import androidx.compose.material3.TopAppBarDefaults
import network.bisq.mobile.presentation.ui.components.atoms.icons.BellIcon
import network.bisq.mobile.presentation.ui.components.atoms.icons.BisqLogoSmall
import network.bisq.mobile.presentation.ui.components.atoms.icons.UserIcon
@@ -34,7 +33,9 @@ interface ITopBarPresenter: ViewPresenter {
fun TopBar(
title: String = "",
isHome: Boolean = false,
- customBackButton: @Composable (() -> Unit)? = null
+ customBackButton: @Composable (() -> Unit)? = null,
+ isFlowScreen: Boolean = false,
+ stepText: String = ""
) {
val navController: NavHostController = koinInject(named("RootNavController"))
val presenter: ITopBarPresenter = koinInject()
@@ -50,7 +51,7 @@ fun TopBar(
Icon(
Icons.AutoMirrored.Filled.ArrowBack,
contentDescription = "Back",
- tint = BisqTheme.colors.primary
+ tint = BisqTheme.colors.grey1
)
}
}
@@ -70,15 +71,33 @@ fun TopBar(
if (isHome) {
BisqLogoSmall(modifier = Modifier.height(34.dp).width(100.dp))
} else {
- BisqText.h4Medium(
- text = title,
- color = BisqTheme.colors.light1,
- )
+ if (isFlowScreen) {
+ Column {
+ BisqText.smallRegular(
+ text = "Step $stepText",
+ color = BisqTheme.colors.grey1,
+ // modifier = Modifier.padding(top= 8.dp)
+ modifier = Modifier.offset(y = (8).dp)
+ )
+ BisqText.h5Medium(
+ text = title,
+ color = BisqTheme.colors.light1,
+ )
+ }
+ } else {
+ BisqText.h4Medium(
+ text = title,
+ color = BisqTheme.colors.light1,
+ )
+ }
}
},
actions = {
- Row(modifier = Modifier.padding(end = 16.dp), verticalAlignment = Alignment.CenterVertically) {
- BellIcon(modifier = Modifier.size(30.dp))
+ Row(
+ modifier = Modifier.padding(top = if (isFlowScreen) 15.dp else 0.dp, end = 16.dp),
+ verticalAlignment = Alignment.CenterVertically
+ ) {
+ BellIcon()
Spacer(modifier = Modifier.width(12.dp))
UserIcon(presenter.uniqueAvatar.value, modifier = Modifier.size(30.dp))
}
diff --git a/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/components/molecules/info/InfoBox.kt b/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/components/molecules/info/InfoBox.kt
new file mode 100644
index 00000000..b98ca259
--- /dev/null
+++ b/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/components/molecules/info/InfoBox.kt
@@ -0,0 +1,80 @@
+package network.bisq.mobile.presentation.ui.components.molecules.info
+
+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 network.bisq.mobile.presentation.ui.components.atoms.BisqText
+import network.bisq.mobile.presentation.ui.theme.BisqTheme
+
+enum class InfoBoxValueType {
+ BoldValue,
+ SmallValue,
+ TitleSmall,
+}
+
+enum class InfoBoxStyle {
+ Style1, // Label on top, value below
+ Style2 // Value on top, label below
+}
+
+@Composable
+fun InfoBox(
+ label: String,
+ value: String? = null,
+ valueComposable: (@Composable () -> Unit)? = null,
+ rightAlign: Boolean = false,
+ valueType: InfoBoxValueType = InfoBoxValueType.BoldValue,
+ style: InfoBoxStyle = InfoBoxStyle.Style1,
+) {
+
+ val valueWidget: @Composable () -> Unit = if (value != null) {
+ {
+ when (valueType) {
+ InfoBoxValueType.BoldValue -> if (style == InfoBoxStyle.Style1) BisqText.h6Regular(text = value) else (BisqText.baseRegular(text = value))
+ InfoBoxValueType.SmallValue -> BisqText.baseRegular(text = value)
+ InfoBoxValueType.TitleSmall -> BisqText.h4Regular(text = value)
+ }
+ }
+ } else if (valueComposable != null) {
+ {
+ valueComposable()
+ }
+ } else {
+ {
+ BisqText.h6Regular(text = "[ERR] Pass either value or valueComposable", color = BisqTheme.colors.danger)
+ }
+ }
+
+ when (style) {
+ InfoBoxStyle.Style1 -> {
+ Column(
+ horizontalAlignment = if (rightAlign) Alignment.End else Alignment.Start,
+ verticalArrangement = Arrangement.spacedBy(2.dp)
+ ) {
+ BisqText.baseRegular(text = label, color = BisqTheme.colors.grey2)
+ valueWidget()
+ }
+ }
+ InfoBoxStyle.Style2 -> {
+ Column(
+ horizontalAlignment = if (rightAlign) Alignment.End else Alignment.Start,
+ verticalArrangement = Arrangement.spacedBy(0.dp)
+ ) {
+ valueWidget()
+ BisqText.smallRegular(text = label, color = BisqTheme.colors.grey2, modifier = Modifier.offset(y = (-4).dp))
+ }
+ }
+ }
+
+ /*
+ Column(
+ horizontalAlignment = if (rightAlign) Alignment.End else Alignment.Start,
+ verticalArrangement = Arrangement.spacedBy(2.dp)
+ ) {
+ BisqText.baseRegular(text = label, color = BisqTheme.colors.grey2)
+ valueWidget()
+ }
+ */
+}
diff --git a/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/components/molecules/info/InfoRow.kt b/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/components/molecules/info/InfoRow.kt
new file mode 100644
index 00000000..0152e0dc
--- /dev/null
+++ b/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/components/molecules/info/InfoRow.kt
@@ -0,0 +1,34 @@
+package network.bisq.mobile.presentation.ui.components.molecules.info
+
+import androidx.compose.foundation.layout.*
+import androidx.compose.runtime.Composable
+import androidx.compose.ui.Modifier
+
+@Composable
+fun InfoRow(
+ label1: String,
+ value1: String,
+ label2: String,
+ value2: String,
+ valueType: InfoBoxValueType = InfoBoxValueType.BoldValue,
+ style: InfoBoxStyle = InfoBoxStyle.Style1,
+) {
+ Row(
+ modifier = Modifier.fillMaxWidth(),
+ horizontalArrangement = Arrangement.SpaceBetween
+ ) {
+ InfoBox(
+ label = label1,
+ value = value1,
+ valueType = valueType,
+ style = style,
+ )
+ InfoBox(
+ label = label2,
+ value = value2,
+ valueType = valueType,
+ rightAlign = true,
+ style = style,
+ )
+ }
+}
\ No newline at end of file
diff --git a/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/components/organisms/trades/CloseTradeCard.kt b/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/components/organisms/trades/CloseTradeCard.kt
new file mode 100644
index 00000000..1f544442
--- /dev/null
+++ b/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/components/organisms/trades/CloseTradeCard.kt
@@ -0,0 +1,55 @@
+package network.bisq.mobile.presentation.ui.components.organisms.trades
+
+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.text.style.TextAlign
+import androidx.compose.ui.unit.dp
+import cafe.adriel.lyricist.LocalStrings
+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 CloseTradeCard(
+ onDismissRequest: () -> Unit,
+ onConfirm: () -> Unit
+) {
+ val strings = LocalStrings.current.bisqEasyTradeState
+ val stringsBisqEasy = LocalStrings.current.bisqEasy
+ val stringsCommon = LocalStrings.current.common
+
+ Column(
+ modifier = Modifier.padding(24.dp),
+ verticalArrangement = Arrangement.spacedBy(24.dp),
+ horizontalAlignment = Alignment.CenterHorizontally
+ ) {
+
+ BisqText.h4Regular(text = strings.bisqEasy_tradeState_phase4)
+
+ BisqText.baseRegular(
+ text = stringsBisqEasy.bisqEasy_openTrades_closeTrade_warning_completed,
+ color = BisqTheme.colors.grey1,
+ textAlign = TextAlign.Center
+ )
+
+ Row(horizontalArrangement = Arrangement.spacedBy(12.dp)) {
+ BisqButton(
+ text = stringsCommon.buttons_cancel,
+ backgroundColor = BisqTheme.colors.dark5,
+ onClick = onDismissRequest,
+ padding = PaddingValues(horizontal = 20.dp, vertical = 8.dp)
+ )
+ BisqButton(
+ text = stringsBisqEasy.bisqEasy_openTrades_confirmCloseTrade,
+ onClick = onConfirm,
+ padding = PaddingValues(horizontal = 12.dp, vertical = 8.dp)
+ )
+ }
+ }
+}
\ No newline at end of file
diff --git a/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/components/organisms/trades/StepperSection.kt b/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/components/organisms/trades/StepperSection.kt
new file mode 100644
index 00000000..beb2f190
--- /dev/null
+++ b/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/components/organisms/trades/StepperSection.kt
@@ -0,0 +1,84 @@
+package network.bisq.mobile.presentation.ui.components.organisms.trades
+
+import androidx.compose.foundation.layout.*
+import androidx.compose.runtime.*
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.draw.drawBehind
+import androidx.compose.ui.geometry.Offset
+import androidx.compose.ui.graphics.drawscope.Stroke
+import androidx.compose.ui.text.style.TextAlign
+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 StepperSection(
+ stepNumber: Int = 0,
+ isActive: Boolean = false,
+ isLastIndex: Boolean = false,
+ contentStartOffset: Dp = 32.dp,
+ spacerBetweenNodes: Dp = 32.dp,
+ content: @Composable BoxScope.(modifier: Modifier) -> Unit
+) {
+ val lineColor = BisqTheme.colors.dark5
+ Box(
+ modifier = Modifier.wrapContentSize().drawBehind {
+ drawLine(
+ color = lineColor,
+ start = Offset(x = 12.dp.toPx(), y = 12.dp.toPx() * 2),
+ end = Offset(x = 12.dp.toPx(), y = this.size.height),
+ strokeWidth = 1.dp.toPx()
+ )
+
+ }
+ ) {
+ val primary = BisqTheme.colors.primary
+ Box(
+ modifier = Modifier.wrapContentSize().drawBehind {
+ if (isActive) {
+ drawCircle(
+ color = lineColor,
+ radius = 12.dp.toPx(),
+ center = Offset(12.dp.toPx(), 12.dp.toPx()),
+ )
+ drawCircle(
+ color = primary,
+ radius = 8.dp.toPx(),
+ center = Offset(12.dp.toPx(), 12.dp.toPx()),
+ )
+ drawCircle(
+ color = primary,
+ radius = 12.dp.toPx(),
+ center = Offset(12.dp.toPx(), 12.dp.toPx()),
+ style = Stroke(width = 1.dp.toPx())
+ )
+ } else {
+ drawCircle(
+ color = lineColor,
+ radius = 12.dp.toPx(),
+ center = Offset(12.dp.toPx(), 12.dp.toPx()),
+ )
+ }
+
+ }) {
+
+ BisqText.xsmallRegular(
+ textAlign = TextAlign.Center,
+ text = stepNumber.toString(),
+ modifier = Modifier.padding(start = 8.dp).offset(x = 1.dp, y = (-4).dp)
+ )
+ }
+ content(
+ Modifier
+ .padding(
+ start = contentStartOffset,
+ bottom = if (isLastIndex) {
+ 0.dp
+ } else {
+ spacerBetweenNodes
+ }
+ )
+ )
+ }
+}
diff --git a/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/components/organisms/trades/TradeFlowAccountDetails.kt b/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/components/organisms/trades/TradeFlowAccountDetails.kt
new file mode 100644
index 00000000..3bcee449
--- /dev/null
+++ b/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/components/organisms/trades/TradeFlowAccountDetails.kt
@@ -0,0 +1,56 @@
+package network.bisq.mobile.presentation.ui.components.organisms.trades
+
+import androidx.compose.foundation.layout.*
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.collectAsState
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.unit.dp
+import cafe.adriel.lyricist.LocalStrings
+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.atoms.BisqTextField
+import network.bisq.mobile.presentation.ui.theme.BisqUIConstants
+import network.bisq.mobile.presentation.ui.uicases.trades.ITradeFlowPresenter
+import org.koin.compose.koinInject
+
+/**
+ * Trade flow's 1st Stepper section
+ */
+@Composable
+fun TradeFlowAccountDetails(
+ onNext: () -> Unit
+) {
+ val strings = LocalStrings.current.bisqEasyTradeState
+ val stringsBisqEasy = LocalStrings.current.bisqEasy
+ val presenter: ITradeFlowPresenter = koinInject()
+
+ Column {
+ Spacer(modifier = Modifier.height(BisqUIConstants.ScreenPadding))
+ BisqText.baseRegular(text = strings.bisqEasy_tradeState_info_buyer_phase1a_seller_wait_message)
+ Spacer(modifier = Modifier.height(BisqUIConstants.ScreenPadding2X))
+ BisqText.h6Regular(
+ text = strings.bisqEasy_tradeState_info_buyer_phase1a_bitcoinPayment_headline_LN
+ )
+ Spacer(modifier = Modifier.height(BisqUIConstants.ScreenPadding))
+ BisqTextField(
+ label = strings.bisqEasy_tradeState_info_buyer_phase1a_bitcoinPayment_description_LN,
+ value = presenter.receiveAddress.collectAsState().value,
+ onValueChanged = { presenter.setReceiveAddress(it) },
+ )
+ Spacer(modifier = Modifier.height(BisqUIConstants.ScreenPadding))
+ BisqButton(
+ text = strings.bisqEasy_tradeState_info_buyer_phase1a_send,
+ onClick = onNext,
+ padding = PaddingValues(
+ horizontal = 18.dp,
+ vertical = 6.dp
+ )
+ )
+ Spacer(modifier = Modifier.height(BisqUIConstants.ScreenPadding))
+ BisqText.smallMedium(
+ text = strings.bisqEasy_tradeState_info_buyer_phase1a_wallet_prompt_prefix
+ )
+ // TODO: Make a small variation of the button
+ BisqButton(text = stringsBisqEasy.bisqEasy_walletGuide_tabs_headline, onClick = { presenter.openWalletGuideLink() })
+ }
+}
\ No newline at end of file
diff --git a/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/components/organisms/trades/TradeFlowBtcPayment.kt b/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/components/organisms/trades/TradeFlowBtcPayment.kt
new file mode 100644
index 00000000..743db543
--- /dev/null
+++ b/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/components/organisms/trades/TradeFlowBtcPayment.kt
@@ -0,0 +1,99 @@
+package network.bisq.mobile.presentation.ui.components.organisms.trades
+
+import androidx.compose.foundation.layout.*
+import androidx.compose.runtime.*
+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.img_bitcoin_payment_confirmation
+import bisqapps.shared.presentation.generated.resources.img_bitcoin_payment_waiting
+import cafe.adriel.lyricist.LocalStrings
+import kotlinx.coroutines.delay
+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.atoms.CircularLoadingImage
+import network.bisq.mobile.presentation.ui.theme.BisqTheme
+import network.bisq.mobile.presentation.ui.theme.BisqUIConstants
+
+/**
+ * Trade flow's 3rd Stepper section
+ */
+@Composable
+fun TradeFlowBtcPayment(
+ onNext: () -> Unit
+) {
+ val strings = LocalStrings.current.bisqEasyTradeState
+ var isLoading by remember { mutableStateOf(true) }
+ LaunchedEffect(Unit) {
+ delay(3000)
+ isLoading = false
+ }
+
+ if (isLoading) {
+ ShowLoaderBtcPayment(onNext)
+ return
+ }
+
+ Row(
+ verticalAlignment = Alignment.CenterVertically,
+ horizontalArrangement = Arrangement.spacedBy(16.dp)
+ ) {
+ Spacer(modifier = Modifier.height(BisqUIConstants.ScreenPadding))
+ CircularLoadingImage(
+ image = Res.drawable.img_bitcoin_payment_confirmation,
+ isLoading = !isLoading
+ )
+
+ Column(
+ verticalArrangement = Arrangement.spacedBy(
+ 12.dp
+ )
+ ) {
+ BisqText.h6Regular(
+ text = strings.bisqEasy_tradeState_info_buyer_phase3b_headline_ln,
+ )
+ BisqText.smallRegular(
+ text = strings.bisqEasy_tradeState_info_buyer_phase3b_info_ln,
+ color = BisqTheme.colors.grey1
+ )
+ BisqButton(
+ text = strings.bisqEasy_tradeState_info_buyer_phase3b_confirmButton_ln,
+ onClick = onNext,
+ padding = PaddingValues(horizontal = 18.dp, 6.dp)
+ )
+ }
+ }
+}
+
+@Composable
+fun ShowLoaderBtcPayment(
+ onNext: () -> Unit
+) {
+ val strings = LocalStrings.current.bisqEasyTradeState
+
+ Row(
+ verticalAlignment = Alignment.CenterVertically,
+ horizontalArrangement = Arrangement.spacedBy(16.dp)
+ ) {
+ Spacer(modifier = Modifier.height(BisqUIConstants.ScreenPadding))
+ CircularLoadingImage(
+ image = Res.drawable.img_bitcoin_payment_waiting,
+ isLoading = true
+ )
+
+ Column(
+ verticalArrangement = Arrangement.spacedBy(
+ 12.dp
+ )
+ ) {
+ BisqText.h6Regular(
+ text = strings.bisqEasy_tradeState_info_buyer_phase3a_seller_wait_message
+ )
+ BisqText.smallRegular(
+ text = strings.bisqEasy_tradeState_info_buyer_phase3a_info("Lightning invoice"),
+ color = BisqTheme.colors.grey1
+ )
+ }
+ }
+}
diff --git a/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/components/organisms/trades/TradeFlowCompleted.kt b/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/components/organisms/trades/TradeFlowCompleted.kt
new file mode 100644
index 00000000..772efdef
--- /dev/null
+++ b/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/components/organisms/trades/TradeFlowCompleted.kt
@@ -0,0 +1,78 @@
+package network.bisq.mobile.presentation.ui.components.organisms.trades
+
+import androidx.compose.foundation.BorderStroke
+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 cafe.adriel.lyricist.LocalStrings
+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.atoms.BisqTextField
+import network.bisq.mobile.presentation.ui.theme.BisqTheme
+import network.bisq.mobile.presentation.ui.theme.BisqUIConstants
+
+/**
+ * Trade flow's 4th Stepper section
+ */
+@Composable
+fun TradeFlowCompleted(
+ onClose: () -> Unit,
+ onExport: () -> Unit,
+){
+ val strings = LocalStrings.current.bisqEasyTradeState
+
+ val sendAmount = "1234.56 USD"
+ val btcValue = "0.00173399 BTC"
+
+ Column {
+ Spacer(modifier = Modifier.height(BisqUIConstants.ScreenPadding))
+ BisqText.h6Regular(
+ text = strings.bisqEasy_tradeCompleted_title
+ )
+ Spacer(modifier = Modifier.height(BisqUIConstants.ScreenPadding))
+ BisqTextField(
+ value = sendAmount,
+ onValueChanged = {},
+ label = strings.bisqEasy_tradeCompleted_body_you_have_receveid,
+ )
+ Spacer(modifier = Modifier.height(BisqUIConstants.ScreenPadding))
+ BisqTextField(
+ value = btcValue,
+ onValueChanged = {},
+ label = strings.bisqEasy_tradeCompleted_body_you_have_sold
+ )
+ Spacer(modifier = Modifier.height(BisqUIConstants.ScreenPadding))
+ Row(
+ modifier = Modifier.fillMaxWidth(),
+ verticalAlignment = Alignment.CenterVertically,
+ horizontalArrangement = Arrangement.SpaceBetween
+ ) {
+ BisqButton(
+ text = strings.bisqEasy_tradeState_info_phase4_leaveChannel,
+ color = BisqTheme.colors.primary,
+ onClick = onClose,
+ backgroundColor = BisqTheme.colors.dark5,
+ border = BorderStroke(
+ width = 2.dp,
+ color = BisqTheme.colors.primary
+ ),
+ padding = PaddingValues(
+ horizontal = 18.dp,
+ vertical = 6.dp
+ )
+ )
+ BisqButton(
+ text = strings.bisqEasy_tradeState_info_phase4_exportTrade,
+ color = BisqTheme.colors.light1,
+ onClick = onExport,
+ backgroundColor = BisqTheme.colors.dark5,
+ padding = PaddingValues(
+ horizontal = 18.dp,
+ vertical = 6.dp
+ )
+ )
+ }
+ }
+}
\ No newline at end of file
diff --git a/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/components/organisms/trades/TradeFlowFiatPayment.kt b/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/components/organisms/trades/TradeFlowFiatPayment.kt
new file mode 100644
index 00000000..c6671ffb
--- /dev/null
+++ b/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/components/organisms/trades/TradeFlowFiatPayment.kt
@@ -0,0 +1,115 @@
+package network.bisq.mobile.presentation.ui.components.organisms.trades
+
+import androidx.compose.foundation.background
+import androidx.compose.foundation.layout.*
+import androidx.compose.foundation.shape.RoundedCornerShape
+import androidx.compose.runtime.*
+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.img_fiat_payment_waiting
+import cafe.adriel.lyricist.LocalStrings
+import kotlinx.coroutines.delay
+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.atoms.BisqTextField
+import network.bisq.mobile.presentation.ui.components.atoms.CircularLoadingImage
+import network.bisq.mobile.presentation.ui.theme.BisqTheme
+import network.bisq.mobile.presentation.ui.theme.BisqUIConstants
+import network.bisq.mobile.presentation.ui.uicases.trades.ITradeFlowPresenter
+import org.koin.compose.koinInject
+
+/**
+ * Trade flow's 2nd Stepper section
+ */
+@Composable
+fun TradeFlowFiatPayment(
+ onNext: () -> Unit
+) {
+ val strings = LocalStrings.current.bisqEasyTradeState
+ var isLoading by remember { mutableStateOf(false) }
+ val presenter: ITradeFlowPresenter = koinInject()
+
+ val sendAmount = "1234.56 USD"
+ val sendID = "someone@zelle.com"
+
+ if (presenter.confirmingFiatPayment.collectAsState().value) {
+ ShowLoaderFiatPayment(onNext)
+ return
+ }
+
+ Column {
+ Spacer(modifier = Modifier.height(BisqUIConstants.ScreenPadding))
+ BisqText.h6Regular(
+ text = strings.bisqEasy_tradeState_info_buyer_phase2a_headline(sendAmount)
+ )
+ Spacer(modifier = Modifier.height(BisqUIConstants.ScreenPadding))
+ BisqTextField(
+ value = sendAmount,
+ onValueChanged = {},
+ label = strings.bisqEasy_tradeState_info_buyer_phase2a_quoteAmount,
+ disabled = true,
+ )
+ BisqTextField(
+ value = sendID,
+ onValueChanged = {},
+ label = strings.bisqEasy_tradeState_info_buyer_phase2a_sellersAccount,
+ disabled = true,
+ )
+ Spacer(modifier = Modifier.height(BisqUIConstants.ScreenPadding))
+ BisqText.smallRegular(
+ text = strings.bisqEasy_tradeState_info_buyer_phase2a_reasonForPaymentInfo,
+ color = BisqTheme.colors.grey1
+ )
+ Spacer(modifier = Modifier.height(BisqUIConstants.ScreenPadding))
+ BisqButton(
+ text = strings.bisqEasy_tradeState_info_buyer_phase2a_confirmFiatSent(sendAmount),
+ onClick = { presenter.confirmFiatPayment() },
+ padding = PaddingValues(
+ horizontal = 18.dp,
+ vertical = 6.dp
+ )
+ )
+ }
+}
+
+@Composable
+fun ShowLoaderFiatPayment(
+ onNext: () -> Unit
+) {
+ val strings = LocalStrings.current.bisqEasyTradeState
+ val sendAmount = "1234.56 USD"
+
+ LaunchedEffect(Unit) {
+ delay(3000)
+ // isLoading = false
+ onNext()
+ }
+
+ Spacer(modifier = Modifier.height(BisqUIConstants.ScreenPadding))
+ Row(
+ verticalAlignment = Alignment.CenterVertically,
+ horizontalArrangement = Arrangement.spacedBy(16.dp)
+ ) {
+ CircularLoadingImage(
+ image = Res.drawable.img_fiat_payment_waiting,
+ isLoading = true
+ )
+
+ Column(
+ verticalArrangement = Arrangement.spacedBy(
+ 12.dp
+ )
+ ) {
+ BisqText.h6Regular(
+ text = strings.bisqEasy_tradeState_info_buyer_phase2a_seller_wait_message
+ )
+ BisqText.smallRegular(
+ text = strings.bisqEasy_tradeState_info_buyer_phase2b_info(sendAmount, "Lightning invoice"),
+ color = BisqTheme.colors.grey1
+ )
+ }
+ }
+}
\ No newline at end of file
diff --git a/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/components/organisms/trades/TradeHeader.kt b/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/components/organisms/trades/TradeHeader.kt
new file mode 100644
index 00000000..9edf3267
--- /dev/null
+++ b/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/components/organisms/trades/TradeHeader.kt
@@ -0,0 +1,154 @@
+package network.bisq.mobile.presentation.ui.components.organisms.trades
+
+import androidx.compose.animation.*
+import androidx.compose.animation.core.MutableTransitionState
+import androidx.compose.animation.core.animateFloat
+import androidx.compose.animation.core.rememberTransition
+import androidx.compose.animation.core.tween
+import androidx.compose.foundation.background
+import androidx.compose.foundation.layout.*
+import androidx.compose.foundation.shape.RoundedCornerShape
+import androidx.compose.material3.IconButton
+import androidx.compose.runtime.*
+import androidx.compose.ui.Alignment
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.draw.clip
+import androidx.compose.ui.draw.rotate
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.unit.dp
+import cafe.adriel.lyricist.LocalStrings
+import network.bisq.mobile.domain.data.model.OfferListItem
+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.atoms.ProfileRating
+import network.bisq.mobile.presentation.ui.components.atoms.icons.UpIcon
+import network.bisq.mobile.presentation.ui.components.molecules.info.InfoBoxStyle
+import network.bisq.mobile.presentation.ui.components.molecules.info.InfoRow
+import network.bisq.mobile.presentation.ui.theme.BisqTheme
+import network.bisq.mobile.presentation.ui.theme.BisqUIConstants
+
+@Composable
+fun TradeHeader(
+ offer: OfferListItem,
+) {
+ val strings = LocalStrings.current.bisqEasyTradeState
+ val stringsBisqEasy = LocalStrings.current.bisqEasy
+
+ val enterTransition = remember {
+ expandVertically(
+ expandFrom = Alignment.Top,
+ animationSpec = tween(300)
+ ) + fadeIn(
+ initialAlpha = 0.3f,
+ animationSpec = tween(300)
+ )
+ }
+ val exitTransition = remember {
+ shrinkVertically(
+ shrinkTowards = Alignment.Top,
+ animationSpec = tween(300)
+ ) + fadeOut(
+ animationSpec = tween(300)
+ )
+ }
+ var visible by remember { mutableStateOf(false) }
+
+ val transitionState = remember {
+ MutableTransitionState(visible).apply {
+ targetState = !visible
+ }
+ }
+ val transition = rememberTransition(transitionState)
+ val arrowRotationDegree by transition.animateFloat({
+ tween(durationMillis = 300)
+ }) {
+ if (visible) 0f else 180f
+ }
+
+ Row(modifier = Modifier.clip(shape = RoundedCornerShape(12.dp))) {
+ Column(
+ modifier = Modifier.fillMaxWidth()
+ .background(color = BisqTheme.colors.dark5)
+ .padding(12.dp),
+ verticalArrangement = Arrangement.spacedBy(12.dp)
+ ) {
+ Row(
+ modifier = Modifier.fillMaxWidth(),
+ horizontalArrangement = Arrangement.SpaceBetween,
+ verticalAlignment = Alignment.CenterVertically
+ ) {
+ ProfileRating(offer)
+ Column(
+ verticalArrangement = Arrangement.spacedBy(2.dp),
+ horizontalAlignment = Alignment.End
+ ) {
+ BisqText.xsmallRegular(text = "10000.02 USD")
+ BisqText.xsmallRegular(text = "0.00173399 BTC")
+ }
+ }
+ AnimatedVisibility(
+ visible = visible,
+ enter = enterTransition,
+ exit = exitTransition
+ ) {
+ Column {
+
+ InfoRow(
+ style = InfoBoxStyle.Style2,
+ label1 = strings.bisqEasy_tradeState_header_tradeId,
+ value1 = "07b9bab1",
+ label2 = strings.bisqEasy_tradeCompleted_body_date,
+ value2 = "29 Sep 2024",
+ )
+
+ Spacer(modifier = Modifier.height(BisqUIConstants.ScreenPadding))
+
+ InfoRow(
+ style = InfoBoxStyle.Style2,
+ label1 = "Floating percentage",
+ value1 = "1.71%",
+ label2 = stringsBisqEasy.bisqEasy_openTrades_table_price,
+ value2 = "9567056.04 USD/BTC",
+ )
+
+ Spacer(modifier = Modifier.height(BisqUIConstants.ScreenPadding))
+
+ InfoRow(
+ style = InfoBoxStyle.Style2,
+ label1 = strings.bisqEasy_tradeCompleted_header_paymentMethod,
+ value1 = "CashApp",
+ label2 = stringsBisqEasy.bisqEasy_offerbook_offerList_table_columns_settlementMethod,
+ value2 = "Lightning",
+ )
+
+ }
+ }
+ Row(
+ modifier = Modifier.fillMaxWidth(),
+ horizontalArrangement = Arrangement.SpaceBetween,
+ verticalAlignment = Alignment.CenterVertically
+ ) {
+ BisqButton(
+ text = stringsBisqEasy.bisqEasy_openTrades_cancelTrade,
+ color = BisqTheme.colors.grey1,
+ onClick = {},
+ backgroundColor = Color.Transparent,
+ padding = PaddingValues(horizontal = 70.dp, vertical = 6.dp)
+ )
+ IconButton(
+ onClick = {
+ visible = !visible
+ }
+ ) {
+ UpIcon(
+ modifier = Modifier
+ .size(24.dp)
+ .clip(shape = RoundedCornerShape(12.dp))
+ .rotate(arrowRotationDegree)
+ .background(color = BisqTheme.colors.primary)
+ )
+ }
+ }
+ }
+ }
+}
diff --git a/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/navigation/Routes.kt b/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/navigation/Routes.kt
index bd4bea4f..643ce069 100644
--- a/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/navigation/Routes.kt
+++ b/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/navigation/Routes.kt
@@ -17,4 +17,9 @@ enum class Routes(val title: String) {
TabMyTrades(title = "tab_my_trades"),
TabSettings(title = "tab_settings"),
OfferList(title = "offer_list"),
+ TakeOfferTradeAmount(title = "take_offer_trade_amount"),
+ TakeOfferPaymentMethod(title = "take_offer_payment_method"),
+ TakeOfferReviewTrade(title = "take_offer_review_trade"),
+
+ TradeFlow(title = "trade_flow"),
}
\ No newline at end of file
diff --git a/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/navigation/graph/RootNavGraph.kt b/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/navigation/graph/RootNavGraph.kt
index 8d6c3e1b..63bbb003 100644
--- a/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/navigation/graph/RootNavGraph.kt
+++ b/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/navigation/graph/RootNavGraph.kt
@@ -5,17 +5,22 @@ import androidx.compose.animation.core.tween
import androidx.compose.foundation.background
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
+import androidx.navigation.NavGraphBuilder
import androidx.navigation.NavHostController
import androidx.navigation.compose.NavHost
import androidx.navigation.compose.composable
+import network.bisq.mobile.presentation.ui.uicases.offers.takeOffer.TakeOfferPaymentMethodScreen
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.offers.takeOffer.TakeOfferReviewTradeScreen
+import network.bisq.mobile.presentation.ui.uicases.offers.takeOffer.TakeOfferTradeAmountScreen
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
import network.bisq.mobile.presentation.ui.uicases.startup.TrustedNodeSetupScreen
+import network.bisq.mobile.presentation.ui.uicases.trades.TradeFlowScreen
import org.koin.compose.koinInject
import org.koin.core.qualifier.named
@@ -31,41 +36,76 @@ fun RootNavGraph() {
composable(route = Routes.Splash.name) {
SplashScreen()
}
- composable(route = Routes.Onboarding.name, enterTransition = {
- slideIntoContainer(
- AnimatedContentTransitionScope.SlideDirection.Left,
- animationSpec = tween(300)
- )
- }) {
+
+ addScreen(Routes.Onboarding.name) {
OnBoardingScreen()
}
- composable(route = Routes.CreateProfile.name, enterTransition = {
- slideIntoContainer(
- AnimatedContentTransitionScope.SlideDirection.Left,
- animationSpec = tween(300)
- )
- }) {
+
+ addScreen(Routes.CreateProfile.name) {
CreateProfileScreen()
}
- composable(route = Routes.TrustedNodeSetup.name, enterTransition = {
- slideIntoContainer(
- AnimatedContentTransitionScope.SlideDirection.Left,
- animationSpec = tween(300)
- )
- }) {
+
+ addScreen(Routes.TrustedNodeSetup.name) {
TrustedNodeSetupScreen()
}
- composable(route = Routes.TabContainer.name) {
+
+ addScreen(route = Routes.TabContainer.name) {
TabContainerScreen()
}
- composable(route = Routes.OfferList.name, enterTransition = {
+ addScreen(Routes.OfferList.name) {
+ OffersListScreen()
+ }
+
+ addScreen(Routes.TakeOfferTradeAmount.name) {
+ TakeOfferTradeAmountScreen()
+ }
+
+ addScreen(Routes.TakeOfferPaymentMethod.name) {
+ TakeOfferPaymentMethodScreen()
+ }
+
+ addScreen(Routes.TakeOfferReviewTrade.name) {
+ TakeOfferReviewTradeScreen()
+ }
+
+ addScreen(Routes.TradeFlow.name) {
+ TradeFlowScreen()
+ }
+
+ }
+}
+
+fun NavGraphBuilder.addScreen(
+ route: String,
+ content: @Composable () -> Unit
+) {
+ composable(
+ route = route,
+ enterTransition = {
+ // When a screen is pushed in, slide in from right edge of the screen to left
slideIntoContainer(
AnimatedContentTransitionScope.SlideDirection.Left,
animationSpec = tween(300)
)
- }) {
- OffersListScreen()
+ },
+ exitTransition = {
+ // When a new screen is pushed over current screen, don't do exit animation
+ null
+ },
+ popEnterTransition = {
+ // When the new pushed screen is poppped out, don't do pop Enter animation
+ null
+ },
+ popExitTransition = {
+ // When current screen is poped out, slide if from screen to screen's right edge
+ slideOutOfContainer(
+ AnimatedContentTransitionScope.SlideDirection.Right,
+ animationSpec = tween(300)
+ )
}
+
+ ) {
+ content()
}
}
\ No newline at end of file
diff --git a/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/theme/UIConstants.kt b/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/theme/UIConstants.kt
index 9586bcda..0c802426 100644
--- a/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/theme/UIConstants.kt
+++ b/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/theme/UIConstants.kt
@@ -4,6 +4,7 @@ import androidx.compose.ui.unit.dp
object BisqUIConstants {
val ScreenPadding = 12.dp
+ val ScreenPadding2X = 24.dp
val StaticTopPadding = 36.dp
val ScrollTopPadding = 24.dp
}
diff --git a/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/uicases/GettingStartedScreen.kt b/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/uicases/GettingStartedScreen.kt
index 36c701d3..71fef6d8 100644
--- a/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/uicases/GettingStartedScreen.kt
+++ b/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/uicases/GettingStartedScreen.kt
@@ -2,16 +2,7 @@ package network.bisq.mobile.presentation.ui.uicases
import androidx.compose.foundation.Image
import androidx.compose.foundation.background
-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.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.foundation.shape.RoundedCornerShape
import androidx.compose.runtime.Composable
import androidx.compose.runtime.collectAsState
@@ -38,7 +29,7 @@ import org.jetbrains.compose.resources.ExperimentalResourceApi
import org.jetbrains.compose.resources.painterResource
import org.koin.compose.koinInject
-interface IGettingStarted: ViewPresenter {
+interface IGettingStarted : ViewPresenter {
val btcPrice: StateFlow
val offersOnline: StateFlow
val publishedProfiles: StateFlow
@@ -62,7 +53,10 @@ fun GettingStartedScreen() {
RememberPresenterLifecycle(presenter)
- BisqScrollLayout(verticalArrangement = Arrangement.spacedBy(24.dp)) {
+ BisqScrollLayout(
+ padding = PaddingValues(all = 0.dp),
+ verticalArrangement = Arrangement.spacedBy(24.dp)
+ ) {
Column {
PriceProfileCard(
diff --git a/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/uicases/offers/MarketListPresenter.kt b/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/uicases/offers/MarketListPresenter.kt
index 4a47bbef..8e75defa 100644
--- a/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/uicases/offers/MarketListPresenter.kt
+++ b/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/uicases/offers/MarketListPresenter.kt
@@ -28,6 +28,7 @@ class MarketListPresenter(
fun onSelectMarket(marketListItem: MarketListItem) {
offerbookServiceFacade.selectMarket(marketListItem)
rootNavigator.navigate(Routes.OfferList.name)
+ // rootNavigator.navigate(Routes.TradeFlow.name)
}
override fun onViewAttached() {
diff --git a/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/uicases/offers/MarketListScreen.kt b/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/uicases/offers/MarketListScreen.kt
index 2394769b..3e4acedf 100644
--- a/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/uicases/offers/MarketListScreen.kt
+++ b/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/uicases/offers/MarketListScreen.kt
@@ -5,6 +5,7 @@ import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.lazy.items
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
+import androidx.compose.ui.unit.dp
import cafe.adriel.lyricist.LocalStrings
import network.bisq.mobile.presentation.ui.components.CurrencyProfileCard
import network.bisq.mobile.presentation.ui.components.atoms.BisqTextField
@@ -16,14 +17,12 @@ import org.koin.compose.koinInject
@Composable
fun MarketListScreen() {
- val strings = LocalStrings.current
+ val strings = LocalStrings.current.common
val presenter: MarketListPresenter = koinInject()
RememberPresenterLifecycle(presenter)
- BisqStaticLayout(
- verticalArrangement = Arrangement.Top,
- ) {
+ BisqStaticLayout(padding = PaddingValues(all = 0.dp), verticalArrangement = Arrangement.Top) {
BisqTextField(label = "", placeholder = strings.common_search, value ="", onValueChanged = {})
Spacer(modifier = Modifier.height(BisqUIConstants.ScreenPadding))
diff --git a/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/uicases/offers/OffersListPresenter.kt b/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/uicases/offers/OffersListPresenter.kt
index 9699cec5..b486cabc 100644
--- a/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/uicases/offers/OffersListPresenter.kt
+++ b/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/uicases/offers/OffersListPresenter.kt
@@ -7,16 +7,18 @@ import network.bisq.mobile.domain.data.model.OfferListItem
import network.bisq.mobile.domain.service.offerbook.OfferbookServiceFacade
import network.bisq.mobile.presentation.BasePresenter
import network.bisq.mobile.presentation.MainPresenter
+import network.bisq.mobile.presentation.ViewPresenter
+import network.bisq.mobile.presentation.ui.navigation.Routes
+
open class OffersListPresenter(
mainPresenter: MainPresenter,
private val offerbookServiceFacade: OfferbookServiceFacade,
-) : BasePresenter(mainPresenter) {
-
- val offerListItems: StateFlow> = offerbookServiceFacade.offerListItems
+) : BasePresenter(mainPresenter), IOffersListPresenter {
+ override val offerListItems: StateFlow> = offerbookServiceFacade.offerListItems
private val _selectedDirection = MutableStateFlow(Direction.SELL)
- val selectedDirection: StateFlow = _selectedDirection
+ override val selectedDirection: StateFlow = _selectedDirection
override fun onViewAttached() {
}
@@ -24,13 +26,17 @@ open class OffersListPresenter(
override fun onViewUnattaching() {
}
- fun takeOffer() {
+ override fun takeOffer(offer: OfferListItem) {
log.i { "take offer clicked " }
//todo show take offer screen
- // rootNavigator.navigate(Routes.OfferList.name)
+ rootNavigator.navigate(Routes.TakeOfferTradeAmount.name)
+ }
+
+ override fun chatForOffer(offer: OfferListItem) {
+ log.i { "chat for offer clicked " }
}
- fun onSelectDirection(direction: Direction) {
+ override fun onSelectDirection(direction: Direction) {
_selectedDirection.value = direction
}
}
diff --git a/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/uicases/offers/OffersListScreen.kt b/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/uicases/offers/OffersListScreen.kt
index a412d7fe..f414c962 100644
--- a/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/uicases/offers/OffersListScreen.kt
+++ b/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/uicases/offers/OffersListScreen.kt
@@ -1,30 +1,20 @@
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.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.foundation.lazy.items
-import androidx.compose.material.icons.Icons
-import androidx.compose.material.icons.automirrored.filled.ArrowBack
-import androidx.compose.material3.Icon
-import androidx.compose.material3.IconButton
import androidx.compose.runtime.Composable
import androidx.compose.runtime.collectAsState
-import androidx.compose.runtime.mutableStateOf
-import androidx.compose.runtime.remember
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.unit.dp
-import androidx.navigation.NavController
-import androidx.navigation.NavHostController
import cafe.adriel.lyricist.LocalStrings
+import kotlinx.coroutines.flow.StateFlow
import network.bisq.mobile.client.replicated_model.offer.Direction
+import network.bisq.mobile.domain.data.model.OfferListItem
+import network.bisq.mobile.presentation.ViewPresenter
import network.bisq.mobile.presentation.ui.components.layout.BisqStaticScaffold
import network.bisq.mobile.presentation.ui.components.molecules.DirectionToggle
import network.bisq.mobile.presentation.ui.components.molecules.OfferCard
@@ -32,21 +22,28 @@ import network.bisq.mobile.presentation.ui.components.molecules.TopBar
import network.bisq.mobile.presentation.ui.helpers.RememberPresenterLifecycle
import network.bisq.mobile.presentation.ui.theme.BisqUIConstants
import org.koin.compose.koinInject
-import org.koin.core.qualifier.named
+
+interface IOffersListPresenter : ViewPresenter {
+ val offerListItems: StateFlow>
+ val selectedDirection: StateFlow
+
+ fun takeOffer(offer: OfferListItem)
+ fun chatForOffer(offer: OfferListItem)
+ fun onSelectDirection(direction: Direction)
+}
@Composable
fun OffersListScreen() {
- val presenter: OffersListPresenter = koinInject()
- val strings = LocalStrings.current
+ val commonStrings = LocalStrings.current.common
+ val presenter: IOffersListPresenter = koinInject()
+
+ RememberPresenterLifecycle(presenter)
// Offers are mirrored to what user wants. E.g. I want to buy Bitcoin using a sell offer
val offerDirections: List = listOf(
Direction.SELL,
Direction.BUY
)
- val openDialog = remember { mutableStateOf(false) }
- val rootNavController: NavController
- val navController: NavHostController = koinInject(named("RootNavController"))
val offerListItems = presenter.offerListItems.collectAsState().value
val selectedDirection = presenter.selectedDirection.collectAsState().value
@@ -57,35 +54,29 @@ fun OffersListScreen() {
BisqStaticScaffold(
topBar = {
- TopBar(title = strings.common_offers)
+ TopBar(title = commonStrings.common_offers)
},
) {
- Spacer(modifier = Modifier.height(BisqUIConstants.ScreenPadding))
- Box(modifier = Modifier.fillMaxSize()) {
- Column {
- Column(
- modifier = Modifier.fillMaxWidth(),
- horizontalAlignment = Alignment.CenterHorizontally
- ) {
- DirectionToggle(
- offerDirections,
- presenter.selectedDirection.value,
- 130.dp
- ) { direction ->
- presenter.onSelectDirection(direction)
- }
+ DirectionToggle(
+ offerDirections,
+ presenter.selectedDirection.value,
+ 130.dp
+ ) { direction ->
+ presenter.onSelectDirection(direction)
+ }
- Spacer(modifier = Modifier.height(32.dp))
+ Spacer(modifier = Modifier.height(BisqUIConstants.ScreenPadding))
- LazyColumn(
- modifier = Modifier.padding(10.dp),
- verticalArrangement = Arrangement.spacedBy(18.dp)
- ) {
- items(sortedList) { item ->
- OfferCard(item, onClick = { presenter.takeOffer() })
- }
- }
- }
+ LazyColumn(
+ verticalArrangement = Arrangement.spacedBy(12.dp),
+ horizontalAlignment = Alignment.CenterHorizontally,
+ ) {
+ items(sortedList) { item ->
+ OfferCard(
+ item,
+ onClick = { presenter.takeOffer(item) },
+ onChatClick = { presenter.chatForOffer(item) }
+ )
}
}
}
diff --git a/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/uicases/offers/takeOffer/PaymentMethodPresenter.kt b/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/uicases/offers/takeOffer/PaymentMethodPresenter.kt
new file mode 100644
index 00000000..a2d9a1e0
--- /dev/null
+++ b/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/uicases/offers/takeOffer/PaymentMethodPresenter.kt
@@ -0,0 +1,33 @@
+package network.bisq.mobile.presentation.ui.uicases.offers.takeOffer
+
+import kotlinx.coroutines.flow.StateFlow
+import network.bisq.mobile.domain.data.model.OfferListItem
+import network.bisq.mobile.domain.service.offerbook.OfferbookServiceFacade
+import network.bisq.mobile.presentation.BasePresenter
+import network.bisq.mobile.presentation.MainPresenter
+import network.bisq.mobile.presentation.ui.navigation.Routes
+
+open class PaymentMethodPresenter(
+ mainPresenter: MainPresenter,
+ private val offerbookServiceFacade: OfferbookServiceFacade,
+) : BasePresenter(mainPresenter), ITakeOfferPaymentMethodPresenter {
+
+ override val offerListItems: StateFlow> = offerbookServiceFacade.offerListItems
+
+ override fun onViewAttached() {
+ }
+
+ override fun onViewUnattaching() {
+ }
+
+ override fun goBack() {
+ log.i { "goBack" }
+ rootNavigator.popBackStack()
+ }
+
+ override fun paymentMethodConfirmed() {
+ log.i { "Payment method selected" }
+ rootNavigator.navigate(Routes.TakeOfferReviewTrade.name)
+ }
+
+}
diff --git a/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/uicases/offers/takeOffer/PaymentMethodScreen.kt b/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/uicases/offers/takeOffer/PaymentMethodScreen.kt
new file mode 100644
index 00000000..855e9b0e
--- /dev/null
+++ b/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/uicases/offers/takeOffer/PaymentMethodScreen.kt
@@ -0,0 +1,134 @@
+package network.bisq.mobile.presentation.ui.uicases.offers.takeOffer
+
+import androidx.compose.foundation.background
+import androidx.compose.foundation.layout.*
+import androidx.compose.foundation.shape.RoundedCornerShape
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.collectAsState
+import androidx.compose.ui.Alignment
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.draw.clip
+import androidx.compose.ui.unit.dp
+import cafe.adriel.lyricist.LocalStrings
+import kotlinx.coroutines.flow.StateFlow
+import network.bisq.mobile.domain.data.model.OfferListItem
+import network.bisq.mobile.presentation.ViewPresenter
+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 network.bisq.mobile.presentation.ui.components.layout.MultiScreenWizardScaffold
+import network.bisq.mobile.presentation.ui.theme.BisqUIConstants
+import org.koin.compose.koinInject
+
+interface ITakeOfferPaymentMethodPresenter : ViewPresenter {
+ // TODO: Update later to refer to a single OfferListItem
+ val offerListItems: StateFlow>
+
+ fun goBack()
+ fun paymentMethodConfirmed()
+}
+
+@Composable
+fun TakeOfferPaymentMethodScreen() {
+ val strings = LocalStrings.current.bisqEasy
+ val presenter: ITakeOfferPaymentMethodPresenter = koinInject()
+
+ val offer = presenter.offerListItems.collectAsState().value.first()
+ var customMethodCounter = 1
+
+ MultiScreenWizardScaffold(
+ strings.bisqEasy_takeOffer_progress_method,
+ stepIndex = 2,
+ stepsLength = 3,
+ prevOnClick = { presenter.goBack() },
+ nextOnClick = { presenter.paymentMethodConfirmed() }
+ ) {
+
+ BisqText.h3Regular(
+ text = strings.bisqEasy_takeOffer_paymentMethods_headline_fiatAndBitcoin,
+ color = BisqTheme.colors.light1
+ )
+ Spacer(modifier = Modifier.height(BisqUIConstants.ScreenPadding2X))
+ Spacer(modifier = Modifier.height(BisqUIConstants.ScreenPadding2X))
+ Column(
+ modifier = Modifier.padding(horizontal = 16.dp),
+ horizontalAlignment = Alignment.CenterHorizontally,
+ ) {
+ BisqText.largeLight(
+ text = strings.bisqEasy_takeOffer_paymentMethods_subtitle_fiat_buyer("USD"),
+ color = BisqTheme.colors.grey2
+ )
+ Spacer(modifier = Modifier.height(BisqUIConstants.ScreenPadding2X))
+ Column(
+ modifier = Modifier.fillMaxWidth().padding(horizontal = 38.dp),
+ horizontalAlignment = Alignment.Start,
+ verticalArrangement = Arrangement.spacedBy(BisqUIConstants.ScreenPadding)
+ ) {
+ offer.quoteSidePaymentMethods.forEach { paymentMethod ->
+ // TODO: Make this to Toggle buttons. Can get paymentMethod as some Enum?
+ Row(
+ modifier = Modifier.fillMaxWidth()
+ .clip(shape = RoundedCornerShape(6.dp))
+ .background(color = BisqTheme.colors.dark5).padding(start = 18.dp)
+ .padding(vertical = 10.dp),
+ verticalAlignment = Alignment.CenterVertically,
+ horizontalArrangement = Arrangement.spacedBy(10.dp)
+ ) {
+ DynamicImage(
+ path = "drawable/payment/fiat/${
+ paymentMethod
+ .lowercase()
+ .replace("-", "_")
+ }.png",
+ fallbackPath = "drawable/payment/fiat/custom_payment_${customMethodCounter++}.png",
+ modifier = Modifier.size(15.dp),
+ )
+ BisqText.baseRegular(
+ text = paymentMethod
+ )
+ }
+ }
+ }
+ }
+ Spacer(modifier = Modifier.height(BisqUIConstants.ScreenPadding2X))
+ Spacer(modifier = Modifier.height(BisqUIConstants.ScreenPadding2X))
+ Column(
+ modifier = Modifier.padding(horizontal = 16.dp),
+ horizontalAlignment = Alignment.CenterHorizontally,
+ ) {
+ BisqText.largeLight(
+ text = strings.bisqEasy_takeOffer_paymentMethods_subtitle_bitcoin_seller,
+ color = BisqTheme.colors.grey2
+ )
+ Spacer(modifier = Modifier.height(BisqUIConstants.ScreenPadding2X))
+ Column(
+ modifier = Modifier.fillMaxWidth().padding(horizontal = 38.dp),
+ horizontalAlignment = Alignment.Start,
+ verticalArrangement = Arrangement.spacedBy(BisqUIConstants.ScreenPadding)
+ ) {
+ offer.baseSidePaymentMethods.forEach { settlementMethod ->
+ // TODO: Make this to Toggle buttons. Can get paymentMethod as some Enum?
+ Row(
+ modifier = Modifier.fillMaxWidth()
+ .clip(shape = RoundedCornerShape(6.dp))
+ .background(color = BisqTheme.colors.dark5).padding(start = 18.dp)
+ .padding(vertical = 10.dp),
+ verticalAlignment = Alignment.CenterVertically,
+ horizontalArrangement = Arrangement.spacedBy(10.dp)
+ ) {
+ DynamicImage(
+ "drawable/payment/bitcoin/${
+ settlementMethod
+ .lowercase()
+ .replace("-", "_")
+ }.png",
+ modifier = Modifier.size(15.dp)
+ )
+
+ BisqText.baseRegular(text = settlementMethod)
+ }
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/uicases/offers/takeOffer/ReviewTradePresenter.kt b/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/uicases/offers/takeOffer/ReviewTradePresenter.kt
new file mode 100644
index 00000000..addcfd37
--- /dev/null
+++ b/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/uicases/offers/takeOffer/ReviewTradePresenter.kt
@@ -0,0 +1,35 @@
+package network.bisq.mobile.presentation.ui.uicases.offers.takeOffer
+
+
+import kotlinx.coroutines.flow.StateFlow
+import network.bisq.mobile.domain.data.model.OfferListItem
+import network.bisq.mobile.domain.service.offerbook.OfferbookServiceFacade
+import network.bisq.mobile.presentation.BasePresenter
+import network.bisq.mobile.presentation.MainPresenter
+import network.bisq.mobile.presentation.ui.navigation.Routes
+
+open class ReviewTradePresenter(
+ mainPresenter: MainPresenter,
+ private val offerbookServiceFacade: OfferbookServiceFacade,
+) : BasePresenter(mainPresenter), ITakeOfferReviewTradePresenter {
+
+ override val offerListItems: StateFlow> = offerbookServiceFacade.offerListItems
+
+ override fun onViewAttached() {
+ }
+
+ override fun onViewUnattaching() {
+ }
+
+ override fun goBack() {
+ log.i { "goBack" }
+ rootNavigator.popBackStack()
+ }
+
+ override fun tradeConfirmed() {
+ log.i { "Trade confirmed" }
+ // TODO: Confirmation popup goes here
+ rootNavigator.navigate(Routes.TradeFlow.name)
+ }
+
+}
diff --git a/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/uicases/offers/takeOffer/ReviewTradeScreen.kt b/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/uicases/offers/takeOffer/ReviewTradeScreen.kt
new file mode 100644
index 00000000..0c10e37d
--- /dev/null
+++ b/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/uicases/offers/takeOffer/ReviewTradeScreen.kt
@@ -0,0 +1,103 @@
+package network.bisq.mobile.presentation.ui.uicases.offers.takeOffer
+
+import androidx.compose.foundation.layout.*
+import androidx.compose.runtime.Composable
+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.domain.data.model.OfferListItem
+import network.bisq.mobile.presentation.ViewPresenter
+import network.bisq.mobile.presentation.ui.components.atoms.BisqHDivider
+import network.bisq.mobile.presentation.ui.components.atoms.BisqText
+import network.bisq.mobile.presentation.ui.theme.BisqTheme
+import network.bisq.mobile.presentation.ui.components.layout.MultiScreenWizardScaffold
+import network.bisq.mobile.presentation.ui.components.molecules.info.InfoBox
+import network.bisq.mobile.presentation.ui.components.molecules.info.InfoRow
+import network.bisq.mobile.presentation.ui.theme.BisqUIConstants
+import org.koin.compose.koinInject
+
+interface ITakeOfferReviewTradePresenter : ViewPresenter {
+ // TODO: Update later to refer to a single OfferListItem
+ val offerListItems: StateFlow>
+
+ fun goBack()
+ fun tradeConfirmed()
+}
+
+@Composable
+fun TakeOfferReviewTradeScreen() {
+ val strings = LocalStrings.current.bisqEasyTradeWizard
+ val bisqEasyStrings = LocalStrings.current.bisqEasy
+ val tradeStateStrings = LocalStrings.current.bisqEasyTradeState
+ val commonStrings = LocalStrings.current.common
+ val presenter: ITakeOfferReviewTradePresenter = koinInject()
+
+ val offer = presenter.offerListItems.collectAsState().value.first()
+
+ MultiScreenWizardScaffold(
+ bisqEasyStrings.bisqEasy_takeOffer_progress_review,
+ stepIndex = 2,
+ stepsLength = 3,
+ prevOnClick = { presenter.goBack() },
+ nextButtonText = bisqEasyStrings.bisqEasy_takeOffer_review_takeOffer,
+ nextOnClick = { presenter.tradeConfirmed() }
+ ) {
+ BisqText.h3Regular(
+ text = bisqEasyStrings.bisqEasy_takeOffer_progress_review,
+ color = BisqTheme.colors.light1
+ )
+ Spacer(modifier = Modifier.height(BisqUIConstants.ScreenPadding2X))
+ Column(verticalArrangement = Arrangement.spacedBy(BisqUIConstants.ScreenPadding2X)) {
+ InfoRow(
+ label1 = tradeStateStrings.bisqEasy_tradeState_header_direction.uppercase(),
+ value1 = if (offer.direction.isBuy)
+ strings.bisqEasy_tradeWizard_directionAndMarket_buy
+ else
+ strings.bisqEasy_tradeWizard_directionAndMarket_sell,
+ label2 = strings.bisqEasy_tradeWizard_review_paymentMethodDescription_fiat.uppercase(),
+ value2 = offer.quoteSidePaymentMethods[0], // TODO: Show only selected method
+ )
+ InfoRow(
+ label1 = strings.bisqEasy_tradeWizard_review_toPay.uppercase(),
+ value1 = offer.formattedPrice, // TODO: Show selected amount (in case offer has range)
+ label2 = strings.bisqEasy_tradeWizard_review_toReceive.uppercase(),
+ value2 = offer.formattedQuoteAmount
+ )
+ }
+ BisqHDivider()
+ Column(verticalArrangement = Arrangement.spacedBy(24.dp)) {
+ InfoBox(
+ label = strings.bisqEasy_tradeWizard_review_priceDescription_taker,
+ valueComposable = {
+ Column(verticalArrangement = Arrangement.spacedBy(2.dp)) {
+ Row(
+ verticalAlignment = Alignment.Bottom,
+ horizontalArrangement = Arrangement.spacedBy(2.dp)
+ ) {
+ BisqText.h6Regular(text = "98,000.68") // TODO: Values?
+ BisqText.baseRegular(text = "BTC/USD", color = BisqTheme.colors.grey2) // TODO: Values?
+ }
+ BisqText.smallRegular(
+ text = strings.bisqEasy_tradeWizard_review_priceDetails_float("1.00%", "above", "60,000 BTC/USD"),
+ color = BisqTheme.colors.grey4
+ )
+ }
+ }
+ )
+
+ InfoRow(
+ label1 = strings.bisqEasy_tradeWizard_review_paymentMethodDescription_btc,
+ value1 = offer.baseSidePaymentMethods[0], // TODO: Show only selected method
+ label2 = strings.bisqEasy_tradeWizard_review_paymentMethodDescription_fiat,
+ value2 = offer.quoteSidePaymentMethods[0], // TODO: Show only selected method
+ )
+ InfoBox(
+ label = strings.bisqEasy_tradeWizard_review_feeDescription,
+ value = strings.bisqEasy_tradeWizard_review_noTradeFees
+ )
+ }
+ }
+}
\ No newline at end of file
diff --git a/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/uicases/offers/takeOffer/TradeAmountPresenter.kt b/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/uicases/offers/takeOffer/TradeAmountPresenter.kt
new file mode 100644
index 00000000..2499074c
--- /dev/null
+++ b/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/uicases/offers/takeOffer/TradeAmountPresenter.kt
@@ -0,0 +1,33 @@
+package network.bisq.mobile.presentation.ui.uicases.offers.takeOffer
+
+import kotlinx.coroutines.flow.StateFlow
+import network.bisq.mobile.domain.data.model.OfferListItem
+import network.bisq.mobile.domain.service.offerbook.OfferbookServiceFacade
+import network.bisq.mobile.presentation.BasePresenter
+import network.bisq.mobile.presentation.MainPresenter
+import network.bisq.mobile.presentation.ui.navigation.Routes
+
+open class TradeAmountPresenter(
+ mainPresenter: MainPresenter,
+ private val offerbookServiceFacade: OfferbookServiceFacade,
+) : BasePresenter(mainPresenter), ITakeOfferTradeAmountPresenter {
+
+ override val offerListItems: StateFlow> = offerbookServiceFacade.offerListItems
+
+ override fun onViewAttached() {
+ }
+
+ override fun onViewUnattaching() {
+ }
+
+ override fun goBack() {
+ log.i { "goBack" }
+ rootNavigator.popBackStack()
+ }
+
+ override fun amountConfirmed() {
+ log.i { "Amount selected" }
+ rootNavigator.navigate(Routes.TakeOfferPaymentMethod.name)
+ }
+
+}
diff --git a/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/uicases/offers/takeOffer/TradeAmountScreen.kt b/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/uicases/offers/takeOffer/TradeAmountScreen.kt
new file mode 100644
index 00000000..487f0875
--- /dev/null
+++ b/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/uicases/offers/takeOffer/TradeAmountScreen.kt
@@ -0,0 +1,67 @@
+package network.bisq.mobile.presentation.ui.uicases.offers.takeOffer
+
+import androidx.compose.foundation.layout.*
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.collectAsState
+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.domain.data.model.OfferListItem
+import network.bisq.mobile.presentation.ViewPresenter
+import network.bisq.mobile.presentation.ui.components.atoms.BisqText
+import network.bisq.mobile.presentation.ui.components.layout.MultiScreenWizardScaffold
+import network.bisq.mobile.presentation.ui.components.molecules.BisqAmountSelector
+import network.bisq.mobile.presentation.ui.theme.BisqTheme
+import network.bisq.mobile.presentation.ui.theme.BisqUIConstants
+import org.koin.compose.koinInject
+
+interface ITakeOfferTradeAmountPresenter : ViewPresenter {
+ // TODO: Update later to refer to a single OfferListItem
+ val offerListItems: StateFlow>
+
+ fun goBack()
+ fun amountConfirmed()
+}
+
+@Composable
+fun TakeOfferTradeAmountScreen() {
+ val strings = LocalStrings.current.bisqEasy
+ val presenter: ITakeOfferTradeAmountPresenter = koinInject()
+
+ val offer = presenter.offerListItems.collectAsState().value.first()
+
+ // TODO: Should be from OfferListItem
+ val offerMinFiatAmount = 800.0f
+ val offerMaxFiatAmount = 1500.0f
+
+ MultiScreenWizardScaffold(
+ strings.bisqEasy_takeOffer_progress_amount,
+ stepIndex = 1,
+ stepsLength = 3,
+ prevOnClick = { presenter.goBack() },
+ nextOnClick = { presenter.amountConfirmed() }
+ ) {
+ BisqText.h3Regular(
+ text = strings.bisqEasy_takeOffer_amount_headline_buyer,
+ color = BisqTheme.colors.light1
+ )
+ Spacer(modifier = Modifier.height(BisqUIConstants.ScreenPadding))
+ BisqText.largeLight(
+ text = strings.bisqEasy_takeOffer_amount_description(
+ offerMinFiatAmount.toDouble(),
+ offerMaxFiatAmount.toDouble()
+ ),
+ color = BisqTheme.colors.grey2
+ )
+
+ Spacer(modifier = Modifier.height(128.dp))
+
+ BisqAmountSelector(
+ minAmount = offerMinFiatAmount,
+ maxAmount = offerMaxFiatAmount,
+ exchangeRate = 95000.0,
+ currency = "USD"
+ )
+ }
+}
\ No newline at end of file
diff --git a/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/uicases/startup/CreateProfileScreen.kt b/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/uicases/startup/CreateProfileScreen.kt
index 189132ad..d341ebbb 100644
--- a/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/uicases/startup/CreateProfileScreen.kt
+++ b/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/uicases/startup/CreateProfileScreen.kt
@@ -29,7 +29,8 @@ import org.koin.core.qualifier.named
@Composable
fun CreateProfileScreen(
) {
- val strings = LocalStrings.current
+ val strings = LocalStrings.current.application
+ val commonStrings = LocalStrings.current.common
val navController: NavHostController = koinInject(named("RootNavController"))
val presenter: CreateProfilePresenter = koinInject { parametersOf(navController) }
@@ -82,7 +83,7 @@ fun CreateProfileScreen(
)
Spacer(modifier = Modifier.height(40.dp))
BisqButton(
- strings.buttons_next,
+ commonStrings.buttons_next,
onClick = { presenter.onCreateAndPublishNewUserProfile() },
backgroundColor = if (presenter.nickName.value.isEmpty()) BisqTheme.colors.primaryDisabled else BisqTheme.colors.primary
)
diff --git a/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/uicases/startup/OnBoardingScreen.kt b/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/uicases/startup/OnBoardingScreen.kt
index e5b75e84..6502d299 100644
--- a/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/uicases/startup/OnBoardingScreen.kt
+++ b/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/uicases/startup/OnBoardingScreen.kt
@@ -33,7 +33,8 @@ interface IOnboardingPresenter : ViewPresenter {
@OptIn(ExperimentalResourceApi::class)
@Composable
fun OnBoardingScreen() {
- val strings = LocalStrings.current
+ val strings = LocalStrings.current.application
+ val commonStrings = LocalStrings.current.common
val presenter: IOnboardingPresenter = koinInject()
val coroutineScope = rememberCoroutineScope()
@@ -57,7 +58,7 @@ fun OnBoardingScreen() {
Spacer(modifier = Modifier.height(56.dp))
BisqButton(
- text = if (pagerState.currentPage == presenter.indexesToShow.lastIndex) strings.onboarding_button_create_profile else strings.buttons_next,
+ text = if (pagerState.currentPage == presenter.indexesToShow.lastIndex) strings.onboarding_button_create_profile else commonStrings.buttons_next,
onClick = { presenter.onNextButtonClick(coroutineScope, pagerState) }
)
}
diff --git a/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/uicases/startup/SplashScreen.kt b/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/uicases/startup/SplashScreen.kt
index b673889f..a338e29b 100644
--- a/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/uicases/startup/SplashScreen.kt
+++ b/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/uicases/startup/SplashScreen.kt
@@ -1,5 +1,6 @@
package network.bisq.mobile.presentation.ui.uicases.startup
+import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.runtime.Composable
@@ -22,19 +23,18 @@ import org.koin.core.qualifier.named
fun SplashScreen(
) {
val strings = LocalStrings.current
- val navController: NavHostController = koinInject(named("RootNavController"))
- val presenter: SplashPresenter = koinInject { parametersOf(navController) }
+ val presenter: SplashPresenter = koinInject()
RememberPresenterLifecycle(presenter)
- BisqStaticScaffold {
+ BisqStaticScaffold(verticalArrangement = Arrangement.SpaceBetween) {
BisqLogo()
Column {
BisqProgressBar(presenter.progress.collectAsState().value)
// TODO: Get this from presenter
- val networkType = strings.splash_bootstrapState_network_TOR
+ val networkType = strings.application.splash_bootstrapState_network_TOR
BisqText.baseRegular(
text = presenter.state.collectAsState().value,
diff --git a/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/uicases/trades/MyTrades.kt b/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/uicases/trades/MyTrades.kt
deleted file mode 100644
index c5898ff5..00000000
--- a/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/uicases/trades/MyTrades.kt
+++ /dev/null
@@ -1,30 +0,0 @@
-
-package network.bisq.mobile.presentation.ui.uicases.trades
-
-import androidx.compose.foundation.layout.Box
-import androidx.compose.foundation.layout.fillMaxSize
-import androidx.compose.runtime.Composable
-import androidx.compose.ui.Alignment
-import androidx.compose.ui.Modifier
-import androidx.navigation.NavHostController
-import network.bisq.mobile.presentation.ui.components.atoms.BisqText
-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 MyTrades() {
- val rootNavController: NavHostController = koinInject(named("RootNavController"))
- Box(
- modifier = Modifier
- .fillMaxSize(),
- contentAlignment = Alignment.Center // Centers the content within the Box
- ) {
- BisqText.h2Regular(
- text = "My Trades",
- color = BisqTheme.colors.light1,
- )
- }
-}
\ No newline at end of file
diff --git a/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/uicases/trades/TradeFlowPresenter.kt b/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/uicases/trades/TradeFlowPresenter.kt
new file mode 100644
index 00000000..6d0bd11a
--- /dev/null
+++ b/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/uicases/trades/TradeFlowPresenter.kt
@@ -0,0 +1,100 @@
+package network.bisq.mobile.presentation.ui.uicases.trades
+
+import androidx.compose.runtime.Composable
+import cafe.adriel.lyricist.LocalStrings
+import kotlinx.coroutines.flow.StateFlow
+import kotlinx.coroutines.flow.MutableStateFlow
+import network.bisq.mobile.domain.data.model.OfferListItem
+import network.bisq.mobile.domain.service.offerbook.OfferbookServiceFacade
+import network.bisq.mobile.presentation.BasePresenter
+import network.bisq.mobile.presentation.MainPresenter
+import network.bisq.mobile.presentation.ui.navigation.Routes
+
+enum class TradeFlowScreenSteps(val titleKey: String) {
+ ACCOUNT_DETAILS(titleKey = "bisqEasy_tradeState_phase1"),
+ FIAT_PAYMENT(titleKey = "bisqEasy_tradeState_phase2"),
+ BITCOIN_TRANSFER(titleKey = "bisqEasy_tradeState_phase3"),
+ TRADE_COMPLETED(titleKey = "bisqEasy_tradeState_phase4")
+}
+
+@Composable
+fun TradeFlowScreenSteps.getTranslatedTitle(): String {
+ val strings = LocalStrings.current.bisqEasyTradeState
+ return when (this) {
+ TradeFlowScreenSteps.ACCOUNT_DETAILS -> strings.bisqEasy_tradeState_phase1
+ TradeFlowScreenSteps.FIAT_PAYMENT -> strings.bisqEasy_tradeState_phase2
+ TradeFlowScreenSteps.BITCOIN_TRANSFER -> strings.bisqEasy_tradeState_phase3
+ TradeFlowScreenSteps.TRADE_COMPLETED -> strings.bisqEasy_tradeState_phase4
+ }
+}
+
+open class TradeFlowPresenter(
+ mainPresenter: MainPresenter,
+ private val offerbookServiceFacade: OfferbookServiceFacade,
+) : BasePresenter(mainPresenter), ITradeFlowPresenter {
+
+ override val offerListItems: StateFlow> = offerbookServiceFacade.offerListItems
+
+ override val steps = listOf(
+ TradeFlowScreenSteps.ACCOUNT_DETAILS,
+ TradeFlowScreenSteps.FIAT_PAYMENT,
+ TradeFlowScreenSteps.BITCOIN_TRANSFER,
+ TradeFlowScreenSteps.TRADE_COMPLETED
+ )
+
+ // Could be onchain address or LN Invoice
+ private val _receiveAddress = MutableStateFlow("")
+ override val receiveAddress: StateFlow get() = _receiveAddress
+ override fun setReceiveAddress(value: String) {
+ _receiveAddress.value = value
+ }
+
+ private val _confirmingFiatPayment = MutableStateFlow(false)
+ override val confirmingFiatPayment: StateFlow get() = _confirmingFiatPayment
+ override fun setConfirmingFiatPayment(value: Boolean) {
+ _confirmingFiatPayment.value = value
+ }
+
+ override fun confirmFiatPayment() {
+ setConfirmingFiatPayment(true)
+ }
+
+ private val _showCloseTradeDialog = MutableStateFlow(false)
+ override val showCloseTradeDialog: StateFlow get() = _showCloseTradeDialog
+ override fun setShowCloseTradeDialog(value: Boolean) {
+ _showCloseTradeDialog.value = value
+ }
+
+ override fun closeTrade() {
+ setShowCloseTradeDialog(true)
+ }
+
+ override fun closeTradeConfirm() {
+ setShowCloseTradeDialog(false)
+ rootNavigator.popBackStack(Routes.OfferList.name, inclusive = false, saveState = false)
+ }
+
+ override fun openWalletGuideLink() {
+ // Open web link for Wallet guide
+ }
+
+ override fun openTradeGuideLink() {
+ // Open web link for Trade guide
+ }
+
+ override fun exportTrade() {
+ // TODO
+ }
+
+ override fun openMediation() {
+ // TODO: Is Mediation part of MVP?
+ // If not, should we show a message to the user,
+ // to install desktop app to handle disputes?
+ }
+
+ override fun onViewAttached() {
+ }
+
+ override fun onViewUnattaching() {
+ }
+}
diff --git a/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/uicases/trades/TradeFlowScreen.kt b/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/uicases/trades/TradeFlowScreen.kt
new file mode 100644
index 00000000..ac4ff7e6
--- /dev/null
+++ b/shared/presentation/src/commonMain/kotlin/network/bisq/mobile/presentation/ui/uicases/trades/TradeFlowScreen.kt
@@ -0,0 +1,144 @@
+package network.bisq.mobile.presentation.ui.uicases.trades
+
+import androidx.compose.animation.AnimatedVisibility
+import androidx.compose.foundation.*
+import androidx.compose.foundation.layout.*
+import androidx.compose.runtime.*
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.draw.blur
+import androidx.compose.ui.unit.dp
+import cafe.adriel.lyricist.LocalStrings
+import kotlinx.coroutines.flow.StateFlow
+import network.bisq.mobile.domain.data.model.OfferListItem
+import network.bisq.mobile.presentation.ViewPresenter
+import network.bisq.mobile.presentation.ui.components.atoms.*
+import network.bisq.mobile.presentation.ui.components.layout.BisqStaticScaffold
+import network.bisq.mobile.presentation.ui.components.molecules.BisqDialog
+import network.bisq.mobile.presentation.ui.components.molecules.TopBar
+import network.bisq.mobile.presentation.ui.components.organisms.trades.CloseTradeCard
+import network.bisq.mobile.presentation.ui.components.organisms.trades.*
+import network.bisq.mobile.presentation.ui.theme.BisqTheme
+import network.bisq.mobile.presentation.ui.theme.BisqUIConstants
+import org.koin.compose.koinInject
+
+interface ITradeFlowPresenter : ViewPresenter {
+ // TODO: Update later to refer to a single state specific object
+ val offerListItems: StateFlow>
+
+ val steps: List
+
+ val receiveAddress: StateFlow
+ fun setReceiveAddress(value: String)
+
+ val confirmingFiatPayment: StateFlow
+ fun setConfirmingFiatPayment(value: Boolean)
+
+ fun confirmFiatPayment()
+
+ val showCloseTradeDialog: StateFlow
+ fun setShowCloseTradeDialog(value: Boolean)
+ fun closeTrade()
+
+ fun closeTradeConfirm()
+
+ fun openWalletGuideLink()
+ fun openTradeGuideLink()
+
+ fun exportTrade()
+
+ fun openMediation()
+}
+
+@Composable
+fun TradeFlowScreen() {
+ val strings = LocalStrings.current.bisqEasy
+ val presenter: ITradeFlowPresenter = koinInject()
+
+ val offer = presenter.offerListItems.collectAsState().value.first()
+ val showCloseTradeDialog = presenter.showCloseTradeDialog.collectAsState().value
+
+ BisqStaticScaffold(
+ topBar = { TopBar("Trade - 07b9bab1") }
+ ) {
+ Box(modifier = Modifier.fillMaxSize().blur(if (showCloseTradeDialog) 12.dp else 0.dp)) {
+ Column(
+ modifier = Modifier
+ .verticalScroll(rememberScrollState())
+ .fillMaxSize()
+ ) {
+
+ TradeHeader(offer)
+
+ Spacer(modifier = Modifier.height(BisqUIConstants.ScreenPadding2X))
+
+ TradeFlowStepper()
+
+ }
+ if (showCloseTradeDialog) {
+ BisqDialog() {
+ CloseTradeCard(
+ onDismissRequest = {
+ presenter.setShowCloseTradeDialog(false)
+ },
+ onConfirm = {
+ presenter.closeTradeConfirm()
+ }
+ )
+
+ }
+
+ }
+ }
+ }
+}
+
+@Composable
+fun TradeFlowStepper() {
+ val presenter: ITradeFlowPresenter = koinInject()
+ var expandedStep by remember { mutableStateOf(0) }
+
+ Column(
+ modifier = Modifier.fillMaxWidth()
+ ) {
+ presenter.steps.forEachIndexed { index, step ->
+ StepperSection(
+ stepNumber = index + 1,
+ isActive = expandedStep == index,
+ isLastIndex = index == step.titleKey.lastIndex,
+ ) { modifier ->
+ Column(modifier = modifier) {
+ BisqText.baseRegular(
+ text = step.getTranslatedTitle().uppercase(),
+ color = if (expandedStep == index) BisqTheme.colors.light1 else BisqTheme.colors.grey2,
+ )
+
+ AnimatedVisibility(
+ visible = expandedStep == index,
+ ) {
+ when (step.titleKey) {
+ TradeFlowScreenSteps.ACCOUNT_DETAILS.titleKey -> {
+ TradeFlowAccountDetails(onNext = { expandedStep += 1 })
+ }
+
+ TradeFlowScreenSteps.FIAT_PAYMENT.titleKey -> {
+ TradeFlowFiatPayment(onNext = { expandedStep += 1 })
+ }
+
+ TradeFlowScreenSteps.BITCOIN_TRANSFER.titleKey -> {
+ TradeFlowBtcPayment(onNext = { expandedStep += 1 })
+ }
+
+ TradeFlowScreenSteps.TRADE_COMPLETED.titleKey -> {
+ TradeFlowCompleted(onClose = {
+ presenter.closeTrade()
+ }, onExport = {
+
+ })
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+}