From 75d280ad535ed9ef18412307c734b87e40544e68 Mon Sep 17 00:00:00 2001 From: Laurent Date: Wed, 15 Oct 2025 17:04:39 +0200 Subject: [PATCH] update but does not build --- .../padelclub/lestorage/AndroidFileWriter.kt | 14 ++++++++ .../padelclub/lestorage/PlatformFileWriter.kt | 5 +++ .../app/padelclub/lestorage/FileWriter.kt | 5 +++ .../app/padelclub/lestorage/ModelObject.kt | 7 +++- .../padelclub/lestorage/PlatformFileWriter.kt | 3 ++ .../app/padelclub/lestorage/Storable.kt | 3 ++ .../kotlin/app/padelclub/lestorage/Store.kt | 10 +++++- .../app/padelclub/lestorage/StoreCenter.kt | 14 +++++++- .../padelclub/lestorage/StoredCollection.kt | 26 ++++++++++++++- .../app/padelclub/lestorage/IosFileWriter.kt | 33 +++++++++++++++++++ .../padelclub/lestorage/PlatformFileWriter.kt | 5 +++ .../androidMain/kotlin/app/padelclub/App.kt | 23 +++++++++++++ iosApp/iosApp/ContentView.swift | 20 +++++++++++ 13 files changed, 164 insertions(+), 4 deletions(-) create mode 100644 LeStorage/src/androidMain/kotlin/app/padelclub/lestorage/AndroidFileWriter.kt create mode 100644 LeStorage/src/androidMain/kotlin/app/padelclub/lestorage/PlatformFileWriter.kt create mode 100644 LeStorage/src/commonMain/kotlin/app/padelclub/lestorage/FileWriter.kt create mode 100644 LeStorage/src/commonMain/kotlin/app/padelclub/lestorage/PlatformFileWriter.kt create mode 100644 LeStorage/src/iosMain/kotlin/app/padelclub/lestorage/IosFileWriter.kt create mode 100644 LeStorage/src/iosMain/kotlin/app/padelclub/lestorage/PlatformFileWriter.kt diff --git a/LeStorage/src/androidMain/kotlin/app/padelclub/lestorage/AndroidFileWriter.kt b/LeStorage/src/androidMain/kotlin/app/padelclub/lestorage/AndroidFileWriter.kt new file mode 100644 index 0000000..393927a --- /dev/null +++ b/LeStorage/src/androidMain/kotlin/app/padelclub/lestorage/AndroidFileWriter.kt @@ -0,0 +1,14 @@ +package app.padelclub.lestorage + +import java.io.File + +class AndroidFileWriter : FileWriter { + override fun writeFile(directory: String, filename: String, content: String) { + val dir = File(directory) + if (!dir.exists()) { + dir.mkdirs() + } + val file = File(dir, filename) + file.writeText(content) + } +} diff --git a/LeStorage/src/androidMain/kotlin/app/padelclub/lestorage/PlatformFileWriter.kt b/LeStorage/src/androidMain/kotlin/app/padelclub/lestorage/PlatformFileWriter.kt new file mode 100644 index 0000000..bb05bb6 --- /dev/null +++ b/LeStorage/src/androidMain/kotlin/app/padelclub/lestorage/PlatformFileWriter.kt @@ -0,0 +1,5 @@ +package app.padelclub.lestorage + +actual fun createPlatformFileWriter(): FileWriter { + return AndroidFileWriter() +} diff --git a/LeStorage/src/commonMain/kotlin/app/padelclub/lestorage/FileWriter.kt b/LeStorage/src/commonMain/kotlin/app/padelclub/lestorage/FileWriter.kt new file mode 100644 index 0000000..29547e3 --- /dev/null +++ b/LeStorage/src/commonMain/kotlin/app/padelclub/lestorage/FileWriter.kt @@ -0,0 +1,5 @@ +package app.padelclub.lestorage + +interface FileWriter { + fun writeFile(directory: String, filename: String, content: String) +} diff --git a/LeStorage/src/commonMain/kotlin/app/padelclub/lestorage/ModelObject.kt b/LeStorage/src/commonMain/kotlin/app/padelclub/lestorage/ModelObject.kt index d557288..248cb70 100644 --- a/LeStorage/src/commonMain/kotlin/app/padelclub/lestorage/ModelObject.kt +++ b/LeStorage/src/commonMain/kotlin/app/padelclub/lestorage/ModelObject.kt @@ -1,7 +1,12 @@ package app.padelclub.lestorage -open class ModelObject: Storable { +import kotlinx.serialization.Serializable +import kotlinx.serialization.Transient +@Serializable +abstract class ModelObject: Storable { + + @Transient override var store: Store? = null } \ No newline at end of file diff --git a/LeStorage/src/commonMain/kotlin/app/padelclub/lestorage/PlatformFileWriter.kt b/LeStorage/src/commonMain/kotlin/app/padelclub/lestorage/PlatformFileWriter.kt new file mode 100644 index 0000000..3238f07 --- /dev/null +++ b/LeStorage/src/commonMain/kotlin/app/padelclub/lestorage/PlatformFileWriter.kt @@ -0,0 +1,3 @@ +package app.padelclub.lestorage + +expect fun createPlatformFileWriter(): FileWriter diff --git a/LeStorage/src/commonMain/kotlin/app/padelclub/lestorage/Storable.kt b/LeStorage/src/commonMain/kotlin/app/padelclub/lestorage/Storable.kt index 4f16e35..77370b7 100644 --- a/LeStorage/src/commonMain/kotlin/app/padelclub/lestorage/Storable.kt +++ b/LeStorage/src/commonMain/kotlin/app/padelclub/lestorage/Storable.kt @@ -1,7 +1,10 @@ package app.padelclub.lestorage +import kotlinx.serialization.Serializable + interface Storable { + val id: String var store: Store? } \ No newline at end of file diff --git a/LeStorage/src/commonMain/kotlin/app/padelclub/lestorage/Store.kt b/LeStorage/src/commonMain/kotlin/app/padelclub/lestorage/Store.kt index e8e3a48..3f21455 100644 --- a/LeStorage/src/commonMain/kotlin/app/padelclub/lestorage/Store.kt +++ b/LeStorage/src/commonMain/kotlin/app/padelclub/lestorage/Store.kt @@ -1,5 +1,13 @@ package app.padelclub.lestorage -class Store { +class Store(val storeCenter: StoreCenter) { + + fun writeJson(filename: String, json: String) { + this.storeCenter.fileWriter.writeFile(storeCenter.directory, filename, json) + } + + fun collection(filename: String): StoredCollection { + return StoredCollection(this, filename) + } } \ No newline at end of file diff --git a/LeStorage/src/commonMain/kotlin/app/padelclub/lestorage/StoreCenter.kt b/LeStorage/src/commonMain/kotlin/app/padelclub/lestorage/StoreCenter.kt index 4e0c2a5..fac565c 100644 --- a/LeStorage/src/commonMain/kotlin/app/padelclub/lestorage/StoreCenter.kt +++ b/LeStorage/src/commonMain/kotlin/app/padelclub/lestorage/StoreCenter.kt @@ -3,10 +3,22 @@ package app.padelclub.lestorage import kotlin.uuid.ExperimentalUuidApi import kotlin.uuid.Uuid -class StoreCenter { +class StoreCenter(val directory: String) { + + val fileWriter: FileWriter by lazy { + createPlatformFileWriter() + } + + val mainStore: Store by lazy { + Store(this) + } companion object { + val default: StoreCenter by lazy { + StoreCenter("storage") + } + @OptIn(ExperimentalUuidApi::class) fun uuidString(): String { return Uuid.random().toString() diff --git a/LeStorage/src/commonMain/kotlin/app/padelclub/lestorage/StoredCollection.kt b/LeStorage/src/commonMain/kotlin/app/padelclub/lestorage/StoredCollection.kt index 2ef0bb3..a8730b2 100644 --- a/LeStorage/src/commonMain/kotlin/app/padelclub/lestorage/StoredCollection.kt +++ b/LeStorage/src/commonMain/kotlin/app/padelclub/lestorage/StoredCollection.kt @@ -1,7 +1,31 @@ package app.padelclub.lestorage -class StoredCollection(var store: Store) { +import kotlinx.serialization.Serializable +import kotlinx.serialization.encodeToString +import kotlinx.serialization.json.Json +class StoredCollection(var store: Store, val filename: String) { + var items: MutableList = mutableListOf() + + fun addOrUpdate(item: T) { + val existingIndex = items.indexOfFirst { it.id == item.id } + if (existingIndex != -1) { + items[existingIndex] = item + } else { + items.add(item) + } + writeToJson() + } + + fun delete(id: String) { + items.removeAll { it.id == id } + writeToJson() + } + + private fun writeToJson() { + val json = Json.encodeToString(items) + store.writeJson(filename, json) + } } \ No newline at end of file diff --git a/LeStorage/src/iosMain/kotlin/app/padelclub/lestorage/IosFileWriter.kt b/LeStorage/src/iosMain/kotlin/app/padelclub/lestorage/IosFileWriter.kt new file mode 100644 index 0000000..adda744 --- /dev/null +++ b/LeStorage/src/iosMain/kotlin/app/padelclub/lestorage/IosFileWriter.kt @@ -0,0 +1,33 @@ +package app.padelclub.lestorage + +import kotlinx.cinterop.ExperimentalForeignApi +import platform.Foundation.NSFileManager +import platform.Foundation.NSString +import platform.Foundation.NSUTF8StringEncoding +import platform.Foundation.create +import platform.Foundation.writeToFile + +class IosFileWriter : FileWriter { + @OptIn(ExperimentalForeignApi::class) + override fun writeFile(directory: String, filename: String, content: String) { + val fileManager = NSFileManager.defaultManager + + // Create directory if it doesn't exist + fileManager.createDirectoryAtPath( + directory, + withIntermediateDirectories = true, + attributes = null, + error = null + ) + + // Write file + val filePath = "$directory/$filename" + val nsString = NSString.create(string = content) + nsString.writeToFile( + filePath, + atomically = true, + encoding = NSUTF8StringEncoding, + error = null + ) + } +} diff --git a/LeStorage/src/iosMain/kotlin/app/padelclub/lestorage/PlatformFileWriter.kt b/LeStorage/src/iosMain/kotlin/app/padelclub/lestorage/PlatformFileWriter.kt new file mode 100644 index 0000000..b3cff12 --- /dev/null +++ b/LeStorage/src/iosMain/kotlin/app/padelclub/lestorage/PlatformFileWriter.kt @@ -0,0 +1,5 @@ +package app.padelclub.lestorage + +actual fun createPlatformFileWriter(): FileWriter { + return IosFileWriter() +} diff --git a/composeApp/src/androidMain/kotlin/app/padelclub/App.kt b/composeApp/src/androidMain/kotlin/app/padelclub/App.kt index 5b3a002..ff71a3b 100644 --- a/composeApp/src/androidMain/kotlin/app/padelclub/App.kt +++ b/composeApp/src/androidMain/kotlin/app/padelclub/App.kt @@ -13,17 +13,29 @@ import androidx.compose.material3.Text import androidx.compose.runtime.* import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier +import androidx.compose.ui.platform.LocalContext import org.jetbrains.compose.resources.painterResource import org.jetbrains.compose.ui.tooling.preview.Preview import padelclub.composeapp.generated.resources.Res import padelclub.composeapp.generated.resources.compose_multiplatform import app.padelclub.lestorage.LeStorage +import app.padelclub.lestorage.StoreCenter +import app.padelclub.lestorage.Store +import app.padelclub.lestorage.StoredCollection +import app.padelclub.lestorage.AndroidFileWriter +import app.padelclub.data.Session @Composable @Preview fun App() { MaterialTheme { + val context = LocalContext.current + val storeCenter = remember { StoreCenter(context.filesDir.absolutePath + "/storage") } + val sessionCollection = remember { storeCenter.mainStore.collection("sessions.json") } + + var sessionCount by remember { mutableStateOf(sessionCollection.items.size) } + var showContent by remember { mutableStateOf(false) } Column( modifier = Modifier @@ -32,6 +44,17 @@ fun App() { .fillMaxSize(), horizontalAlignment = Alignment.CenterHorizontally, ) { + Button(onClick = { + val randomName = "Session-${(1000..9999).random()}" + val newSession = Session(name = randomName) + sessionCollection.addOrUpdate(newSession) + sessionCount = sessionCollection.items.size + }) { + Text("Add New Session") + } + + Text("Total Sessions: $sessionCount") + Button(onClick = { showContent = !showContent }) { Text("Click me!") } diff --git a/iosApp/iosApp/ContentView.swift b/iosApp/iosApp/ContentView.swift index 85b3b8b..a27e01b 100644 --- a/iosApp/iosApp/ContentView.swift +++ b/iosApp/iosApp/ContentView.swift @@ -4,8 +4,28 @@ import LeStorage struct ContentView: View { @State private var showContent = false + @State private var sessionCount = 0 + + let sessionCollection: StoredCollection + + init() { + let center = StoreCenter.companion.default_ + self.sessionCollection = center.mainStore.collection(filename: "sessions.json") + self._sessionCount = State(initialValue: Int(sessionCollection.items.count)) + } + var body: some View { VStack { + Button("Add New Session") { + let randomName = "Session-\(Int.random(in: 1000...9999))" + let newSession = Session() + newSession.name = randomName + sessionCollection.addOrUpdate(item: newSession) + sessionCount = Int(sessionCollection.items.count) + } + + Text("Total Sessions: \(sessionCount)") + Button("Click me!") { withAnimation { showContent = !showContent