refactor: replace sample app with list of records

This commit is contained in:
2026-06-09 15:57:38 +02:00
parent f37e71dddd
commit 09deb69d05
16 changed files with 163 additions and 229 deletions
+76 -76
View File
@@ -11,7 +11,7 @@
/* End PBXFileReference section */ /* End PBXFileReference section */
/* Begin PBXFileSystemSynchronizedBuildFileExceptionSet section */ /* Begin PBXFileSystemSynchronizedBuildFileExceptionSet section */
95ABF2C8EE96D87C60CB4B62 /* Exceptions for "iosApp" folder in "iosApp" target */ = { 95ABF2C8EE96D87C60CB4B62 /* PBXFileSystemSynchronizedBuildFileExceptionSet */ = {
isa = PBXFileSystemSynchronizedBuildFileExceptionSet; isa = PBXFileSystemSynchronizedBuildFileExceptionSet;
membershipExceptions = ( membershipExceptions = (
Info.plist, Info.plist,
@@ -24,7 +24,7 @@
89B7F8019E767C8CDD8E9E81 /* iosApp */ = { 89B7F8019E767C8CDD8E9E81 /* iosApp */ = {
isa = PBXFileSystemSynchronizedRootGroup; isa = PBXFileSystemSynchronizedRootGroup;
exceptions = ( exceptions = (
95ABF2C8EE96D87C60CB4B62 /* Exceptions for "iosApp" folder in "iosApp" target */, 95ABF2C8EE96D87C60CB4B62 /* PBXFileSystemSynchronizedBuildFileExceptionSet */,
); );
path = iosApp; path = iosApp;
sourceTree = "<group>"; sourceTree = "<group>";
@@ -47,6 +47,14 @@
/* End PBXFrameworksBuildPhase section */ /* End PBXFrameworksBuildPhase section */
/* Begin PBXGroup section */ /* Begin PBXGroup section */
47B0C8770C82BEADFE13EF77 /* Products */ = {
isa = PBXGroup;
children = (
9DA43AABF87DF46F5E794E72 /* Gwenedeg.app */,
);
name = Products;
sourceTree = "<group>";
};
A562F15E4A0F12F420BB5B12 = { A562F15E4A0F12F420BB5B12 = {
isa = PBXGroup; isa = PBXGroup;
children = ( children = (
@@ -56,14 +64,6 @@
); );
sourceTree = "<group>"; sourceTree = "<group>";
}; };
47B0C8770C82BEADFE13EF77 /* Products */ = {
isa = PBXGroup;
children = (
9DA43AABF87DF46F5E794E72 /* Gwenedeg.app */,
);
name = Products;
sourceTree = "<group>";
};
/* End PBXGroup section */ /* End PBXGroup section */
/* Begin PBXNativeTarget section */ /* Begin PBXNativeTarget section */
@@ -167,6 +167,34 @@
/* End PBXSourcesBuildPhase section */ /* End PBXSourcesBuildPhase section */
/* Begin XCBuildConfiguration section */ /* Begin XCBuildConfiguration section */
0F61D172BA94A3B6F831A0D3 /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
ARCHS = arm64;
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic;
DEVELOPMENT_ASSET_PATHS = "\"iosApp/Preview Content\"";
DEVELOPMENT_TEAM = 492RZGQ5SU;
ENABLE_PREVIEWS = YES;
GENERATE_INFOPLIST_FILE = YES;
INFOPLIST_FILE = iosApp/Info.plist;
INFOPLIST_KEY_UIApplicationSceneManifest_Generation = YES;
INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES;
INFOPLIST_KEY_UILaunchScreen_Generation = YES;
INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight";
INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight";
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
);
SWIFT_EMIT_LOC_STRINGS = YES;
SWIFT_VERSION = 5.0;
TARGETED_DEVICE_FAMILY = "1,2";
};
name = Debug;
};
21881C6A07515FFC1DADCA05 /* Debug */ = { 21881C6A07515FFC1DADCA05 /* Debug */ = {
isa = XCBuildConfiguration; isa = XCBuildConfiguration;
baseConfigurationReferenceAnchor = D8035B75140A5CBF147B4F8A /* Configuration */; baseConfigurationReferenceAnchor = D8035B75140A5CBF147B4F8A /* Configuration */;
@@ -232,6 +260,34 @@
}; };
name = Debug; name = Debug;
}; };
61BCF02D053AC97BF036B6EA /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
ARCHS = arm64;
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic;
DEVELOPMENT_ASSET_PATHS = "\"iosApp/Preview Content\"";
DEVELOPMENT_TEAM = "${TEAM_ID}";
ENABLE_PREVIEWS = YES;
GENERATE_INFOPLIST_FILE = YES;
INFOPLIST_FILE = iosApp/Info.plist;
INFOPLIST_KEY_UIApplicationSceneManifest_Generation = YES;
INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES;
INFOPLIST_KEY_UILaunchScreen_Generation = YES;
INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight";
INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight";
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
);
SWIFT_EMIT_LOC_STRINGS = YES;
SWIFT_VERSION = 5.0;
TARGETED_DEVICE_FAMILY = "1,2";
};
name = Release;
};
E201D027F4E1648F1454A88C /* Release */ = { E201D027F4E1648F1454A88C /* Release */ = {
isa = XCBuildConfiguration; isa = XCBuildConfiguration;
baseConfigurationReferenceAnchor = D8035B75140A5CBF147B4F8A /* Configuration */; baseConfigurationReferenceAnchor = D8035B75140A5CBF147B4F8A /* Configuration */;
@@ -290,74 +346,9 @@
}; };
name = Release; name = Release;
}; };
0F61D172BA94A3B6F831A0D3 /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
ARCHS = arm64;
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic;
DEVELOPMENT_ASSET_PATHS = "\"iosApp/Preview Content\"";
DEVELOPMENT_TEAM = "${TEAM_ID}";
ENABLE_PREVIEWS = YES;
GENERATE_INFOPLIST_FILE = YES;
INFOPLIST_FILE = iosApp/Info.plist;
INFOPLIST_KEY_UIApplicationSceneManifest_Generation = YES;
INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES;
INFOPLIST_KEY_UILaunchScreen_Generation = YES;
INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight";
INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight";
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
);
SWIFT_EMIT_LOC_STRINGS = YES;
SWIFT_VERSION = 5.0;
TARGETED_DEVICE_FAMILY = "1,2";
};
name = Debug;
};
61BCF02D053AC97BF036B6EA /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
ARCHS = arm64;
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic;
DEVELOPMENT_ASSET_PATHS = "\"iosApp/Preview Content\"";
DEVELOPMENT_TEAM = "${TEAM_ID}";
ENABLE_PREVIEWS = YES;
GENERATE_INFOPLIST_FILE = YES;
INFOPLIST_FILE = iosApp/Info.plist;
INFOPLIST_KEY_UIApplicationSceneManifest_Generation = YES;
INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES;
INFOPLIST_KEY_UILaunchScreen_Generation = YES;
INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight";
INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight";
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
);
SWIFT_EMIT_LOC_STRINGS = YES;
SWIFT_VERSION = 5.0;
TARGETED_DEVICE_FAMILY = "1,2";
};
name = Release;
};
/* End XCBuildConfiguration section */ /* End XCBuildConfiguration section */
/* Begin XCConfigurationList section */ /* Begin XCConfigurationList section */
7D7378CC21ADE468E3035338 /* Build configuration list for PBXProject "iosApp" */ = {
isa = XCConfigurationList;
buildConfigurations = (
21881C6A07515FFC1DADCA05 /* Debug */,
E201D027F4E1648F1454A88C /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
582786CD1EA9153C0E140AAC /* Build configuration list for PBXNativeTarget "iosApp" */ = { 582786CD1EA9153C0E140AAC /* Build configuration list for PBXNativeTarget "iosApp" */ = {
isa = XCConfigurationList; isa = XCConfigurationList;
buildConfigurations = ( buildConfigurations = (
@@ -367,7 +358,16 @@
defaultConfigurationIsVisible = 0; defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release; defaultConfigurationName = Release;
}; };
7D7378CC21ADE468E3035338 /* Build configuration list for PBXProject "iosApp" */ = {
isa = XCConfigurationList;
buildConfigurations = (
21881C6A07515FFC1DADCA05 /* Debug */,
E201D027F4E1648F1454A88C /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
/* End XCConfigurationList section */ /* End XCConfigurationList section */
}; };
rootObject = 50584B9465876AB65BD227D3 /* Project object */; rootObject = 50584B9465876AB65BD227D3 /* Project object */;
} }
@@ -1,12 +0,0 @@
package fr.ajaury.gwenedeg
import kotlin.test.Test
import kotlin.test.assertEquals
class SharedLogicAndroidHostTest {
@Test
fun example() {
assertEquals(3, 1 + 2)
}
}
@@ -1,9 +0,0 @@
package fr.ajaury.gwenedeg
import android.os.Build
class AndroidPlatform : Platform {
override val name: String = "Android ${Build.VERSION.SDK_INT}"
}
actual fun getPlatform(): Platform = AndroidPlatform()
@@ -1,49 +1,14 @@
package fr.ajaury.gwenedeg package fr.ajaury.gwenedeg
import androidx.compose.animation.AnimatedVisibility
import androidx.compose.foundation.Image
import androidx.compose.foundation.background
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.safeContentPadding
import androidx.compose.material3.Button
import androidx.compose.material3.MaterialTheme import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Text import androidx.compose.runtime.Composable
import androidx.compose.runtime.*
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.tooling.preview.Preview
import org.jetbrains.compose.resources.painterResource import fr.ajaury.gwenedeg.records.ui.RecordsScreen
import gwenedeg.shared.generated.resources.Res
import gwenedeg.shared.generated.resources.compose_multiplatform
@Composable @Composable
@Preview @Preview
fun App() { fun App() {
MaterialTheme { MaterialTheme {
var showContent by remember { mutableStateOf(false) } RecordsScreen()
Column(
modifier = Modifier
.background(MaterialTheme.colorScheme.primaryContainer)
.safeContentPadding()
.fillMaxSize(),
horizontalAlignment = Alignment.CenterHorizontally,
) {
Button(onClick = { showContent = !showContent }) {
Text("Click me!")
}
AnimatedVisibility(showContent) {
val greeting = remember { Greeting().greet() }
Column(
modifier = Modifier.fillMaxWidth(),
horizontalAlignment = Alignment.CenterHorizontally,
) {
Image(painterResource(Res.drawable.compose_multiplatform), null)
Text("Compose: $greeting")
}
}
}
} }
} }
@@ -1,9 +0,0 @@
package fr.ajaury.gwenedeg
class Greeting {
private val platform = getPlatform()
fun greet(): String {
return sayHello(platform.name)
}
}
@@ -1,4 +0,0 @@
package fr.ajaury.gwenedeg
fun sayHello(to: String): String =
"Hello, $to!"
@@ -1,7 +0,0 @@
package fr.ajaury.gwenedeg
interface Platform {
val name: String
}
expect fun getPlatform(): Platform
@@ -0,0 +1,15 @@
package fr.ajaury.gwenedeg.records.ui
import androidx.compose.foundation.layout.padding
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.unit.dp
@Composable
fun RecordView(record: String) {
Text(
text = record,
modifier = Modifier.padding(16.dp),
)
}
@@ -0,0 +1,68 @@
package fr.ajaury.gwenedeg.records.ui
import androidx.compose.foundation.background
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.safeContentPadding
import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.lazy.items
import androidx.compose.material3.HorizontalDivider
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Scaffold
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.unit.dp
private val records =
listOf(
"An onestiz",
"En em brezntiñ",
"An amzer a ra",
"E komz get unan arall",
"Me hag ar brezhoneg",
"Ar yec'hed",
"Deskriviñ",
"Me 'gar / Ne garan ket",
"C'hoantoù",
"Penaos 'peus kavet...?",
"Oberiantizoù",
"Debriñ hag evet",
"Bale, pourmen ha beajiñ",
"Ma c'horf",
"Dle eo / ret eo / dav eo / mall eo...",
"Deizioù ar sizhun",
"Mizioù ha kourzoù ar blez",
"Bez'zo / N'eus ket...",
"Banne.../Tamm...",
"Stad a vuhez",
"Lec'hiiñ",
)
@Composable
fun RecordsScreen() {
Scaffold { innerPadding ->
LazyColumn(
modifier =
Modifier
.padding(innerPadding)
.background(MaterialTheme.colorScheme.primaryContainer)
.fillMaxSize(),
) {
items(records) { item ->
RecordView(
record = item,
)
if (!item.isLastItem()) {
HorizontalDivider(
modifier = Modifier.padding(horizontal = 16.dp),
thickness = 1.dp,
color = MaterialTheme.colorScheme.outlineVariant,
)
}
}
}
}
}
private fun String.isLastItem(): Boolean = this == records.last()
@@ -1,12 +0,0 @@
package fr.ajaury.gwenedeg
import kotlin.test.Test
import kotlin.test.assertEquals
class SharedCommonTest {
@Test
fun example() {
assertEquals(3, 1 + 2)
}
}
@@ -1,9 +0,0 @@
package fr.ajaury.gwenedeg
import platform.UIKit.UIDevice
class IOSPlatform: Platform {
override val name: String = UIDevice.currentDevice.systemName() + " " + UIDevice.currentDevice.systemVersion
}
actual fun getPlatform(): Platform = IOSPlatform()
@@ -1,12 +0,0 @@
package fr.ajaury.gwenedeg
import kotlin.test.Test
import kotlin.test.assertEquals
class SharedLogicIOSTest {
@Test
fun example() {
assertEquals(3, 1 + 2)
}
}
@@ -1,14 +0,0 @@
package fr.ajaury.gwenedeg
import web.navigator.navigator
class JsPlatform: Platform {
private val userAgent = navigator.userAgent
private val browserList = listOf("Chrome", "Firefox", "Safari", "Edge")
override val name: String = userAgent.findAnyOf(browserList, ignoreCase = true)
?.let { (startIndex) -> userAgent.substring(startIndex).substringBefore(" ") }
?: "Unknown"
}
actual fun getPlatform(): Platform = JsPlatform()
@@ -1,7 +0,0 @@
package fr.ajaury.gwenedeg
class JVMPlatform: Platform {
override val name: String = "Java ${System.getProperty("java.version")}"
}
actual fun getPlatform(): Platform = JVMPlatform()
@@ -1,12 +0,0 @@
package fr.ajaury.gwenedeg
import kotlin.test.Test
import kotlin.test.assertEquals
class SharedLogicDesktopTest {
@Test
fun example() {
assertEquals(3, 1 + 2)
}
}
@@ -1,7 +0,0 @@
package fr.ajaury.gwenedeg
class WasmPlatform: Platform {
override val name: String = "Web with Kotlin/Wasm"
}
actual fun getPlatform(): Platform = WasmPlatform()