diff --git a/composeApp/src/androidMain/kotlin/com/example/mycrib/storage/TaskCacheStorage.android.kt b/composeApp/src/androidMain/kotlin/com/example/mycrib/storage/TaskCacheStorage.android.kt new file mode 100644 index 0000000..2206bfd --- /dev/null +++ b/composeApp/src/androidMain/kotlin/com/example/mycrib/storage/TaskCacheStorage.android.kt @@ -0,0 +1,6 @@ +package com.mycrib.storage + +internal actual fun getPlatformTaskCacheManager(): TaskCacheManager? { + // Android requires context, so must use initialize() method + return null +} diff --git a/composeApp/src/androidMain/kotlin/com/example/mycrib/storage/TokenStorage.android.kt b/composeApp/src/androidMain/kotlin/com/example/mycrib/storage/TokenStorage.android.kt new file mode 100644 index 0000000..529a053 --- /dev/null +++ b/composeApp/src/androidMain/kotlin/com/example/mycrib/storage/TokenStorage.android.kt @@ -0,0 +1,6 @@ +package com.mycrib.storage + +internal actual fun getPlatformTokenManager(): TokenManager? { + // Android requires context, so must use initialize() method + return null +} diff --git a/composeApp/src/commonMain/kotlin/com/example/mycrib/storage/TaskCacheStorage.kt b/composeApp/src/commonMain/kotlin/com/example/mycrib/storage/TaskCacheStorage.kt index 7785fd6..5d5c8ab 100644 --- a/composeApp/src/commonMain/kotlin/com/example/mycrib/storage/TaskCacheStorage.kt +++ b/composeApp/src/commonMain/kotlin/com/example/mycrib/storage/TaskCacheStorage.kt @@ -21,7 +21,14 @@ object TaskCacheStorage { cacheManager = manager } + private fun ensureInitialized() { + if (cacheManager == null) { + cacheManager = getPlatformTaskCacheManager() + } + } + fun saveTasks(tasks: List) { + ensureInitialized() try { val tasksJson = json.encodeToString(tasks) cacheManager?.saveTasks(tasksJson) @@ -31,6 +38,7 @@ object TaskCacheStorage { } fun getTasks(): List? { + ensureInitialized() return try { val tasksJson = cacheManager?.getTasks() if (tasksJson != null) { @@ -45,6 +53,14 @@ object TaskCacheStorage { } fun clearTasks() { + ensureInitialized() cacheManager?.clearTasks() } } + +/** + * Platform-specific function to get the default TaskCacheManager instance. + * For platforms that don't require context (web, iOS, JVM), returns singleton. + * For Android, must be initialized via initialize() method before use. + */ +internal expect fun getPlatformTaskCacheManager(): TaskCacheManager? diff --git a/composeApp/src/commonMain/kotlin/com/example/mycrib/storage/TokenStorage.kt b/composeApp/src/commonMain/kotlin/com/example/mycrib/storage/TokenStorage.kt index 07f21bb..734d256 100644 --- a/composeApp/src/commonMain/kotlin/com/example/mycrib/storage/TokenStorage.kt +++ b/composeApp/src/commonMain/kotlin/com/example/mycrib/storage/TokenStorage.kt @@ -18,12 +18,21 @@ object TokenStorage { cachedToken = manager.getToken() } + private fun ensureInitialized() { + if (tokenManager == null) { + tokenManager = getPlatformTokenManager() + cachedToken = tokenManager?.getToken() + } + } + fun saveToken(token: String) { + ensureInitialized() cachedToken = token tokenManager?.saveToken(token) } fun getToken(): String? { + ensureInitialized() // Return cached token if available, otherwise try to load from storage if (cachedToken == null) { cachedToken = tokenManager?.getToken() @@ -32,9 +41,17 @@ object TokenStorage { } fun clearToken() { + ensureInitialized() cachedToken = null tokenManager?.clearToken() } fun hasToken(): Boolean = getToken() != null } + +/** + * Platform-specific function to get the default TokenManager instance. + * For platforms that don't require context (web, iOS, JVM), returns singleton. + * For Android, must be initialized via initialize() method before use. + */ +internal expect fun getPlatformTokenManager(): TokenManager? diff --git a/composeApp/src/iosMain/kotlin/com/example/mycrib/storage/TaskCacheStorage.ios.kt b/composeApp/src/iosMain/kotlin/com/example/mycrib/storage/TaskCacheStorage.ios.kt new file mode 100644 index 0000000..bf81286 --- /dev/null +++ b/composeApp/src/iosMain/kotlin/com/example/mycrib/storage/TaskCacheStorage.ios.kt @@ -0,0 +1,5 @@ +package com.mycrib.storage + +internal actual fun getPlatformTaskCacheManager(): TaskCacheManager? { + return TaskCacheManager.getInstance() +} diff --git a/composeApp/src/iosMain/kotlin/com/example/mycrib/storage/TokenStorage.ios.kt b/composeApp/src/iosMain/kotlin/com/example/mycrib/storage/TokenStorage.ios.kt new file mode 100644 index 0000000..c7e942d --- /dev/null +++ b/composeApp/src/iosMain/kotlin/com/example/mycrib/storage/TokenStorage.ios.kt @@ -0,0 +1,5 @@ +package com.mycrib.storage + +internal actual fun getPlatformTokenManager(): TokenManager? { + return TokenManager.getInstance() +} diff --git a/composeApp/src/jvmMain/kotlin/com/example/mycrib/storage/TaskCacheStorage.jvm.kt b/composeApp/src/jvmMain/kotlin/com/example/mycrib/storage/TaskCacheStorage.jvm.kt new file mode 100644 index 0000000..bf81286 --- /dev/null +++ b/composeApp/src/jvmMain/kotlin/com/example/mycrib/storage/TaskCacheStorage.jvm.kt @@ -0,0 +1,5 @@ +package com.mycrib.storage + +internal actual fun getPlatformTaskCacheManager(): TaskCacheManager? { + return TaskCacheManager.getInstance() +} diff --git a/composeApp/src/jvmMain/kotlin/com/example/mycrib/storage/TokenStorage.jvm.kt b/composeApp/src/jvmMain/kotlin/com/example/mycrib/storage/TokenStorage.jvm.kt new file mode 100644 index 0000000..c7e942d --- /dev/null +++ b/composeApp/src/jvmMain/kotlin/com/example/mycrib/storage/TokenStorage.jvm.kt @@ -0,0 +1,5 @@ +package com.mycrib.storage + +internal actual fun getPlatformTokenManager(): TokenManager? { + return TokenManager.getInstance() +} diff --git a/composeApp/src/wasmJsMain/kotlin/com/example/mycrib/storage/TaskCacheManager.wasmJs.kt b/composeApp/src/wasmJsMain/kotlin/com/example/mycrib/storage/TaskCacheManager.wasmJs.kt new file mode 100644 index 0000000..02213a8 --- /dev/null +++ b/composeApp/src/wasmJsMain/kotlin/com/example/mycrib/storage/TaskCacheManager.wasmJs.kt @@ -0,0 +1,33 @@ +package com.mycrib.storage + +import kotlinx.browser.localStorage + +/** + * WASM implementation of TaskCacheManager using browser's localStorage. + */ +actual class TaskCacheManager { + actual fun saveTasks(tasksJson: String) { + localStorage.setItem(KEY_TASKS, tasksJson) + } + + actual fun getTasks(): String? { + return localStorage.getItem(KEY_TASKS) + } + + actual fun clearTasks() { + localStorage.removeItem(KEY_TASKS) + } + + companion object { + private const val KEY_TASKS = "cached_tasks" + + private var instance: TaskCacheManager? = null + + fun getInstance(): TaskCacheManager { + if (instance == null) { + instance = TaskCacheManager() + } + return instance!! + } + } +} diff --git a/composeApp/src/wasmJsMain/kotlin/com/example/mycrib/storage/TaskCacheStorage.wasmJs.kt b/composeApp/src/wasmJsMain/kotlin/com/example/mycrib/storage/TaskCacheStorage.wasmJs.kt new file mode 100644 index 0000000..bf81286 --- /dev/null +++ b/composeApp/src/wasmJsMain/kotlin/com/example/mycrib/storage/TaskCacheStorage.wasmJs.kt @@ -0,0 +1,5 @@ +package com.mycrib.storage + +internal actual fun getPlatformTaskCacheManager(): TaskCacheManager? { + return TaskCacheManager.getInstance() +} diff --git a/composeApp/src/wasmJsMain/kotlin/com/example/mycrib/storage/TokenManager.wasmJs.kt b/composeApp/src/wasmJsMain/kotlin/com/example/mycrib/storage/TokenManager.wasmJs.kt new file mode 100644 index 0000000..d0b86a9 --- /dev/null +++ b/composeApp/src/wasmJsMain/kotlin/com/example/mycrib/storage/TokenManager.wasmJs.kt @@ -0,0 +1,33 @@ +package com.mycrib.storage + +import kotlinx.browser.localStorage + +/** + * WASM implementation of TokenManager using browser's localStorage. + */ +actual class TokenManager { + actual fun saveToken(token: String) { + localStorage.setItem(KEY_TOKEN, token) + } + + actual fun getToken(): String? { + return localStorage.getItem(KEY_TOKEN) + } + + actual fun clearToken() { + localStorage.removeItem(KEY_TOKEN) + } + + companion object { + private const val KEY_TOKEN = "auth_token" + + private var instance: TokenManager? = null + + fun getInstance(): TokenManager { + if (instance == null) { + instance = TokenManager() + } + return instance!! + } + } +} diff --git a/composeApp/src/wasmJsMain/kotlin/com/example/mycrib/storage/TokenStorage.wasmJs.kt b/composeApp/src/wasmJsMain/kotlin/com/example/mycrib/storage/TokenStorage.wasmJs.kt new file mode 100644 index 0000000..c7e942d --- /dev/null +++ b/composeApp/src/wasmJsMain/kotlin/com/example/mycrib/storage/TokenStorage.wasmJs.kt @@ -0,0 +1,5 @@ +package com.mycrib.storage + +internal actual fun getPlatformTokenManager(): TokenManager? { + return TokenManager.getInstance() +}