update but does not build

main
Laurent 4 weeks ago
parent 90b61097e2
commit 75d280ad53
  1. 14
      LeStorage/src/androidMain/kotlin/app/padelclub/lestorage/AndroidFileWriter.kt
  2. 5
      LeStorage/src/androidMain/kotlin/app/padelclub/lestorage/PlatformFileWriter.kt
  3. 5
      LeStorage/src/commonMain/kotlin/app/padelclub/lestorage/FileWriter.kt
  4. 7
      LeStorage/src/commonMain/kotlin/app/padelclub/lestorage/ModelObject.kt
  5. 3
      LeStorage/src/commonMain/kotlin/app/padelclub/lestorage/PlatformFileWriter.kt
  6. 3
      LeStorage/src/commonMain/kotlin/app/padelclub/lestorage/Storable.kt
  7. 10
      LeStorage/src/commonMain/kotlin/app/padelclub/lestorage/Store.kt
  8. 14
      LeStorage/src/commonMain/kotlin/app/padelclub/lestorage/StoreCenter.kt
  9. 26
      LeStorage/src/commonMain/kotlin/app/padelclub/lestorage/StoredCollection.kt
  10. 33
      LeStorage/src/iosMain/kotlin/app/padelclub/lestorage/IosFileWriter.kt
  11. 5
      LeStorage/src/iosMain/kotlin/app/padelclub/lestorage/PlatformFileWriter.kt
  12. 23
      composeApp/src/androidMain/kotlin/app/padelclub/App.kt
  13. 20
      iosApp/iosApp/ContentView.swift

@ -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)
}
}

@ -0,0 +1,5 @@
package app.padelclub.lestorage
actual fun createPlatformFileWriter(): FileWriter {
return AndroidFileWriter()
}

@ -0,0 +1,5 @@
package app.padelclub.lestorage
interface FileWriter {
fun writeFile(directory: String, filename: String, content: String)
}

@ -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
}

@ -0,0 +1,3 @@
package app.padelclub.lestorage
expect fun createPlatformFileWriter(): FileWriter

@ -1,7 +1,10 @@
package app.padelclub.lestorage
import kotlinx.serialization.Serializable
interface Storable {
val id: String
var store: Store?
}

@ -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 <T : Storable> collection(filename: String): StoredCollection<T> {
return StoredCollection(this, filename)
}
}

@ -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()

@ -1,7 +1,31 @@
package app.padelclub.lestorage
class StoredCollection<T : Storable>(var store: Store) {
import kotlinx.serialization.Serializable
import kotlinx.serialization.encodeToString
import kotlinx.serialization.json.Json
class StoredCollection<T : Storable>(var store: Store, val filename: String) {
var items: MutableList<T> = 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)
}
}

@ -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
)
}
}

@ -0,0 +1,5 @@
package app.padelclub.lestorage
actual fun createPlatformFileWriter(): FileWriter {
return IosFileWriter()
}

@ -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<Session>("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!")
}

@ -4,8 +4,28 @@ import LeStorage
struct ContentView: View {
@State private var showContent = false
@State private var sessionCount = 0
let sessionCollection: StoredCollection<Session>
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

Loading…
Cancel
Save