diff --git a/apps/flipcash/core-ui/build.gradle.kts b/apps/flipcash/core-ui/build.gradle.kts index 5c27c4add1..d177e08c90 100644 --- a/apps/flipcash/core-ui/build.gradle.kts +++ b/apps/flipcash/core-ui/build.gradle.kts @@ -14,6 +14,8 @@ kotlin { sourceSets { commonMain.dependencies { + implementation(libs.jetbrains.compose.animation) + implementation(libs.jetbrains.compose.ui.tooling.preview) implementation(project(":apps:flipcash:core")) implementation(project(":services:opencode")) implementation(project(":services:opencode-compose")) @@ -21,10 +23,12 @@ kotlin { implementation(project(":ui:components")) implementation(project(":ui:resources")) implementation(project(":ui:theme")) + implementation(project(":apps:flipcash:shared:theme")) implementation(libs.jetbrains.compose.runtime) implementation(libs.jetbrains.compose.foundation) implementation(libs.jetbrains.compose.ui) + implementation(libs.jetbrains.compose.components.resources) implementation(libs.jetbrains.compose.material) implementation(libs.jetbrains.compose.material3) implementation(libs.jetbrains.compose.material.icons.extended) diff --git a/apps/flipcash/core-ui/src/androidMain/kotlin/com/flipcash/app/core/ui/BrandedGradientIcon.kt b/apps/flipcash/core-ui/src/commonMain/kotlin/com/flipcash/app/core/ui/BrandedGradientIcon.kt similarity index 100% rename from apps/flipcash/core-ui/src/androidMain/kotlin/com/flipcash/app/core/ui/BrandedGradientIcon.kt rename to apps/flipcash/core-ui/src/commonMain/kotlin/com/flipcash/app/core/ui/BrandedGradientIcon.kt diff --git a/apps/flipcash/core-ui/src/androidMain/kotlin/com/flipcash/app/core/ui/ConfirmationStyle.kt b/apps/flipcash/core-ui/src/commonMain/kotlin/com/flipcash/app/core/ui/ConfirmationStyle.kt similarity index 100% rename from apps/flipcash/core-ui/src/androidMain/kotlin/com/flipcash/app/core/ui/ConfirmationStyle.kt rename to apps/flipcash/core-ui/src/commonMain/kotlin/com/flipcash/app/core/ui/ConfirmationStyle.kt diff --git a/apps/flipcash/core-ui/src/androidMain/kotlin/com/flipcash/app/core/ui/ConversionGraphic.kt b/apps/flipcash/core-ui/src/commonMain/kotlin/com/flipcash/app/core/ui/ConversionGraphic.kt similarity index 84% rename from apps/flipcash/core-ui/src/androidMain/kotlin/com/flipcash/app/core/ui/ConversionGraphic.kt rename to apps/flipcash/core-ui/src/commonMain/kotlin/com/flipcash/app/core/ui/ConversionGraphic.kt index a4c2713e51..fd3dae6d9e 100644 --- a/apps/flipcash/core-ui/src/androidMain/kotlin/com/flipcash/app/core/ui/ConversionGraphic.kt +++ b/apps/flipcash/core-ui/src/commonMain/kotlin/com/flipcash/app/core/ui/ConversionGraphic.kt @@ -8,9 +8,12 @@ import androidx.compose.foundation.layout.size import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier -import androidx.compose.ui.res.painterResource +import org.jetbrains.compose.resources.painterResource import androidx.compose.ui.unit.dp -import com.flipcash.core.R +import com.flipcash.core.resources.Res +import com.flipcash.core.resources.ic_arrow_right +import com.flipcash.core.resources.ic_coin_dollars +import com.flipcash.core.resources.ic_usdc_on_solana /** * A coin face the [ConversionGraphic] can show on either side of the arrow. @@ -50,7 +53,7 @@ fun ConversionGraphic( // Nudged onto the coin faces' centre line, which the top alignment above leaves at // 50 dp: (100 - 28) / 2. modifier = Modifier.padding(top = 36.dp).size(28.dp), - painter = painterResource(R.drawable.ic_arrow_right), + painter = painterResource(Res.drawable.ic_arrow_right), contentDescription = null, ) Coin(to) @@ -62,13 +65,13 @@ private fun Coin(coin: ConversionCoin) { when (coin) { ConversionCoin.Dollars -> Image( modifier = Modifier.size(100.dp), - painter = painterResource(R.drawable.ic_coin_dollars), + painter = painterResource(Res.drawable.ic_coin_dollars), contentDescription = null, ) // Natural size (111x112): the 100 dp coin plus the badge overhanging its corner. ConversionCoin.UsdcOnSolana -> Image( - painter = painterResource(R.drawable.ic_usdc_on_solana), + painter = painterResource(Res.drawable.ic_usdc_on_solana), contentDescription = null, ) } diff --git a/apps/flipcash/core-ui/src/commonMain/kotlin/com/flipcash/app/core/ui/CurrencyAppreciationLabel.kt b/apps/flipcash/core-ui/src/commonMain/kotlin/com/flipcash/app/core/ui/CurrencyAppreciationLabel.kt index bc05434934..3a420dd8d8 100644 --- a/apps/flipcash/core-ui/src/commonMain/kotlin/com/flipcash/app/core/ui/CurrencyAppreciationLabel.kt +++ b/apps/flipcash/core-ui/src/commonMain/kotlin/com/flipcash/app/core/ui/CurrencyAppreciationLabel.kt @@ -1,5 +1,11 @@ package com.flipcash.app.core.ui +import org.jetbrains.compose.resources.stringResource +import com.flipcash.core.resources.Res +import com.flipcash.core.resources.label_fromAppreciation +import com.flipcash.core.resources.label_fromCurrencyAppreciation +import com.flipcash.core.resources.label_fromCurrencyDepreciation +import com.flipcash.core.resources.label_fromDepreciation import androidx.compose.foundation.background import androidx.compose.foundation.border import androidx.compose.foundation.layout.Arrangement @@ -12,13 +18,11 @@ import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.unit.dp import com.flipcash.app.core.money.formattedAppreciation -import com.flipcash.app.core.resources.CoreStrings import com.getcode.opencode.model.financial.Fiat import com.getcode.theme.CodeTheme import com.getcode.theme.White20 import com.getcode.theme.extraSmall import com.getcode.ui.components.text.AnimatedNumberText -import com.getcode.util.resources.stringRes /** Controls the visual treatment of the appreciation badge. */ enum class AppreciationStyle { @@ -88,15 +92,15 @@ fun CurrencyAppreciationLabel( val label = when (style) { AppreciationStyle.Pill -> if (hasAppreciation) { - stringRes(CoreStrings.label_fromAppreciation) + stringResource(Res.string.label_fromAppreciation) } else { - stringRes(CoreStrings.label_fromDepreciation) + stringResource(Res.string.label_fromDepreciation) } AppreciationStyle.Classic -> if (hasAppreciation) { - stringRes(CoreStrings.label_fromCurrencyAppreciation) + stringResource(Res.string.label_fromCurrencyAppreciation) } else { - stringRes(CoreStrings.label_fromCurrencyDepreciation) + stringResource(Res.string.label_fromCurrencyDepreciation) } } Text( diff --git a/apps/flipcash/core-ui/src/androidMain/kotlin/com/flipcash/app/core/ui/CurrencyHolder.kt b/apps/flipcash/core-ui/src/commonMain/kotlin/com/flipcash/app/core/ui/CurrencyHolder.kt similarity index 100% rename from apps/flipcash/core-ui/src/androidMain/kotlin/com/flipcash/app/core/ui/CurrencyHolder.kt rename to apps/flipcash/core-ui/src/commonMain/kotlin/com/flipcash/app/core/ui/CurrencyHolder.kt diff --git a/apps/flipcash/core-ui/src/androidMain/kotlin/com/flipcash/app/core/ui/DeviceFrame.kt b/apps/flipcash/core-ui/src/commonMain/kotlin/com/flipcash/app/core/ui/DeviceFrame.kt similarity index 83% rename from apps/flipcash/core-ui/src/androidMain/kotlin/com/flipcash/app/core/ui/DeviceFrame.kt rename to apps/flipcash/core-ui/src/commonMain/kotlin/com/flipcash/app/core/ui/DeviceFrame.kt index 7dcc411002..f32900a3cc 100644 --- a/apps/flipcash/core-ui/src/androidMain/kotlin/com/flipcash/app/core/ui/DeviceFrame.kt +++ b/apps/flipcash/core-ui/src/commonMain/kotlin/com/flipcash/app/core/ui/DeviceFrame.kt @@ -8,9 +8,11 @@ import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip -import androidx.compose.ui.res.painterResource +import org.jetbrains.compose.resources.painterResource import androidx.compose.ui.unit.dp -import com.flipcash.core.R +import com.flipcash.core.resources.Res +import com.flipcash.core.resources.ic_device_frame +import com.flipcash.core.resources.ic_screen_frame @Composable fun ScreenFrame( @@ -20,7 +22,7 @@ fun ScreenFrame( ) { Box(modifier = modifier, contentAlignment = Alignment.TopCenter) { Image( - painter = painterResource(id = R.drawable.ic_screen_frame), + painter = painterResource(Res.drawable.ic_screen_frame), contentDescription = "", ) Box( @@ -43,7 +45,7 @@ fun DeviceFrame( ) { Box(modifier = modifier, contentAlignment = Alignment.TopCenter) { Image( - painter = painterResource(id = R.drawable.ic_device_frame), + painter = painterResource(Res.drawable.ic_device_frame), contentDescription = "", ) // Inner viewport clipped to frame edge diff --git a/apps/flipcash/core-ui/src/androidMain/kotlin/com/flipcash/app/core/ui/NotificationPreview.kt b/apps/flipcash/core-ui/src/commonMain/kotlin/com/flipcash/app/core/ui/NotificationPreview.kt similarity index 85% rename from apps/flipcash/core-ui/src/androidMain/kotlin/com/flipcash/app/core/ui/NotificationPreview.kt rename to apps/flipcash/core-ui/src/commonMain/kotlin/com/flipcash/app/core/ui/NotificationPreview.kt index 5deabe0aad..95b26f7160 100644 --- a/apps/flipcash/core-ui/src/androidMain/kotlin/com/flipcash/app/core/ui/NotificationPreview.kt +++ b/apps/flipcash/core-ui/src/commonMain/kotlin/com/flipcash/app/core/ui/NotificationPreview.kt @@ -19,16 +19,19 @@ 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.res.painterResource -import androidx.compose.ui.res.stringResource +import org.jetbrains.compose.resources.painterResource +import org.jetbrains.compose.resources.stringResource import androidx.compose.ui.text.font.FontFamily import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import com.flipcash.app.theme.FlipcashPreview -import com.flipcash.core.R import com.getcode.theme.CodeTheme +import com.flipcash.core.resources.Res +import com.flipcash.core.resources.ic_notification_preview_icon +import com.flipcash.core.resources.notification_preview_body +import com.flipcash.core.resources.notification_preview_title @Composable fun NotificationPreview( @@ -53,7 +56,7 @@ fun NotificationPreview( .fillMaxHeight() .requiredSize(32.dp) .aspectRatio(1f), - painter = painterResource(R.drawable.ic_notification_preview_icon), + painter = painterResource(Res.drawable.ic_notification_preview_icon), contentDescription = null, ) Spacer(modifier = Modifier.width(8.dp)) @@ -96,8 +99,8 @@ fun NotificationPreview( fun Preview_Notification() { FlipcashPreview { NotificationPreview( - title = stringResource(R.string.notification_preview_title), - body = stringResource(R.string.notification_preview_body), + title = stringResource(Res.string.notification_preview_title), + body = stringResource(Res.string.notification_preview_body), ) } } \ No newline at end of file diff --git a/apps/flipcash/core-ui/src/androidMain/kotlin/com/flipcash/app/core/ui/ReceiptLineItem.kt b/apps/flipcash/core-ui/src/commonMain/kotlin/com/flipcash/app/core/ui/ReceiptLineItem.kt similarity index 100% rename from apps/flipcash/core-ui/src/androidMain/kotlin/com/flipcash/app/core/ui/ReceiptLineItem.kt rename to apps/flipcash/core-ui/src/commonMain/kotlin/com/flipcash/app/core/ui/ReceiptLineItem.kt diff --git a/apps/flipcash/core-ui/src/androidMain/kotlin/com/flipcash/app/core/ui/Skeleton.kt b/apps/flipcash/core-ui/src/commonMain/kotlin/com/flipcash/app/core/ui/Skeleton.kt similarity index 100% rename from apps/flipcash/core-ui/src/androidMain/kotlin/com/flipcash/app/core/ui/Skeleton.kt rename to apps/flipcash/core-ui/src/commonMain/kotlin/com/flipcash/app/core/ui/Skeleton.kt diff --git a/apps/flipcash/core-ui/src/androidMain/kotlin/com/flipcash/app/core/ui/SwitchPreview.kt b/apps/flipcash/core-ui/src/commonMain/kotlin/com/flipcash/app/core/ui/SwitchPreview.kt similarity index 93% rename from apps/flipcash/core-ui/src/androidMain/kotlin/com/flipcash/app/core/ui/SwitchPreview.kt rename to apps/flipcash/core-ui/src/commonMain/kotlin/com/flipcash/app/core/ui/SwitchPreview.kt index 5ed02e05eb..00b915a662 100644 --- a/apps/flipcash/core-ui/src/androidMain/kotlin/com/flipcash/app/core/ui/SwitchPreview.kt +++ b/apps/flipcash/core-ui/src/commonMain/kotlin/com/flipcash/app/core/ui/SwitchPreview.kt @@ -20,15 +20,16 @@ import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.graphicsLayer -import androidx.compose.ui.res.stringResource +import org.jetbrains.compose.resources.stringResource import androidx.compose.ui.text.font.FontFamily import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import com.flipcash.app.theme.FlipcashPreview -import com.flipcash.core.R import com.getcode.theme.CodeTheme +import com.flipcash.core.resources.Res +import com.flipcash.core.resources.title_allowNotifications @Composable fun SwitchPreview(modifier: Modifier = Modifier, checked: Boolean = false) { @@ -45,7 +46,7 @@ fun SwitchPreview(modifier: Modifier = Modifier, checked: Boolean = false) { ) { Text( modifier = Modifier.weight(1f), - text = stringResource(R.string.title_allowNotifications), + text = stringResource(Res.string.title_allowNotifications), fontSize = 14.sp, fontFamily = FontFamily.Default, fontWeight = FontWeight.Medium diff --git a/apps/flipcash/core-ui/src/androidMain/kotlin/com/flipcash/app/core/ui/TokenSelectionPill.kt b/apps/flipcash/core-ui/src/commonMain/kotlin/com/flipcash/app/core/ui/TokenSelectionPill.kt similarity index 93% rename from apps/flipcash/core-ui/src/androidMain/kotlin/com/flipcash/app/core/ui/TokenSelectionPill.kt rename to apps/flipcash/core-ui/src/commonMain/kotlin/com/flipcash/app/core/ui/TokenSelectionPill.kt index ec82200dd9..d5199efa4f 100644 --- a/apps/flipcash/core-ui/src/androidMain/kotlin/com/flipcash/app/core/ui/TokenSelectionPill.kt +++ b/apps/flipcash/core-ui/src/commonMain/kotlin/com/flipcash/app/core/ui/TokenSelectionPill.kt @@ -18,12 +18,13 @@ 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.res.painterResource +import org.jetbrains.compose.resources.painterResource import androidx.compose.ui.text.TextStyle import androidx.compose.ui.unit.Dp import com.getcode.opencode.model.financial.Token import com.getcode.theme.CodeTheme -import com.getcode.ui.core.R +import com.getcode.util.resources.Res +import com.getcode.util.resources.ic_dropdown @Composable fun TokenSelectionPill( @@ -64,7 +65,7 @@ fun TokenSelectionPill( Image( modifier = Modifier .size(CodeTheme.dimens.grid.x4), - painter = painterResource(R.drawable.ic_dropdown), + painter = painterResource(Res.drawable.ic_dropdown), contentDescription = "" ) } @@ -105,7 +106,7 @@ fun TokenSelectionPill( Image( modifier = Modifier .width(CodeTheme.dimens.grid.x4), - painter = painterResource(R.drawable.ic_dropdown), + painter = painterResource(Res.drawable.ic_dropdown), contentDescription = "" ) } diff --git a/apps/flipcash/core-ui/src/androidMain/kotlin/com/flipcash/app/core/ui/flow/FlowProgress.kt b/apps/flipcash/core-ui/src/commonMain/kotlin/com/flipcash/app/core/ui/flow/FlowProgress.kt similarity index 100% rename from apps/flipcash/core-ui/src/androidMain/kotlin/com/flipcash/app/core/ui/flow/FlowProgress.kt rename to apps/flipcash/core-ui/src/commonMain/kotlin/com/flipcash/app/core/ui/flow/FlowProgress.kt diff --git a/apps/flipcash/core-ui/src/androidMain/kotlin/com/flipcash/app/core/ui/flow/FlowStepBarController.kt b/apps/flipcash/core-ui/src/commonMain/kotlin/com/flipcash/app/core/ui/flow/FlowStepBarController.kt similarity index 100% rename from apps/flipcash/core-ui/src/androidMain/kotlin/com/flipcash/app/core/ui/flow/FlowStepBarController.kt rename to apps/flipcash/core-ui/src/commonMain/kotlin/com/flipcash/app/core/ui/flow/FlowStepBarController.kt diff --git a/apps/flipcash/core-ui/src/androidMain/kotlin/com/flipcash/app/core/ui/flow/FlowStepper.kt b/apps/flipcash/core-ui/src/commonMain/kotlin/com/flipcash/app/core/ui/flow/FlowStepper.kt similarity index 100% rename from apps/flipcash/core-ui/src/androidMain/kotlin/com/flipcash/app/core/ui/flow/FlowStepper.kt rename to apps/flipcash/core-ui/src/commonMain/kotlin/com/flipcash/app/core/ui/flow/FlowStepper.kt diff --git a/apps/flipcash/core-ui/src/commonMain/kotlin/com/flipcash/app/core/ui/onboarding/NewUserTutorial.kt b/apps/flipcash/core-ui/src/commonMain/kotlin/com/flipcash/app/core/ui/onboarding/NewUserTutorial.kt index cb1a56b6c8..2a78b1eda6 100644 --- a/apps/flipcash/core-ui/src/commonMain/kotlin/com/flipcash/app/core/ui/onboarding/NewUserTutorial.kt +++ b/apps/flipcash/core-ui/src/commonMain/kotlin/com/flipcash/app/core/ui/onboarding/NewUserTutorial.kt @@ -1,5 +1,16 @@ package com.flipcash.app.core.ui.onboarding +import org.jetbrains.compose.resources.stringResource +import org.jetbrains.compose.resources.painterResource +import com.flipcash.core.resources.Res +import com.flipcash.core.resources.ic_checked_green +import com.getcode.util.resources.ic_chevron_right +import com.getcode.util.resources.Res as UiRes +import com.flipcash.core.resources.ic_nav_tipcard +import com.flipcash.core.resources.subtitle_addMoney +import com.flipcash.core.resources.subtitle_scanTipCard +import com.flipcash.core.resources.title_addMoney +import com.flipcash.core.resources.title_scanTipCard import androidx.compose.foundation.Image import androidx.compose.foundation.background import androidx.compose.foundation.clickable @@ -26,12 +37,8 @@ import androidx.compose.ui.graphics.vector.rememberVectorPainter import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import androidx.compose.ui.util.fastForEach -import com.flipcash.app.core.resources.CoreDrawables -import com.flipcash.app.core.resources.CoreStrings import com.getcode.theme.CodeTheme import com.getcode.theme.extraSmall -import com.getcode.util.resources.painterForResId -import com.getcode.util.resources.stringRes /** * A row in a "what's left to do" checklist. @@ -53,20 +60,20 @@ sealed interface TutorialItem { class AddMoney(override val isCompleted: Boolean) : Wallet { override val title: String - @Composable get() = stringRes(CoreStrings.title_addMoney) + @Composable get() = stringResource(Res.string.title_addMoney) override val description: String - @Composable get() = stringRes(CoreStrings.subtitle_addMoney) + @Composable get() = stringResource(Res.string.subtitle_addMoney) override val icon: Painter @Composable get() = rememberVectorPainter(Icons.Outlined.AddCircleOutline) } class ScanTipCard(override val isCompleted: Boolean) : Wallet { override val title: String - @Composable get() = stringRes(CoreStrings.title_scanTipCard) + @Composable get() = stringResource(Res.string.title_scanTipCard) override val description: String - @Composable get() = stringRes(CoreStrings.subtitle_scanTipCard) + @Composable get() = stringResource(Res.string.subtitle_scanTipCard) override val icon: Painter - @Composable get() = painterForResId(CoreDrawables.ic_nav_tipcard) + @Composable get() = painterResource(Res.drawable.ic_nav_tipcard) } } @@ -137,7 +144,7 @@ private fun OnboardingItemRow( Image( modifier = Modifier.align(Alignment.Top).size(24.dp), painter = if (item.isCompleted) { - painterForResId(CoreDrawables.ic_checked_green) + painterResource(Res.drawable.ic_checked_green) } else { item.icon }, @@ -162,7 +169,7 @@ private fun OnboardingItemRow( } Icon( modifier = Modifier.align(Alignment.CenterVertically).size(16.dp), - painter = painterForResId(CoreDrawables.ic_chevron_right), + painter = painterResource(UiRes.drawable.ic_chevron_right), tint = CodeTheme.colors.textSecondary, contentDescription = null ) diff --git a/apps/flipcash/core-ui/src/androidMain/kotlin/com/flipcash/app/core/ui/processing/ProcessingLoadingIndicator.kt b/apps/flipcash/core-ui/src/commonMain/kotlin/com/flipcash/app/core/ui/processing/ProcessingLoadingIndicator.kt similarity index 91% rename from apps/flipcash/core-ui/src/androidMain/kotlin/com/flipcash/app/core/ui/processing/ProcessingLoadingIndicator.kt rename to apps/flipcash/core-ui/src/commonMain/kotlin/com/flipcash/app/core/ui/processing/ProcessingLoadingIndicator.kt index d91b21dfc6..ab9dfa1cca 100644 --- a/apps/flipcash/core-ui/src/androidMain/kotlin/com/flipcash/app/core/ui/processing/ProcessingLoadingIndicator.kt +++ b/apps/flipcash/core-ui/src/commonMain/kotlin/com/flipcash/app/core/ui/processing/ProcessingLoadingIndicator.kt @@ -20,8 +20,7 @@ import androidx.compose.runtime.withFrameMillis import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.StrokeCap -import androidx.compose.ui.res.painterResource -import com.flipcash.core.R +import org.jetbrains.compose.resources.painterResource import com.getcode.theme.CodeTheme import com.getcode.ui.theme.CodeCircularProgressIndicator import com.getcode.view.LoadingSuccessState @@ -29,6 +28,9 @@ import kotlinx.coroutines.isActive import kotlin.math.pow import kotlin.time.Duration import kotlin.time.Duration.Companion.seconds +import com.flipcash.core.resources.Res +import com.flipcash.core.resources.ic_circle_check_large +import com.flipcash.core.resources.ic_circle_exclamation_large @Composable fun ProcessingLoadingIndicator( @@ -96,7 +98,7 @@ fun ProcessingLoadingIndicator( when (targetState) { LoadingSuccessState.State.Error -> Image( modifier = modifier, - painter = painterResource(R.drawable.ic_circle_exclamation_large), + painter = painterResource(Res.drawable.ic_circle_exclamation_large), contentDescription = null, ) LoadingSuccessState.State.Idle -> Spacer(modifier) @@ -110,7 +112,7 @@ fun ProcessingLoadingIndicator( ) LoadingSuccessState.State.Success -> Image( modifier = modifier, - painter = painterResource(R.drawable.ic_circle_check_large), + painter = painterResource(Res.drawable.ic_circle_check_large), contentDescription = null, ) } diff --git a/apps/flipcash/core-ui/src/androidMain/kotlin/com/flipcash/app/core/ui/transitions/CardExpandTransition.kt b/apps/flipcash/core-ui/src/commonMain/kotlin/com/flipcash/app/core/ui/transitions/CardExpandTransition.kt similarity index 100% rename from apps/flipcash/core-ui/src/androidMain/kotlin/com/flipcash/app/core/ui/transitions/CardExpandTransition.kt rename to apps/flipcash/core-ui/src/commonMain/kotlin/com/flipcash/app/core/ui/transitions/CardExpandTransition.kt diff --git a/apps/flipcash/core/build.gradle.kts b/apps/flipcash/core/build.gradle.kts index 2fab73b963..6fac369089 100644 --- a/apps/flipcash/core/build.gradle.kts +++ b/apps/flipcash/core/build.gradle.kts @@ -17,6 +17,12 @@ kotlin { sourceSets { commonMain.dependencies { + implementation(libs.jetbrains.compose.ui) + implementation(libs.jetbrains.compose.animation) + implementation(libs.jetbrains.compose.material) + implementation(libs.jetbrains.compose.material3) + implementation(libs.jetbrains.compose.ui.tooling.preview) + implementation(libs.sodium.bindings.kmp) implementation(project(":libs:parcelable")) implementation(libs.javax.inject) api(libs.androidx.lifecycle.runtime.common) diff --git a/apps/flipcash/core/src/androidMain/kotlin/com/flipcash/app/core/extensions/Boolean.kt b/apps/flipcash/core/src/androidMain/kotlin/com/flipcash/app/core/extensions/Boolean.kt deleted file mode 100644 index fd1cd833fe..0000000000 --- a/apps/flipcash/core/src/androidMain/kotlin/com/flipcash/app/core/extensions/Boolean.kt +++ /dev/null @@ -1,8 +0,0 @@ -package com.flipcash.app.core.extensions - -import androidx.compose.runtime.Composable -import androidx.compose.ui.res.stringResource -import com.flipcash.core.R - -@Composable -fun Boolean.toYesOrNo() = if (this) stringResource(R.string.label_yes) else stringResource(R.string.label_no) \ No newline at end of file diff --git a/apps/flipcash/core/src/androidMain/kotlin/com/flipcash/app/core/resources/CoreResources.android.kt b/apps/flipcash/core/src/androidMain/kotlin/com/flipcash/app/core/resources/CoreResources.android.kt deleted file mode 100644 index fd2dd31111..0000000000 --- a/apps/flipcash/core/src/androidMain/kotlin/com/flipcash/app/core/resources/CoreResources.android.kt +++ /dev/null @@ -1,33 +0,0 @@ -package com.flipcash.app.core.resources - -import com.flipcash.core.R - -@Suppress("PropertyName") -actual object CoreStrings { - actual val title_addMoney: Int = R.string.title_addMoney - actual val subtitle_addMoney: Int = R.string.subtitle_addMoney - actual val title_scanTipCard: Int = R.string.title_scanTipCard - actual val subtitle_scanTipCard: Int = R.string.subtitle_scanTipCard - actual val label_fromAppreciation: Int = R.string.label_fromAppreciation - actual val label_fromDepreciation: Int = R.string.label_fromDepreciation - actual val label_fromCurrencyAppreciation: Int = R.string.label_fromCurrencyAppreciation - actual val label_fromCurrencyDepreciation: Int = R.string.label_fromCurrencyDepreciation - actual val title_recentActivity: Int = R.string.title_recentActivity - actual val label_chatReceipt_yesterday: Int = R.string.label_chatReceipt_yesterday - actual val title_tipOnboarding: Int = R.string.title_tipOnboarding - actual val action_createYourOwnCurrency: Int = R.string.action_createYourOwnCurrency - actual val action_currencyLeaderboard: Int = R.string.action_currencyLeaderboard - actual val action_addDollars: Int = R.string.action_addDollars - actual val action_withdrawDollars: Int = R.string.action_withdrawDollars -} - -@Suppress("PropertyName") -actual object CoreDrawables { - actual val ic_nav_tipcard: Int = R.drawable.ic_nav_tipcard - actual val ic_checked_green: Int = R.drawable.ic_checked_green - actual val ic_chevron_right: Int = R.drawable.ic_chevron_right - actual val ic_coins_add: Int = R.drawable.ic_coins_add - actual val ic_globe: Int = R.drawable.ic_globe - actual val ic_menu_deposit: Int = R.drawable.ic_menu_deposit - actual val ic_menu_withdraw: Int = R.drawable.ic_menu_withdraw -} diff --git a/apps/flipcash/core/src/androidMain/kotlin/com/flipcash/app/core/Locals.kt b/apps/flipcash/core/src/commonMain/kotlin/com/flipcash/app/core/Locals.kt similarity index 100% rename from apps/flipcash/core/src/androidMain/kotlin/com/flipcash/app/core/Locals.kt rename to apps/flipcash/core/src/commonMain/kotlin/com/flipcash/app/core/Locals.kt diff --git a/apps/flipcash/core/src/androidMain/kotlin/com/flipcash/app/core/android/VersionInfo.kt b/apps/flipcash/core/src/commonMain/kotlin/com/flipcash/app/core/android/VersionInfo.kt similarity index 100% rename from apps/flipcash/core/src/androidMain/kotlin/com/flipcash/app/core/android/VersionInfo.kt rename to apps/flipcash/core/src/commonMain/kotlin/com/flipcash/app/core/android/VersionInfo.kt diff --git a/apps/flipcash/core/src/androidMain/kotlin/com/flipcash/app/core/annotations/AccountType.kt b/apps/flipcash/core/src/commonMain/kotlin/com/flipcash/app/core/annotations/AccountType.kt similarity index 100% rename from apps/flipcash/core/src/androidMain/kotlin/com/flipcash/app/core/annotations/AccountType.kt rename to apps/flipcash/core/src/commonMain/kotlin/com/flipcash/app/core/annotations/AccountType.kt diff --git a/apps/flipcash/core/src/androidMain/kotlin/com/flipcash/app/core/cache/CacheEntry.kt b/apps/flipcash/core/src/commonMain/kotlin/com/flipcash/app/core/cache/CacheEntry.kt similarity index 100% rename from apps/flipcash/core/src/androidMain/kotlin/com/flipcash/app/core/cache/CacheEntry.kt rename to apps/flipcash/core/src/commonMain/kotlin/com/flipcash/app/core/cache/CacheEntry.kt diff --git a/apps/flipcash/core/src/androidMain/kotlin/com/flipcash/app/core/cache/CachePolicy.kt b/apps/flipcash/core/src/commonMain/kotlin/com/flipcash/app/core/cache/CachePolicy.kt similarity index 100% rename from apps/flipcash/core/src/androidMain/kotlin/com/flipcash/app/core/cache/CachePolicy.kt rename to apps/flipcash/core/src/commonMain/kotlin/com/flipcash/app/core/cache/CachePolicy.kt diff --git a/apps/flipcash/core/src/androidMain/kotlin/com/flipcash/app/core/cache/CachePolicyHandler.kt b/apps/flipcash/core/src/commonMain/kotlin/com/flipcash/app/core/cache/CachePolicyHandler.kt similarity index 100% rename from apps/flipcash/core/src/androidMain/kotlin/com/flipcash/app/core/cache/CachePolicyHandler.kt rename to apps/flipcash/core/src/commonMain/kotlin/com/flipcash/app/core/cache/CachePolicyHandler.kt diff --git a/apps/flipcash/core/src/androidMain/kotlin/com/flipcash/app/core/data/Loadable.kt b/apps/flipcash/core/src/commonMain/kotlin/com/flipcash/app/core/data/Loadable.kt similarity index 100% rename from apps/flipcash/core/src/androidMain/kotlin/com/flipcash/app/core/data/Loadable.kt rename to apps/flipcash/core/src/commonMain/kotlin/com/flipcash/app/core/data/Loadable.kt diff --git a/apps/flipcash/core/src/androidMain/kotlin/com/flipcash/app/core/encryption/Sodium.kt b/apps/flipcash/core/src/commonMain/kotlin/com/flipcash/app/core/encryption/Sodium.kt similarity index 100% rename from apps/flipcash/core/src/androidMain/kotlin/com/flipcash/app/core/encryption/Sodium.kt rename to apps/flipcash/core/src/commonMain/kotlin/com/flipcash/app/core/encryption/Sodium.kt diff --git a/apps/flipcash/core/src/commonMain/kotlin/com/flipcash/app/core/extensions/Boolean.kt b/apps/flipcash/core/src/commonMain/kotlin/com/flipcash/app/core/extensions/Boolean.kt new file mode 100644 index 0000000000..b2c7209ca9 --- /dev/null +++ b/apps/flipcash/core/src/commonMain/kotlin/com/flipcash/app/core/extensions/Boolean.kt @@ -0,0 +1,10 @@ +package com.flipcash.app.core.extensions + +import androidx.compose.runtime.Composable +import org.jetbrains.compose.resources.stringResource +import com.flipcash.core.resources.Res +import com.flipcash.core.resources.label_no +import com.flipcash.core.resources.label_yes + +@Composable +fun Boolean.toYesOrNo() = if (this) stringResource(Res.string.label_yes) else stringResource(Res.string.label_no) \ No newline at end of file diff --git a/apps/flipcash/core/src/androidMain/kotlin/com/flipcash/app/core/extensions/Flow.kt b/apps/flipcash/core/src/commonMain/kotlin/com/flipcash/app/core/extensions/Flow.kt similarity index 100% rename from apps/flipcash/core/src/androidMain/kotlin/com/flipcash/app/core/extensions/Flow.kt rename to apps/flipcash/core/src/commonMain/kotlin/com/flipcash/app/core/extensions/Flow.kt diff --git a/apps/flipcash/core/src/androidMain/kotlin/com/flipcash/app/core/extensions/List.kt b/apps/flipcash/core/src/commonMain/kotlin/com/flipcash/app/core/extensions/List.kt similarity index 100% rename from apps/flipcash/core/src/androidMain/kotlin/com/flipcash/app/core/extensions/List.kt rename to apps/flipcash/core/src/commonMain/kotlin/com/flipcash/app/core/extensions/List.kt diff --git a/apps/flipcash/core/src/androidMain/kotlin/com/flipcash/app/core/extensions/Pair.kt b/apps/flipcash/core/src/commonMain/kotlin/com/flipcash/app/core/extensions/Pair.kt similarity index 100% rename from apps/flipcash/core/src/androidMain/kotlin/com/flipcash/app/core/extensions/Pair.kt rename to apps/flipcash/core/src/commonMain/kotlin/com/flipcash/app/core/extensions/Pair.kt diff --git a/apps/flipcash/core/src/androidMain/kotlin/com/flipcash/app/core/extensions/Result.kt b/apps/flipcash/core/src/commonMain/kotlin/com/flipcash/app/core/extensions/Result.kt similarity index 100% rename from apps/flipcash/core/src/androidMain/kotlin/com/flipcash/app/core/extensions/Result.kt rename to apps/flipcash/core/src/commonMain/kotlin/com/flipcash/app/core/extensions/Result.kt diff --git a/apps/flipcash/core/src/androidMain/kotlin/com/flipcash/app/core/internal/extensions/Result.kt b/apps/flipcash/core/src/commonMain/kotlin/com/flipcash/app/core/internal/extensions/Result.kt similarity index 100% rename from apps/flipcash/core/src/androidMain/kotlin/com/flipcash/app/core/internal/extensions/Result.kt rename to apps/flipcash/core/src/commonMain/kotlin/com/flipcash/app/core/internal/extensions/Result.kt diff --git a/apps/flipcash/core/src/androidMain/kotlin/com/flipcash/app/core/internal/updater/ProfileUpdater.kt b/apps/flipcash/core/src/commonMain/kotlin/com/flipcash/app/core/internal/updater/ProfileUpdater.kt similarity index 100% rename from apps/flipcash/core/src/androidMain/kotlin/com/flipcash/app/core/internal/updater/ProfileUpdater.kt rename to apps/flipcash/core/src/commonMain/kotlin/com/flipcash/app/core/internal/updater/ProfileUpdater.kt diff --git a/apps/flipcash/core/src/androidMain/kotlin/com/flipcash/app/core/links/TrustedWebsites.kt b/apps/flipcash/core/src/commonMain/kotlin/com/flipcash/app/core/links/TrustedWebsites.kt similarity index 100% rename from apps/flipcash/core/src/androidMain/kotlin/com/flipcash/app/core/links/TrustedWebsites.kt rename to apps/flipcash/core/src/commonMain/kotlin/com/flipcash/app/core/links/TrustedWebsites.kt diff --git a/apps/flipcash/core/src/commonMain/kotlin/com/flipcash/app/core/resources/CoreResources.kt b/apps/flipcash/core/src/commonMain/kotlin/com/flipcash/app/core/resources/CoreResources.kt deleted file mode 100644 index 28e1615421..0000000000 --- a/apps/flipcash/core/src/commonMain/kotlin/com/flipcash/app/core/resources/CoreResources.kt +++ /dev/null @@ -1,36 +0,0 @@ -package com.flipcash.app.core.resources - -/** - * `Int` IDs for the `app:core` resources that common UI hands to [com.getcode.util.resources.stringRes] - * and [com.getcode.util.resources.painterForResId]. Android returns the `R` IDs; desktop registers the - * generated Compose resources. - */ -@Suppress("PropertyName") -expect object CoreStrings { - val title_addMoney: Int - val subtitle_addMoney: Int - val title_scanTipCard: Int - val subtitle_scanTipCard: Int - val label_fromAppreciation: Int - val label_fromDepreciation: Int - val label_fromCurrencyAppreciation: Int - val label_fromCurrencyDepreciation: Int - val title_recentActivity: Int - val label_chatReceipt_yesterday: Int - val title_tipOnboarding: Int - val action_createYourOwnCurrency: Int - val action_currencyLeaderboard: Int - val action_addDollars: Int - val action_withdrawDollars: Int -} - -@Suppress("PropertyName") -expect object CoreDrawables { - val ic_nav_tipcard: Int - val ic_checked_green: Int - val ic_chevron_right: Int - val ic_coins_add: Int - val ic_globe: Int - val ic_menu_deposit: Int - val ic_menu_withdraw: Int -} diff --git a/apps/flipcash/core/src/androidMain/kotlin/com/flipcash/app/core/tipping/OwnTipCard.kt b/apps/flipcash/core/src/commonMain/kotlin/com/flipcash/app/core/tipping/OwnTipCard.kt similarity index 100% rename from apps/flipcash/core/src/androidMain/kotlin/com/flipcash/app/core/tipping/OwnTipCard.kt rename to apps/flipcash/core/src/commonMain/kotlin/com/flipcash/app/core/tipping/OwnTipCard.kt diff --git a/apps/flipcash/core/src/androidMain/kotlin/com/flipcash/app/core/tipping/TipSelection.kt b/apps/flipcash/core/src/commonMain/kotlin/com/flipcash/app/core/tipping/TipSelection.kt similarity index 100% rename from apps/flipcash/core/src/androidMain/kotlin/com/flipcash/app/core/tipping/TipSelection.kt rename to apps/flipcash/core/src/commonMain/kotlin/com/flipcash/app/core/tipping/TipSelection.kt diff --git a/apps/flipcash/core/src/androidMain/kotlin/com/flipcash/app/core/toast/SystemToastController.kt b/apps/flipcash/core/src/commonMain/kotlin/com/flipcash/app/core/toast/SystemToastController.kt similarity index 100% rename from apps/flipcash/core/src/androidMain/kotlin/com/flipcash/app/core/toast/SystemToastController.kt rename to apps/flipcash/core/src/commonMain/kotlin/com/flipcash/app/core/toast/SystemToastController.kt diff --git a/apps/flipcash/core/src/androidMain/kotlin/com/flipcash/app/core/toast/ToastController.kt b/apps/flipcash/core/src/commonMain/kotlin/com/flipcash/app/core/toast/ToastController.kt similarity index 100% rename from apps/flipcash/core/src/androidMain/kotlin/com/flipcash/app/core/toast/ToastController.kt rename to apps/flipcash/core/src/commonMain/kotlin/com/flipcash/app/core/toast/ToastController.kt diff --git a/apps/flipcash/core/src/androidMain/kotlin/com/flipcash/app/core/util/AbbreviatedLink.kt b/apps/flipcash/core/src/commonMain/kotlin/com/flipcash/app/core/util/AbbreviatedLink.kt similarity index 100% rename from apps/flipcash/core/src/androidMain/kotlin/com/flipcash/app/core/util/AbbreviatedLink.kt rename to apps/flipcash/core/src/commonMain/kotlin/com/flipcash/app/core/util/AbbreviatedLink.kt diff --git a/apps/flipcash/core/src/androidMain/kotlin/com/flipcash/app/core/util/Fiat.kt b/apps/flipcash/core/src/commonMain/kotlin/com/flipcash/app/core/util/Fiat.kt similarity index 100% rename from apps/flipcash/core/src/androidMain/kotlin/com/flipcash/app/core/util/Fiat.kt rename to apps/flipcash/core/src/commonMain/kotlin/com/flipcash/app/core/util/Fiat.kt diff --git a/apps/flipcash/core/src/androidMain/kotlin/com/flipcash/app/core/util/Linkify.kt b/apps/flipcash/core/src/commonMain/kotlin/com/flipcash/app/core/util/Linkify.kt similarity index 100% rename from apps/flipcash/core/src/androidMain/kotlin/com/flipcash/app/core/util/Linkify.kt rename to apps/flipcash/core/src/commonMain/kotlin/com/flipcash/app/core/util/Linkify.kt diff --git a/apps/flipcash/core/src/androidMain/kotlin/com/flipcash/app/core/util/MessagingPackages.kt b/apps/flipcash/core/src/commonMain/kotlin/com/flipcash/app/core/util/MessagingPackages.kt similarity index 100% rename from apps/flipcash/core/src/androidMain/kotlin/com/flipcash/app/core/util/MessagingPackages.kt rename to apps/flipcash/core/src/commonMain/kotlin/com/flipcash/app/core/util/MessagingPackages.kt diff --git a/apps/flipcash/core/src/androidMain/kotlin/com/flipcash/app/core/util/Number.kt b/apps/flipcash/core/src/commonMain/kotlin/com/flipcash/app/core/util/Number.kt similarity index 100% rename from apps/flipcash/core/src/androidMain/kotlin/com/flipcash/app/core/util/Number.kt rename to apps/flipcash/core/src/commonMain/kotlin/com/flipcash/app/core/util/Number.kt diff --git a/apps/flipcash/core/src/androidMain/kotlin/com/flipcash/app/core/verification/email/EmailCodeChannel.kt b/apps/flipcash/core/src/commonMain/kotlin/com/flipcash/app/core/verification/email/EmailCodeChannel.kt similarity index 100% rename from apps/flipcash/core/src/androidMain/kotlin/com/flipcash/app/core/verification/email/EmailCodeChannel.kt rename to apps/flipcash/core/src/commonMain/kotlin/com/flipcash/app/core/verification/email/EmailCodeChannel.kt diff --git a/apps/flipcash/core/src/androidMain/kotlin/com/flipcash/app/core/verification/email/EmailDeeplinkOrigin.kt b/apps/flipcash/core/src/commonMain/kotlin/com/flipcash/app/core/verification/email/EmailDeeplinkOrigin.kt similarity index 100% rename from apps/flipcash/core/src/androidMain/kotlin/com/flipcash/app/core/verification/email/EmailDeeplinkOrigin.kt rename to apps/flipcash/core/src/commonMain/kotlin/com/flipcash/app/core/verification/email/EmailDeeplinkOrigin.kt diff --git a/apps/flipcash/core/src/androidMain/kotlin/com/flipcash/app/core/verification/email/LocalEmailCodeChannel.kt b/apps/flipcash/core/src/commonMain/kotlin/com/flipcash/app/core/verification/email/LocalEmailCodeChannel.kt similarity index 100% rename from apps/flipcash/core/src/androidMain/kotlin/com/flipcash/app/core/verification/email/LocalEmailCodeChannel.kt rename to apps/flipcash/core/src/commonMain/kotlin/com/flipcash/app/core/verification/email/LocalEmailCodeChannel.kt diff --git a/apps/flipcash/core/src/jvmMain/kotlin/com/flipcash/app/core/resources/CoreResources.jvm.kt b/apps/flipcash/core/src/jvmMain/kotlin/com/flipcash/app/core/resources/CoreResources.jvm.kt deleted file mode 100644 index 92b968fcf4..0000000000 --- a/apps/flipcash/core/src/jvmMain/kotlin/com/flipcash/app/core/resources/CoreResources.jvm.kt +++ /dev/null @@ -1,55 +0,0 @@ -package com.flipcash.app.core.resources - -import com.flipcash.core.resources.Res -import com.flipcash.core.resources.ic_checked_green -import com.flipcash.core.resources.ic_nav_tipcard -import com.flipcash.core.resources.label_fromAppreciation -import com.flipcash.core.resources.label_fromCurrencyAppreciation -import com.flipcash.core.resources.label_fromCurrencyDepreciation -import com.flipcash.core.resources.label_fromDepreciation -import com.flipcash.core.resources.subtitle_addMoney -import com.flipcash.core.resources.subtitle_scanTipCard -import com.flipcash.core.resources.title_addMoney -import com.flipcash.core.resources.title_scanTipCard -import com.flipcash.core.resources.title_recentActivity -import com.flipcash.core.resources.label_chatReceipt_yesterday -import com.flipcash.core.resources.title_tipOnboarding -import com.flipcash.core.resources.action_createYourOwnCurrency -import com.flipcash.core.resources.action_currencyLeaderboard -import com.flipcash.core.resources.action_addDollars -import com.flipcash.core.resources.action_withdrawDollars -import com.flipcash.core.resources.ic_coins_add -import com.flipcash.core.resources.ic_globe -import com.flipcash.core.resources.ic_menu_deposit -import com.flipcash.core.resources.ic_menu_withdraw -import com.getcode.util.resources.ComposeResourceIds - -@Suppress("PropertyName") -actual object CoreStrings { - actual val title_addMoney: Int = ComposeResourceIds.register(Res.string.title_addMoney) - actual val subtitle_addMoney: Int = ComposeResourceIds.register(Res.string.subtitle_addMoney) - actual val title_scanTipCard: Int = ComposeResourceIds.register(Res.string.title_scanTipCard) - actual val subtitle_scanTipCard: Int = ComposeResourceIds.register(Res.string.subtitle_scanTipCard) - actual val label_fromAppreciation: Int = ComposeResourceIds.register(Res.string.label_fromAppreciation) - actual val label_fromDepreciation: Int = ComposeResourceIds.register(Res.string.label_fromDepreciation) - actual val label_fromCurrencyAppreciation: Int = ComposeResourceIds.register(Res.string.label_fromCurrencyAppreciation) - actual val label_fromCurrencyDepreciation: Int = ComposeResourceIds.register(Res.string.label_fromCurrencyDepreciation) - actual val title_recentActivity: Int = ComposeResourceIds.register(Res.string.title_recentActivity) - actual val label_chatReceipt_yesterday: Int = ComposeResourceIds.register(Res.string.label_chatReceipt_yesterday) - actual val title_tipOnboarding: Int = ComposeResourceIds.register(Res.string.title_tipOnboarding) - actual val action_createYourOwnCurrency: Int = ComposeResourceIds.register(Res.string.action_createYourOwnCurrency) - actual val action_currencyLeaderboard: Int = ComposeResourceIds.register(Res.string.action_currencyLeaderboard) - actual val action_addDollars: Int = ComposeResourceIds.register(Res.string.action_addDollars) - actual val action_withdrawDollars: Int = ComposeResourceIds.register(Res.string.action_withdrawDollars) -} - -@Suppress("PropertyName") -actual object CoreDrawables { - actual val ic_nav_tipcard: Int = ComposeResourceIds.register(Res.drawable.ic_nav_tipcard) - actual val ic_checked_green: Int = ComposeResourceIds.register(Res.drawable.ic_checked_green) - actual val ic_chevron_right: Int = checkNotNull(ComposeResourceIds.drawableId("ic_chevron_right")) - actual val ic_coins_add: Int = ComposeResourceIds.register(Res.drawable.ic_coins_add) - actual val ic_globe: Int = ComposeResourceIds.register(Res.drawable.ic_globe) - actual val ic_menu_deposit: Int = ComposeResourceIds.register(Res.drawable.ic_menu_deposit) - actual val ic_menu_withdraw: Int = ComposeResourceIds.register(Res.drawable.ic_menu_withdraw) -} diff --git a/apps/flipcash/features/balance/src/commonMain/kotlin/com/flipcash/app/balance/internal/WalletScreenContent.kt b/apps/flipcash/features/balance/src/commonMain/kotlin/com/flipcash/app/balance/internal/WalletScreenContent.kt index 0980c6a663..ffbeaf8506 100644 --- a/apps/flipcash/features/balance/src/commonMain/kotlin/com/flipcash/app/balance/internal/WalletScreenContent.kt +++ b/apps/flipcash/features/balance/src/commonMain/kotlin/com/flipcash/app/balance/internal/WalletScreenContent.kt @@ -1,5 +1,17 @@ package com.flipcash.app.balance.internal +import org.jetbrains.compose.resources.stringResource +import org.jetbrains.compose.resources.painterResource +import com.flipcash.core.resources.Res +import com.flipcash.core.resources.action_addDollars +import com.flipcash.core.resources.action_createYourOwnCurrency +import com.flipcash.core.resources.action_currencyLeaderboard +import com.flipcash.core.resources.action_withdrawDollars +import com.flipcash.core.resources.ic_coins_add +import com.flipcash.core.resources.ic_globe +import com.flipcash.core.resources.ic_menu_deposit +import com.flipcash.core.resources.ic_menu_withdraw +import com.flipcash.core.resources.title_tipOnboarding import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box @@ -52,10 +64,6 @@ import com.flipcash.app.core.navigation.LocalTabBarPadding import com.flipcash.app.core.ui.TileButton import com.flipcash.app.core.ui.TileButtonStyle import com.flipcash.app.tokens.ui.SelectTokenViewModel -import com.flipcash.app.core.resources.CoreDrawables -import com.flipcash.app.core.resources.CoreStrings -import com.getcode.util.resources.painterForResId -import com.getcode.util.resources.stringRes import com.flipcash.shared.transactionhistory.recentActivitySection import com.getcode.theme.CodeTheme import com.getcode.ui.theme.CodeCircularProgressIndicator @@ -213,7 +221,7 @@ internal fun WalletScreenContent( NewUserTutorial( modifier = Modifier.fillMaxWidth() .padding(bottom = CodeTheme.dimens.grid.x5), - title = stringRes(CoreStrings.title_tipOnboarding), + title = stringResource(Res.string.title_tipOnboarding), items = items, ) { item -> when (item) { @@ -322,8 +330,8 @@ internal fun WalletScreenContent( .weight(1f) .aspectRatio(1.45f), style = TileButtonStyle.Spread, - text = stringRes(CoreStrings.action_createYourOwnCurrency), - icon = painterForResId(CoreDrawables.ic_coins_add), + text = stringResource(Res.string.action_createYourOwnCurrency), + icon = painterResource(Res.drawable.ic_coins_add), ) { dispatchEvent(WalletViewModel.Event.OpenScreen(AppRoute.Token.CurrencyCreator)) } @@ -333,8 +341,8 @@ internal fun WalletScreenContent( .weight(1f) .aspectRatio(1.45f), style = TileButtonStyle.Spread, - text = stringRes(CoreStrings.action_currencyLeaderboard), - icon = painterForResId(CoreDrawables.ic_globe), + text = stringResource(Res.string.action_currencyLeaderboard), + icon = painterResource(Res.drawable.ic_globe), ) { dispatchEvent(WalletViewModel.Event.OpenScreen(AppRoute.Token.Discovery)) } @@ -351,8 +359,8 @@ internal fun WalletScreenContent( .weight(1f) .aspectRatio(1.45f), style = TileButtonStyle.Spread, - text = stringRes(CoreStrings.action_addDollars), - icon = painterForResId(CoreDrawables.ic_menu_deposit), + text = stringResource(Res.string.action_addDollars), + icon = painterResource(Res.drawable.ic_menu_deposit), ) { dispatchEvent(WalletViewModel.Event.PresentDepositOptions) } @@ -362,8 +370,8 @@ internal fun WalletScreenContent( .weight(1f) .aspectRatio(1.45f), style = TileButtonStyle.Spread, - text = stringRes(CoreStrings.action_withdrawDollars), - icon = painterForResId(CoreDrawables.ic_menu_withdraw), + text = stringResource(Res.string.action_withdrawDollars), + icon = painterResource(Res.drawable.ic_menu_withdraw), ) { // No preselected mint: the flow opens on the currency picker, which lists // every balance (Dollars included). diff --git a/apps/flipcash/features/userflags/build.gradle.kts b/apps/flipcash/features/userflags/build.gradle.kts index d7b15af12a..6dadce3e46 100644 --- a/apps/flipcash/features/userflags/build.gradle.kts +++ b/apps/flipcash/features/userflags/build.gradle.kts @@ -10,4 +10,5 @@ dependencies { implementation(project(":apps:flipcash:shared:userflags")) implementation(project(":apps:flipcash:shared:region-selection:core")) implementation(project(":libs:messaging")) + implementation(libs.jetbrains.compose.components.resources) } diff --git a/apps/flipcash/features/userflags/src/main/kotlin/com/flipcash/app/userflags/internal/UserFlagsEditor.kt b/apps/flipcash/features/userflags/src/main/kotlin/com/flipcash/app/userflags/internal/UserFlagsEditor.kt index 9cc77a8e41..595aec648b 100644 --- a/apps/flipcash/features/userflags/src/main/kotlin/com/flipcash/app/userflags/internal/UserFlagsEditor.kt +++ b/apps/flipcash/features/userflags/src/main/kotlin/com/flipcash/app/userflags/internal/UserFlagsEditor.kt @@ -95,7 +95,7 @@ private fun UserFlagsEditor( item(contentType = "section_header") { SectionHeader("Overridable") } items( items = state.editableEntries, - key = { it.field.label }, + key = { it.field.label.key }, contentType = { "editable_row" }, ) { entry -> EditableRow( diff --git a/apps/flipcash/features/userflags/src/main/kotlin/com/flipcash/app/userflags/internal/components/EditableRow.kt b/apps/flipcash/features/userflags/src/main/kotlin/com/flipcash/app/userflags/internal/components/EditableRow.kt index 82de8a7386..d9eeb01b1b 100644 --- a/apps/flipcash/features/userflags/src/main/kotlin/com/flipcash/app/userflags/internal/components/EditableRow.kt +++ b/apps/flipcash/features/userflags/src/main/kotlin/com/flipcash/app/userflags/internal/components/EditableRow.kt @@ -20,7 +20,7 @@ import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier -import androidx.compose.ui.res.stringResource +import org.jetbrains.compose.resources.stringResource import androidx.compose.ui.unit.dp import com.flipcash.app.userflags.internal.EditableEntry import com.getcode.theme.CodeTheme diff --git a/apps/flipcash/features/userflags/src/main/kotlin/com/flipcash/app/userflags/internal/components/EditorSheetContent.kt b/apps/flipcash/features/userflags/src/main/kotlin/com/flipcash/app/userflags/internal/components/EditorSheetContent.kt index b26e14916b..748204478a 100644 --- a/apps/flipcash/features/userflags/src/main/kotlin/com/flipcash/app/userflags/internal/components/EditorSheetContent.kt +++ b/apps/flipcash/features/userflags/src/main/kotlin/com/flipcash/app/userflags/internal/components/EditorSheetContent.kt @@ -13,7 +13,7 @@ import androidx.compose.material3.Surface import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier -import androidx.compose.ui.res.stringResource +import org.jetbrains.compose.resources.stringResource import com.flipcash.app.userflags.FieldEditor import com.flipcash.app.userflags.internal.EditableEntry import com.flipcash.app.userflags.internal.UserFlagsViewModel diff --git a/apps/flipcash/features/userflags/src/main/kotlin/com/flipcash/app/userflags/internal/components/Editors.kt b/apps/flipcash/features/userflags/src/main/kotlin/com/flipcash/app/userflags/internal/components/Editors.kt index 89c1c52a5e..3367a1d3fa 100644 --- a/apps/flipcash/features/userflags/src/main/kotlin/com/flipcash/app/userflags/internal/components/Editors.kt +++ b/apps/flipcash/features/userflags/src/main/kotlin/com/flipcash/app/userflags/internal/components/Editors.kt @@ -19,7 +19,7 @@ import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier -import androidx.compose.ui.res.stringResource +import org.jetbrains.compose.resources.stringResource import com.flipcash.app.userflags.FieldEditor import com.flipcash.app.userflags.internal.EditableEntry import com.flipcash.app.userflags.internal.UserFlagsViewModel diff --git a/apps/flipcash/shared/common-ui/build.gradle.kts b/apps/flipcash/shared/common-ui/build.gradle.kts index afa584a830..9d5e1a37f5 100644 --- a/apps/flipcash/shared/common-ui/build.gradle.kts +++ b/apps/flipcash/shared/common-ui/build.gradle.kts @@ -1,6 +1,9 @@ +import com.getcode.buildlogic.resources.androidResAsComposeResources + plugins { alias(libs.plugins.flipcash.kmp.app.library) alias(libs.plugins.compose.compiler) + alias(libs.plugins.jetbrains.compose) } kotlin { @@ -13,11 +16,16 @@ kotlin { sourceSets { commonMain.dependencies { + implementation(libs.jetbrains.compose.components.resources) + implementation(libs.jetbrains.compose.animation) + implementation(libs.jetbrains.compose.material) + implementation(libs.jetbrains.compose.ui.tooling.preview) implementation(project(":apps:flipcash:core")) implementation(project(":ui:core")) implementation(project(":ui:theme")) implementation(project(":services:flipcash")) implementation(project(":services:opencode")) + implementation(project(":apps:flipcash:shared:theme")) implementation(libs.jetbrains.compose.runtime) implementation(libs.jetbrains.compose.foundation) @@ -30,7 +38,6 @@ kotlin { implementation(project(":ui:components")) implementation(project(":ui:resources")) implementation(project(":libs:datetime")) - implementation(project(":apps:flipcash:shared:theme")) implementation(project.dependencies.platform(libs.compose.bom)) implementation(libs.bundles.compose) implementation(libs.bundles.haze) @@ -44,3 +51,12 @@ kotlin { } } } + +compose.resources { + publicResClass = true + packageOfResClass = "${Gradle.flipcashNamespace}.shared.common.ui.resources" + customDirectory( + sourceSetName = "commonMain", + directoryProvider = androidResAsComposeResources(), + ) +} diff --git a/apps/flipcash/shared/common-ui/src/androidMain/kotlin/com/flipcash/shared/common/ui/amount/AmountChip.kt b/apps/flipcash/shared/common-ui/src/commonMain/kotlin/com/flipcash/shared/common/ui/amount/AmountChip.kt similarity index 100% rename from apps/flipcash/shared/common-ui/src/androidMain/kotlin/com/flipcash/shared/common/ui/amount/AmountChip.kt rename to apps/flipcash/shared/common-ui/src/commonMain/kotlin/com/flipcash/shared/common/ui/amount/AmountChip.kt diff --git a/apps/flipcash/shared/common-ui/src/androidMain/kotlin/com/flipcash/shared/common/ui/profile/BalanceRequirementsCard.kt b/apps/flipcash/shared/common-ui/src/commonMain/kotlin/com/flipcash/shared/common/ui/profile/BalanceRequirementsCard.kt similarity index 83% rename from apps/flipcash/shared/common-ui/src/androidMain/kotlin/com/flipcash/shared/common/ui/profile/BalanceRequirementsCard.kt rename to apps/flipcash/shared/common-ui/src/commonMain/kotlin/com/flipcash/shared/common/ui/profile/BalanceRequirementsCard.kt index 7efce6668d..89e1b059fd 100644 --- a/apps/flipcash/shared/common-ui/src/androidMain/kotlin/com/flipcash/shared/common/ui/profile/BalanceRequirementsCard.kt +++ b/apps/flipcash/shared/common-ui/src/commonMain/kotlin/com/flipcash/shared/common/ui/profile/BalanceRequirementsCard.kt @@ -24,15 +24,23 @@ import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip -import androidx.compose.ui.res.painterResource -import androidx.compose.ui.res.stringResource +import org.jetbrains.compose.resources.painterResource +import org.jetbrains.compose.resources.stringResource import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.tooling.preview.PreviewWrapper import androidx.compose.ui.unit.dp import com.flipcash.app.theme.FlipcashThemeWrapper -import com.flipcash.shared.common.ui.R import com.getcode.theme.CodeTheme import com.getcode.theme.White05 +import com.flipcash.shared.common.ui.resources.Res as CommonUiRes +import com.flipcash.shared.common.ui.resources.label_balanceRequirementChat +import com.flipcash.shared.common.ui.resources.label_balanceRequirementCommunityCurrency +import com.flipcash.shared.common.ui.resources.label_balanceRequirementJoin +import com.flipcash.shared.common.ui.resources.label_balanceRequirementNone +import com.flipcash.shared.common.ui.resources.label_yourBalance +import com.flipcash.shared.common.ui.resources.title_balanceRequirements +import com.getcode.util.resources.Res as UiRes +import com.getcode.util.resources.ic_chevron_right private val RowHeight = 56.dp private val CompactRowHeight = 48.dp @@ -69,7 +77,7 @@ fun BalanceRequirementsCard( verticalArrangement = Arrangement.spacedBy(if (compact) 8.dp else 16.dp), ) { Text( - text = stringResource(R.string.title_balanceRequirements), + text = stringResource(CommonUiRes.string.title_balanceRequirements), style = if (compact) CodeTheme.typography.textMedium else CodeTheme.typography.textLarge, color = CodeTheme.colors.textMain, ) @@ -84,14 +92,14 @@ fun BalanceRequirementsCard( RowSeparator() } RequirementRow( - label = stringResource(R.string.label_balanceRequirementJoin), - value = join ?: stringResource(R.string.label_balanceRequirementNone), + label = stringResource(CommonUiRes.string.label_balanceRequirementJoin), + value = join ?: stringResource(CommonUiRes.string.label_balanceRequirementNone), compact = compact, ) RowSeparator() RequirementRow( - label = stringResource(R.string.label_balanceRequirementChat), - value = chat ?: stringResource(R.string.label_balanceRequirementNone), + label = stringResource(CommonUiRes.string.label_balanceRequirementChat), + value = chat ?: stringResource(CommonUiRes.string.label_balanceRequirementNone), compact = compact, ) } @@ -118,7 +126,7 @@ fun BalanceRequirementsCard( horizontalArrangement = Arrangement.SpaceBetween, ) { Text( - text = stringResource(R.string.label_yourBalance), + text = stringResource(CommonUiRes.string.label_yourBalance), style = CodeTheme.typography.textSmall, color = CodeTheme.colors.textSecondary, ) @@ -154,13 +162,13 @@ private fun CommunityCurrencyRow(onClick: () -> Unit, content: @Composable RowSc ) { Text( modifier = Modifier.weight(1f), - text = stringResource(R.string.label_balanceRequirementCommunityCurrency), + text = stringResource(CommonUiRes.string.label_balanceRequirementCommunityCurrency), style = CodeTheme.typography.textSmall, color = CodeTheme.colors.textSecondary, ) content() Icon( - painter = painterResource(R.drawable.ic_chevron_right), + painter = painterResource(UiRes.drawable.ic_chevron_right), contentDescription = null, tint = CodeTheme.colors.textSecondary, ) diff --git a/apps/flipcash/shared/common-ui/src/androidMain/kotlin/com/flipcash/shared/common/ui/profile/ProfileStatsCard.kt b/apps/flipcash/shared/common-ui/src/commonMain/kotlin/com/flipcash/shared/common/ui/profile/ProfileStatsCard.kt similarity index 85% rename from apps/flipcash/shared/common-ui/src/androidMain/kotlin/com/flipcash/shared/common/ui/profile/ProfileStatsCard.kt rename to apps/flipcash/shared/common-ui/src/commonMain/kotlin/com/flipcash/shared/common/ui/profile/ProfileStatsCard.kt index 1b3accfba7..53f2374790 100644 --- a/apps/flipcash/shared/common-ui/src/androidMain/kotlin/com/flipcash/shared/common/ui/profile/ProfileStatsCard.kt +++ b/apps/flipcash/shared/common-ui/src/commonMain/kotlin/com/flipcash/shared/common/ui/profile/ProfileStatsCard.kt @@ -15,14 +15,17 @@ import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip -import androidx.compose.ui.res.stringResource +import org.jetbrains.compose.resources.stringResource import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.tooling.preview.PreviewWrapper import androidx.compose.ui.unit.dp import com.flipcash.app.theme.FlipcashThemeWrapper -import com.flipcash.shared.common.ui.R import com.getcode.theme.CodeTheme import com.getcode.theme.White05 +import com.flipcash.shared.common.ui.resources.Res +import com.flipcash.shared.common.ui.resources.text_profileStatEmpty +import com.flipcash.shared.common.ui.resources.title_profileDateJoined +import com.flipcash.shared.common.ui.resources.title_profileMinimumToChat private val StatsCardHeight = 84.dp private val LeadingStatWidth = 176.dp @@ -49,7 +52,7 @@ fun ProfileStatsCard( ) { Stat( modifier = Modifier.width(LeadingStatWidth).fillMaxHeight(), - caption = stringResource(R.string.title_profileMinimumToChat), + caption = stringResource(Res.string.title_profileMinimumToChat), value = minimumToChat, ) Box( @@ -60,7 +63,7 @@ fun ProfileStatsCard( ) Stat( modifier = Modifier.weight(1f).fillMaxHeight(), - caption = stringResource(R.string.title_profileDateJoined), + caption = stringResource(Res.string.title_profileDateJoined), value = joined, ) } @@ -84,7 +87,7 @@ private fun Stat( color = CodeTheme.colors.textSecondary, ) Text( - text = value ?: stringResource(R.string.text_profileStatEmpty), + text = value ?: stringResource(Res.string.text_profileStatEmpty), style = CodeTheme.typography.textLarge, color = CodeTheme.colors.textMain, ) diff --git a/apps/flipcash/shared/theme/build.gradle.kts b/apps/flipcash/shared/theme/build.gradle.kts index cd19d34932..a543099804 100644 --- a/apps/flipcash/shared/theme/build.gradle.kts +++ b/apps/flipcash/shared/theme/build.gradle.kts @@ -10,6 +10,9 @@ kotlin { sourceSets { commonMain.dependencies { + implementation(libs.jetbrains.compose.material) + implementation(libs.jetbrains.compose.material3) + implementation(libs.jetbrains.compose.ui.tooling.preview) implementation(project(":ui:theme")) implementation(libs.jetbrains.compose.runtime) implementation(libs.jetbrains.compose.foundation) diff --git a/apps/flipcash/shared/theme/src/androidMain/kotlin/com/flipcash/app/theme/FlipcashPreview.kt b/apps/flipcash/shared/theme/src/commonMain/kotlin/com/flipcash/app/theme/FlipcashPreview.kt similarity index 100% rename from apps/flipcash/shared/theme/src/androidMain/kotlin/com/flipcash/app/theme/FlipcashPreview.kt rename to apps/flipcash/shared/theme/src/commonMain/kotlin/com/flipcash/app/theme/FlipcashPreview.kt diff --git a/apps/flipcash/shared/tokens/build.gradle.kts b/apps/flipcash/shared/tokens/build.gradle.kts index 34e4d3caf8..e717bd4947 100644 --- a/apps/flipcash/shared/tokens/build.gradle.kts +++ b/apps/flipcash/shared/tokens/build.gradle.kts @@ -15,6 +15,12 @@ kotlin { sourceSets { commonMain.dependencies { + implementation(libs.jetbrains.compose.foundation) + implementation(libs.jetbrains.compose.ui) + implementation(libs.jetbrains.compose.animation) + implementation(libs.jetbrains.compose.material) + implementation(libs.jetbrains.compose.material3) + implementation(libs.jetbrains.compose.ui.tooling.preview) api(project(":apps:flipcash:shared:tokens:core")) implementation(project(":apps:flipcash:core")) diff --git a/apps/flipcash/shared/tokens/src/androidMain/kotlin/com/flipcash/app/tokens/BalancePoller.kt b/apps/flipcash/shared/tokens/src/commonMain/kotlin/com/flipcash/app/tokens/BalancePoller.kt similarity index 100% rename from apps/flipcash/shared/tokens/src/androidMain/kotlin/com/flipcash/app/tokens/BalancePoller.kt rename to apps/flipcash/shared/tokens/src/commonMain/kotlin/com/flipcash/app/tokens/BalancePoller.kt diff --git a/apps/flipcash/shared/tokens/src/androidMain/kotlin/com/flipcash/app/tokens/FeeAffordableEntry.kt b/apps/flipcash/shared/tokens/src/commonMain/kotlin/com/flipcash/app/tokens/FeeAffordableEntry.kt similarity index 100% rename from apps/flipcash/shared/tokens/src/androidMain/kotlin/com/flipcash/app/tokens/FeeAffordableEntry.kt rename to apps/flipcash/shared/tokens/src/commonMain/kotlin/com/flipcash/app/tokens/FeeAffordableEntry.kt diff --git a/apps/flipcash/shared/tokens/src/androidMain/kotlin/com/flipcash/app/tokens/InlineCompletion.kt b/apps/flipcash/shared/tokens/src/commonMain/kotlin/com/flipcash/app/tokens/InlineCompletion.kt similarity index 100% rename from apps/flipcash/shared/tokens/src/androidMain/kotlin/com/flipcash/app/tokens/InlineCompletion.kt rename to apps/flipcash/shared/tokens/src/commonMain/kotlin/com/flipcash/app/tokens/InlineCompletion.kt diff --git a/apps/flipcash/shared/tokens/src/androidMain/kotlin/com/flipcash/app/tokens/TokenUpdater.kt b/apps/flipcash/shared/tokens/src/commonMain/kotlin/com/flipcash/app/tokens/TokenUpdater.kt similarity index 100% rename from apps/flipcash/shared/tokens/src/androidMain/kotlin/com/flipcash/app/tokens/TokenUpdater.kt rename to apps/flipcash/shared/tokens/src/commonMain/kotlin/com/flipcash/app/tokens/TokenUpdater.kt diff --git a/apps/flipcash/shared/tokens/src/androidMain/kotlin/com/flipcash/app/tokens/UsdcDepositSweep.kt b/apps/flipcash/shared/tokens/src/commonMain/kotlin/com/flipcash/app/tokens/UsdcDepositSweep.kt similarity index 100% rename from apps/flipcash/shared/tokens/src/androidMain/kotlin/com/flipcash/app/tokens/UsdcDepositSweep.kt rename to apps/flipcash/shared/tokens/src/commonMain/kotlin/com/flipcash/app/tokens/UsdcDepositSweep.kt diff --git a/apps/flipcash/shared/tokens/src/androidMain/kotlin/com/flipcash/app/tokens/data/MarketTrend.kt b/apps/flipcash/shared/tokens/src/commonMain/kotlin/com/flipcash/app/tokens/data/MarketTrend.kt similarity index 100% rename from apps/flipcash/shared/tokens/src/androidMain/kotlin/com/flipcash/app/tokens/data/MarketTrend.kt rename to apps/flipcash/shared/tokens/src/commonMain/kotlin/com/flipcash/app/tokens/data/MarketTrend.kt diff --git a/apps/flipcash/shared/tokens/src/androidMain/kotlin/com/flipcash/app/tokens/data/Period.kt b/apps/flipcash/shared/tokens/src/commonMain/kotlin/com/flipcash/app/tokens/data/Period.kt similarity index 100% rename from apps/flipcash/shared/tokens/src/androidMain/kotlin/com/flipcash/app/tokens/data/Period.kt rename to apps/flipcash/shared/tokens/src/commonMain/kotlin/com/flipcash/app/tokens/data/Period.kt diff --git a/apps/flipcash/shared/transaction-history/src/androidHostTest/kotlin/com/flipcash/shared/transactionhistory/ResourceHelperStringResourceTest.kt b/apps/flipcash/shared/transaction-history/src/androidHostTest/kotlin/com/flipcash/shared/transactionhistory/ResourceHelperStringResourceTest.kt new file mode 100644 index 0000000000..922511d852 --- /dev/null +++ b/apps/flipcash/shared/transaction-history/src/androidHostTest/kotlin/com/flipcash/shared/transactionhistory/ResourceHelperStringResourceTest.kt @@ -0,0 +1,25 @@ +package com.flipcash.shared.transactionhistory + +import androidx.test.core.app.ApplicationProvider +import com.flipcash.shared.transactionhistory.generated.resources.Res +import com.flipcash.shared.transactionhistory.generated.resources.title_activity_sentTo +import com.getcode.util.resources.AndroidResources +import org.junit.Test +import org.junit.runner.RunWith +import org.robolectric.RobolectricTestRunner +import kotlin.test.assertEquals + +/** + * The transaction mappers build display text outside composition from a Compose [Res] string. On Android + * that goes back to `R` by the resource's key, so this checks the key still finds the real Android string. + */ +@RunWith(RobolectricTestRunner::class) +class ResourceHelperStringResourceTest { + + @Test + fun `compose string resource resolves through Android resources`() { + val resources = AndroidResources(ApplicationProvider.getApplicationContext()) + + assertEquals("Sent to Ann", resources.getString(Res.string.title_activity_sentTo, "Ann")) + } +} diff --git a/apps/flipcash/shared/transaction-history/src/androidHostTest/kotlin/com/flipcash/shared/transactionhistory/TransactionDetailsMapperTest.kt b/apps/flipcash/shared/transaction-history/src/androidHostTest/kotlin/com/flipcash/shared/transactionhistory/TransactionDetailsMapperTest.kt index a0f3b58704..939fd012f4 100644 --- a/apps/flipcash/shared/transaction-history/src/androidHostTest/kotlin/com/flipcash/shared/transactionhistory/TransactionDetailsMapperTest.kt +++ b/apps/flipcash/shared/transaction-history/src/androidHostTest/kotlin/com/flipcash/shared/transactionhistory/TransactionDetailsMapperTest.kt @@ -1,5 +1,8 @@ package com.flipcash.shared.transactionhistory +import com.flipcash.shared.transactionhistory.generated.resources.Res +import com.flipcash.shared.transactionhistory.generated.resources.label_txnDetails_inPerson +import com.flipcash.shared.transactionhistory.generated.resources.title_activity_convert import com.flipcash.app.core.feed.ActivityFeedMessage import com.flipcash.app.core.feed.ActivityFeedMessageWithToken import com.flipcash.app.core.feed.MessageMetadata @@ -39,8 +42,8 @@ import org.junit.Test class TransactionDetailsMapperTest { private val resources = FakeResourceHelper() - .stub(R.string.title_activity_convert, "%1\$s → %2\$s") - .stub(R.string.label_txnDetails_inPerson, "In Person") + .stub(Res.string.title_activity_convert, "%1\$s → %2\$s") + .stub(Res.string.label_txnDetails_inPerson, "In Person") private val mapper = TransactionDetailsMapper(resources) private val knownUserId: ID = listOf(0x0A, 0x0B, 0x0C) diff --git a/apps/flipcash/shared/transaction-history/src/androidHostTest/kotlin/com/flipcash/shared/transactionhistory/TransactionItemMapperTest.kt b/apps/flipcash/shared/transaction-history/src/androidHostTest/kotlin/com/flipcash/shared/transactionhistory/TransactionItemMapperTest.kt index 94ca34ae52..ed776cac70 100644 --- a/apps/flipcash/shared/transaction-history/src/androidHostTest/kotlin/com/flipcash/shared/transactionhistory/TransactionItemMapperTest.kt +++ b/apps/flipcash/shared/transaction-history/src/androidHostTest/kotlin/com/flipcash/shared/transactionhistory/TransactionItemMapperTest.kt @@ -1,5 +1,10 @@ package com.flipcash.shared.transactionhistory +import com.flipcash.shared.transactionhistory.generated.resources.Res +import com.flipcash.shared.transactionhistory.generated.resources.title_activity_convert +import com.flipcash.shared.transactionhistory.generated.resources.title_activity_receivedFrom +import com.flipcash.shared.transactionhistory.generated.resources.title_activity_sentTo +import com.flipcash.shared.transactionhistory.generated.resources.title_activity_tipFrom import com.flipcash.app.core.feed.ActivityFeedMessage import com.flipcash.app.core.feed.ActivityFeedMessageWithToken import com.flipcash.app.core.feed.MessageMetadata @@ -28,10 +33,10 @@ import org.junit.Test class TransactionItemMapperTest { private val resources = FakeResourceHelper() - .stub(R.string.title_activity_tipFrom, "Tip from %1\$s") - .stub(R.string.title_activity_sentTo, "Sent to %1\$s") - .stub(R.string.title_activity_receivedFrom, "Received from %1\$s") - .stub(R.string.title_activity_convert, "%1\$s → %2\$s") + .stub(Res.string.title_activity_tipFrom, "Tip from %1\$s") + .stub(Res.string.title_activity_sentTo, "Sent to %1\$s") + .stub(Res.string.title_activity_receivedFrom, "Received from %1\$s") + .stub(Res.string.title_activity_convert, "%1\$s → %2\$s") private val mapper = TransactionItemMapper(resources) private val knownUserId: ID = listOf(0x0A, 0x0B, 0x0C) diff --git a/apps/flipcash/shared/transaction-history/src/androidMain/kotlin/com/flipcash/shared/transactionhistory/TransactionDetailsContent.kt b/apps/flipcash/shared/transaction-history/src/androidMain/kotlin/com/flipcash/shared/transactionhistory/TransactionDetailsContent.kt index d9e079d448..d41b6ac8db 100644 --- a/apps/flipcash/shared/transaction-history/src/androidMain/kotlin/com/flipcash/shared/transactionhistory/TransactionDetailsContent.kt +++ b/apps/flipcash/shared/transaction-history/src/androidMain/kotlin/com/flipcash/shared/transactionhistory/TransactionDetailsContent.kt @@ -1,5 +1,6 @@ package com.flipcash.shared.transactionhistory +import org.jetbrains.compose.resources.stringResource as composeStringResource import androidx.compose.foundation.background import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box @@ -159,7 +160,7 @@ private fun Header( // A person-to-person entry is titled by the person; everything else by what it was. Text( text = details.heading?.takeIf { it.isNotBlank() } - ?: stringResource(details.kind.headingRes), + ?: composeStringResource(details.kind.headingRes), style = CodeTheme.typography.textLarge, color = CodeTheme.colors.textMain, textAlign = TextAlign.Center, @@ -262,7 +263,7 @@ private fun DetailCard(details: TransactionDetails, modifier: Modifier = Modifie details.account?.let { account -> ReceiptLineItem( modifier = Modifier.fillMaxWidth(), - label = stringResource(account.direction.labelRes), + label = composeStringResource(account.direction.labelRes), amount = account.shortAddress, ) } @@ -283,7 +284,7 @@ private fun DetailCard(details: TransactionDetails, modifier: Modifier = Modifie ReceiptLineItem( modifier = Modifier.fillMaxWidth(), label = stringResource(R.string.label_txnDetails_status), - amount = stringResource(details.status.labelRes), + amount = composeStringResource(details.status.labelRes), ) } } diff --git a/apps/flipcash/shared/transaction-history/src/androidMain/kotlin/com/flipcash/shared/transactionhistory/resources/TxResources.android.kt b/apps/flipcash/shared/transaction-history/src/androidMain/kotlin/com/flipcash/shared/transactionhistory/resources/TxResources.android.kt deleted file mode 100644 index 3de9123fd1..0000000000 --- a/apps/flipcash/shared/transaction-history/src/androidMain/kotlin/com/flipcash/shared/transactionhistory/resources/TxResources.android.kt +++ /dev/null @@ -1,34 +0,0 @@ -package com.flipcash.shared.transactionhistory.resources - -import com.flipcash.shared.transactionhistory.R - -@Suppress("PropertyName") -actual object TxStrings { - actual val label_activity_convertFee: Int = R.string.label_activity_convertFee - actual val label_txnDetails_from: Int = R.string.label_txnDetails_from - actual val label_txnDetails_inPerson: Int = R.string.label_txnDetails_inPerson - actual val label_txnDetails_paidWith: Int = R.string.label_txnDetails_paidWith - actual val label_txnDetails_soldFor: Int = R.string.label_txnDetails_soldFor - actual val label_txnDetails_status_completed: Int = R.string.label_txnDetails_status_completed - actual val label_txnDetails_status_failed: Int = R.string.label_txnDetails_status_failed - actual val label_txnDetails_status_pending: Int = R.string.label_txnDetails_status_pending - actual val label_txnDetails_status_unknown: Int = R.string.label_txnDetails_status_unknown - actual val label_txnDetails_to: Int = R.string.label_txnDetails_to - actual val title_activity_convert: Int = R.string.title_activity_convert - actual val title_activity_receivedFrom: Int = R.string.title_activity_receivedFrom - actual val title_activity_sentTo: Int = R.string.title_activity_sentTo - actual val title_activity_tipFrom: Int = R.string.title_activity_tipFrom - actual val title_txnDetails_buy: Int = R.string.title_txnDetails_buy - actual val title_txnDetails_convert: Int = R.string.title_txnDetails_convert - actual val title_txnDetails_deposit: Int = R.string.title_txnDetails_deposit - actual val title_txnDetails_poolPayment: Int = R.string.title_txnDetails_poolPayment - actual val title_txnDetails_sell: Int = R.string.title_txnDetails_sell - actual val title_txnDetails_unknown: Int = R.string.title_txnDetails_unknown - actual val title_txnDetails_withdraw: Int = R.string.title_txnDetails_withdraw - actual val title_txnDetails_youGaveCash: Int = R.string.title_txnDetails_youGaveCash - actual val title_txnDetails_youReceived: Int = R.string.title_txnDetails_youReceived - actual val title_txnDetails_youReceivedCash: Int = R.string.title_txnDetails_youReceivedCash - actual val title_txnDetails_youSent: Int = R.string.title_txnDetails_youSent - actual val title_txnDetails_youSentCashLink: Int = R.string.title_txnDetails_youSentCashLink - actual val title_txnDetails_youTipped: Int = R.string.title_txnDetails_youTipped -} diff --git a/apps/flipcash/shared/transaction-history/src/commonMain/kotlin/com/flipcash/shared/transactionhistory/ActivityFeedRow.kt b/apps/flipcash/shared/transaction-history/src/commonMain/kotlin/com/flipcash/shared/transactionhistory/ActivityFeedRow.kt index 9cc8076280..433ee65bcc 100644 --- a/apps/flipcash/shared/transaction-history/src/commonMain/kotlin/com/flipcash/shared/transactionhistory/ActivityFeedRow.kt +++ b/apps/flipcash/shared/transaction-history/src/commonMain/kotlin/com/flipcash/shared/transactionhistory/ActivityFeedRow.kt @@ -1,7 +1,10 @@ package com.flipcash.shared.transactionhistory -import com.flipcash.shared.transactionhistory.resources.TxStrings -import com.flipcash.app.core.resources.CoreStrings +import org.jetbrains.compose.resources.stringResource +import com.flipcash.core.resources.Res as CoreRes +import com.flipcash.core.resources.label_chatReceipt_yesterday +import com.flipcash.shared.transactionhistory.generated.resources.Res as TxRes +import com.flipcash.shared.transactionhistory.generated.resources.label_activity_convertFee import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column @@ -12,7 +15,6 @@ import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier -import com.getcode.util.resources.stringRes import androidx.compose.ui.text.style.TextOverflow import com.flipcash.app.core.ui.ActivityAmount import com.getcode.theme.CodeTheme @@ -82,7 +84,7 @@ fun ActivityFeedRow( maxLines = 1, ) Text( - text = stringRes(TxStrings.label_activity_convertFee, fee.formatted()), + text = stringResource(TxRes.string.label_activity_convertFee, fee.formatted()), style = CodeTheme.typography.textSmall, color = CodeTheme.colors.textSecondary, maxLines = 1, @@ -114,7 +116,7 @@ internal fun formatActivityTimestamp(instant: Instant): String { val time = instant.formatLocalized("h:mm a", is24Hour = is24Hour, if24Hour = "H:mm") return when { dayDiff == 0L -> time - dayDiff == 1L -> stringRes(CoreStrings.label_chatReceipt_yesterday) + dayDiff == 1L -> stringResource(CoreRes.string.label_chatReceipt_yesterday) dayDiff in 2L..6L -> instant.formatLocalized("EEEE") messageDate.year == todayDate.year -> instant.formatLocalized("MMM d") else -> instant.formatLocalized("MMM d, yyyy") diff --git a/apps/flipcash/shared/transaction-history/src/commonMain/kotlin/com/flipcash/shared/transactionhistory/RecentActivitySection.kt b/apps/flipcash/shared/transaction-history/src/commonMain/kotlin/com/flipcash/shared/transactionhistory/RecentActivitySection.kt index bc0c95e73a..3129a06f38 100644 --- a/apps/flipcash/shared/transaction-history/src/commonMain/kotlin/com/flipcash/shared/transactionhistory/RecentActivitySection.kt +++ b/apps/flipcash/shared/transaction-history/src/commonMain/kotlin/com/flipcash/shared/transactionhistory/RecentActivitySection.kt @@ -1,7 +1,11 @@ package com.flipcash.shared.transactionhistory -import com.flipcash.app.core.resources.CoreStrings -import com.flipcash.app.core.resources.CoreDrawables +import org.jetbrains.compose.resources.stringResource +import org.jetbrains.compose.resources.painterResource +import com.flipcash.core.resources.Res +import com.getcode.util.resources.ic_chevron_right +import com.getcode.util.resources.Res as UiRes +import com.flipcash.core.resources.title_recentActivity import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.Row @@ -16,8 +20,6 @@ import androidx.compose.material.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier -import com.getcode.util.resources.painterForResId -import com.getcode.util.resources.stringRes import com.getcode.theme.CodeTheme /** @@ -64,13 +66,13 @@ private fun LazyItemScope.RecentActivityHeader(modifier: Modifier) { verticalAlignment = Alignment.CenterVertically, ) { Text( - text = stringRes(CoreStrings.title_recentActivity), + text = stringResource(Res.string.title_recentActivity), style = CodeTheme.typography.screenTitle, color = CodeTheme.colors.textMain, ) Icon( modifier = Modifier.size(CodeTheme.dimens.staticGrid.x3), - painter = painterForResId(CoreDrawables.ic_chevron_right), + painter = painterResource(UiRes.drawable.ic_chevron_right), contentDescription = null, tint = CodeTheme.colors.textSecondary, ) diff --git a/apps/flipcash/shared/transaction-history/src/commonMain/kotlin/com/flipcash/shared/transactionhistory/TransactionDetails.kt b/apps/flipcash/shared/transaction-history/src/commonMain/kotlin/com/flipcash/shared/transactionhistory/TransactionDetails.kt index 2b14ba1ac8..25875474ae 100644 --- a/apps/flipcash/shared/transaction-history/src/commonMain/kotlin/com/flipcash/shared/transactionhistory/TransactionDetails.kt +++ b/apps/flipcash/shared/transaction-history/src/commonMain/kotlin/com/flipcash/shared/transactionhistory/TransactionDetails.kt @@ -1,7 +1,26 @@ package com.flipcash.shared.transactionhistory -import com.flipcash.shared.transactionhistory.resources.TxStrings -import androidx.annotation.StringRes +import com.flipcash.shared.transactionhistory.generated.resources.Res +import com.flipcash.shared.transactionhistory.generated.resources.label_txnDetails_from +import com.flipcash.shared.transactionhistory.generated.resources.label_txnDetails_status_completed +import com.flipcash.shared.transactionhistory.generated.resources.label_txnDetails_status_failed +import com.flipcash.shared.transactionhistory.generated.resources.label_txnDetails_status_pending +import com.flipcash.shared.transactionhistory.generated.resources.label_txnDetails_status_unknown +import com.flipcash.shared.transactionhistory.generated.resources.label_txnDetails_to +import com.flipcash.shared.transactionhistory.generated.resources.title_txnDetails_buy +import com.flipcash.shared.transactionhistory.generated.resources.title_txnDetails_convert +import com.flipcash.shared.transactionhistory.generated.resources.title_txnDetails_deposit +import com.flipcash.shared.transactionhistory.generated.resources.title_txnDetails_poolPayment +import com.flipcash.shared.transactionhistory.generated.resources.title_txnDetails_sell +import com.flipcash.shared.transactionhistory.generated.resources.title_txnDetails_unknown +import com.flipcash.shared.transactionhistory.generated.resources.title_txnDetails_withdraw +import com.flipcash.shared.transactionhistory.generated.resources.title_txnDetails_youGaveCash +import com.flipcash.shared.transactionhistory.generated.resources.title_txnDetails_youReceived +import com.flipcash.shared.transactionhistory.generated.resources.title_txnDetails_youReceivedCash +import com.flipcash.shared.transactionhistory.generated.resources.title_txnDetails_youSent +import com.flipcash.shared.transactionhistory.generated.resources.title_txnDetails_youSentCashLink +import com.flipcash.shared.transactionhistory.generated.resources.title_txnDetails_youTipped +import org.jetbrains.compose.resources.StringResource import com.getcode.opencode.model.financial.Fiat import com.getcode.opencode.model.financial.Token import kotlin.time.Instant @@ -22,20 +41,20 @@ import kotlin.time.Instant * received-cash-link counterpart because collecting one is indistinguishable, in the metadata, * from taking a bill in person — both arrive as an unattributed `ReceivedCrypto`. */ -enum class TransactionKind(@StringRes val headingRes: Int) { - Tipped(TxStrings.title_txnDetails_youTipped), - Received(TxStrings.title_txnDetails_youReceived), - Sent(TxStrings.title_txnDetails_youSent), - GaveCash(TxStrings.title_txnDetails_youGaveCash), - ReceivedCash(TxStrings.title_txnDetails_youReceivedCash), - SentCashLink(TxStrings.title_txnDetails_youSentCashLink), - Buy(TxStrings.title_txnDetails_buy), - Sell(TxStrings.title_txnDetails_sell), - Withdraw(TxStrings.title_txnDetails_withdraw), - Deposit(TxStrings.title_txnDetails_deposit), - Convert(TxStrings.title_txnDetails_convert), - PoolPayment(TxStrings.title_txnDetails_poolPayment), - Unknown(TxStrings.title_txnDetails_unknown), +enum class TransactionKind(val headingRes: StringResource) { + Tipped(Res.string.title_txnDetails_youTipped), + Received(Res.string.title_txnDetails_youReceived), + Sent(Res.string.title_txnDetails_youSent), + GaveCash(Res.string.title_txnDetails_youGaveCash), + ReceivedCash(Res.string.title_txnDetails_youReceivedCash), + SentCashLink(Res.string.title_txnDetails_youSentCashLink), + Buy(Res.string.title_txnDetails_buy), + Sell(Res.string.title_txnDetails_sell), + Withdraw(Res.string.title_txnDetails_withdraw), + Deposit(Res.string.title_txnDetails_deposit), + Convert(Res.string.title_txnDetails_convert), + PoolPayment(Res.string.title_txnDetails_poolPayment), + Unknown(Res.string.title_txnDetails_unknown), } /** @@ -49,9 +68,9 @@ data class TransactionAccount( val address: String, val direction: Direction, ) { - enum class Direction(@StringRes val labelRes: Int) { - To(TxStrings.label_txnDetails_to), - From(TxStrings.label_txnDetails_from), + enum class Direction(val labelRes: StringResource) { + To(Res.string.label_txnDetails_to), + From(Res.string.label_txnDetails_from), } /** Nobody reads the middle of an address; the ends are what someone actually compares. */ @@ -65,11 +84,11 @@ data class TransactionAccount( } /** The entry's settlement state, as the Status row phrases it. */ -enum class TransactionStatus(@StringRes val labelRes: Int) { - Pending(TxStrings.label_txnDetails_status_pending), - Completed(TxStrings.label_txnDetails_status_completed), - Failed(TxStrings.label_txnDetails_status_failed), - Unknown(TxStrings.label_txnDetails_status_unknown), +enum class TransactionStatus(val labelRes: StringResource) { + Pending(Res.string.label_txnDetails_status_pending), + Completed(Res.string.label_txnDetails_status_completed), + Failed(Res.string.label_txnDetails_status_failed), + Unknown(Res.string.label_txnDetails_status_unknown), } /** diff --git a/apps/flipcash/shared/transaction-history/src/commonMain/kotlin/com/flipcash/shared/transactionhistory/TransactionSubtitles.kt b/apps/flipcash/shared/transaction-history/src/commonMain/kotlin/com/flipcash/shared/transactionhistory/TransactionSubtitles.kt index 0d30391d3d..179b716cfa 100644 --- a/apps/flipcash/shared/transaction-history/src/commonMain/kotlin/com/flipcash/shared/transactionhistory/TransactionSubtitles.kt +++ b/apps/flipcash/shared/transaction-history/src/commonMain/kotlin/com/flipcash/shared/transactionhistory/TransactionSubtitles.kt @@ -1,6 +1,10 @@ package com.flipcash.shared.transactionhistory -import com.flipcash.shared.transactionhistory.resources.TxStrings +import com.flipcash.shared.transactionhistory.generated.resources.Res +import com.flipcash.shared.transactionhistory.generated.resources.label_txnDetails_inPerson +import com.flipcash.shared.transactionhistory.generated.resources.label_txnDetails_paidWith +import com.flipcash.shared.transactionhistory.generated.resources.label_txnDetails_soldFor +import com.flipcash.shared.transactionhistory.generated.resources.title_activity_convert import com.getcode.util.resources.ResourceHelper /** @@ -28,22 +32,22 @@ object TransactionSubtitles { * exchanges identities, so "who" is genuinely unanswerable; how it moved is the useful fact. */ fun inPerson(resources: ResourceHelper): String = - resources.getString(TxStrings.label_txnDetails_inPerson) + resources.getString(Res.string.label_txnDetails_inPerson) /** [TransactionKind.Buy] — the mint that was spent, which the amount alone never says. */ fun paidWith(resources: ResourceHelper, tokenName: String): String = - resources.getString(TxStrings.label_txnDetails_paidWith, tokenName) + resources.getString(Res.string.label_txnDetails_paidWith, tokenName) /** [TransactionKind.Sell] — the mint that came back. */ fun soldFor(resources: ResourceHelper, tokenName: String): String = - resources.getString(TxStrings.label_txnDetails_soldFor, tokenName) + resources.getString(Res.string.label_txnDetails_soldFor, tokenName) /** * [TransactionKind.Convert] — both mints, in the same "from → to" shape the activity row's * convert title already uses, so the row and the screen it opens read alike. */ fun converted(resources: ResourceHelper, from: String, to: String): String = - resources.getString(TxStrings.title_activity_convert, from, to) + resources.getString(Res.string.title_activity_convert, from, to) /** [TransactionKind.PoolPayment] — the pool that was paid. */ fun pool(name: String): String? = name.takeIf { it.isNotBlank() } diff --git a/apps/flipcash/shared/transaction-history/src/commonMain/kotlin/com/flipcash/shared/transactionhistory/internal/TransactionItemMapper.kt b/apps/flipcash/shared/transaction-history/src/commonMain/kotlin/com/flipcash/shared/transactionhistory/internal/TransactionItemMapper.kt index 7004d06418..d7644d2403 100644 --- a/apps/flipcash/shared/transaction-history/src/commonMain/kotlin/com/flipcash/shared/transactionhistory/internal/TransactionItemMapper.kt +++ b/apps/flipcash/shared/transaction-history/src/commonMain/kotlin/com/flipcash/shared/transactionhistory/internal/TransactionItemMapper.kt @@ -1,6 +1,10 @@ package com.flipcash.shared.transactionhistory.internal -import com.flipcash.shared.transactionhistory.resources.TxStrings +import com.flipcash.shared.transactionhistory.generated.resources.Res +import com.flipcash.shared.transactionhistory.generated.resources.title_activity_convert +import com.flipcash.shared.transactionhistory.generated.resources.title_activity_receivedFrom +import com.flipcash.shared.transactionhistory.generated.resources.title_activity_sentTo +import com.flipcash.shared.transactionhistory.generated.resources.title_activity_tipFrom import com.flipcash.app.core.feed.ActivityFeedMessageWithToken import com.flipcash.app.core.feed.MessageMetadata import com.flipcash.app.core.feed.MessageSubstitution @@ -82,7 +86,7 @@ private fun convertTitle( convertOf(source.message.metadata) ?: return null val from = source.token?.name?.takeIf { it.isNotBlank() } ?: return null val to = source.toToken?.name?.takeIf { it.isNotBlank() } ?: return null - return resources.getString(TxStrings.title_activity_convert, from, to) + return resources.getString(Res.string.title_activity_convert, from, to) } /** @@ -130,12 +134,12 @@ private fun resolveTitle( val isTip = text.isTipVerb() return when (meta) { is MessageMetadata.ReceivedCrypto -> - if (isTip) resources.getString(TxStrings.title_activity_tipFrom, counterpartyName) - else resources.getString(TxStrings.title_activity_receivedFrom, counterpartyName) + if (isTip) resources.getString(Res.string.title_activity_tipFrom, counterpartyName) + else resources.getString(Res.string.title_activity_receivedFrom, counterpartyName) is MessageMetadata.DirectlySentCrypto -> // "Tipped" already reads as a transitive verb; "Sent" needs the preposition. if (isTip) "$text $counterpartyName" - else resources.getString(TxStrings.title_activity_sentTo, counterpartyName) + else resources.getString(Res.string.title_activity_sentTo, counterpartyName) else -> "$text $counterpartyName" } } diff --git a/apps/flipcash/shared/transaction-history/src/commonMain/kotlin/com/flipcash/shared/transactionhistory/resources/TxResources.kt b/apps/flipcash/shared/transaction-history/src/commonMain/kotlin/com/flipcash/shared/transactionhistory/resources/TxResources.kt deleted file mode 100644 index d707ec3968..0000000000 --- a/apps/flipcash/shared/transaction-history/src/commonMain/kotlin/com/flipcash/shared/transactionhistory/resources/TxResources.kt +++ /dev/null @@ -1,37 +0,0 @@ -package com.flipcash.shared.transactionhistory.resources - -/** - * `Int` IDs for the transaction-history strings that common code hands to - * [com.getcode.util.resources.ResourceHelper] and [com.getcode.util.resources.stringRes]. Android - * returns the `R` IDs; desktop registers the generated Compose resources. - */ -@Suppress("PropertyName") -expect object TxStrings { - val label_activity_convertFee: Int - val label_txnDetails_from: Int - val label_txnDetails_inPerson: Int - val label_txnDetails_paidWith: Int - val label_txnDetails_soldFor: Int - val label_txnDetails_status_completed: Int - val label_txnDetails_status_failed: Int - val label_txnDetails_status_pending: Int - val label_txnDetails_status_unknown: Int - val label_txnDetails_to: Int - val title_activity_convert: Int - val title_activity_receivedFrom: Int - val title_activity_sentTo: Int - val title_activity_tipFrom: Int - val title_txnDetails_buy: Int - val title_txnDetails_convert: Int - val title_txnDetails_deposit: Int - val title_txnDetails_poolPayment: Int - val title_txnDetails_sell: Int - val title_txnDetails_unknown: Int - val title_txnDetails_withdraw: Int - val title_txnDetails_youGaveCash: Int - val title_txnDetails_youReceived: Int - val title_txnDetails_youReceivedCash: Int - val title_txnDetails_youSent: Int - val title_txnDetails_youSentCashLink: Int - val title_txnDetails_youTipped: Int -} diff --git a/apps/flipcash/shared/transaction-history/src/jvmMain/kotlin/com/flipcash/shared/transactionhistory/resources/TxResources.jvm.kt b/apps/flipcash/shared/transaction-history/src/jvmMain/kotlin/com/flipcash/shared/transactionhistory/resources/TxResources.jvm.kt deleted file mode 100644 index c04328f65f..0000000000 --- a/apps/flipcash/shared/transaction-history/src/jvmMain/kotlin/com/flipcash/shared/transactionhistory/resources/TxResources.jvm.kt +++ /dev/null @@ -1,62 +0,0 @@ -package com.flipcash.shared.transactionhistory.resources - -import com.flipcash.shared.transactionhistory.generated.resources.Res -import com.flipcash.shared.transactionhistory.generated.resources.label_activity_convertFee -import com.flipcash.shared.transactionhistory.generated.resources.label_txnDetails_from -import com.flipcash.shared.transactionhistory.generated.resources.label_txnDetails_inPerson -import com.flipcash.shared.transactionhistory.generated.resources.label_txnDetails_paidWith -import com.flipcash.shared.transactionhistory.generated.resources.label_txnDetails_soldFor -import com.flipcash.shared.transactionhistory.generated.resources.label_txnDetails_status_completed -import com.flipcash.shared.transactionhistory.generated.resources.label_txnDetails_status_failed -import com.flipcash.shared.transactionhistory.generated.resources.label_txnDetails_status_pending -import com.flipcash.shared.transactionhistory.generated.resources.label_txnDetails_status_unknown -import com.flipcash.shared.transactionhistory.generated.resources.label_txnDetails_to -import com.flipcash.shared.transactionhistory.generated.resources.title_activity_convert -import com.flipcash.shared.transactionhistory.generated.resources.title_activity_receivedFrom -import com.flipcash.shared.transactionhistory.generated.resources.title_activity_sentTo -import com.flipcash.shared.transactionhistory.generated.resources.title_activity_tipFrom -import com.flipcash.shared.transactionhistory.generated.resources.title_txnDetails_buy -import com.flipcash.shared.transactionhistory.generated.resources.title_txnDetails_convert -import com.flipcash.shared.transactionhistory.generated.resources.title_txnDetails_deposit -import com.flipcash.shared.transactionhistory.generated.resources.title_txnDetails_poolPayment -import com.flipcash.shared.transactionhistory.generated.resources.title_txnDetails_sell -import com.flipcash.shared.transactionhistory.generated.resources.title_txnDetails_unknown -import com.flipcash.shared.transactionhistory.generated.resources.title_txnDetails_withdraw -import com.flipcash.shared.transactionhistory.generated.resources.title_txnDetails_youGaveCash -import com.flipcash.shared.transactionhistory.generated.resources.title_txnDetails_youReceived -import com.flipcash.shared.transactionhistory.generated.resources.title_txnDetails_youReceivedCash -import com.flipcash.shared.transactionhistory.generated.resources.title_txnDetails_youSent -import com.flipcash.shared.transactionhistory.generated.resources.title_txnDetails_youSentCashLink -import com.flipcash.shared.transactionhistory.generated.resources.title_txnDetails_youTipped -import com.getcode.util.resources.ComposeResourceIds - -@Suppress("PropertyName") -actual object TxStrings { - actual val label_activity_convertFee: Int = ComposeResourceIds.register(Res.string.label_activity_convertFee) - actual val label_txnDetails_from: Int = ComposeResourceIds.register(Res.string.label_txnDetails_from) - actual val label_txnDetails_inPerson: Int = ComposeResourceIds.register(Res.string.label_txnDetails_inPerson) - actual val label_txnDetails_paidWith: Int = ComposeResourceIds.register(Res.string.label_txnDetails_paidWith) - actual val label_txnDetails_soldFor: Int = ComposeResourceIds.register(Res.string.label_txnDetails_soldFor) - actual val label_txnDetails_status_completed: Int = ComposeResourceIds.register(Res.string.label_txnDetails_status_completed) - actual val label_txnDetails_status_failed: Int = ComposeResourceIds.register(Res.string.label_txnDetails_status_failed) - actual val label_txnDetails_status_pending: Int = ComposeResourceIds.register(Res.string.label_txnDetails_status_pending) - actual val label_txnDetails_status_unknown: Int = ComposeResourceIds.register(Res.string.label_txnDetails_status_unknown) - actual val label_txnDetails_to: Int = ComposeResourceIds.register(Res.string.label_txnDetails_to) - actual val title_activity_convert: Int = ComposeResourceIds.register(Res.string.title_activity_convert) - actual val title_activity_receivedFrom: Int = ComposeResourceIds.register(Res.string.title_activity_receivedFrom) - actual val title_activity_sentTo: Int = ComposeResourceIds.register(Res.string.title_activity_sentTo) - actual val title_activity_tipFrom: Int = ComposeResourceIds.register(Res.string.title_activity_tipFrom) - actual val title_txnDetails_buy: Int = ComposeResourceIds.register(Res.string.title_txnDetails_buy) - actual val title_txnDetails_convert: Int = ComposeResourceIds.register(Res.string.title_txnDetails_convert) - actual val title_txnDetails_deposit: Int = ComposeResourceIds.register(Res.string.title_txnDetails_deposit) - actual val title_txnDetails_poolPayment: Int = ComposeResourceIds.register(Res.string.title_txnDetails_poolPayment) - actual val title_txnDetails_sell: Int = ComposeResourceIds.register(Res.string.title_txnDetails_sell) - actual val title_txnDetails_unknown: Int = ComposeResourceIds.register(Res.string.title_txnDetails_unknown) - actual val title_txnDetails_withdraw: Int = ComposeResourceIds.register(Res.string.title_txnDetails_withdraw) - actual val title_txnDetails_youGaveCash: Int = ComposeResourceIds.register(Res.string.title_txnDetails_youGaveCash) - actual val title_txnDetails_youReceived: Int = ComposeResourceIds.register(Res.string.title_txnDetails_youReceived) - actual val title_txnDetails_youReceivedCash: Int = ComposeResourceIds.register(Res.string.title_txnDetails_youReceivedCash) - actual val title_txnDetails_youSent: Int = ComposeResourceIds.register(Res.string.title_txnDetails_youSent) - actual val title_txnDetails_youSentCashLink: Int = ComposeResourceIds.register(Res.string.title_txnDetails_youSentCashLink) - actual val title_txnDetails_youTipped: Int = ComposeResourceIds.register(Res.string.title_txnDetails_youTipped) -} diff --git a/apps/flipcash/shared/userflags/build.gradle.kts b/apps/flipcash/shared/userflags/build.gradle.kts index bcb6712ac2..68416a6e07 100644 --- a/apps/flipcash/shared/userflags/build.gradle.kts +++ b/apps/flipcash/shared/userflags/build.gradle.kts @@ -1,6 +1,9 @@ +import com.getcode.buildlogic.resources.androidResAsComposeResources + plugins { alias(libs.plugins.flipcash.kmp.app.library) alias(libs.plugins.compose.compiler) + alias(libs.plugins.jetbrains.compose) alias(libs.plugins.kotlin.ksp) } @@ -14,6 +17,7 @@ kotlin { commonMain.dependencies { implementation(libs.jetbrains.compose.runtime) implementation(libs.jetbrains.compose.foundation) + implementation(libs.jetbrains.compose.components.resources) implementation(libs.androidx.annotation) implementation(libs.androidx.datastore.preferences.core) implementation(libs.javax.inject) @@ -39,6 +43,14 @@ kotlin { } } +compose.resources { + packageOfResClass = "com.flipcash.app.userflags.generated.resources" + customDirectory( + sourceSetName = "commonMain", + directoryProvider = androidResAsComposeResources(), + ) +} + dependencies { add("kspAndroid", libs.hilt.android.compiler) add("kspAndroid", libs.hilt.compiler) diff --git a/apps/flipcash/shared/userflags/src/androidMain/kotlin/com/flipcash/app/userflags/FlagStrings.android.kt b/apps/flipcash/shared/userflags/src/androidMain/kotlin/com/flipcash/app/userflags/FlagStrings.android.kt deleted file mode 100644 index bf9407fcfc..0000000000 --- a/apps/flipcash/shared/userflags/src/androidMain/kotlin/com/flipcash/app/userflags/FlagStrings.android.kt +++ /dev/null @@ -1,26 +0,0 @@ -package com.flipcash.app.userflags - -import com.flipcash.shared.userflags.R - -internal actual object FlagStrings { - actual val hint_flag_billExchangeDataTimeout: Int = R.string.hint_flag_billExchangeDataTimeout - actual val hint_flag_messageDeleteWindow: Int = R.string.hint_flag_messageDeleteWindow - actual val hint_flag_messageEditWindow: Int = R.string.hint_flag_messageEditWindow - actual val hint_flag_minHolderAmount: Int = R.string.hint_flag_minHolderAmount - actual val hint_flag_minimumVersion: Int = R.string.hint_flag_minimumVersion - actual val hint_flag_newCurrencyFeeAmount: Int = R.string.hint_flag_newCurrencyFeeAmount - actual val hint_flag_newCurrencyPurchaseAmount: Int = R.string.hint_flag_newCurrencyPurchaseAmount - actual val hint_flag_withdrawalFeeAmount: Int = R.string.hint_flag_withdrawalFeeAmount - actual val label_flag_billExchangeDataTimeout: Int = R.string.label_flag_billExchangeDataTimeout - actual val label_flag_messageDeleteWindow: Int = R.string.label_flag_messageDeleteWindow - actual val label_flag_messageEditWindow: Int = R.string.label_flag_messageEditWindow - actual val label_flag_minHolderAmount: Int = R.string.label_flag_minHolderAmount - actual val label_flag_minimumVersion: Int = R.string.label_flag_minimumVersion - actual val label_flag_newCurrencyFeeAmount: Int = R.string.label_flag_newCurrencyFeeAmount - actual val label_flag_newCurrencyPurchaseAmount: Int = R.string.label_flag_newCurrencyPurchaseAmount - actual val label_flag_preferredProvider: Int = R.string.label_flag_preferredProvider - actual val label_flag_preferredUsdcLiquidityPool: Int = R.string.label_flag_preferredUsdcLiquidityPool - actual val label_flag_requireCoinbaseEmailVerification: Int = R.string.label_flag_requireCoinbaseEmailVerification - actual val label_flag_supportedOnRampProviders: Int = R.string.label_flag_supportedOnRampProviders - actual val label_flag_withdrawalFeeAmount: Int = R.string.label_flag_withdrawalFeeAmount -} diff --git a/apps/flipcash/shared/userflags/src/commonMain/kotlin/com/flipcash/app/userflags/Field.kt b/apps/flipcash/shared/userflags/src/commonMain/kotlin/com/flipcash/app/userflags/Field.kt index 6f94b50caa..6579f2d0b9 100644 --- a/apps/flipcash/shared/userflags/src/commonMain/kotlin/com/flipcash/app/userflags/Field.kt +++ b/apps/flipcash/shared/userflags/src/commonMain/kotlin/com/flipcash/app/userflags/Field.kt @@ -1,6 +1,27 @@ package com.flipcash.app.userflags -import androidx.annotation.StringRes +import org.jetbrains.compose.resources.StringResource +import com.flipcash.app.userflags.generated.resources.Res +import com.flipcash.app.userflags.generated.resources.hint_flag_billExchangeDataTimeout +import com.flipcash.app.userflags.generated.resources.hint_flag_messageDeleteWindow +import com.flipcash.app.userflags.generated.resources.hint_flag_messageEditWindow +import com.flipcash.app.userflags.generated.resources.hint_flag_minHolderAmount +import com.flipcash.app.userflags.generated.resources.hint_flag_minimumVersion +import com.flipcash.app.userflags.generated.resources.hint_flag_newCurrencyFeeAmount +import com.flipcash.app.userflags.generated.resources.hint_flag_newCurrencyPurchaseAmount +import com.flipcash.app.userflags.generated.resources.hint_flag_withdrawalFeeAmount +import com.flipcash.app.userflags.generated.resources.label_flag_billExchangeDataTimeout +import com.flipcash.app.userflags.generated.resources.label_flag_messageDeleteWindow +import com.flipcash.app.userflags.generated.resources.label_flag_messageEditWindow +import com.flipcash.app.userflags.generated.resources.label_flag_minHolderAmount +import com.flipcash.app.userflags.generated.resources.label_flag_minimumVersion +import com.flipcash.app.userflags.generated.resources.label_flag_newCurrencyFeeAmount +import com.flipcash.app.userflags.generated.resources.label_flag_newCurrencyPurchaseAmount +import com.flipcash.app.userflags.generated.resources.label_flag_preferredProvider +import com.flipcash.app.userflags.generated.resources.label_flag_preferredUsdcLiquidityPool +import com.flipcash.app.userflags.generated.resources.label_flag_requireCoinbaseEmailVerification +import com.flipcash.app.userflags.generated.resources.label_flag_supportedOnRampProviders +import com.flipcash.app.userflags.generated.resources.label_flag_withdrawalFeeAmount import androidx.compose.foundation.text.input.InputTransformation import androidx.compose.foundation.text.input.OutputTransformation import androidx.compose.foundation.text.input.insert @@ -22,8 +43,8 @@ sealed class Field( val preferenceKey: Preferences.Key, val encode: (Domain) -> Stored, val decode: (Stored) -> Domain?, - @get:StringRes val label: Int, - @get:StringRes val hint: Int = label, + val label: StringResource, + val hint: StringResource = label, val format: (Domain) -> String, val editFormat: (Domain) -> String = format, val editor: FieldEditor, @@ -34,7 +55,7 @@ sealed class Field( stringPreferencesKey("override_preferred_provider"), encode = { it?.encode() ?: "None" }, decode = { decodeOnRampProvider(it) }, - label = FlagStrings.label_flag_preferredProvider, + label = Res.string.label_flag_preferredProvider, format = { provider -> provider?.displayName() ?: "None" }, editor = FieldEditor.SingleSelect( options = listOf( @@ -56,7 +77,7 @@ sealed class Field( else -> "${providers.size} selected" } }, - label = FlagStrings.label_flag_supportedOnRampProviders, + label = Res.string.label_flag_supportedOnRampProviders, editor = FieldEditor.MultiSelect( options = listOf( "Manual Deposit" to OnRampProvider.ManualDeposit, @@ -70,8 +91,8 @@ sealed class Field( intPreferencesKey("override_min_version"), encode = { it ?: 0 }, decode = { it }, - label = FlagStrings.label_flag_minimumVersion, - hint = FlagStrings.hint_flag_minimumVersion, + label = Res.string.label_flag_minimumVersion, + hint = Res.string.hint_flag_minimumVersion, format = { it.toString() }, editor = FieldEditor.TextInput( keyboard = KeyboardType.Number, @@ -86,8 +107,8 @@ sealed class Field( longPreferencesKey("override_bill_timeout"), encode = { it?.inWholeMilliseconds ?: -1L }, decode = { if (it < 0) null else it.milliseconds }, - label = FlagStrings.label_flag_billExchangeDataTimeout, - hint = FlagStrings.hint_flag_billExchangeDataTimeout, + label = Res.string.label_flag_billExchangeDataTimeout, + hint = Res.string.hint_flag_billExchangeDataTimeout, format = { it?.let { "${it.inWholeSeconds}s" } ?: "None" }, editFormat = { it?.inWholeSeconds?.toString() ?: "" }, editor = FieldEditor.TextInput( @@ -108,8 +129,8 @@ sealed class Field( longPreferencesKey("override_message_edit_window"), encode = { it?.inWholeMilliseconds ?: -1L }, decode = { if (it < 0) null else it.milliseconds }, - label = FlagStrings.label_flag_messageEditWindow, - hint = FlagStrings.hint_flag_messageEditWindow, + label = Res.string.label_flag_messageEditWindow, + hint = Res.string.hint_flag_messageEditWindow, format = { it?.let { "${it.inWholeSeconds}s" } ?: "None" }, editFormat = { it?.inWholeSeconds?.toString() ?: "" }, editor = FieldEditor.TextInput( @@ -125,8 +146,8 @@ sealed class Field( longPreferencesKey("override_message_delete_window"), encode = { it?.inWholeMilliseconds ?: -1L }, decode = { if (it < 0) null else it.milliseconds }, - label = FlagStrings.label_flag_messageDeleteWindow, - hint = FlagStrings.hint_flag_messageDeleteWindow, + label = Res.string.label_flag_messageDeleteWindow, + hint = Res.string.hint_flag_messageDeleteWindow, format = { it?.let { "${it.inWholeSeconds}s" } ?: "None" }, editFormat = { it?.inWholeSeconds?.toString() ?: "" }, editor = FieldEditor.TextInput( @@ -142,8 +163,8 @@ sealed class Field( longPreferencesKey("override_new_currency_amount"), encode = { it.quarks }, decode = { Fiat(quarks = it) }, - label = FlagStrings.label_flag_newCurrencyPurchaseAmount, - hint = FlagStrings.hint_flag_newCurrencyPurchaseAmount, + label = Res.string.label_flag_newCurrencyPurchaseAmount, + hint = Res.string.hint_flag_newCurrencyPurchaseAmount, format = { it.formatted(rule = Fiat.FormattingRule.Truncated) }, editFormat = { it.formatted(showPrefix = false, rule = Fiat.FormattingRule.Truncated) }, editor = FieldEditor.TextInput( @@ -161,8 +182,8 @@ sealed class Field( longPreferencesKey("override_new_fee_amount"), encode = { it.quarks }, decode = { Fiat(quarks = it) }, - label = FlagStrings.label_flag_newCurrencyFeeAmount, - hint = FlagStrings.hint_flag_newCurrencyFeeAmount, + label = Res.string.label_flag_newCurrencyFeeAmount, + hint = Res.string.hint_flag_newCurrencyFeeAmount, format = { it.formatted(rule = Fiat.FormattingRule.Truncated) }, editFormat = { it.formatted(showPrefix = false, rule = Fiat.FormattingRule.Truncated) }, editor = FieldEditor.TextInput( @@ -180,8 +201,8 @@ sealed class Field( longPreferencesKey("override_withdrawal_fee_amount"), encode = { it.quarks }, decode = { Fiat(quarks = it) }, - label = FlagStrings.label_flag_withdrawalFeeAmount, - hint = FlagStrings.hint_flag_withdrawalFeeAmount, + label = Res.string.label_flag_withdrawalFeeAmount, + hint = Res.string.hint_flag_withdrawalFeeAmount, format = { it.formatted(rule = Fiat.FormattingRule.Truncated) }, editFormat = { it.formatted(showPrefix = false, rule = Fiat.FormattingRule.Truncated) }, editor = FieldEditor.TextInput( @@ -199,7 +220,7 @@ sealed class Field( stringPreferencesKey("override_preferred_liquidity_pool"), encode = { it.name }, decode = { runCatching { UsdcLiquidtyPool.valueOf(it) }.getOrNull() }, - label = FlagStrings.label_flag_preferredUsdcLiquidityPool, + label = Res.string.label_flag_preferredUsdcLiquidityPool, format = { provider -> provider.displayName() }, editor = FieldEditor.SingleSelect( options = listOf( @@ -213,7 +234,7 @@ sealed class Field( booleanPreferencesKey("override_require_coinbase_email_verification"), encode = { it }, decode = { it }, - label = FlagStrings.label_flag_requireCoinbaseEmailVerification, + label = Res.string.label_flag_requireCoinbaseEmailVerification, format = { if (it) "Yes" else "No" }, editor = FieldEditor.SingleSelect( options = listOf("Yes" to true, "No" to false) @@ -224,8 +245,8 @@ sealed class Field( longPreferencesKey("override_min_holder_amount"), encode = { it.quarks }, decode = { Fiat(quarks = it) }, - label = FlagStrings.label_flag_minHolderAmount, - hint = FlagStrings.hint_flag_minHolderAmount, + label = Res.string.label_flag_minHolderAmount, + hint = Res.string.hint_flag_minHolderAmount, format = { it.formatted(rule = Fiat.FormattingRule.Truncated) }, editFormat = { it.formatted(showPrefix = false, rule = Fiat.FormattingRule.Truncated) }, editor = FieldEditor.TextInput( diff --git a/apps/flipcash/shared/userflags/src/commonMain/kotlin/com/flipcash/app/userflags/FlagStrings.kt b/apps/flipcash/shared/userflags/src/commonMain/kotlin/com/flipcash/app/userflags/FlagStrings.kt deleted file mode 100644 index f7923bed81..0000000000 --- a/apps/flipcash/shared/userflags/src/commonMain/kotlin/com/flipcash/app/userflags/FlagStrings.kt +++ /dev/null @@ -1,28 +0,0 @@ -package com.flipcash.app.userflags - -/** - * String resource ids for the debug flag editor's labels and hints. Android reads them from - * this module's `R`; desktop has no flag editor, so its ids are 0. - */ -internal expect object FlagStrings { - val hint_flag_billExchangeDataTimeout: Int - val hint_flag_messageDeleteWindow: Int - val hint_flag_messageEditWindow: Int - val hint_flag_minHolderAmount: Int - val hint_flag_minimumVersion: Int - val hint_flag_newCurrencyFeeAmount: Int - val hint_flag_newCurrencyPurchaseAmount: Int - val hint_flag_withdrawalFeeAmount: Int - val label_flag_billExchangeDataTimeout: Int - val label_flag_messageDeleteWindow: Int - val label_flag_messageEditWindow: Int - val label_flag_minHolderAmount: Int - val label_flag_minimumVersion: Int - val label_flag_newCurrencyFeeAmount: Int - val label_flag_newCurrencyPurchaseAmount: Int - val label_flag_preferredProvider: Int - val label_flag_preferredUsdcLiquidityPool: Int - val label_flag_requireCoinbaseEmailVerification: Int - val label_flag_supportedOnRampProviders: Int - val label_flag_withdrawalFeeAmount: Int -} diff --git a/apps/flipcash/shared/userflags/src/jvmMain/kotlin/com/flipcash/app/userflags/FlagStrings.jvm.kt b/apps/flipcash/shared/userflags/src/jvmMain/kotlin/com/flipcash/app/userflags/FlagStrings.jvm.kt deleted file mode 100644 index 5e9c5fbd6d..0000000000 --- a/apps/flipcash/shared/userflags/src/jvmMain/kotlin/com/flipcash/app/userflags/FlagStrings.jvm.kt +++ /dev/null @@ -1,24 +0,0 @@ -package com.flipcash.app.userflags - -internal actual object FlagStrings { - actual val hint_flag_billExchangeDataTimeout: Int = 0 - actual val hint_flag_messageDeleteWindow: Int = 0 - actual val hint_flag_messageEditWindow: Int = 0 - actual val hint_flag_minHolderAmount: Int = 0 - actual val hint_flag_minimumVersion: Int = 0 - actual val hint_flag_newCurrencyFeeAmount: Int = 0 - actual val hint_flag_newCurrencyPurchaseAmount: Int = 0 - actual val hint_flag_withdrawalFeeAmount: Int = 0 - actual val label_flag_billExchangeDataTimeout: Int = 0 - actual val label_flag_messageDeleteWindow: Int = 0 - actual val label_flag_messageEditWindow: Int = 0 - actual val label_flag_minHolderAmount: Int = 0 - actual val label_flag_minimumVersion: Int = 0 - actual val label_flag_newCurrencyFeeAmount: Int = 0 - actual val label_flag_newCurrencyPurchaseAmount: Int = 0 - actual val label_flag_preferredProvider: Int = 0 - actual val label_flag_preferredUsdcLiquidityPool: Int = 0 - actual val label_flag_requireCoinbaseEmailVerification: Int = 0 - actual val label_flag_supportedOnRampProviders: Int = 0 - actual val label_flag_withdrawalFeeAmount: Int = 0 -} diff --git a/ui/components/build.gradle.kts b/ui/components/build.gradle.kts index d578f47feb..8b0494ea60 100644 --- a/ui/components/build.gradle.kts +++ b/ui/components/build.gradle.kts @@ -1,6 +1,9 @@ +import com.getcode.buildlogic.resources.androidResAsComposeResources + plugins { alias(libs.plugins.flipcash.kmp.app.library) alias(libs.plugins.compose.compiler) + alias(libs.plugins.jetbrains.compose) id("org.jetbrains.kotlin.plugin.parcelize") } @@ -19,6 +22,7 @@ kotlin { implementation(libs.jetbrains.compose.material) api(libs.jetbrains.compose.material3) implementation(libs.jetbrains.compose.components.resources) + implementation(libs.jetbrains.compose.material.icons.extended) api(libs.jetbrains.compose.ui.tooling.preview) // api: TopScrollEdge and the app bar take a HazeState, so callers need the type. api(libs.bundles.haze) @@ -59,3 +63,12 @@ kotlin { } } + +compose.resources { + publicResClass = true + packageOfResClass = "${Gradle.codeNamespace}.ui.components.resources" + customDirectory( + sourceSetName = "commonMain", + directoryProvider = androidResAsComposeResources(), + ) +} diff --git a/ui/components/src/androidHostTest/kotlin/com/getcode/ui/components/ComposeResourcesOnAndroidTest.kt b/ui/components/src/androidHostTest/kotlin/com/getcode/ui/components/ComposeResourcesOnAndroidTest.kt new file mode 100644 index 0000000000..42b58770f0 --- /dev/null +++ b/ui/components/src/androidHostTest/kotlin/com/getcode/ui/components/ComposeResourcesOnAndroidTest.kt @@ -0,0 +1,46 @@ +package com.getcode.ui.components + +import androidx.compose.foundation.Image +import androidx.compose.ui.Modifier +import androidx.compose.ui.platform.testTag +import androidx.compose.ui.test.assertIsDisplayed +import androidx.compose.ui.test.junit4.createComposeRule +import androidx.compose.ui.test.onNodeWithTag +import androidx.compose.ui.test.onNodeWithText +import com.getcode.theme.DesignSystem +import com.getcode.util.resources.Res +import com.getcode.util.resources.ic_chevron_right +import org.jetbrains.compose.resources.painterResource +import org.junit.Rule +import org.junit.Test +import org.junit.runner.RunWith +import org.robolectric.RobolectricTestRunner + +/** + * Common code reads strings and drawables through Compose resources, where Android used to read `R`. + * These check the Android build packages them and resolves them at runtime, not only that it compiles. + */ +@RunWith(RobolectricTestRunner::class) +class ComposeResourcesOnAndroidTest { + + @get:Rule + val composeTestRule = createComposeRule() + + @Test + fun `string from this module resolves`() { + composeTestRule.setContent { DesignSystem { BetaIndicator() } } + composeTestRule.onNodeWithText("Beta").assertIsDisplayed() + } + + @Test + fun `vector drawable from ui resources resolves`() { + composeTestRule.setContent { + Image( + painter = painterResource(Res.drawable.ic_chevron_right), + contentDescription = null, + modifier = Modifier.testTag("chevron"), + ) + } + composeTestRule.onNodeWithTag("chevron").assertIsDisplayed() + } +} diff --git a/ui/components/src/androidMain/kotlin/com/getcode/ui/Locals.kt b/ui/components/src/commonMain/kotlin/com/getcode/ui/Locals.kt similarity index 100% rename from ui/components/src/androidMain/kotlin/com/getcode/ui/Locals.kt rename to ui/components/src/commonMain/kotlin/com/getcode/ui/Locals.kt diff --git a/ui/components/src/androidMain/kotlin/com/getcode/ui/components/BetaIndicator.kt b/ui/components/src/commonMain/kotlin/com/getcode/ui/components/BetaIndicator.kt similarity index 84% rename from ui/components/src/androidMain/kotlin/com/getcode/ui/components/BetaIndicator.kt rename to ui/components/src/commonMain/kotlin/com/getcode/ui/components/BetaIndicator.kt index 07f15b19fe..48492d1bdd 100644 --- a/ui/components/src/androidMain/kotlin/com/getcode/ui/components/BetaIndicator.kt +++ b/ui/components/src/commonMain/kotlin/com/getcode/ui/components/BetaIndicator.kt @@ -10,8 +10,10 @@ import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment.Companion.CenterVertically import androidx.compose.ui.Modifier -import androidx.compose.ui.res.stringResource +import org.jetbrains.compose.resources.stringResource import com.getcode.theme.CodeTheme +import com.getcode.ui.components.resources.Res +import com.getcode.ui.components.resources.subtitle_beta @Composable fun BetaIndicator(modifier: Modifier = Modifier) { @@ -30,7 +32,7 @@ fun BetaIndicator(modifier: Modifier = Modifier) { ) Text( - text = stringResource(R.string.subtitle_beta), + text = stringResource(Res.string.subtitle_beta), style = CodeTheme.typography.textSmall, color = CodeTheme.colors.textSecondary ) diff --git a/ui/components/src/androidMain/kotlin/com/getcode/ui/components/BlurredContent.kt b/ui/components/src/commonMain/kotlin/com/getcode/ui/components/BlurredContent.kt similarity index 100% rename from ui/components/src/androidMain/kotlin/com/getcode/ui/components/BlurredContent.kt rename to ui/components/src/commonMain/kotlin/com/getcode/ui/components/BlurredContent.kt diff --git a/ui/components/src/androidMain/kotlin/com/getcode/ui/components/BottomScrollEdge.kt b/ui/components/src/commonMain/kotlin/com/getcode/ui/components/BottomScrollEdge.kt similarity index 100% rename from ui/components/src/androidMain/kotlin/com/getcode/ui/components/BottomScrollEdge.kt rename to ui/components/src/commonMain/kotlin/com/getcode/ui/components/BottomScrollEdge.kt diff --git a/ui/components/src/androidMain/kotlin/com/getcode/ui/components/BulletRow.kt b/ui/components/src/commonMain/kotlin/com/getcode/ui/components/BulletRow.kt similarity index 100% rename from ui/components/src/androidMain/kotlin/com/getcode/ui/components/BulletRow.kt rename to ui/components/src/commonMain/kotlin/com/getcode/ui/components/BulletRow.kt diff --git a/ui/components/src/androidMain/kotlin/com/getcode/ui/components/CapsuleProgressBar.kt b/ui/components/src/commonMain/kotlin/com/getcode/ui/components/CapsuleProgressBar.kt similarity index 100% rename from ui/components/src/androidMain/kotlin/com/getcode/ui/components/CapsuleProgressBar.kt rename to ui/components/src/commonMain/kotlin/com/getcode/ui/components/CapsuleProgressBar.kt diff --git a/ui/components/src/androidMain/kotlin/com/getcode/ui/components/Chip.kt b/ui/components/src/commonMain/kotlin/com/getcode/ui/components/Chip.kt similarity index 100% rename from ui/components/src/androidMain/kotlin/com/getcode/ui/components/Chip.kt rename to ui/components/src/commonMain/kotlin/com/getcode/ui/components/Chip.kt diff --git a/ui/components/src/androidMain/kotlin/com/getcode/ui/components/FilterChip.kt b/ui/components/src/commonMain/kotlin/com/getcode/ui/components/FilterChip.kt similarity index 100% rename from ui/components/src/androidMain/kotlin/com/getcode/ui/components/FilterChip.kt rename to ui/components/src/commonMain/kotlin/com/getcode/ui/components/FilterChip.kt diff --git a/ui/components/src/androidMain/kotlin/com/getcode/ui/components/Flippable.kt b/ui/components/src/commonMain/kotlin/com/getcode/ui/components/Flippable.kt similarity index 100% rename from ui/components/src/androidMain/kotlin/com/getcode/ui/components/Flippable.kt rename to ui/components/src/commonMain/kotlin/com/getcode/ui/components/Flippable.kt diff --git a/ui/components/src/androidMain/kotlin/com/getcode/ui/components/FullWidthScrollableTabRow.kt b/ui/components/src/commonMain/kotlin/com/getcode/ui/components/FullWidthScrollableTabRow.kt similarity index 100% rename from ui/components/src/androidMain/kotlin/com/getcode/ui/components/FullWidthScrollableTabRow.kt rename to ui/components/src/commonMain/kotlin/com/getcode/ui/components/FullWidthScrollableTabRow.kt diff --git a/ui/components/src/androidMain/kotlin/com/getcode/ui/components/ListItem.kt b/ui/components/src/commonMain/kotlin/com/getcode/ui/components/ListItem.kt similarity index 96% rename from ui/components/src/androidMain/kotlin/com/getcode/ui/components/ListItem.kt rename to ui/components/src/commonMain/kotlin/com/getcode/ui/components/ListItem.kt index d109b9caa3..22ac260a22 100644 --- a/ui/components/src/androidMain/kotlin/com/getcode/ui/components/ListItem.kt +++ b/ui/components/src/commonMain/kotlin/com/getcode/ui/components/ListItem.kt @@ -21,13 +21,15 @@ import androidx.compose.ui.Alignment.Companion.CenterVertically import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.ColorFilter import androidx.compose.ui.graphics.painter.Painter -import androidx.compose.ui.res.painterResource +import org.jetbrains.compose.resources.painterResource import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import com.getcode.theme.CodeTheme import com.getcode.theme.White20 import com.getcode.ui.theme.CodeToggleSwitch import androidx.compose.foundation.clickable +import com.getcode.util.resources.Res +import com.getcode.util.resources.ic_chevron_right private val ListItemIconSize = 24.dp @@ -152,7 +154,7 @@ object ListItemDefaults { @Composable fun Chevron() { Icon( - painter = painterResource(id = R.drawable.ic_chevron_right), + painter = painterResource(Res.drawable.ic_chevron_right), contentDescription = null, tint = White20, ) diff --git a/ui/components/src/androidMain/kotlin/com/getcode/ui/components/Modal.kt b/ui/components/src/commonMain/kotlin/com/getcode/ui/components/Modal.kt similarity index 100% rename from ui/components/src/androidMain/kotlin/com/getcode/ui/components/Modal.kt rename to ui/components/src/commonMain/kotlin/com/getcode/ui/components/Modal.kt diff --git a/ui/components/src/androidMain/kotlin/com/getcode/ui/components/NotificationDot.kt b/ui/components/src/commonMain/kotlin/com/getcode/ui/components/NotificationDot.kt similarity index 100% rename from ui/components/src/androidMain/kotlin/com/getcode/ui/components/NotificationDot.kt rename to ui/components/src/commonMain/kotlin/com/getcode/ui/components/NotificationDot.kt diff --git a/ui/components/src/androidMain/kotlin/com/getcode/ui/components/Pill.kt b/ui/components/src/commonMain/kotlin/com/getcode/ui/components/Pill.kt similarity index 100% rename from ui/components/src/androidMain/kotlin/com/getcode/ui/components/Pill.kt rename to ui/components/src/commonMain/kotlin/com/getcode/ui/components/Pill.kt diff --git a/ui/components/src/androidMain/kotlin/com/getcode/ui/components/PullToReveal.kt b/ui/components/src/commonMain/kotlin/com/getcode/ui/components/PullToReveal.kt similarity index 100% rename from ui/components/src/androidMain/kotlin/com/getcode/ui/components/PullToReveal.kt rename to ui/components/src/commonMain/kotlin/com/getcode/ui/components/PullToReveal.kt diff --git a/ui/components/src/androidMain/kotlin/com/getcode/ui/components/SegmentedControl.kt b/ui/components/src/commonMain/kotlin/com/getcode/ui/components/SegmentedControl.kt similarity index 100% rename from ui/components/src/androidMain/kotlin/com/getcode/ui/components/SegmentedControl.kt rename to ui/components/src/commonMain/kotlin/com/getcode/ui/components/SegmentedControl.kt diff --git a/ui/components/src/androidMain/kotlin/com/getcode/ui/components/SwipeActionRow.kt b/ui/components/src/commonMain/kotlin/com/getcode/ui/components/SwipeActionRow.kt similarity index 98% rename from ui/components/src/androidMain/kotlin/com/getcode/ui/components/SwipeActionRow.kt rename to ui/components/src/commonMain/kotlin/com/getcode/ui/components/SwipeActionRow.kt index 7ff1638336..4a1ac308b1 100644 --- a/ui/components/src/androidMain/kotlin/com/getcode/ui/components/SwipeActionRow.kt +++ b/ui/components/src/commonMain/kotlin/com/getcode/ui/components/SwipeActionRow.kt @@ -43,7 +43,7 @@ import androidx.compose.ui.graphics.Color import androidx.compose.ui.layout.Layout import androidx.compose.ui.layout.onSizeChanged import androidx.compose.ui.platform.LocalDensity -import androidx.compose.ui.res.painterResource +import org.jetbrains.compose.resources.painterResource import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.Constraints import androidx.compose.ui.unit.IntOffset @@ -51,9 +51,10 @@ import com.getcode.theme.CodeTheme import com.getcode.theme.DesignSystem import com.getcode.theme.White50 import androidx.compose.foundation.clickable -import com.getcode.util.resources.R import kotlin.math.abs import kotlinx.coroutines.launch +import com.getcode.util.resources.Res +import com.getcode.util.resources.ic_delete /** * Describes a single action revealed behind the row content on swipe. @@ -111,7 +112,7 @@ fun SwipeActionRow( resetOnDismiss = resetOnDismiss, ) { Icon( - painter = painterResource(R.drawable.ic_delete), + painter = painterResource(Res.drawable.ic_delete), contentDescription = null, tint = Color.White, modifier = Modifier.requiredSize(iconSize), diff --git a/ui/components/src/androidMain/kotlin/com/getcode/ui/components/TopScrollEdge.kt b/ui/components/src/commonMain/kotlin/com/getcode/ui/components/TopScrollEdge.kt similarity index 100% rename from ui/components/src/androidMain/kotlin/com/getcode/ui/components/TopScrollEdge.kt rename to ui/components/src/commonMain/kotlin/com/getcode/ui/components/TopScrollEdge.kt diff --git a/ui/components/src/androidMain/kotlin/com/getcode/ui/components/VerticalDivider.kt b/ui/components/src/commonMain/kotlin/com/getcode/ui/components/VerticalDivider.kt similarity index 100% rename from ui/components/src/androidMain/kotlin/com/getcode/ui/components/VerticalDivider.kt rename to ui/components/src/commonMain/kotlin/com/getcode/ui/components/VerticalDivider.kt diff --git a/ui/components/src/androidMain/kotlin/com/getcode/ui/components/charts/ChartPoint.kt b/ui/components/src/commonMain/kotlin/com/getcode/ui/components/charts/ChartPoint.kt similarity index 100% rename from ui/components/src/androidMain/kotlin/com/getcode/ui/components/charts/ChartPoint.kt rename to ui/components/src/commonMain/kotlin/com/getcode/ui/components/charts/ChartPoint.kt diff --git a/ui/components/src/androidMain/kotlin/com/getcode/ui/components/charts/Trends.kt b/ui/components/src/commonMain/kotlin/com/getcode/ui/components/charts/Trends.kt similarity index 100% rename from ui/components/src/androidMain/kotlin/com/getcode/ui/components/charts/Trends.kt rename to ui/components/src/commonMain/kotlin/com/getcode/ui/components/charts/Trends.kt diff --git a/ui/components/src/androidMain/kotlin/com/getcode/ui/components/chat/DateBubble.kt b/ui/components/src/commonMain/kotlin/com/getcode/ui/components/chat/DateBubble.kt similarity index 100% rename from ui/components/src/androidMain/kotlin/com/getcode/ui/components/chat/DateBubble.kt rename to ui/components/src/commonMain/kotlin/com/getcode/ui/components/chat/DateBubble.kt diff --git a/ui/components/src/androidMain/kotlin/com/getcode/ui/components/chat/MessageNodeDefaults.kt b/ui/components/src/commonMain/kotlin/com/getcode/ui/components/chat/MessageNodeDefaults.kt similarity index 100% rename from ui/components/src/androidMain/kotlin/com/getcode/ui/components/chat/MessageNodeDefaults.kt rename to ui/components/src/commonMain/kotlin/com/getcode/ui/components/chat/MessageNodeDefaults.kt diff --git a/ui/components/src/androidMain/kotlin/com/getcode/ui/components/chat/TypingIndicator.kt b/ui/components/src/commonMain/kotlin/com/getcode/ui/components/chat/TypingIndicator.kt similarity index 100% rename from ui/components/src/androidMain/kotlin/com/getcode/ui/components/chat/TypingIndicator.kt rename to ui/components/src/commonMain/kotlin/com/getcode/ui/components/chat/TypingIndicator.kt diff --git a/ui/components/src/androidMain/kotlin/com/getcode/ui/components/text/ExpandableText.kt b/ui/components/src/commonMain/kotlin/com/getcode/ui/components/text/ExpandableText.kt similarity index 93% rename from ui/components/src/androidMain/kotlin/com/getcode/ui/components/text/ExpandableText.kt rename to ui/components/src/commonMain/kotlin/com/getcode/ui/components/text/ExpandableText.kt index 7ffc154c5f..846d942efb 100644 --- a/ui/components/src/androidMain/kotlin/com/getcode/ui/components/text/ExpandableText.kt +++ b/ui/components/src/commonMain/kotlin/com/getcode/ui/components/text/ExpandableText.kt @@ -24,14 +24,16 @@ import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color -import androidx.compose.ui.res.stringResource +import org.jetbrains.compose.resources.stringResource import androidx.compose.ui.text.TextStyle import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.unit.dp import com.getcode.theme.CodeTheme -import com.getcode.ui.components.R import com.getcode.ui.core.debugBounds import com.getcode.ui.core.drawWithGradient +import com.getcode.ui.components.resources.Res +import com.getcode.ui.components.resources.action_showLess +import com.getcode.ui.components.resources.action_showMore @Composable fun ExpandableText( @@ -132,7 +134,7 @@ private fun ExpandVisibilityButton( horizontalArrangement = Arrangement.spacedBy(CodeTheme.dimens.grid.x1) ) { Text( - text = if (isExpanded) stringResource(R.string.action_showLess) else stringResource(R.string.action_showMore), + text = if (isExpanded) stringResource(Res.string.action_showLess) else stringResource(Res.string.action_showMore), style = CodeTheme.typography.textMedium, color = CodeTheme.colors.textMain, ) diff --git a/ui/components/src/androidMain/kotlin/com/getcode/ui/components/text/SectionHeader.kt b/ui/components/src/commonMain/kotlin/com/getcode/ui/components/text/SectionHeader.kt similarity index 100% rename from ui/components/src/androidMain/kotlin/com/getcode/ui/components/text/SectionHeader.kt rename to ui/components/src/commonMain/kotlin/com/getcode/ui/components/text/SectionHeader.kt diff --git a/ui/components/src/androidMain/kotlin/com/getcode/ui/components/text/animated/DigitContainer.kt b/ui/components/src/commonMain/kotlin/com/getcode/ui/components/text/animated/DigitContainer.kt similarity index 100% rename from ui/components/src/androidMain/kotlin/com/getcode/ui/components/text/animated/DigitContainer.kt rename to ui/components/src/commonMain/kotlin/com/getcode/ui/components/text/animated/DigitContainer.kt diff --git a/ui/components/src/androidMain/kotlin/com/getcode/ui/theme/CodeBillSwipeToDismiss.kt b/ui/components/src/commonMain/kotlin/com/getcode/ui/theme/CodeBillSwipeToDismiss.kt similarity index 100% rename from ui/components/src/androidMain/kotlin/com/getcode/ui/theme/CodeBillSwipeToDismiss.kt rename to ui/components/src/commonMain/kotlin/com/getcode/ui/theme/CodeBillSwipeToDismiss.kt diff --git a/ui/components/src/androidMain/kotlin/com/getcode/ui/theme/CodeCheckbox.kt b/ui/components/src/commonMain/kotlin/com/getcode/ui/theme/CodeCheckbox.kt similarity index 100% rename from ui/components/src/androidMain/kotlin/com/getcode/ui/theme/CodeCheckbox.kt rename to ui/components/src/commonMain/kotlin/com/getcode/ui/theme/CodeCheckbox.kt diff --git a/ui/components/src/androidMain/kotlin/com/getcode/ui/theme/CodeRadioButton.kt b/ui/components/src/commonMain/kotlin/com/getcode/ui/theme/CodeRadioButton.kt similarity index 100% rename from ui/components/src/androidMain/kotlin/com/getcode/ui/theme/CodeRadioButton.kt rename to ui/components/src/commonMain/kotlin/com/getcode/ui/theme/CodeRadioButton.kt diff --git a/ui/components/src/androidMain/kotlin/com/getcode/ui/theme/CodeScaffold.kt b/ui/components/src/commonMain/kotlin/com/getcode/ui/theme/CodeScaffold.kt similarity index 100% rename from ui/components/src/androidMain/kotlin/com/getcode/ui/theme/CodeScaffold.kt rename to ui/components/src/commonMain/kotlin/com/getcode/ui/theme/CodeScaffold.kt diff --git a/ui/components/src/androidMain/kotlin/com/getcode/ui/theme/CodeSeedView.kt b/ui/components/src/commonMain/kotlin/com/getcode/ui/theme/CodeSeedView.kt similarity index 100% rename from ui/components/src/androidMain/kotlin/com/getcode/ui/theme/CodeSeedView.kt rename to ui/components/src/commonMain/kotlin/com/getcode/ui/theme/CodeSeedView.kt diff --git a/ui/components/src/androidMain/kotlin/com/getcode/ui/theme/CodeSegmentedControl.kt b/ui/components/src/commonMain/kotlin/com/getcode/ui/theme/CodeSegmentedControl.kt similarity index 100% rename from ui/components/src/androidMain/kotlin/com/getcode/ui/theme/CodeSegmentedControl.kt rename to ui/components/src/commonMain/kotlin/com/getcode/ui/theme/CodeSegmentedControl.kt diff --git a/ui/components/src/androidMain/kotlin/com/getcode/ui/theme/CodeSwitch.kt b/ui/components/src/commonMain/kotlin/com/getcode/ui/theme/CodeSwitch.kt similarity index 100% rename from ui/components/src/androidMain/kotlin/com/getcode/ui/theme/CodeSwitch.kt rename to ui/components/src/commonMain/kotlin/com/getcode/ui/theme/CodeSwitch.kt diff --git a/ui/components/src/androidMain/kotlin/com/getcode/ui/utils/AnimationUtils.kt b/ui/components/src/commonMain/kotlin/com/getcode/ui/utils/AnimationUtils.kt similarity index 100% rename from ui/components/src/androidMain/kotlin/com/getcode/ui/utils/AnimationUtils.kt rename to ui/components/src/commonMain/kotlin/com/getcode/ui/utils/AnimationUtils.kt diff --git a/ui/components/src/androidMain/kotlin/com/getcode/ui/utils/Geometry.kt b/ui/components/src/commonMain/kotlin/com/getcode/ui/utils/Geometry.kt similarity index 100% rename from ui/components/src/androidMain/kotlin/com/getcode/ui/utils/Geometry.kt rename to ui/components/src/commonMain/kotlin/com/getcode/ui/utils/Geometry.kt diff --git a/ui/components/src/androidMain/kotlin/com/getcode/ui/utils/LazyList.kt b/ui/components/src/commonMain/kotlin/com/getcode/ui/utils/LazyList.kt similarity index 100% rename from ui/components/src/androidMain/kotlin/com/getcode/ui/utils/LazyList.kt rename to ui/components/src/commonMain/kotlin/com/getcode/ui/utils/LazyList.kt diff --git a/ui/components/src/androidMain/kotlin/com/getcode/ui/utils/Maps.kt b/ui/components/src/commonMain/kotlin/com/getcode/ui/utils/Maps.kt similarity index 100% rename from ui/components/src/androidMain/kotlin/com/getcode/ui/utils/Maps.kt rename to ui/components/src/commonMain/kotlin/com/getcode/ui/utils/Maps.kt diff --git a/ui/components/src/androidMain/kotlin/com/getcode/ui/utils/MeasureScope.kt b/ui/components/src/commonMain/kotlin/com/getcode/ui/utils/MeasureScope.kt similarity index 100% rename from ui/components/src/androidMain/kotlin/com/getcode/ui/utils/MeasureScope.kt rename to ui/components/src/commonMain/kotlin/com/getcode/ui/utils/MeasureScope.kt diff --git a/ui/components/src/androidMain/kotlin/com/getcode/ui/utils/PaddingValues.kt b/ui/components/src/commonMain/kotlin/com/getcode/ui/utils/PaddingValues.kt similarity index 100% rename from ui/components/src/androidMain/kotlin/com/getcode/ui/utils/PaddingValues.kt rename to ui/components/src/commonMain/kotlin/com/getcode/ui/utils/PaddingValues.kt diff --git a/ui/components/src/androidMain/kotlin/com/getcode/ui/utils/TextStyle.kt b/ui/components/src/commonMain/kotlin/com/getcode/ui/utils/TextStyle.kt similarity index 100% rename from ui/components/src/androidMain/kotlin/com/getcode/ui/utils/TextStyle.kt rename to ui/components/src/commonMain/kotlin/com/getcode/ui/utils/TextStyle.kt diff --git a/ui/core/src/androidMain/kotlin/com/getcode/ui/core/ContextMenuAction.kt b/ui/core/src/commonMain/kotlin/com/getcode/ui/core/ContextMenuAction.kt similarity index 100% rename from ui/core/src/androidMain/kotlin/com/getcode/ui/core/ContextMenuAction.kt rename to ui/core/src/commonMain/kotlin/com/getcode/ui/core/ContextMenuAction.kt diff --git a/ui/core/src/androidMain/kotlin/com/getcode/ui/core/ExpandedTouchTarget.kt b/ui/core/src/commonMain/kotlin/com/getcode/ui/core/ExpandedTouchTarget.kt similarity index 100% rename from ui/core/src/androidMain/kotlin/com/getcode/ui/core/ExpandedTouchTarget.kt rename to ui/core/src/commonMain/kotlin/com/getcode/ui/core/ExpandedTouchTarget.kt diff --git a/ui/core/src/androidMain/kotlin/com/getcode/ui/core/StarMaskVisualTransformation.kt b/ui/core/src/commonMain/kotlin/com/getcode/ui/core/StarMaskVisualTransformation.kt similarity index 100% rename from ui/core/src/androidMain/kotlin/com/getcode/ui/core/StarMaskVisualTransformation.kt rename to ui/core/src/commonMain/kotlin/com/getcode/ui/core/StarMaskVisualTransformation.kt diff --git a/ui/core/src/androidMain/kotlin/com/getcode/ui/core/visibility/VisibilityInfo.kt b/ui/core/src/commonMain/kotlin/com/getcode/ui/core/visibility/VisibilityInfo.kt similarity index 100% rename from ui/core/src/androidMain/kotlin/com/getcode/ui/core/visibility/VisibilityInfo.kt rename to ui/core/src/commonMain/kotlin/com/getcode/ui/core/visibility/VisibilityInfo.kt diff --git a/ui/core/src/androidMain/kotlin/com/getcode/ui/core/visibility/VisibilityTrackerNode.kt b/ui/core/src/commonMain/kotlin/com/getcode/ui/core/visibility/VisibilityTrackerNode.kt similarity index 100% rename from ui/core/src/androidMain/kotlin/com/getcode/ui/core/visibility/VisibilityTrackerNode.kt rename to ui/core/src/commonMain/kotlin/com/getcode/ui/core/visibility/VisibilityTrackerNode.kt diff --git a/ui/navigation/build.gradle.kts b/ui/navigation/build.gradle.kts index c658b24e56..27266d9bf8 100644 --- a/ui/navigation/build.gradle.kts +++ b/ui/navigation/build.gradle.kts @@ -12,6 +12,10 @@ kotlin { sourceSets { commonMain.dependencies { + implementation(libs.jetbrains.compose.animation) + implementation(libs.jetbrains.compose.material) + implementation(libs.jetbrains.compose.material3) + implementation(libs.jetbrains.compose.ui.tooling.preview) api(project(":libs:coroutines")) implementation(project(":libs:logging")) implementation(project(":libs:parcelable")) diff --git a/ui/navigation/src/androidMain/kotlin/com/getcode/navigation/flow/FlowDismissStyle.kt b/ui/navigation/src/commonMain/kotlin/com/getcode/navigation/flow/FlowDismissStyle.kt similarity index 100% rename from ui/navigation/src/androidMain/kotlin/com/getcode/navigation/flow/FlowDismissStyle.kt rename to ui/navigation/src/commonMain/kotlin/com/getcode/navigation/flow/FlowDismissStyle.kt diff --git a/ui/navigation/src/androidMain/kotlin/com/getcode/navigation/scrim/Scrim.kt b/ui/navigation/src/commonMain/kotlin/com/getcode/navigation/scrim/Scrim.kt similarity index 100% rename from ui/navigation/src/androidMain/kotlin/com/getcode/navigation/scrim/Scrim.kt rename to ui/navigation/src/commonMain/kotlin/com/getcode/navigation/scrim/Scrim.kt diff --git a/ui/navigation/src/androidMain/kotlin/com/getcode/ui/utils/SheetExpansion.kt b/ui/navigation/src/commonMain/kotlin/com/getcode/ui/utils/SheetExpansion.kt similarity index 100% rename from ui/navigation/src/androidMain/kotlin/com/getcode/ui/utils/SheetExpansion.kt rename to ui/navigation/src/commonMain/kotlin/com/getcode/ui/utils/SheetExpansion.kt diff --git a/ui/resources/src/androidMain/kotlin/com/getcode/util/resources/AndroidResources.kt b/ui/resources/src/androidMain/kotlin/com/getcode/util/resources/AndroidResources.kt index db84bf05b6..c1b7463d3b 100644 --- a/ui/resources/src/androidMain/kotlin/com/getcode/util/resources/AndroidResources.kt +++ b/ui/resources/src/androidMain/kotlin/com/getcode/util/resources/AndroidResources.kt @@ -10,6 +10,7 @@ import androidx.annotation.RawRes import androidx.annotation.StringRes import androidx.appcompat.content.res.AppCompatResources import androidx.core.content.res.ResourcesCompat +import org.jetbrains.compose.resources.StringResource import timber.log.Timber import java.io.File @@ -25,6 +26,13 @@ class AndroidResources( return context.getString(resourceId, *formatArgs) } + // Compose resources keep the Android resource name as their key, and every module's resources are + // merged into the app package, so the key resolves to the same R entry Android always read. + override fun getString(resource: StringResource, vararg formatArgs: Any): String { + val id = getIdentifier(resource.key, ResourceType.String) ?: return "" + return context.getString(id, *formatArgs) + } + override fun getRawResource(@RawRes resourceId: Int): String { return try { context.resources.openRawResource(resourceId).bufferedReader().use { it.readText() } diff --git a/ui/resources/src/androidMain/kotlin/com/getcode/util/resources/StringRes.android.kt b/ui/resources/src/androidMain/kotlin/com/getcode/util/resources/StringRes.android.kt deleted file mode 100644 index 5819f8d2f9..0000000000 --- a/ui/resources/src/androidMain/kotlin/com/getcode/util/resources/StringRes.android.kt +++ /dev/null @@ -1,15 +0,0 @@ -package com.getcode.util.resources - -import androidx.compose.runtime.Composable -import androidx.compose.ui.res.pluralStringResource -import androidx.compose.ui.res.stringResource - -@Composable -actual fun stringRes(id: Int): String = stringResource(id) - -@Composable -actual fun stringRes(id: Int, vararg formatArgs: Any): String = stringResource(id, *formatArgs) - -@Composable -actual fun pluralStringRes(id: Int, count: Int, vararg formatArgs: Any): String = - pluralStringResource(id, count, *formatArgs) diff --git a/ui/resources/src/commonMain/kotlin/com/getcode/util/resources/ResourceHelper.kt b/ui/resources/src/commonMain/kotlin/com/getcode/util/resources/ResourceHelper.kt index fb339aa961..72f1cc0070 100644 --- a/ui/resources/src/commonMain/kotlin/com/getcode/util/resources/ResourceHelper.kt +++ b/ui/resources/src/commonMain/kotlin/com/getcode/util/resources/ResourceHelper.kt @@ -5,6 +5,7 @@ import androidx.annotation.PluralsRes import androidx.annotation.RawRes import androidx.annotation.StringRes import androidx.compose.runtime.staticCompositionLocalOf +import org.jetbrains.compose.resources.StringResource /** * Looks up app resources by their Android resource ID. @@ -17,6 +18,9 @@ interface ResourceHelper { fun getString(@StringRes resourceId: Int, vararg formatArgs: Any): String + /** Reads a Compose string resource outside composition, for mappers that build display text. */ + fun getString(resource: StringResource, vararg formatArgs: Any): String + fun getRawResource(@RawRes resourceId: Int): String fun getQuantityString( @@ -49,6 +53,8 @@ private object NoOpResources : ResourceHelper { override fun getString(resourceId: Int, vararg formatArgs: Any): String = "" + override fun getString(resource: StringResource, vararg formatArgs: Any): String = "" + override fun getRawResource(resourceId: Int): String = "" override fun getQuantityString( diff --git a/ui/resources/src/commonMain/kotlin/com/getcode/util/resources/StringRes.kt b/ui/resources/src/commonMain/kotlin/com/getcode/util/resources/StringRes.kt deleted file mode 100644 index 5bb17bec3e..0000000000 --- a/ui/resources/src/commonMain/kotlin/com/getcode/util/resources/StringRes.kt +++ /dev/null @@ -1,18 +0,0 @@ -package com.getcode.util.resources - -import androidx.annotation.PluralsRes -import androidx.annotation.StringRes -import androidx.compose.runtime.Composable - -/** - * Reads the string behind a resource ID in composition. On Android these are `R.string` values; - * on desktop they come from [ResourceHelper.getIdentifier] or a module's string table. - */ -@Composable -expect fun stringRes(@StringRes id: Int): String - -@Composable -expect fun stringRes(@StringRes id: Int, vararg formatArgs: Any): String - -@Composable -expect fun pluralStringRes(@PluralsRes id: Int, count: Int, vararg formatArgs: Any): String diff --git a/ui/resources/src/jvmMain/kotlin/com/getcode/util/resources/ComposeResourceHelper.kt b/ui/resources/src/jvmMain/kotlin/com/getcode/util/resources/ComposeResourceHelper.kt index c55ed631b5..17df59207e 100644 --- a/ui/resources/src/jvmMain/kotlin/com/getcode/util/resources/ComposeResourceHelper.kt +++ b/ui/resources/src/jvmMain/kotlin/com/getcode/util/resources/ComposeResourceHelper.kt @@ -2,6 +2,7 @@ package com.getcode.util.resources import kotlinx.coroutines.runBlocking import org.jetbrains.compose.resources.getPluralString +import org.jetbrains.compose.resources.StringResource import org.jetbrains.compose.resources.getString /** @@ -15,6 +16,9 @@ class ComposeResourceHelper : ResourceHelper { override fun getString(resourceId: Int, vararg formatArgs: Any): String = runBlocking { getString(ComposeResourceIds.string(resourceId), *formatArgs) } + override fun getString(resource: StringResource, vararg formatArgs: Any): String = + runBlocking { getString(resource, *formatArgs) } + override fun getRawResource(resourceId: Int): String = "" override fun getQuantityString(id: Int, quantity: Int, vararg formatArgs: Any, default: String): String = diff --git a/ui/resources/src/jvmMain/kotlin/com/getcode/util/resources/StringRes.jvm.kt b/ui/resources/src/jvmMain/kotlin/com/getcode/util/resources/StringRes.jvm.kt deleted file mode 100644 index 6e9a8f1313..0000000000 --- a/ui/resources/src/jvmMain/kotlin/com/getcode/util/resources/StringRes.jvm.kt +++ /dev/null @@ -1,16 +0,0 @@ -package com.getcode.util.resources - -import androidx.compose.runtime.Composable -import org.jetbrains.compose.resources.pluralStringResource -import org.jetbrains.compose.resources.stringResource - -@Composable -actual fun stringRes(id: Int): String = stringResource(ComposeResourceIds.string(id)) - -@Composable -actual fun stringRes(id: Int, vararg formatArgs: Any): String = - stringResource(ComposeResourceIds.string(id), *formatArgs) - -@Composable -actual fun pluralStringRes(id: Int, count: Int, vararg formatArgs: Any): String = - pluralStringResource(ComposeResourceIds.plural(id), count, *formatArgs) diff --git a/ui/resources/test-fixtures/src/main/kotlin/com/getcode/util/resources/FakeResourceHelper.kt b/ui/resources/test-fixtures/src/main/kotlin/com/getcode/util/resources/FakeResourceHelper.kt index e9881b8b62..84d9e73cc2 100644 --- a/ui/resources/test-fixtures/src/main/kotlin/com/getcode/util/resources/FakeResourceHelper.kt +++ b/ui/resources/test-fixtures/src/main/kotlin/com/getcode/util/resources/FakeResourceHelper.kt @@ -3,6 +3,7 @@ package com.getcode.util.resources import android.graphics.Typeface import android.graphics.drawable.Drawable import android.util.DisplayMetrics +import org.jetbrains.compose.resources.StringResource import java.io.File import java.net.URL import java.net.URLClassLoader @@ -17,6 +18,7 @@ class FakeResourceHelper(vararg rClasses: Class<*>) : AndroidResourceHelper { } private val overrides = mutableMapOf() + private val keyOverrides = mutableMapOf() fun stub(resourceId: Int, value: String): FakeResourceHelper = apply { overrides[resourceId] = value @@ -30,6 +32,15 @@ class FakeResourceHelper(vararg rClasses: Class<*>) : AndroidResourceHelper { return runCatching { template.format(*formatArgs) }.getOrDefault(template) } + fun stub(resource: StringResource, value: String): FakeResourceHelper = apply { + keyOverrides[resource.key] = value + } + + override fun getString(resource: StringResource, vararg formatArgs: Any): String { + val template = keyOverrides[resource.key] ?: return resource.key + return runCatching { template.format(*formatArgs) }.getOrDefault(template) + } + override fun getRawResource(resourceId: Int): String = "" override fun getQuantityString(id: Int, quantity: Int, vararg formatArgs: Any, default: String): String = default override fun getDimension(dimenId: Int, default: Float): Float = default