Rebrand from MyCrib to Casera

- Rename Kotlin package from com.example.mycrib to com.example.casera
- Update Android app name, namespace, and application ID
- Update iOS bundle identifiers and project settings
- Rename iOS directories (MyCribTests -> CaseraTests, etc.)
- Update deep link schemes from mycrib:// to casera://
- Update app group identifiers
- Update subscription product IDs
- Update all UI strings and branding

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
Trey t
2025-11-28 21:10:38 -06:00
parent 8dbc816a33
commit c6eef720ed
215 changed files with 767 additions and 767 deletions

View File

@@ -95,11 +95,11 @@ kotlin {
} }
android { android {
namespace = "com.example.mycrib" namespace = "com.example.casera"
compileSdk = libs.versions.android.compileSdk.get().toInt() compileSdk = libs.versions.android.compileSdk.get().toInt()
defaultConfig { defaultConfig {
applicationId = "com.example.mycrib" applicationId = "com.example.casera"
minSdk = libs.versions.android.minSdk.get().toInt() minSdk = libs.versions.android.minSdk.get().toInt()
targetSdk = libs.versions.android.targetSdk.get().toInt() targetSdk = libs.versions.android.targetSdk.get().toInt()
versionCode = 1 versionCode = 1
@@ -131,11 +131,11 @@ dependencies {
compose.desktop { compose.desktop {
application { application {
mainClass = "com.example.mycrib.MainKt" mainClass = "com.example.casera.MainKt"
nativeDistributions { nativeDistributions {
targetFormats(TargetFormat.Dmg, TargetFormat.Msi, TargetFormat.Deb) targetFormats(TargetFormat.Dmg, TargetFormat.Msi, TargetFormat.Deb)
packageName = "com.example.mycrib" packageName = "com.example.casera"
packageVersion = "1.0.0" packageVersion = "1.0.0"
} }
} }

View File

@@ -36,7 +36,7 @@
<category android:name="android.intent.category.BROWSABLE" /> <category android:name="android.intent.category.BROWSABLE" />
<data <data
android:scheme="mycrib" android:scheme="casera"
android:host="reset-password" /> android:host="reset-password" />
</intent-filter> </intent-filter>
</activity> </activity>

View File

@@ -1,4 +1,4 @@
package com.example.mycrib.ui.components package com.example.casera.ui.components
import androidx.compose.foundation.background import androidx.compose.foundation.background
import androidx.compose.foundation.layout.* import androidx.compose.foundation.layout.*
@@ -10,8 +10,8 @@ import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.Color
import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import com.example.mycrib.models.TaskSummary import com.example.casera.models.TaskSummary
import com.example.mycrib.models.TaskColumnCategory import com.example.casera.models.TaskColumnCategory
/** /**
* Displays a task summary with dynamic categories from the backend. * Displays a task summary with dynamic categories from the backend.

View File

@@ -1,4 +1,4 @@
package com.example.mycrib package com.example.casera
import android.content.Intent import android.content.Intent
import android.net.Uri import android.net.Uri
@@ -22,14 +22,14 @@ import coil3.memory.MemoryCache
import coil3.request.crossfade import coil3.request.crossfade
import coil3.util.DebugLogger import coil3.util.DebugLogger
import okio.FileSystem import okio.FileSystem
import com.example.mycrib.storage.TokenManager import com.example.casera.storage.TokenManager
import com.example.mycrib.storage.TokenStorage import com.example.casera.storage.TokenStorage
import com.example.mycrib.storage.TaskCacheManager import com.example.casera.storage.TaskCacheManager
import com.example.mycrib.storage.TaskCacheStorage import com.example.casera.storage.TaskCacheStorage
import com.example.mycrib.storage.ThemeStorage import com.example.casera.storage.ThemeStorage
import com.example.mycrib.storage.ThemeStorageManager import com.example.casera.storage.ThemeStorageManager
import com.example.mycrib.ui.theme.ThemeManager import com.example.casera.ui.theme.ThemeManager
import com.example.mycrib.fcm.FCMManager import com.example.casera.fcm.FCMManager
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
class MainActivity : ComponentActivity(), SingletonImageLoader.Factory { class MainActivity : ComponentActivity(), SingletonImageLoader.Factory {
@@ -85,21 +85,21 @@ class MainActivity : ComponentActivity(), SingletonImageLoader.Factory {
try { try {
val authToken = TokenStorage.getToken() val authToken = TokenStorage.getToken()
if (authToken != null) { if (authToken != null) {
val notificationApi = com.example.mycrib.network.NotificationApi() val notificationApi = com.example.casera.network.NotificationApi()
val request = com.example.mycrib.models.DeviceRegistrationRequest( val request = com.example.casera.models.DeviceRegistrationRequest(
registrationId = fcmToken, registrationId = fcmToken,
platform = "android" platform = "android"
) )
when (val result = notificationApi.registerDevice(authToken, request)) { when (val result = notificationApi.registerDevice(authToken, request)) {
is com.example.mycrib.network.ApiResult.Success -> { is com.example.casera.network.ApiResult.Success -> {
Log.d("MainActivity", "Device registered successfully: ${result.data}") Log.d("MainActivity", "Device registered successfully: ${result.data}")
} }
is com.example.mycrib.network.ApiResult.Error -> { is com.example.casera.network.ApiResult.Error -> {
Log.e("MainActivity", "Failed to register device: ${result.message}") Log.e("MainActivity", "Failed to register device: ${result.message}")
} }
is com.example.mycrib.network.ApiResult.Loading, is com.example.casera.network.ApiResult.Loading,
is com.example.mycrib.network.ApiResult.Idle -> { is com.example.casera.network.ApiResult.Idle -> {
// These states shouldn't occur for direct API calls // These states shouldn't occur for direct API calls
} }
} }

View File

@@ -1,4 +1,4 @@
package com.example.mycrib package com.example.casera
import android.app.NotificationChannel import android.app.NotificationChannel
import android.app.NotificationManager import android.app.NotificationManager
@@ -30,23 +30,23 @@ class MyFirebaseMessagingService : FirebaseMessagingService() {
// Note: In a real app, you might want to use WorkManager for reliable delivery // Note: In a real app, you might want to use WorkManager for reliable delivery
CoroutineScope(Dispatchers.IO).launch { CoroutineScope(Dispatchers.IO).launch {
try { try {
val authToken = com.example.mycrib.storage.TokenStorage.getToken() val authToken = com.example.casera.storage.TokenStorage.getToken()
if (authToken != null) { if (authToken != null) {
val notificationApi = com.example.mycrib.network.NotificationApi() val notificationApi = com.example.casera.network.NotificationApi()
val request = com.example.mycrib.models.DeviceRegistrationRequest( val request = com.example.casera.models.DeviceRegistrationRequest(
registrationId = token, registrationId = token,
platform = "android" platform = "android"
) )
when (val result = notificationApi.registerDevice(authToken, request)) { when (val result = notificationApi.registerDevice(authToken, request)) {
is com.example.mycrib.network.ApiResult.Success -> { is com.example.casera.network.ApiResult.Success -> {
Log.d(TAG, "Device registered successfully with new token") Log.d(TAG, "Device registered successfully with new token")
} }
is com.example.mycrib.network.ApiResult.Error -> { is com.example.casera.network.ApiResult.Error -> {
Log.e(TAG, "Failed to register device with new token: ${result.message}") Log.e(TAG, "Failed to register device with new token: ${result.message}")
} }
is com.example.mycrib.network.ApiResult.Loading, is com.example.casera.network.ApiResult.Loading,
is com.example.mycrib.network.ApiResult.Idle -> { is com.example.casera.network.ApiResult.Idle -> {
// These states shouldn't occur for direct API calls // These states shouldn't occur for direct API calls
} }
} }

View File

@@ -1,4 +1,4 @@
package com.example.mycrib package com.example.casera
import android.os.Build import android.os.Build

View File

@@ -1,4 +1,4 @@
package com.example.mycrib.fcm package com.example.casera.fcm
import android.Manifest import android.Manifest
import android.app.Activity import android.app.Activity

View File

@@ -1,4 +1,4 @@
package com.example.mycrib.network package com.example.casera.network
import io.ktor.client.* import io.ktor.client.*
import io.ktor.client.engine.okhttp.* import io.ktor.client.engine.okhttp.*

View File

@@ -1,13 +1,13 @@
package com.example.mycrib.platform package com.example.casera.platform
import android.app.Activity import android.app.Activity
import android.content.Context import android.content.Context
import android.util.Log import android.util.Log
import com.android.billingclient.api.* import com.android.billingclient.api.*
import com.example.mycrib.cache.SubscriptionCache import com.example.casera.cache.SubscriptionCache
import com.example.mycrib.network.APILayer import com.example.casera.network.APILayer
import com.example.mycrib.network.ApiResult import com.example.casera.network.ApiResult
import com.example.mycrib.utils.SubscriptionHelper import com.example.casera.utils.SubscriptionHelper
import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.SupervisorJob import kotlinx.coroutines.SupervisorJob
@@ -36,8 +36,8 @@ class BillingManager private constructor(private val context: Context) {
// Product IDs (must match Google Play Console) // Product IDs (must match Google Play Console)
private val productIDs = listOf( private val productIDs = listOf(
"com.example.mycrib.pro.monthly", "com.example.casera.pro.monthly",
"com.example.mycrib.pro.annual" "com.example.casera.pro.annual"
) )
private val scope = CoroutineScope(SupervisorJob() + Dispatchers.Main) private val scope = CoroutineScope(SupervisorJob() + Dispatchers.Main)
@@ -421,14 +421,14 @@ class BillingManager private constructor(private val context: Context) {
* Get monthly product * Get monthly product
*/ */
fun getMonthlyProduct(): ProductDetails? { fun getMonthlyProduct(): ProductDetails? {
return _products.value.find { it.productId == "com.example.mycrib.pro.monthly" } return _products.value.find { it.productId == "com.example.casera.pro.monthly" }
} }
/** /**
* Get annual product * Get annual product
*/ */
fun getAnnualProduct(): ProductDetails? { fun getAnnualProduct(): ProductDetails? {
return _products.value.find { it.productId == "com.example.mycrib.pro.annual" } return _products.value.find { it.productId == "com.example.casera.pro.annual" }
} }
/** /**

View File

@@ -1,4 +1,4 @@
package com.example.mycrib.platform package com.example.casera.platform
import android.content.Context import android.content.Context
import coil3.ImageLoader import coil3.ImageLoader

View File

@@ -1,4 +1,4 @@
package com.example.mycrib.platform package com.example.casera.platform
import android.content.Context import android.content.Context
import android.net.Uri import android.net.Uri

View File

@@ -1,4 +1,4 @@
package com.example.mycrib.storage package com.example.casera.storage
import android.content.Context import android.content.Context
import android.content.SharedPreferences import android.content.SharedPreferences

View File

@@ -1,4 +1,4 @@
package com.example.mycrib.storage package com.example.casera.storage
internal actual fun getPlatformTaskCacheManager(): TaskCacheManager? { internal actual fun getPlatformTaskCacheManager(): TaskCacheManager? {
// Android requires context, so must use initialize() method // Android requires context, so must use initialize() method

View File

@@ -1,4 +1,4 @@
package com.example.mycrib.storage package com.example.casera.storage
import android.content.Context import android.content.Context
import android.content.SharedPreferences import android.content.SharedPreferences

View File

@@ -1,4 +1,4 @@
package com.example.mycrib.storage package com.example.casera.storage
import android.content.Context import android.content.Context
import android.content.SharedPreferences import android.content.SharedPreferences

View File

@@ -1,4 +1,4 @@
package com.example.mycrib.storage package com.example.casera.storage
internal actual fun getPlatformTokenManager(): TokenManager? { internal actual fun getPlatformTokenManager(): TokenManager? {
// Android requires context, so must use initialize() method // Android requires context, so must use initialize() method

View File

@@ -1,4 +1,4 @@
package com.example.mycrib.ui.subscription package com.example.casera.ui.subscription
import android.app.Activity import android.app.Activity
import androidx.compose.foundation.BorderStroke import androidx.compose.foundation.BorderStroke
@@ -17,9 +17,9 @@ import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import com.android.billingclient.api.ProductDetails import com.android.billingclient.api.ProductDetails
import com.example.mycrib.cache.SubscriptionCache import com.example.casera.cache.SubscriptionCache
import com.example.mycrib.platform.BillingManager import com.example.casera.platform.BillingManager
import com.example.mycrib.ui.theme.AppSpacing import com.example.casera.ui.theme.AppSpacing
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
/** /**

View File

@@ -1,8 +1,8 @@
package com.example.mycrib.util package com.example.casera.util
import android.graphics.Bitmap import android.graphics.Bitmap
import android.graphics.BitmapFactory import android.graphics.BitmapFactory
import com.example.mycrib.platform.ImageData import com.example.casera.platform.ImageData
import java.io.ByteArrayOutputStream import java.io.ByteArrayOutputStream
/** /**

View File

@@ -1,4 +1,4 @@
<resources> <resources>
<string name="app_name">MyCrib</string> <string name="app_name">Casera</string>
<string name="default_notification_channel_id">mycrib_notifications</string> <string name="default_notification_channel_id">casera_notifications</string>
</resources> </resources>

View File

@@ -1,4 +1,4 @@
package com.example.mycrib package com.example.casera
import androidx.compose.animation.AnimatedVisibility import androidx.compose.animation.AnimatedVisibility
import androidx.compose.foundation.Image import androidx.compose.foundation.Image
@@ -16,20 +16,20 @@ import androidx.compose.material3.Text
import androidx.compose.runtime.* import androidx.compose.runtime.*
import androidx.compose.ui.Alignment import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import com.example.mycrib.ui.screens.AddResidenceScreen import com.example.casera.ui.screens.AddResidenceScreen
import com.example.mycrib.ui.screens.EditResidenceScreen import com.example.casera.ui.screens.EditResidenceScreen
import com.example.mycrib.ui.screens.EditTaskScreen import com.example.casera.ui.screens.EditTaskScreen
import com.example.mycrib.ui.screens.ForgotPasswordScreen import com.example.casera.ui.screens.ForgotPasswordScreen
import com.example.mycrib.ui.screens.HomeScreen import com.example.casera.ui.screens.HomeScreen
import com.example.mycrib.ui.screens.LoginScreen import com.example.casera.ui.screens.LoginScreen
import com.example.mycrib.ui.screens.RegisterScreen import com.example.casera.ui.screens.RegisterScreen
import com.example.mycrib.ui.screens.ResetPasswordScreen import com.example.casera.ui.screens.ResetPasswordScreen
import com.example.mycrib.ui.screens.ResidenceDetailScreen import com.example.casera.ui.screens.ResidenceDetailScreen
import com.example.mycrib.ui.screens.ResidencesScreen import com.example.casera.ui.screens.ResidencesScreen
import com.example.mycrib.ui.screens.TasksScreen import com.example.casera.ui.screens.TasksScreen
import com.example.mycrib.ui.screens.VerifyEmailScreen import com.example.casera.ui.screens.VerifyEmailScreen
import com.example.mycrib.ui.screens.VerifyResetCodeScreen import com.example.casera.ui.screens.VerifyResetCodeScreen
import com.example.mycrib.viewmodel.PasswordResetViewModel import com.example.casera.viewmodel.PasswordResetViewModel
import androidx.lifecycle.viewmodel.compose.viewModel import androidx.lifecycle.viewmodel.compose.viewModel
import org.jetbrains.compose.resources.painterResource import org.jetbrains.compose.resources.painterResource
import org.jetbrains.compose.ui.tooling.preview.Preview import org.jetbrains.compose.ui.tooling.preview.Preview
@@ -38,24 +38,24 @@ import androidx.navigation.compose.NavHost
import androidx.navigation.compose.rememberNavController import androidx.navigation.compose.rememberNavController
import androidx.navigation.compose.composable import androidx.navigation.compose.composable
import androidx.navigation.toRoute import androidx.navigation.toRoute
import com.example.mycrib.ui.screens.MainScreen import com.example.casera.ui.screens.MainScreen
import com.example.mycrib.ui.screens.ProfileScreen import com.example.casera.ui.screens.ProfileScreen
import com.example.mycrib.ui.theme.MyCribTheme import com.example.casera.ui.theme.MyCribTheme
import com.example.mycrib.ui.theme.ThemeManager import com.example.casera.ui.theme.ThemeManager
import com.example.mycrib.navigation.* import com.example.casera.navigation.*
import com.example.mycrib.repository.LookupsRepository import com.example.casera.repository.LookupsRepository
import com.example.mycrib.models.Residence import com.example.casera.models.Residence
import com.example.mycrib.models.TaskCategory import com.example.casera.models.TaskCategory
import com.example.mycrib.models.TaskDetail import com.example.casera.models.TaskDetail
import com.example.mycrib.models.TaskFrequency import com.example.casera.models.TaskFrequency
import com.example.mycrib.models.TaskPriority import com.example.casera.models.TaskPriority
import com.example.mycrib.models.TaskStatus import com.example.casera.models.TaskStatus
import com.example.mycrib.network.ApiResult import com.example.casera.network.ApiResult
import com.example.mycrib.network.AuthApi import com.example.casera.network.AuthApi
import com.example.mycrib.storage.TokenStorage import com.example.casera.storage.TokenStorage
import mycrib.composeapp.generated.resources.Res import casera.composeapp.generated.resources.Res
import mycrib.composeapp.generated.resources.compose_multiplatform import casera.composeapp.generated.resources.compose_multiplatform
@Composable @Composable
@Preview @Preview

View File

@@ -1,4 +1,4 @@
package com.example.mycrib package com.example.casera
class Greeting { class Greeting {
private val platform = getPlatform() private val platform = getPlatform()

View File

@@ -1,4 +1,4 @@
//package com.mycrib.android //package com.casera.android
// //
//import android.os.Bundle //import android.os.Bundle
//import androidx.activity.ComponentActivity //import androidx.activity.ComponentActivity
@@ -10,8 +10,8 @@
//import androidx.navigation.compose.NavHost //import androidx.navigation.compose.NavHost
//import androidx.navigation.compose.composable //import androidx.navigation.compose.composable
//import androidx.navigation.compose.rememberNavController //import androidx.navigation.compose.rememberNavController
//import com.example.mycrib.ui.screens.* //import com.example.casera.ui.screens.*
//import com.example.mycrib.ui.theme.MyCribTheme //import com.example.casera.ui.theme.MyCribTheme
// //
//class MainActivity : ComponentActivity() { //class MainActivity : ComponentActivity() {
// override fun onCreate(savedInstanceState: Bundle?) { // override fun onCreate(savedInstanceState: Bundle?) {

View File

@@ -1,4 +1,4 @@
package com.example.mycrib package com.example.casera
interface Platform { interface Platform {
val name: String val name: String

View File

@@ -1,6 +1,6 @@
package com.example.mycrib.cache package com.example.casera.cache
import com.example.mycrib.models.* import com.example.casera.models.*
import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.flow.asStateFlow

View File

@@ -1,7 +1,7 @@
package com.example.mycrib.cache package com.example.casera.cache
import com.example.mycrib.network.* import com.example.casera.network.*
import com.example.mycrib.storage.TokenStorage import com.example.casera.storage.TokenStorage
import kotlinx.coroutines.* import kotlinx.coroutines.*
/** /**

View File

@@ -1,10 +1,10 @@
package com.example.mycrib.cache package com.example.casera.cache
import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.mutableStateOf
import com.example.mycrib.models.FeatureBenefit import com.example.casera.models.FeatureBenefit
import com.example.mycrib.models.Promotion import com.example.casera.models.Promotion
import com.example.mycrib.models.SubscriptionStatus import com.example.casera.models.SubscriptionStatus
import com.example.mycrib.models.UpgradeTriggerData import com.example.casera.models.UpgradeTriggerData
object SubscriptionCache { object SubscriptionCache {
val currentSubscription = mutableStateOf<SubscriptionStatus?>(null) val currentSubscription = mutableStateOf<SubscriptionStatus?>(null)

View File

@@ -1,4 +1,4 @@
package com.example.mycrib.models package com.example.casera.models
import kotlinx.serialization.SerialName import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable import kotlinx.serialization.Serializable

View File

@@ -1,4 +1,4 @@
package com.example.mycrib.models package com.example.casera.models
import kotlinx.serialization.SerialName import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable import kotlinx.serialization.Serializable

View File

@@ -1,4 +1,4 @@
package com.example.mycrib.models package com.example.casera.models
import kotlinx.serialization.SerialName import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable import kotlinx.serialization.Serializable

View File

@@ -1,4 +1,4 @@
package com.example.mycrib.models package com.example.casera.models
import kotlinx.serialization.SerialName import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable import kotlinx.serialization.Serializable

View File

@@ -1,4 +1,4 @@
package com.example.mycrib.models package com.example.casera.models
import kotlinx.serialization.SerialName import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable import kotlinx.serialization.Serializable

View File

@@ -1,4 +1,4 @@
package com.example.mycrib.models package com.example.casera.models
import kotlinx.serialization.SerialName import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable import kotlinx.serialization.Serializable

View File

@@ -1,4 +1,4 @@
package com.example.mycrib.models package com.example.casera.models
import kotlinx.serialization.SerialName import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable import kotlinx.serialization.Serializable

View File

@@ -1,4 +1,4 @@
package com.example.mycrib.models package com.example.casera.models
import kotlinx.serialization.SerialName import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable import kotlinx.serialization.Serializable

View File

@@ -1,4 +1,4 @@
package com.example.mycrib.models package com.example.casera.models
import kotlinx.serialization.SerialName import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable import kotlinx.serialization.Serializable

View File

@@ -1,4 +1,4 @@
package com.example.mycrib.models package com.example.casera.models
import kotlinx.serialization.SerialName import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable import kotlinx.serialization.Serializable

View File

@@ -1,4 +1,4 @@
package com.example.mycrib.navigation package com.example.casera.navigation
import kotlinx.serialization.SerialName import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable import kotlinx.serialization.Serializable

View File

@@ -1,11 +1,11 @@
package com.example.mycrib.network package com.example.casera.network
import com.example.mycrib.cache.DataCache import com.example.casera.cache.DataCache
import com.example.mycrib.cache.DataPrefetchManager import com.example.casera.cache.DataPrefetchManager
import com.example.mycrib.cache.SubscriptionCache import com.example.casera.cache.SubscriptionCache
import com.example.mycrib.models.* import com.example.casera.models.*
import com.example.mycrib.network.* import com.example.casera.network.*
import com.example.mycrib.storage.TokenStorage import com.example.casera.storage.TokenStorage
/** /**
* Unified API Layer that manages all network calls and cache operations. * Unified API Layer that manages all network calls and cache operations.

View File

@@ -1,4 +1,4 @@
package com.example.mycrib.network package com.example.casera.network
import io.ktor.client.* import io.ktor.client.*
import io.ktor.client.plugins.contentnegotiation.* import io.ktor.client.plugins.contentnegotiation.*

View File

@@ -1,4 +1,4 @@
package com.example.mycrib.network package com.example.casera.network
/** /**
* API Environment Configuration * API Environment Configuration

View File

@@ -1,4 +1,4 @@
package com.example.mycrib.network package com.example.casera.network
sealed class ApiResult<out T> { sealed class ApiResult<out T> {
data class Success<T>(val data: T) : ApiResult<T>() data class Success<T>(val data: T) : ApiResult<T>()

View File

@@ -1,6 +1,6 @@
package com.example.mycrib.network package com.example.casera.network
import com.example.mycrib.models.* import com.example.casera.models.*
import io.ktor.client.* import io.ktor.client.*
import io.ktor.client.call.* import io.ktor.client.call.*
import io.ktor.client.request.* import io.ktor.client.request.*

View File

@@ -1,6 +1,6 @@
package com.example.mycrib.network package com.example.casera.network
import com.example.mycrib.models.* import com.example.casera.models.*
import io.ktor.client.* import io.ktor.client.*
import io.ktor.client.call.* import io.ktor.client.call.*
import io.ktor.client.request.* import io.ktor.client.request.*

View File

@@ -1,6 +1,6 @@
package com.example.mycrib.network package com.example.casera.network
import com.example.mycrib.models.* import com.example.casera.models.*
import io.ktor.client.* import io.ktor.client.*
import io.ktor.client.call.* import io.ktor.client.call.*
import io.ktor.client.request.* import io.ktor.client.request.*

View File

@@ -1,6 +1,6 @@
package com.example.mycrib.network package com.example.casera.network
import com.example.mycrib.models.ErrorResponse import com.example.casera.models.ErrorResponse
import io.ktor.client.call.body import io.ktor.client.call.body
import io.ktor.client.statement.HttpResponse import io.ktor.client.statement.HttpResponse
import kotlinx.serialization.json.Json import kotlinx.serialization.json.Json

View File

@@ -1,6 +1,6 @@
package com.example.mycrib.network package com.example.casera.network
import com.example.mycrib.models.* import com.example.casera.models.*
import io.ktor.client.* import io.ktor.client.*
import io.ktor.client.call.* import io.ktor.client.call.*
import io.ktor.client.request.* import io.ktor.client.request.*

View File

@@ -1,6 +1,6 @@
package com.example.mycrib.network package com.example.casera.network
import com.example.mycrib.models.* import com.example.casera.models.*
import io.ktor.client.* import io.ktor.client.*
import io.ktor.client.call.* import io.ktor.client.call.*
import io.ktor.client.request.* import io.ktor.client.request.*

View File

@@ -1,6 +1,6 @@
package com.example.mycrib.network package com.example.casera.network
import com.example.mycrib.models.* import com.example.casera.models.*
import io.ktor.client.* import io.ktor.client.*
import io.ktor.client.call.* import io.ktor.client.call.*
import io.ktor.client.request.* import io.ktor.client.request.*

View File

@@ -1,6 +1,6 @@
package com.example.mycrib.network package com.example.casera.network
import com.example.mycrib.models.* import com.example.casera.models.*
import io.ktor.client.* import io.ktor.client.*
import io.ktor.client.call.* import io.ktor.client.call.*
import io.ktor.client.request.* import io.ktor.client.request.*

View File

@@ -1,6 +1,6 @@
package com.example.mycrib.network package com.example.casera.network
import com.example.mycrib.models.* import com.example.casera.models.*
import io.ktor.client.* import io.ktor.client.*
import io.ktor.client.call.* import io.ktor.client.call.*
import io.ktor.client.request.* import io.ktor.client.request.*

View File

@@ -1,6 +1,6 @@
package com.example.mycrib.network package com.example.casera.network
import com.example.mycrib.models.* import com.example.casera.models.*
import io.ktor.client.* import io.ktor.client.*
import io.ktor.client.call.* import io.ktor.client.call.*
import io.ktor.client.request.* import io.ktor.client.request.*

View File

@@ -1,4 +1,4 @@
package com.example.mycrib.platform package com.example.casera.platform
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable

View File

@@ -1,12 +1,12 @@
package com.example.mycrib.repository package com.example.casera.repository
import com.example.mycrib.cache.SubscriptionCache import com.example.casera.cache.SubscriptionCache
import com.example.mycrib.models.* import com.example.casera.models.*
import com.example.mycrib.network.ApiResult import com.example.casera.network.ApiResult
import com.example.mycrib.network.LookupsApi import com.example.casera.network.LookupsApi
import com.example.mycrib.network.SubscriptionApi import com.example.casera.network.SubscriptionApi
import com.example.mycrib.storage.TokenStorage import com.example.casera.storage.TokenStorage
import com.example.mycrib.storage.TaskCacheStorage import com.example.casera.storage.TaskCacheStorage
import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.MutableStateFlow

View File

@@ -1,4 +1,4 @@
package com.example.mycrib.storage package com.example.casera.storage
/** /**
* Platform-specific task cache manager interface for persistent storage. * Platform-specific task cache manager interface for persistent storage.

View File

@@ -1,6 +1,6 @@
package com.example.mycrib.storage package com.example.casera.storage
import com.example.mycrib.models.CustomTask import com.example.casera.models.CustomTask
import kotlinx.serialization.encodeToString import kotlinx.serialization.encodeToString
import kotlinx.serialization.json.Json import kotlinx.serialization.json.Json
import kotlinx.serialization.decodeFromString import kotlinx.serialization.decodeFromString

View File

@@ -1,4 +1,4 @@
package com.example.mycrib.storage package com.example.casera.storage
/** /**
* Cross-platform theme storage for persisting theme selection. * Cross-platform theme storage for persisting theme selection.

View File

@@ -1,4 +1,4 @@
package com.example.mycrib.storage package com.example.casera.storage
/** /**
* Platform-specific token manager interface for persistent storage. * Platform-specific token manager interface for persistent storage.

View File

@@ -1,4 +1,4 @@
package com.example.mycrib.storage package com.example.casera.storage
/** /**
* Token storage that provides a unified interface for accessing platform-specific * Token storage that provides a unified interface for accessing platform-specific

View File

@@ -1,4 +1,4 @@
package com.example.mycrib.ui.components package com.example.casera.ui.components
import androidx.compose.foundation.layout.* import androidx.compose.foundation.layout.*
import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.rememberScrollState
@@ -13,11 +13,11 @@ import androidx.compose.ui.graphics.Color
import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import androidx.lifecycle.viewmodel.compose.viewModel import androidx.lifecycle.viewmodel.compose.viewModel
import com.example.mycrib.viewmodel.ContractorViewModel import com.example.casera.viewmodel.ContractorViewModel
import com.example.mycrib.models.ContractorCreateRequest import com.example.casera.models.ContractorCreateRequest
import com.example.mycrib.models.ContractorUpdateRequest import com.example.casera.models.ContractorUpdateRequest
import com.example.mycrib.network.ApiResult import com.example.casera.network.ApiResult
import com.example.mycrib.repository.LookupsRepository import com.example.casera.repository.LookupsRepository
@OptIn(ExperimentalMaterial3Api::class) @OptIn(ExperimentalMaterial3Api::class)
@Composable @Composable

View File

@@ -1,7 +1,7 @@
package com.example.mycrib.ui.components package com.example.casera.ui.components
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import com.example.mycrib.models.TaskCreateRequest import com.example.casera.models.TaskCreateRequest
@Composable @Composable
fun AddNewTaskDialog( fun AddNewTaskDialog(

View File

@@ -1,8 +1,8 @@
package com.example.mycrib.ui.components package com.example.casera.ui.components
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import com.example.mycrib.models.MyResidencesResponse import com.example.casera.models.MyResidencesResponse
import com.example.mycrib.models.TaskCreateRequest import com.example.casera.models.TaskCreateRequest
@Composable @Composable
fun AddNewTaskWithResidenceDialog( fun AddNewTaskWithResidenceDialog(

View File

@@ -1,4 +1,4 @@
package com.example.mycrib.ui.components package com.example.casera.ui.components
import androidx.compose.foundation.layout.* import androidx.compose.foundation.layout.*
import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.rememberScrollState
@@ -9,12 +9,12 @@ import androidx.compose.runtime.*
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.text.input.KeyboardType import androidx.compose.ui.text.input.KeyboardType
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import com.example.mycrib.repository.LookupsRepository import com.example.casera.repository.LookupsRepository
import com.example.mycrib.models.MyResidencesResponse import com.example.casera.models.MyResidencesResponse
import com.example.mycrib.models.TaskCategory import com.example.casera.models.TaskCategory
import com.example.mycrib.models.TaskCreateRequest import com.example.casera.models.TaskCreateRequest
import com.example.mycrib.models.TaskFrequency import com.example.casera.models.TaskFrequency
import com.example.mycrib.models.TaskPriority import com.example.casera.models.TaskPriority
@OptIn(ExperimentalMaterial3Api::class) @OptIn(ExperimentalMaterial3Api::class)
@Composable @Composable

View File

@@ -1,4 +1,4 @@
package com.example.mycrib.ui.components package com.example.casera.ui.components
import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxSize
@@ -6,7 +6,7 @@ import androidx.compose.material3.CircularProgressIndicator
import androidx.compose.runtime.* import androidx.compose.runtime.*
import androidx.compose.ui.Alignment import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import com.example.mycrib.network.ApiResult import com.example.casera.network.ApiResult
/** /**
* Handles ApiResult states automatically with loading, error dialogs, and success content. * Handles ApiResult states automatically with loading, error dialogs, and success content.
@@ -127,7 +127,7 @@ fun <T> ApiResult<T>.HandleErrors(
LaunchedEffect(this) { LaunchedEffect(this) {
if (this@HandleErrors is ApiResult.Error) { if (this@HandleErrors is ApiResult.Error) {
errorMessage = com.example.mycrib.util.ErrorMessageParser.parse((this@HandleErrors as ApiResult.Error).message) errorMessage = com.example.casera.util.ErrorMessageParser.parse((this@HandleErrors as ApiResult.Error).message)
showErrorDialog = true showErrorDialog = true
} }
} }

View File

@@ -1,4 +1,4 @@
package com.example.mycrib.ui.components package com.example.casera.ui.components
import androidx.compose.foundation.layout.* import androidx.compose.foundation.layout.*
import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.rememberScrollState
@@ -14,12 +14,12 @@ import androidx.compose.ui.Modifier
import androidx.compose.ui.text.input.KeyboardType import androidx.compose.ui.text.input.KeyboardType
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import androidx.lifecycle.viewmodel.compose.viewModel import androidx.lifecycle.viewmodel.compose.viewModel
import com.example.mycrib.viewmodel.ContractorViewModel import com.example.casera.viewmodel.ContractorViewModel
import com.example.mycrib.models.TaskCompletionCreateRequest import com.example.casera.models.TaskCompletionCreateRequest
import com.example.mycrib.network.ApiResult import com.example.casera.network.ApiResult
import com.example.mycrib.platform.ImageData import com.example.casera.platform.ImageData
import com.example.mycrib.platform.rememberImagePicker import com.example.casera.platform.rememberImagePicker
import com.example.mycrib.platform.rememberCameraPicker import com.example.casera.platform.rememberCameraPicker
import kotlinx.datetime.* import kotlinx.datetime.*
@OptIn(ExperimentalMaterial3Api::class) @OptIn(ExperimentalMaterial3Api::class)

View File

@@ -1,4 +1,4 @@
package com.example.mycrib.ui.components package com.example.casera.ui.components
import androidx.compose.material3.AlertDialog import androidx.compose.material3.AlertDialog
import androidx.compose.material3.Button import androidx.compose.material3.Button

View File

@@ -1,4 +1,4 @@
package com.example.mycrib.ui.components package com.example.casera.ui.components
import androidx.compose.foundation.layout.* import androidx.compose.foundation.layout.*
import androidx.compose.material.icons.Icons import androidx.compose.material.icons.Icons
@@ -9,9 +9,9 @@ import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.text.input.TextFieldValue import androidx.compose.ui.text.input.TextFieldValue
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import com.example.mycrib.network.ApiResult import com.example.casera.network.ApiResult
import com.example.mycrib.network.ResidenceApi import com.example.casera.network.ResidenceApi
import com.example.mycrib.storage.TokenStorage import com.example.casera.storage.TokenStorage
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
@Composable @Composable

View File

@@ -1,4 +1,4 @@
package com.example.mycrib.ui.components package com.example.casera.ui.components
import androidx.compose.foundation.layout.* import androidx.compose.foundation.layout.*
import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.LazyColumn
@@ -12,11 +12,11 @@ import androidx.compose.runtime.*
import androidx.compose.ui.Alignment import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import com.example.mycrib.models.ResidenceUser import com.example.casera.models.ResidenceUser
import com.example.mycrib.models.ResidenceShareCode import com.example.casera.models.ResidenceShareCode
import com.example.mycrib.network.ApiResult import com.example.casera.network.ApiResult
import com.example.mycrib.network.ResidenceApi import com.example.casera.network.ResidenceApi
import com.example.mycrib.storage.TokenStorage import com.example.casera.storage.TokenStorage
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
@Composable @Composable

View File

@@ -1,4 +1,4 @@
package com.example.mycrib.ui.components.auth package com.example.casera.ui.components.auth
import androidx.compose.foundation.layout.* import androidx.compose.foundation.layout.*
import androidx.compose.material3.* import androidx.compose.material3.*

View File

@@ -1,4 +1,4 @@
package com.example.mycrib.ui.components.auth package com.example.casera.ui.components.auth
import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.Spacer

View File

@@ -1,4 +1,4 @@
package com.example.mycrib.ui.components.common package com.example.casera.ui.components.common
import androidx.compose.foundation.layout.* import androidx.compose.foundation.layout.*
import androidx.compose.material3.Card import androidx.compose.material3.Card
@@ -9,9 +9,9 @@ import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.Color
import androidx.compose.ui.unit.Dp import androidx.compose.ui.unit.Dp
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import com.example.mycrib.ui.theme.AppRadius import com.example.casera.ui.theme.AppRadius
import com.example.mycrib.ui.theme.AppSpacing import com.example.casera.ui.theme.AppSpacing
import com.example.mycrib.ui.theme.backgroundSecondary import com.example.casera.ui.theme.backgroundSecondary
/** /**
* CompactCard - Smaller card with reduced padding * CompactCard - Smaller card with reduced padding

View File

@@ -1,4 +1,4 @@
package com.example.mycrib.ui.components.common package com.example.casera.ui.components.common
import androidx.compose.foundation.layout.* import androidx.compose.foundation.layout.*
import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.foundation.shape.RoundedCornerShape

View File

@@ -1,4 +1,4 @@
package com.example.mycrib.ui.components.common package com.example.casera.ui.components.common
import androidx.compose.foundation.layout.* import androidx.compose.foundation.layout.*
import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.foundation.shape.RoundedCornerShape

View File

@@ -1,4 +1,4 @@
package com.example.mycrib.ui.components.common package com.example.casera.ui.components.common
import androidx.compose.foundation.layout.* import androidx.compose.foundation.layout.*
import androidx.compose.material3.Card import androidx.compose.material3.Card
@@ -9,9 +9,9 @@ import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.Color
import androidx.compose.ui.unit.Dp import androidx.compose.ui.unit.Dp
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import com.example.mycrib.ui.theme.AppRadius import com.example.casera.ui.theme.AppRadius
import com.example.mycrib.ui.theme.AppSpacing import com.example.casera.ui.theme.AppSpacing
import com.example.mycrib.ui.theme.backgroundSecondary import com.example.casera.ui.theme.backgroundSecondary
/** /**
* StandardCard - Consistent card component matching iOS design * StandardCard - Consistent card component matching iOS design

View File

@@ -1,4 +1,4 @@
package com.example.mycrib.ui.components.common package com.example.casera.ui.components.common
import androidx.compose.foundation.layout.* import androidx.compose.foundation.layout.*
import androidx.compose.material3.* import androidx.compose.material3.*
@@ -8,7 +8,7 @@ import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.vector.ImageVector import androidx.compose.ui.graphics.vector.ImageVector
import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import com.example.mycrib.ui.theme.AppSpacing import com.example.casera.ui.theme.AppSpacing
/** /**
* StandardEmptyState - Consistent empty state component * StandardEmptyState - Consistent empty state component

View File

@@ -1,4 +1,4 @@
package com.example.mycrib.ui.components.common package com.example.casera.ui.components.common
import androidx.compose.foundation.layout.* import androidx.compose.foundation.layout.*
import androidx.compose.material3.* import androidx.compose.material3.*

View File

@@ -1,4 +1,4 @@
package com.example.mycrib.ui.components.dialogs package com.example.casera.ui.components.dialogs
import androidx.compose.foundation.background import androidx.compose.foundation.background
import androidx.compose.foundation.border import androidx.compose.foundation.border
@@ -20,7 +20,7 @@ import androidx.compose.ui.graphics.Color
import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import androidx.compose.ui.window.Dialog import androidx.compose.ui.window.Dialog
import com.example.mycrib.ui.theme.* import com.example.casera.ui.theme.*
/** /**
* ThemePickerDialog - Shows all available themes in a grid * ThemePickerDialog - Shows all available themes in a grid

View File

@@ -1,4 +1,4 @@
package com.example.mycrib.ui.components.documents package com.example.casera.ui.components.documents
import androidx.compose.foundation.background import androidx.compose.foundation.background
import androidx.compose.foundation.clickable import androidx.compose.foundation.clickable
@@ -14,9 +14,9 @@ import androidx.compose.ui.graphics.Color
import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import com.example.mycrib.models.Document import com.example.casera.models.Document
import com.example.mycrib.models.DocumentCategory import com.example.casera.models.DocumentCategory
import com.example.mycrib.models.DocumentType import com.example.casera.models.DocumentType
@Composable @Composable
fun DocumentCard(document: Document, isWarrantyCard: Boolean = false, onClick: () -> Unit) { fun DocumentCard(document: Document, isWarrantyCard: Boolean = false, onClick: () -> Unit) {

View File

@@ -1,4 +1,4 @@
package com.example.mycrib.ui.components.documents package com.example.casera.ui.components.documents
import androidx.compose.foundation.layout.* import androidx.compose.foundation.layout.*
import androidx.compose.material.icons.Icons import androidx.compose.material.icons.Icons

View File

@@ -1,4 +1,4 @@
package com.example.mycrib.ui.components.documents package com.example.casera.ui.components.documents
import androidx.compose.foundation.layout.* import androidx.compose.foundation.layout.*
import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.LazyColumn
@@ -13,11 +13,11 @@ import androidx.compose.runtime.*
import androidx.compose.ui.Alignment import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import com.example.mycrib.models.Document import com.example.casera.models.Document
import com.example.mycrib.network.ApiResult import com.example.casera.network.ApiResult
import com.example.mycrib.cache.SubscriptionCache import com.example.casera.cache.SubscriptionCache
import com.example.mycrib.ui.subscription.UpgradeFeatureScreen import com.example.casera.ui.subscription.UpgradeFeatureScreen
import com.example.mycrib.utils.SubscriptionHelper import com.example.casera.utils.SubscriptionHelper
@OptIn(ExperimentalMaterial3Api::class) @OptIn(ExperimentalMaterial3Api::class)
@Composable @Composable

View File

@@ -1,11 +1,11 @@
package com.example.mycrib.ui.components.forms package com.example.casera.ui.components.forms
import androidx.compose.foundation.layout.* import androidx.compose.foundation.layout.*
import androidx.compose.material3.MaterialTheme import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Text import androidx.compose.material3.Text
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import com.example.mycrib.ui.theme.AppSpacing import com.example.casera.ui.theme.AppSpacing
/** /**
* FormSection - Groups related form fields with optional header/footer * FormSection - Groups related form fields with optional header/footer

View File

@@ -1,4 +1,4 @@
package com.example.mycrib.ui.components.forms package com.example.casera.ui.components.forms
import androidx.compose.foundation.layout.* import androidx.compose.foundation.layout.*
import androidx.compose.foundation.text.KeyboardActions import androidx.compose.foundation.text.KeyboardActions
@@ -9,7 +9,7 @@ import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.vector.ImageVector import androidx.compose.ui.graphics.vector.ImageVector
import androidx.compose.ui.text.input.VisualTransformation import androidx.compose.ui.text.input.VisualTransformation
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import com.example.mycrib.ui.theme.AppSpacing import com.example.casera.ui.theme.AppSpacing
/** /**
* FormTextField - Standardized text field for forms * FormTextField - Standardized text field for forms

View File

@@ -1,4 +1,4 @@
package com.example.mycrib.ui.components.residence package com.example.casera.ui.components.residence
import androidx.compose.foundation.layout.* import androidx.compose.foundation.layout.*
import androidx.compose.material3.* import androidx.compose.material3.*

View File

@@ -1,4 +1,4 @@
package com.example.mycrib.ui.components.residence package com.example.casera.ui.components.residence
import androidx.compose.foundation.layout.* import androidx.compose.foundation.layout.*
import androidx.compose.material3.* import androidx.compose.material3.*

View File

@@ -1,4 +1,4 @@
package com.example.mycrib.ui.components.residence package com.example.casera.ui.components.residence
import androidx.compose.foundation.layout.* import androidx.compose.foundation.layout.*
import androidx.compose.material3.* import androidx.compose.material3.*

View File

@@ -1,4 +1,4 @@
package com.example.mycrib.ui.components.task package com.example.casera.ui.components.task
import androidx.compose.foundation.layout.* import androidx.compose.foundation.layout.*
import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.LazyColumn
@@ -12,10 +12,10 @@ import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import com.example.mycrib.models.TaskCompletionResponse import com.example.casera.models.TaskCompletionResponse
import com.example.mycrib.models.TaskCompletion import com.example.casera.models.TaskCompletion
import com.example.mycrib.network.ApiResult import com.example.casera.network.ApiResult
import com.example.mycrib.network.APILayer import com.example.casera.network.APILayer
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
/** /**

View File

@@ -1,4 +1,4 @@
package com.example.mycrib.ui.components.task package com.example.casera.ui.components.task
import androidx.compose.foundation.background import androidx.compose.foundation.background
import androidx.compose.foundation.layout.* import androidx.compose.foundation.layout.*
@@ -23,8 +23,8 @@ import coil3.compose.AsyncImage
import coil3.compose.AsyncImagePainter import coil3.compose.AsyncImagePainter
import coil3.compose.SubcomposeAsyncImage import coil3.compose.SubcomposeAsyncImage
import coil3.compose.SubcomposeAsyncImageContent import coil3.compose.SubcomposeAsyncImageContent
import com.example.mycrib.models.TaskCompletionImage import com.example.casera.models.TaskCompletionImage
import com.example.mycrib.network.ApiClient import com.example.casera.network.ApiClient
@Composable @Composable
fun PhotoViewerDialog( fun PhotoViewerDialog(

View File

@@ -1,4 +1,4 @@
package com.example.mycrib.ui.components.task package com.example.casera.ui.components.task
import androidx.compose.foundation.layout.* import androidx.compose.foundation.layout.*
import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.foundation.shape.RoundedCornerShape

View File

@@ -1,4 +1,4 @@
package com.example.mycrib.ui.components.task package com.example.casera.ui.components.task
import androidx.compose.foundation.layout.* import androidx.compose.foundation.layout.*
import androidx.compose.material.icons.Icons import androidx.compose.material.icons.Icons
@@ -8,7 +8,7 @@ import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import androidx.lifecycle.viewmodel.compose.viewModel import androidx.lifecycle.viewmodel.compose.viewModel
import com.example.mycrib.viewmodel.TaskViewModel import com.example.casera.viewmodel.TaskViewModel
// MARK: - Edit Task Button // MARK: - Edit Task Button
@Composable @Composable

View File

@@ -1,4 +1,4 @@
package com.example.mycrib.ui.components.task package com.example.casera.ui.components.task
import androidx.compose.foundation.background import androidx.compose.foundation.background
import androidx.compose.foundation.layout.* import androidx.compose.foundation.layout.*
@@ -14,12 +14,12 @@ import androidx.compose.ui.draw.clip
import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.Color
import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import com.example.mycrib.models.TaskDetail import com.example.casera.models.TaskDetail
import com.example.mycrib.models.TaskCategory import com.example.casera.models.TaskCategory
import com.example.mycrib.models.TaskPriority import com.example.casera.models.TaskPriority
import com.example.mycrib.models.TaskFrequency import com.example.casera.models.TaskFrequency
import com.example.mycrib.models.TaskStatus import com.example.casera.models.TaskStatus
import com.example.mycrib.models.TaskCompletion import com.example.casera.models.TaskCompletion
import org.jetbrains.compose.ui.tooling.preview.Preview import org.jetbrains.compose.ui.tooling.preview.Preview
@Composable @Composable

View File

@@ -1,4 +1,4 @@
package com.example.mycrib.ui.components.task package com.example.casera.ui.components.task
import androidx.compose.foundation.ExperimentalFoundationApi import androidx.compose.foundation.ExperimentalFoundationApi
import androidx.compose.foundation.background import androidx.compose.foundation.background
@@ -19,8 +19,8 @@ import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.vector.ImageVector import androidx.compose.ui.graphics.vector.ImageVector
import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import com.example.mycrib.models.TaskColumn import com.example.casera.models.TaskColumn
import com.example.mycrib.models.TaskDetail import com.example.casera.models.TaskDetail
@OptIn(ExperimentalFoundationApi::class) @OptIn(ExperimentalFoundationApi::class)
@Composable @Composable

View File

@@ -1,4 +1,4 @@
package com.example.mycrib.ui.components.task package com.example.casera.ui.components.task
import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Row

View File

@@ -1,9 +1,9 @@
package com.example.mycrib.ui.screens package com.example.casera.ui.screens
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.lifecycle.viewmodel.compose.viewModel import androidx.lifecycle.viewmodel.compose.viewModel
import com.example.mycrib.viewmodel.DocumentViewModel import com.example.casera.viewmodel.DocumentViewModel
import com.example.mycrib.viewmodel.ResidenceViewModel import com.example.casera.viewmodel.ResidenceViewModel
@Composable @Composable
fun AddDocumentScreen( fun AddDocumentScreen(

View File

@@ -1,8 +1,8 @@
package com.example.mycrib.ui.screens package com.example.casera.ui.screens
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.lifecycle.viewmodel.compose.viewModel import androidx.lifecycle.viewmodel.compose.viewModel
import com.example.mycrib.viewmodel.ResidenceViewModel import com.example.casera.viewmodel.ResidenceViewModel
@Composable @Composable
fun AddResidenceScreen( fun AddResidenceScreen(

View File

@@ -1,4 +1,4 @@
package com.example.mycrib.ui.screens package com.example.casera.ui.screens
import androidx.compose.foundation.clickable import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.* import androidx.compose.foundation.layout.*
@@ -12,17 +12,17 @@ import androidx.compose.ui.Modifier
import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import androidx.lifecycle.viewmodel.compose.viewModel import androidx.lifecycle.viewmodel.compose.viewModel
import com.example.mycrib.ui.components.AddNewTaskWithResidenceDialog import com.example.casera.ui.components.AddNewTaskWithResidenceDialog
import com.example.mycrib.ui.components.ApiResultHandler import com.example.casera.ui.components.ApiResultHandler
import com.example.mycrib.ui.components.CompleteTaskDialog import com.example.casera.ui.components.CompleteTaskDialog
import com.example.mycrib.ui.components.HandleErrors import com.example.casera.ui.components.HandleErrors
import com.example.mycrib.ui.components.task.TaskCard import com.example.casera.ui.components.task.TaskCard
import com.example.mycrib.ui.components.task.DynamicTaskKanbanView import com.example.casera.ui.components.task.DynamicTaskKanbanView
import com.example.mycrib.viewmodel.ResidenceViewModel import com.example.casera.viewmodel.ResidenceViewModel
import com.example.mycrib.viewmodel.TaskCompletionViewModel import com.example.casera.viewmodel.TaskCompletionViewModel
import com.example.mycrib.viewmodel.TaskViewModel import com.example.casera.viewmodel.TaskViewModel
import com.example.mycrib.models.TaskDetail import com.example.casera.models.TaskDetail
import com.example.mycrib.network.ApiResult import com.example.casera.network.ApiResult
@OptIn(ExperimentalMaterial3Api::class) @OptIn(ExperimentalMaterial3Api::class)
@Composable @Composable
@@ -265,7 +265,7 @@ fun AllTasksScreen(
}, },
isLoading = createTaskState is ApiResult.Loading, isLoading = createTaskState is ApiResult.Loading,
errorMessage = if (createTaskState is ApiResult.Error) { errorMessage = if (createTaskState is ApiResult.Error) {
com.example.mycrib.util.ErrorMessageParser.parse((createTaskState as ApiResult.Error).message) com.example.casera.util.ErrorMessageParser.parse((createTaskState as ApiResult.Error).message)
} else null } else null
) )
} }

View File

@@ -1,4 +1,4 @@
package com.example.mycrib.ui.screens package com.example.casera.ui.screens
import androidx.compose.foundation.background import androidx.compose.foundation.background
import androidx.compose.foundation.layout.* import androidx.compose.foundation.layout.*
@@ -17,11 +17,11 @@ import androidx.compose.ui.graphics.Color
import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import androidx.lifecycle.viewmodel.compose.viewModel import androidx.lifecycle.viewmodel.compose.viewModel
import com.example.mycrib.ui.components.AddContractorDialog import com.example.casera.ui.components.AddContractorDialog
import com.example.mycrib.ui.components.ApiResultHandler import com.example.casera.ui.components.ApiResultHandler
import com.example.mycrib.ui.components.HandleErrors import com.example.casera.ui.components.HandleErrors
import com.example.mycrib.viewmodel.ContractorViewModel import com.example.casera.viewmodel.ContractorViewModel
import com.example.mycrib.network.ApiResult import com.example.casera.network.ApiResult
@OptIn(ExperimentalMaterial3Api::class) @OptIn(ExperimentalMaterial3Api::class)
@Composable @Composable

View File

@@ -1,4 +1,4 @@
package com.example.mycrib.ui.screens package com.example.casera.ui.screens
import androidx.compose.foundation.background import androidx.compose.foundation.background
import androidx.compose.foundation.clickable import androidx.compose.foundation.clickable
@@ -20,15 +20,15 @@ import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import androidx.lifecycle.viewmodel.compose.viewModel import androidx.lifecycle.viewmodel.compose.viewModel
import com.example.mycrib.ui.components.AddContractorDialog import com.example.casera.ui.components.AddContractorDialog
import com.example.mycrib.ui.components.ApiResultHandler import com.example.casera.ui.components.ApiResultHandler
import com.example.mycrib.ui.components.HandleErrors import com.example.casera.ui.components.HandleErrors
import com.example.mycrib.viewmodel.ContractorViewModel import com.example.casera.viewmodel.ContractorViewModel
import com.example.mycrib.models.ContractorSummary import com.example.casera.models.ContractorSummary
import com.example.mycrib.network.ApiResult import com.example.casera.network.ApiResult
import com.example.mycrib.repository.LookupsRepository import com.example.casera.repository.LookupsRepository
import com.example.mycrib.ui.subscription.UpgradeFeatureScreen import com.example.casera.ui.subscription.UpgradeFeatureScreen
import com.example.mycrib.utils.SubscriptionHelper import com.example.casera.utils.SubscriptionHelper
@OptIn(ExperimentalMaterial3Api::class) @OptIn(ExperimentalMaterial3Api::class)
@Composable @Composable

View File

@@ -1,4 +1,4 @@
package com.example.mycrib.ui.screens package com.example.casera.ui.screens
import androidx.compose.foundation.background import androidx.compose.foundation.background
import androidx.compose.foundation.clickable import androidx.compose.foundation.clickable
@@ -16,17 +16,17 @@ import androidx.compose.ui.graphics.Color
import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import androidx.lifecycle.viewmodel.compose.viewModel import androidx.lifecycle.viewmodel.compose.viewModel
import com.example.mycrib.ui.components.ApiResultHandler import com.example.casera.ui.components.ApiResultHandler
import com.example.mycrib.ui.components.HandleErrors import com.example.casera.ui.components.HandleErrors
import com.example.mycrib.viewmodel.DocumentViewModel import com.example.casera.viewmodel.DocumentViewModel
import com.example.mycrib.models.* import com.example.casera.models.*
import com.example.mycrib.network.ApiResult import com.example.casera.network.ApiResult
import androidx.compose.foundation.Image import androidx.compose.foundation.Image
import coil3.compose.AsyncImage import coil3.compose.AsyncImage
import coil3.compose.rememberAsyncImagePainter import coil3.compose.rememberAsyncImagePainter
import androidx.compose.ui.window.Dialog import androidx.compose.ui.window.Dialog
import com.example.mycrib.ui.components.documents.ErrorState import com.example.casera.ui.components.documents.ErrorState
import com.example.mycrib.ui.components.documents.formatFileSize import com.example.casera.ui.components.documents.formatFileSize
import androidx.compose.ui.window.DialogProperties import androidx.compose.ui.window.DialogProperties
import androidx.compose.foundation.lazy.grid.GridCells import androidx.compose.foundation.lazy.grid.GridCells
import androidx.compose.foundation.lazy.grid.LazyVerticalGrid import androidx.compose.foundation.lazy.grid.LazyVerticalGrid

View File

@@ -1,4 +1,4 @@
package com.example.mycrib.ui.screens package com.example.casera.ui.screens
import androidx.compose.foundation.border import androidx.compose.foundation.border
import androidx.compose.foundation.layout.* import androidx.compose.foundation.layout.*
@@ -18,13 +18,13 @@ import androidx.compose.ui.text.input.KeyboardType
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import androidx.lifecycle.viewmodel.compose.viewModel import androidx.lifecycle.viewmodel.compose.viewModel
import coil3.compose.AsyncImage import coil3.compose.AsyncImage
import com.example.mycrib.viewmodel.DocumentViewModel import com.example.casera.viewmodel.DocumentViewModel
import com.example.mycrib.viewmodel.ResidenceViewModel import com.example.casera.viewmodel.ResidenceViewModel
import com.example.mycrib.models.* import com.example.casera.models.*
import com.example.mycrib.network.ApiResult import com.example.casera.network.ApiResult
import com.example.mycrib.platform.ImageData import com.example.casera.platform.ImageData
import com.example.mycrib.platform.rememberImagePicker import com.example.casera.platform.rememberImagePicker
import com.example.mycrib.platform.rememberCameraPicker import com.example.casera.platform.rememberCameraPicker
@OptIn(ExperimentalMaterial3Api::class) @OptIn(ExperimentalMaterial3Api::class)
@Composable @Composable
@@ -239,7 +239,7 @@ fun DocumentFormScreen(
} }
is ApiResult.Error -> { is ApiResult.Error -> {
Text( Text(
"Failed to load residences: ${com.example.mycrib.util.ErrorMessageParser.parse((residencesState as ApiResult.Error).message)}", "Failed to load residences: ${com.example.casera.util.ErrorMessageParser.parse((residencesState as ApiResult.Error).message)}",
color = MaterialTheme.colorScheme.error color = MaterialTheme.colorScheme.error
) )
} }
@@ -596,7 +596,7 @@ fun DocumentFormScreen(
) )
) { ) {
Text( Text(
com.example.mycrib.util.ErrorMessageParser.parse((operationState as ApiResult.Error).message), com.example.casera.util.ErrorMessageParser.parse((operationState as ApiResult.Error).message),
modifier = Modifier.padding(12.dp), modifier = Modifier.padding(12.dp),
color = MaterialTheme.colorScheme.onErrorContainer color = MaterialTheme.colorScheme.onErrorContainer
) )

View File

@@ -1,4 +1,4 @@
package com.example.mycrib.ui.screens package com.example.casera.ui.screens
import androidx.compose.foundation.layout.* import androidx.compose.foundation.layout.*
import androidx.compose.material.icons.Icons import androidx.compose.material.icons.Icons
@@ -11,11 +11,11 @@ import androidx.compose.ui.graphics.Color
import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import androidx.lifecycle.viewmodel.compose.viewModel import androidx.lifecycle.viewmodel.compose.viewModel
import com.example.mycrib.ui.components.documents.DocumentsTabContent import com.example.casera.ui.components.documents.DocumentsTabContent
import com.example.mycrib.ui.subscription.UpgradeFeatureScreen import com.example.casera.ui.subscription.UpgradeFeatureScreen
import com.example.mycrib.utils.SubscriptionHelper import com.example.casera.utils.SubscriptionHelper
import com.example.mycrib.viewmodel.DocumentViewModel import com.example.casera.viewmodel.DocumentViewModel
import com.example.mycrib.models.* import com.example.casera.models.*
enum class DocumentTab { enum class DocumentTab {
WARRANTIES, DOCUMENTS WARRANTIES, DOCUMENTS
@@ -36,7 +36,7 @@ fun DocumentsScreen(
// Check if screen should be blocked (limit=0) // Check if screen should be blocked (limit=0)
val isBlocked = SubscriptionHelper.isDocumentsBlocked() val isBlocked = SubscriptionHelper.isDocumentsBlocked()
// Get current count for checking when adding // Get current count for checking when adding
val currentCount = (documentsState as? com.example.mycrib.network.ApiResult.Success)?.data?.size ?: 0 val currentCount = (documentsState as? com.example.casera.network.ApiResult.Success)?.data?.size ?: 0
var selectedCategory by remember { mutableStateOf<String?>(null) } var selectedCategory by remember { mutableStateOf<String?>(null) }
var selectedDocType by remember { mutableStateOf<String?>(null) } var selectedDocType by remember { mutableStateOf<String?>(null) }

Some files were not shown because too many files have changed in this diff Show More