name refactor

This commit is contained in:
2026-05-25 23:23:27 -04:00
parent 8ac2ce5273
commit aacb800f4a
98 changed files with 605 additions and 464 deletions

View File

@@ -284,8 +284,8 @@ kordant/
| Document | Location |
|----------|----------|
| Product Plan | `plans/SHIELDAI-product-plan.md` |
| Technical Architecture | `plans/SHIELDAI-technical-architecture.md` |
| Product Plan | `plans/Kordant-product-plan.md` |
| Technical Architecture | `plans/Kordant-technical-architecture.md` |
| Infrastructure | `infra/README.md` |
| Rollback Runbook | `infra/ROLLBACK.md` |
| Stripe Integration | `docs/STRIPE_INTEGRATION.md` |

View File

@@ -1,11 +1,11 @@
package com.shieldai.android
package com.kordant.android
import android.os.Bundle
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.activity.enableEdgeToEdge
import com.shieldai.android.navigation.AppNavigation
import com.shieldai.android.ui.theme.KordantTheme
import com.kordant.android.navigation.AppNavigation
import com.kordant.android.ui.theme.KordantTheme
class MainActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {

View File

@@ -1,8 +1,8 @@
package com.shieldai.android
package com.kordant.android
import android.app.Application
import com.shieldai.android.data.repository.AuthRepository
import com.shieldai.android.data.repository.AuthRepositoryImpl
import com.kordant.android.data.repository.AuthRepository
import com.kordant.android.data.repository.AuthRepositoryImpl
class KordantApp : Application() {
lateinit var authRepository: AuthRepository

View File

@@ -1,4 +1,4 @@
package com.shieldai.android.data.local
package com.kordant.android.data.local
import android.content.Context
import kotlinx.serialization.Serializable

View File

@@ -1,4 +1,4 @@
package com.shieldai.android.data.model
package com.kordant.android.data.model
import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable

View File

@@ -1,4 +1,4 @@
package com.shieldai.android.data.model
package com.kordant.android.data.model
import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable

View File

@@ -1,4 +1,4 @@
package com.shieldai.android.data.model
package com.kordant.android.data.model
import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable

View File

@@ -1,4 +1,4 @@
package com.shieldai.android.data.model
package com.kordant.android.data.model
import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable

View File

@@ -1,4 +1,4 @@
package com.shieldai.android.data.model
package com.kordant.android.data.model
import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable

View File

@@ -1,4 +1,4 @@
package com.shieldai.android.data.model
package com.kordant.android.data.model
import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable

View File

@@ -1,4 +1,4 @@
package com.shieldai.android.data.model
package com.kordant.android.data.model
import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable

View File

@@ -1,4 +1,4 @@
package com.shieldai.android.data.model
package com.kordant.android.data.model
import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable

View File

@@ -1,4 +1,4 @@
package com.shieldai.android.data.model
package com.kordant.android.data.model
import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable

View File

@@ -1,4 +1,4 @@
package com.shieldai.android.data.model
package com.kordant.android.data.model
import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable

View File

@@ -1,4 +1,4 @@
package com.shieldai.android.data.model
package com.kordant.android.data.model
import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable

View File

@@ -1,4 +1,4 @@
package com.shieldai.android.data.remote
package com.kordant.android.data.remote
import android.content.Context
import android.content.SharedPreferences
@@ -11,7 +11,7 @@ class AuthInterceptor(context: Context) : Interceptor {
private val securePrefs: SharedPreferences = EncryptedSharedPreferences.create(
context,
"shieldai_auth_prefs",
"kordant_auth_prefs",
MasterKey.Builder(context).setKeyScheme(MasterKey.KeyScheme.AES256_GCM).build(),
EncryptedSharedPreferences.PrefKeyEncryptionScheme.AES256_SIV,
EncryptedSharedPreferences.PrefValueEncryptionScheme.AES256_GCM,

View File

@@ -1,4 +1,4 @@
package com.shieldai.android.data.remote
package com.kordant.android.data.remote
import kotlinx.coroutines.delay
import kotlin.math.min

View File

@@ -1,16 +1,16 @@
package com.shieldai.android.data.remote
package com.kordant.android.data.remote
import com.shieldai.android.data.model.Alert
import com.shieldai.android.data.model.BrokerListing
import com.shieldai.android.data.model.Exposure
import com.shieldai.android.data.model.Property
import com.shieldai.android.data.model.RemovalRequest
import com.shieldai.android.data.model.SpamRule
import com.shieldai.android.data.model.Subscription
import com.shieldai.android.data.model.User
import com.shieldai.android.data.model.VoiceAnalysis
import com.shieldai.android.data.model.VoiceEnrollment
import com.shieldai.android.data.model.WatchlistItem
import com.kordant.android.data.model.Alert
import com.kordant.android.data.model.BrokerListing
import com.kordant.android.data.model.Exposure
import com.kordant.android.data.model.Property
import com.kordant.android.data.model.RemovalRequest
import com.kordant.android.data.model.SpamRule
import com.kordant.android.data.model.Subscription
import com.kordant.android.data.model.User
import com.kordant.android.data.model.VoiceAnalysis
import com.kordant.android.data.model.VoiceEnrollment
import com.kordant.android.data.model.WatchlistItem
import kotlinx.serialization.json.JsonObject
import retrofit2.http.Body
import retrofit2.http.POST

View File

@@ -1,4 +1,4 @@
package com.shieldai.android.data.remote
package com.kordant.android.data.remote
import kotlinx.serialization.Serializable
import kotlinx.serialization.json.JsonElement

View File

@@ -1,12 +1,12 @@
package com.shieldai.android.data.repository
package com.kordant.android.data.repository
import android.content.Context
import com.shieldai.android.data.local.CacheManager
import com.shieldai.android.data.model.Alert
import com.shieldai.android.data.remote.ApiResult
import com.shieldai.android.data.remote.ErrorHandler
import com.shieldai.android.data.remote.TRPCApiService
import com.shieldai.android.data.remote.TRPCRequest
import com.kordant.android.data.local.CacheManager
import com.kordant.android.data.model.Alert
import com.kordant.android.data.remote.ApiResult
import com.kordant.android.data.remote.ErrorHandler
import com.kordant.android.data.remote.TRPCApiService
import com.kordant.android.data.remote.TRPCRequest
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.serialization.json.buildJsonObject

View File

@@ -1,4 +1,4 @@
package com.shieldai.android.data.repository
package com.kordant.android.data.repository
import android.content.Context
import android.content.SharedPreferences
@@ -38,7 +38,7 @@ interface AuthRepository {
class AuthRepositoryImpl(
context: Context,
private val baseUrl: String = "https://api.shieldai.com"
private val baseUrl: String = "https://kordant.ai/api"
) : AuthRepository {
private val JSON_MEDIA_TYPE = "application/json; charset=utf-8".toMediaType()
@@ -54,7 +54,7 @@ class AuthRepositoryImpl(
private val securePrefs: SharedPreferences = EncryptedSharedPreferences.create(
context,
"shieldai_auth_prefs",
"kordant_auth_prefs",
masterKey,
EncryptedSharedPreferences.PrefKeyEncryptionScheme.AES256_SIV,
EncryptedSharedPreferences.PrefValueEncryptionScheme.AES256_GCM

View File

@@ -1,13 +1,13 @@
package com.shieldai.android.data.repository
package com.kordant.android.data.repository
import android.content.Context
import com.shieldai.android.data.local.CacheManager
import com.shieldai.android.data.model.Exposure
import com.shieldai.android.data.model.WatchlistItem
import com.shieldai.android.data.remote.ApiResult
import com.shieldai.android.data.remote.ErrorHandler
import com.shieldai.android.data.remote.TRPCApiService
import com.shieldai.android.data.remote.TRPCRequest
import com.kordant.android.data.local.CacheManager
import com.kordant.android.data.model.Exposure
import com.kordant.android.data.model.WatchlistItem
import com.kordant.android.data.remote.ApiResult
import com.kordant.android.data.remote.ErrorHandler
import com.kordant.android.data.remote.TRPCApiService
import com.kordant.android.data.remote.TRPCRequest
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.serialization.json.buildJsonObject

View File

@@ -1,12 +1,12 @@
package com.shieldai.android.data.repository
package com.kordant.android.data.repository
import android.content.Context
import com.shieldai.android.data.local.CacheManager
import com.shieldai.android.data.model.Property
import com.shieldai.android.data.remote.ApiResult
import com.shieldai.android.data.remote.ErrorHandler
import com.shieldai.android.data.remote.TRPCApiService
import com.shieldai.android.data.remote.TRPCRequest
import com.kordant.android.data.local.CacheManager
import com.kordant.android.data.model.Property
import com.kordant.android.data.remote.ApiResult
import com.kordant.android.data.remote.ErrorHandler
import com.kordant.android.data.remote.TRPCApiService
import com.kordant.android.data.remote.TRPCRequest
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.serialization.json.buildJsonObject

View File

@@ -1,13 +1,13 @@
package com.shieldai.android.data.repository
package com.kordant.android.data.repository
import android.content.Context
import com.shieldai.android.data.local.CacheManager
import com.shieldai.android.data.model.BrokerListing
import com.shieldai.android.data.model.RemovalRequest
import com.shieldai.android.data.remote.ApiResult
import com.shieldai.android.data.remote.ErrorHandler
import com.shieldai.android.data.remote.TRPCApiService
import com.shieldai.android.data.remote.TRPCRequest
import com.kordant.android.data.local.CacheManager
import com.kordant.android.data.model.BrokerListing
import com.kordant.android.data.model.RemovalRequest
import com.kordant.android.data.remote.ApiResult
import com.kordant.android.data.remote.ErrorHandler
import com.kordant.android.data.remote.TRPCApiService
import com.kordant.android.data.remote.TRPCRequest
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.serialization.json.buildJsonObject

View File

@@ -1,12 +1,12 @@
package com.shieldai.android.data.repository
package com.kordant.android.data.repository
import android.content.Context
import com.shieldai.android.data.local.CacheManager
import com.shieldai.android.data.model.SpamRule
import com.shieldai.android.data.remote.ApiResult
import com.shieldai.android.data.remote.ErrorHandler
import com.shieldai.android.data.remote.TRPCApiService
import com.shieldai.android.data.remote.TRPCRequest
import com.kordant.android.data.local.CacheManager
import com.kordant.android.data.model.SpamRule
import com.kordant.android.data.remote.ApiResult
import com.kordant.android.data.remote.ErrorHandler
import com.kordant.android.data.remote.TRPCApiService
import com.kordant.android.data.remote.TRPCRequest
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.serialization.json.buildJsonObject

View File

@@ -1,12 +1,12 @@
package com.shieldai.android.data.repository
package com.kordant.android.data.repository
import android.content.Context
import com.shieldai.android.data.local.CacheManager
import com.shieldai.android.data.model.Subscription
import com.shieldai.android.data.remote.ApiResult
import com.shieldai.android.data.remote.ErrorHandler
import com.shieldai.android.data.remote.TRPCApiService
import com.shieldai.android.data.remote.TRPCRequest
import com.kordant.android.data.local.CacheManager
import com.kordant.android.data.model.Subscription
import com.kordant.android.data.remote.ApiResult
import com.kordant.android.data.remote.ErrorHandler
import com.kordant.android.data.remote.TRPCApiService
import com.kordant.android.data.remote.TRPCRequest
import kotlinx.serialization.json.buildJsonObject
import kotlinx.serialization.json.put

View File

@@ -1,12 +1,12 @@
package com.shieldai.android.data.repository
package com.kordant.android.data.repository
import android.content.Context
import com.shieldai.android.data.local.CacheManager
import com.shieldai.android.data.model.User
import com.shieldai.android.data.remote.ApiResult
import com.shieldai.android.data.remote.ErrorHandler
import com.shieldai.android.data.remote.TRPCApiService
import com.shieldai.android.data.remote.TRPCRequest
import com.kordant.android.data.local.CacheManager
import com.kordant.android.data.model.User
import com.kordant.android.data.remote.ApiResult
import com.kordant.android.data.remote.ErrorHandler
import com.kordant.android.data.remote.TRPCApiService
import com.kordant.android.data.remote.TRPCRequest
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.serialization.json.buildJsonObject

View File

@@ -1,13 +1,13 @@
package com.shieldai.android.data.repository
package com.kordant.android.data.repository
import android.content.Context
import com.shieldai.android.data.local.CacheManager
import com.shieldai.android.data.model.VoiceAnalysis
import com.shieldai.android.data.model.VoiceEnrollment
import com.shieldai.android.data.remote.ApiResult
import com.shieldai.android.data.remote.ErrorHandler
import com.shieldai.android.data.remote.TRPCApiService
import com.shieldai.android.data.remote.TRPCRequest
import com.kordant.android.data.local.CacheManager
import com.kordant.android.data.model.VoiceAnalysis
import com.kordant.android.data.model.VoiceEnrollment
import com.kordant.android.data.remote.ApiResult
import com.kordant.android.data.remote.ErrorHandler
import com.kordant.android.data.remote.TRPCApiService
import com.kordant.android.data.remote.TRPCRequest
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.serialization.json.buildJsonObject

View File

@@ -1,4 +1,4 @@
package com.shieldai.android.data.sync
package com.kordant.android.data.sync
import android.content.Context
import androidx.work.CoroutineWorker
@@ -29,7 +29,7 @@ class OfflineWorker(
try {
val body = request.body.toRequestBody(jsonMediaType)
val httpRequest = Request.Builder()
.url("https://api.shieldai.com/${request.endpoint}")
.url("https://kordant.ai/api/${request.endpoint}")
.method(request.method, body)
.build()
val response = client.newCall(httpRequest).execute()

View File

@@ -1,4 +1,4 @@
package com.shieldai.android.data.sync
package com.kordant.android.data.sync
import android.content.Context
import kotlinx.serialization.Serializable

View File

@@ -1,4 +1,4 @@
package com.shieldai.android.data.sync
package com.kordant.android.data.sync
import android.content.Context
import android.net.ConnectivityManager

View File

@@ -1,7 +1,7 @@
package com.shieldai.android.di
package com.kordant.android.di
import android.content.Context
import com.shieldai.android.data.local.CacheManager
import com.kordant.android.data.local.CacheManager
object DatabaseModule {
fun initializeCache(context: Context) {

View File

@@ -1,9 +1,9 @@
package com.shieldai.android.di
package com.kordant.android.di
import android.content.Context
import com.jakewharton.retrofit2.converter.kotlinx.serialization.asConverterFactory
import com.shieldai.android.data.remote.AuthInterceptor
import com.shieldai.android.data.remote.TRPCApiService
import com.kordant.android.data.remote.AuthInterceptor
import com.kordant.android.data.remote.TRPCApiService
import kotlinx.serialization.json.Json
import okhttp3.MediaType.Companion.toMediaType
import okhttp3.OkHttpClient

View File

@@ -1,14 +1,14 @@
package com.shieldai.android.di
package com.kordant.android.di
import android.content.Context
import com.shieldai.android.data.repository.AlertRepository
import com.shieldai.android.data.repository.DarkWatchRepository
import com.shieldai.android.data.repository.HomeTitleRepository
import com.shieldai.android.data.repository.RemoveBrokersRepository
import com.shieldai.android.data.repository.SpamShieldRepository
import com.shieldai.android.data.repository.SubscriptionRepository
import com.shieldai.android.data.repository.UserRepository
import com.shieldai.android.data.repository.VoicePrintRepository
import com.kordant.android.data.repository.AlertRepository
import com.kordant.android.data.repository.DarkWatchRepository
import com.kordant.android.data.repository.HomeTitleRepository
import com.kordant.android.data.repository.RemoveBrokersRepository
import com.kordant.android.data.repository.SpamShieldRepository
import com.kordant.android.data.repository.SubscriptionRepository
import com.kordant.android.data.repository.UserRepository
import com.kordant.android.data.repository.VoicePrintRepository
object RepositoryModule {
private var userRepository: UserRepository? = null

View File

@@ -1,4 +1,4 @@
package com.shieldai.android.navigation
package com.kordant.android.navigation
import android.app.Application
import androidx.compose.foundation.layout.padding
@@ -11,8 +11,8 @@ import androidx.compose.ui.platform.LocalContext
import androidx.lifecycle.viewmodel.compose.viewModel
import androidx.navigation.compose.currentBackStackEntryAsState
import androidx.navigation.compose.rememberNavController
import com.shieldai.android.KordantApp
import com.shieldai.android.viewmodel.AuthViewModel
import com.kordant.android.KordantApp
import com.kordant.android.viewmodel.AuthViewModel
@Composable
fun AppNavigation() {

View File

@@ -1,4 +1,4 @@
package com.shieldai.android.navigation
package com.kordant.android.navigation
import androidx.compose.material3.Icon
import androidx.compose.material3.NavigationBar
@@ -7,7 +7,7 @@ import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.ui.graphics.vector.ImageVector
import androidx.compose.ui.res.vectorResource
import com.shieldai.android.R
import com.kordant.android.R
data class BottomNavItem(
val screen: Screen,

View File

@@ -1,4 +1,4 @@
package com.shieldai.android.navigation
package com.kordant.android.navigation
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Arrangement
@@ -26,20 +26,20 @@ import androidx.navigation.compose.NavHost
import androidx.navigation.compose.composable
import androidx.navigation.compose.rememberNavController
import androidx.navigation.navArgument
import com.shieldai.android.R
import com.shieldai.android.ui.screens.auth.AuthScreen
import com.shieldai.android.ui.screens.auth.ForgotPasswordScreen
import com.shieldai.android.ui.screens.auth.ResetPasswordScreen
import com.shieldai.android.ui.screens.dashboard.AlertDetailScreen
import com.shieldai.android.ui.screens.dashboard.DashboardScreen
import com.shieldai.android.ui.screens.onboarding.OnboardingScreen
import com.shieldai.android.ui.screens.services.DarkWatchScreen
import com.shieldai.android.ui.screens.services.HomeTitleScreen
import com.shieldai.android.ui.screens.services.RemoveBrokersScreen
import com.shieldai.android.ui.screens.services.SpamShieldScreen
import com.shieldai.android.ui.screens.services.VoicePrintScreen
import com.shieldai.android.ui.screens.settings.SettingsScreen
import com.shieldai.android.viewmodel.AuthViewModel
import com.kordant.android.R
import com.kordant.android.ui.screens.auth.AuthScreen
import com.kordant.android.ui.screens.auth.ForgotPasswordScreen
import com.kordant.android.ui.screens.auth.ResetPasswordScreen
import com.kordant.android.ui.screens.dashboard.AlertDetailScreen
import com.kordant.android.ui.screens.dashboard.DashboardScreen
import com.kordant.android.ui.screens.onboarding.OnboardingScreen
import com.kordant.android.ui.screens.services.DarkWatchScreen
import com.kordant.android.ui.screens.services.HomeTitleScreen
import com.kordant.android.ui.screens.services.RemoveBrokersScreen
import com.kordant.android.ui.screens.services.SpamShieldScreen
import com.kordant.android.ui.screens.services.VoicePrintScreen
import com.kordant.android.ui.screens.settings.SettingsScreen
import com.kordant.android.viewmodel.AuthViewModel
data class ServiceNavCard(
val title: String,
@@ -224,7 +224,7 @@ private fun ServicesHubScreen(
) {
items(services.size) { index ->
val service = services[index]
com.shieldai.android.ui.components.ShieldCard(
com.kordant.android.ui.components.ShieldCard(
onClick = { onNavigateToService(service.route) },
modifier = Modifier.fillMaxWidth()
) {
@@ -269,7 +269,7 @@ private fun AlertsScreen(
fontWeight = FontWeight.Bold,
modifier = Modifier.padding(bottom = 16.dp)
)
com.shieldai.android.ui.components.ShieldEmptyState(
com.kordant.android.ui.components.ShieldEmptyState(
title = "No alerts",
description = "You have no recent alerts"
)

View File

@@ -1,4 +1,4 @@
package com.shieldai.android.navigation
package com.kordant.android.navigation
sealed class Screen(val route: String) {
data object Dashboard : Screen("dashboard")

View File

@@ -1,4 +1,4 @@
package com.shieldai.android.ui.components
package com.kordant.android.ui.components
import android.content.res.Configuration
import androidx.compose.foundation.layout.Arrangement
@@ -29,7 +29,7 @@ import androidx.compose.ui.Modifier
import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import com.shieldai.android.ui.theme.KordantTheme
import com.kordant.android.ui.theme.KordantTheme
import kotlinx.coroutines.launch
@OptIn(ExperimentalMaterial3Api::class)

View File

@@ -1,4 +1,4 @@
package com.shieldai.android.ui.components
package com.kordant.android.ui.components
import androidx.compose.foundation.Canvas
import androidx.compose.foundation.background
@@ -22,8 +22,8 @@ import androidx.compose.ui.unit.TextUnit
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import coil.compose.AsyncImage
import com.shieldai.android.ui.theme.BrandPrimary
import com.shieldai.android.ui.theme.Success
import com.kordant.android.ui.theme.BrandPrimary
import com.kordant.android.ui.theme.Success
enum class AvatarSize(val dimension: Dp, val fontSize: TextUnit) {
Small(32.dp, 12.sp),

View File

@@ -1,4 +1,4 @@
package com.shieldai.android.ui.components
package com.kordant.android.ui.components
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.Spacer
@@ -16,12 +16,12 @@ import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.painter.Painter
import androidx.compose.ui.unit.dp
import com.shieldai.android.ui.theme.Error
import com.shieldai.android.ui.theme.Info
import com.shieldai.android.ui.theme.Success
import com.shieldai.android.ui.theme.TextPrimaryLight
import com.shieldai.android.ui.theme.TextSecondaryLight
import com.shieldai.android.ui.theme.Warning
import com.kordant.android.ui.theme.Error
import com.kordant.android.ui.theme.Info
import com.kordant.android.ui.theme.Success
import com.kordant.android.ui.theme.TextPrimaryLight
import com.kordant.android.ui.theme.TextSecondaryLight
import com.kordant.android.ui.theme.Warning
enum class BadgeVariant {
Default, Success, Warning, Error, Info

View File

@@ -1,4 +1,4 @@
package com.shieldai.android.ui.components
package com.kordant.android.ui.components
import androidx.compose.foundation.layout.RowScope
import androidx.compose.foundation.layout.Spacer
@@ -18,8 +18,8 @@ import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.unit.dp
import com.shieldai.android.ui.theme.BrandPrimary
import com.shieldai.android.ui.theme.Error
import com.kordant.android.ui.theme.BrandPrimary
import com.kordant.android.ui.theme.Error
enum class ShieldButtonVariant {
Primary, Secondary, Ghost, Danger

View File

@@ -1,4 +1,4 @@
package com.shieldai.android.ui.components
package com.kordant.android.ui.components
import androidx.compose.foundation.BorderStroke
import androidx.compose.foundation.background
@@ -13,9 +13,9 @@ import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Brush
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.unit.dp
import com.shieldai.android.ui.theme.BrandAccent
import com.shieldai.android.ui.theme.BrandPrimary
import com.shieldai.android.ui.theme.OutlineLight
import com.kordant.android.ui.theme.BrandAccent
import com.kordant.android.ui.theme.BrandPrimary
import com.kordant.android.ui.theme.OutlineLight
val GradientCardBrush = Brush.linearGradient(
colors = listOf(

View File

@@ -1,4 +1,4 @@
package com.shieldai.android.ui.components
package com.kordant.android.ui.components
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Column

View File

@@ -1,4 +1,4 @@
package com.shieldai.android.ui.components
package com.kordant.android.ui.components
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Spacer
@@ -19,7 +19,7 @@ import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.unit.dp
import com.shieldai.android.ui.theme.BrandPrimary
import com.kordant.android.ui.theme.BrandPrimary
data class ModalAction(
val text: String,

View File

@@ -1,4 +1,4 @@
package com.shieldai.android.ui.components
package com.kordant.android.ui.components
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.fillMaxWidth
@@ -14,12 +14,12 @@ import androidx.compose.ui.draw.clip
import androidx.compose.ui.graphics.StrokeCap
import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.unit.dp
import com.shieldai.android.ui.theme.BrandAccent
import com.shieldai.android.ui.theme.BrandPrimary
import com.shieldai.android.ui.theme.Error
import com.shieldai.android.ui.theme.OutlineLight
import com.shieldai.android.ui.theme.Success
import com.shieldai.android.ui.theme.Warning
import com.kordant.android.ui.theme.BrandAccent
import com.kordant.android.ui.theme.BrandPrimary
import com.kordant.android.ui.theme.Error
import com.kordant.android.ui.theme.OutlineLight
import com.kordant.android.ui.theme.Success
import com.kordant.android.ui.theme.Warning
enum class ProgressColor {
Primary, Accent, Success, Warning, Error

View File

@@ -1,4 +1,4 @@
package com.shieldai.android.ui.components
package com.kordant.android.ui.components
import androidx.compose.animation.core.LinearEasing
import androidx.compose.animation.core.RepeatMode
@@ -22,7 +22,7 @@ import androidx.compose.ui.geometry.Offset
import androidx.compose.ui.graphics.Brush
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.unit.dp
import com.shieldai.android.ui.theme.OutlineLight
import com.kordant.android.ui.theme.OutlineLight
@Composable
fun ShieldSkeletonLine(

View File

@@ -1,4 +1,4 @@
package com.shieldai.android.ui.components
package com.kordant.android.ui.components
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.fillMaxWidth
@@ -20,7 +20,7 @@ import androidx.compose.ui.text.input.KeyboardType
import androidx.compose.ui.text.input.PasswordVisualTransformation
import androidx.compose.ui.text.input.VisualTransformation
import androidx.compose.ui.unit.dp
import com.shieldai.android.ui.theme.Error
import com.kordant.android.ui.theme.Error
enum class InputType {
Text, Email, Password, Number, Phone

View File

@@ -1,4 +1,4 @@
package com.shieldai.android.ui.components
package com.kordant.android.ui.components
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding
@@ -13,11 +13,11 @@ import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.unit.dp
import com.shieldai.android.ui.theme.Error
import com.shieldai.android.ui.theme.Info
import com.shieldai.android.ui.theme.Success
import com.shieldai.android.ui.theme.TextPrimaryDark
import com.shieldai.android.ui.theme.Warning
import com.kordant.android.ui.theme.Error
import com.kordant.android.ui.theme.Info
import com.kordant.android.ui.theme.Success
import com.kordant.android.ui.theme.TextPrimaryDark
import com.kordant.android.ui.theme.Warning
enum class ToastVariant {
Success, Error, Warning, Info

View File

@@ -1,4 +1,4 @@
package com.shieldai.android.ui.components
package com.kordant.android.ui.components
import androidx.compose.foundation.Canvas
import androidx.compose.foundation.layout.Column
@@ -18,9 +18,9 @@ import androidx.compose.ui.graphics.Paint
import androidx.compose.ui.graphics.drawscope.DrawScope
import androidx.compose.ui.graphics.drawscope.scale
import androidx.compose.ui.unit.dp
import com.shieldai.android.ui.theme.Error
import com.shieldai.android.ui.theme.Success
import com.shieldai.android.ui.theme.Warning
import com.kordant.android.ui.theme.Error
import com.kordant.android.ui.theme.Success
import com.kordant.android.ui.theme.Warning
@Composable
fun ThreatGauge(

View File

@@ -1,4 +1,4 @@
package com.shieldai.android.ui.screens.auth
package com.kordant.android.ui.screens.auth
import androidx.compose.foundation.Image
import androidx.compose.foundation.layout.Column
@@ -26,9 +26,9 @@ import androidx.compose.ui.Modifier
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.unit.dp
import com.shieldai.android.R
import com.shieldai.android.ui.components.ShieldCard
import com.shieldai.android.viewmodel.AuthViewModel
import com.kordant.android.R
import com.kordant.android.ui.components.ShieldCard
import com.kordant.android.viewmodel.AuthViewModel
@Composable
fun AuthScreen(

View File

@@ -1,4 +1,4 @@
package com.shieldai.android.ui.screens.auth
package com.kordant.android.ui.screens.auth
import android.content.Context
import android.security.identity.IdentityCredentialException
@@ -79,11 +79,11 @@ fun canUseBiometric(context: Context): Boolean {
}
fun isBiometricEnabled(context: Context): Boolean {
val prefs = context.getSharedPreferences("shieldai_biometric_prefs", Context.MODE_PRIVATE)
val prefs = context.getSharedPreferences("kordant_biometric_prefs", Context.MODE_PRIVATE)
return prefs.getBoolean("biometric_enabled", false)
}
fun setBiometricEnabled(context: Context, enabled: Boolean) {
val prefs = context.getSharedPreferences("shieldai_biometric_prefs", Context.MODE_PRIVATE)
val prefs = context.getSharedPreferences("kordant_biometric_prefs", Context.MODE_PRIVATE)
prefs.edit().putBoolean("biometric_enabled", enabled).apply()
}

View File

@@ -1,4 +1,4 @@
package com.shieldai.android.ui.screens.auth
package com.kordant.android.ui.screens.auth
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Spacer
@@ -21,12 +21,12 @@ import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.unit.dp
import com.shieldai.android.ui.components.InputType
import com.shieldai.android.ui.components.ShieldButton
import com.shieldai.android.ui.components.ShieldButtonVariant
import com.shieldai.android.ui.components.ShieldCard
import com.shieldai.android.ui.components.ShieldTextField
import com.shieldai.android.viewmodel.AuthViewModel
import com.kordant.android.ui.components.InputType
import com.kordant.android.ui.components.ShieldButton
import com.kordant.android.ui.components.ShieldButtonVariant
import com.kordant.android.ui.components.ShieldCard
import com.kordant.android.ui.components.ShieldTextField
import com.kordant.android.viewmodel.AuthViewModel
@Composable
fun ForgotPasswordScreen(

View File

@@ -1,4 +1,4 @@
package com.shieldai.android.ui.screens.auth
package com.kordant.android.ui.screens.auth
import android.app.Activity
import android.content.Intent
@@ -33,12 +33,12 @@ import com.google.android.gms.auth.api.signin.GoogleSignIn
import com.google.android.gms.auth.api.signin.GoogleSignInClient
import com.google.android.gms.auth.api.signin.GoogleSignInOptions
import com.google.android.gms.common.api.ApiException
import com.shieldai.android.ui.components.InputType
import com.shieldai.android.ui.components.ShieldButton
import com.shieldai.android.ui.components.ShieldTextField
import com.shieldai.android.ui.theme.BrandPrimary
import com.shieldai.android.viewmodel.AuthUiState
import com.shieldai.android.viewmodel.AuthViewModel
import com.kordant.android.ui.components.InputType
import com.kordant.android.ui.components.ShieldButton
import com.kordant.android.ui.components.ShieldTextField
import com.kordant.android.ui.theme.BrandPrimary
import com.kordant.android.viewmodel.AuthUiState
import com.kordant.android.viewmodel.AuthViewModel
@Composable
fun LoginScreen(
@@ -53,7 +53,7 @@ fun LoginScreen(
val gso = remember {
GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
.requestIdToken(context.getString(com.shieldai.android.R.string.default_web_client_id))
.requestIdToken(context.getString(com.kordant.android.R.string.default_web_client_id))
.requestEmail()
.build()
}

View File

@@ -1,4 +1,4 @@
package com.shieldai.android.ui.screens.auth
package com.kordant.android.ui.screens.auth
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Spacer
@@ -21,11 +21,11 @@ import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.unit.dp
import com.shieldai.android.ui.components.InputType
import com.shieldai.android.ui.components.ShieldButton
import com.shieldai.android.ui.components.ShieldCard
import com.shieldai.android.ui.components.ShieldTextField
import com.shieldai.android.viewmodel.AuthViewModel
import com.kordant.android.ui.components.InputType
import com.kordant.android.ui.components.ShieldButton
import com.kordant.android.ui.components.ShieldCard
import com.kordant.android.ui.components.ShieldTextField
import com.kordant.android.viewmodel.AuthViewModel
@Composable
fun ResetPasswordScreen(

View File

@@ -1,4 +1,4 @@
package com.shieldai.android.ui.screens.auth
package com.kordant.android.ui.screens.auth
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row
@@ -19,16 +19,16 @@ import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.unit.dp
import com.shieldai.android.ui.components.InputType
import com.shieldai.android.ui.components.ProgressColor
import com.shieldai.android.ui.components.ShieldButton
import com.shieldai.android.ui.components.ShieldProgressBar
import com.shieldai.android.ui.components.ShieldTextField
import com.shieldai.android.util.PasswordStrength
import com.shieldai.android.util.calculatePasswordStrength
import com.shieldai.android.util.passwordStrengthLabel
import com.shieldai.android.viewmodel.AuthUiState
import com.shieldai.android.viewmodel.AuthViewModel
import com.kordant.android.ui.components.InputType
import com.kordant.android.ui.components.ProgressColor
import com.kordant.android.ui.components.ShieldButton
import com.kordant.android.ui.components.ShieldProgressBar
import com.kordant.android.ui.components.ShieldTextField
import com.kordant.android.util.PasswordStrength
import com.kordant.android.util.calculatePasswordStrength
import com.kordant.android.util.passwordStrengthLabel
import com.kordant.android.viewmodel.AuthUiState
import com.kordant.android.viewmodel.AuthViewModel
@Composable
fun SignupScreen(

View File

@@ -1,4 +1,4 @@
package com.shieldai.android.ui.screens.dashboard
package com.kordant.android.ui.screens.dashboard
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Column
@@ -28,14 +28,14 @@ import androidx.compose.ui.input.nestedscroll.nestedScroll
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.unit.dp
import androidx.lifecycle.viewmodel.compose.viewModel
import com.shieldai.android.data.model.Alert
import com.shieldai.android.ui.components.BadgeVariant
import com.shieldai.android.ui.components.ShieldBadge
import com.shieldai.android.ui.components.ShieldButton
import com.shieldai.android.ui.components.ShieldButtonVariant
import com.shieldai.android.ui.components.ShieldCard
import com.shieldai.android.ui.components.ShieldEmptyState
import com.shieldai.android.ui.viewmodel.AlertDetailViewModel
import com.kordant.android.data.model.Alert
import com.kordant.android.ui.components.BadgeVariant
import com.kordant.android.ui.components.ShieldBadge
import com.kordant.android.ui.components.ShieldButton
import com.kordant.android.ui.components.ShieldButtonVariant
import com.kordant.android.ui.components.ShieldCard
import com.kordant.android.ui.components.ShieldEmptyState
import com.kordant.android.ui.viewmodel.AlertDetailViewModel
@OptIn(ExperimentalMaterial3Api::class)
@Composable

View File

@@ -1,4 +1,4 @@
package com.shieldai.android.ui.screens.dashboard
package com.kordant.android.ui.screens.dashboard
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Box
@@ -36,18 +36,18 @@ import androidx.compose.ui.res.vectorResource
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.unit.dp
import androidx.lifecycle.viewmodel.compose.viewModel
import com.shieldai.android.R
import com.shieldai.android.data.model.Alert
import com.shieldai.android.ui.components.BadgeVariant
import com.shieldai.android.ui.components.ShieldBadge
import com.shieldai.android.ui.components.ShieldButton
import com.shieldai.android.ui.components.ShieldButtonVariant
import com.shieldai.android.ui.components.ShieldCard
import com.shieldai.android.ui.components.ShieldEmptyState
import com.shieldai.android.ui.components.ShieldSkeletonCard
import com.shieldai.android.ui.components.ThreatGauge
import com.shieldai.android.viewmodel.DashboardViewModel
import com.shieldai.android.viewmodel.DashboardViewModel as DashboardVM
import com.kordant.android.R
import com.kordant.android.data.model.Alert
import com.kordant.android.ui.components.BadgeVariant
import com.kordant.android.ui.components.ShieldBadge
import com.kordant.android.ui.components.ShieldButton
import com.kordant.android.ui.components.ShieldButtonVariant
import com.kordant.android.ui.components.ShieldCard
import com.kordant.android.ui.components.ShieldEmptyState
import com.kordant.android.ui.components.ShieldSkeletonCard
import com.kordant.android.ui.components.ThreatGauge
import com.kordant.android.viewmodel.DashboardViewModel
import com.kordant.android.viewmodel.DashboardViewModel as DashboardVM
import kotlinx.coroutines.launch
data class ServiceSummary(

View File

@@ -1,4 +1,4 @@
package com.shieldai.android.ui.screens.onboarding
package com.kordant.android.ui.screens.onboarding
import androidx.compose.animation.core.Animatable
import androidx.compose.animation.core.tween
@@ -24,9 +24,9 @@ import androidx.compose.ui.graphics.drawscope.Stroke
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.unit.dp
import com.shieldai.android.ui.components.ShieldButton
import com.shieldai.android.ui.theme.BrandPrimary
import com.shieldai.android.ui.theme.Success
import com.kordant.android.ui.components.ShieldButton
import com.kordant.android.ui.theme.BrandPrimary
import com.kordant.android.ui.theme.Success
@Composable
fun CompleteStep(onComplete: () -> Unit) {

View File

@@ -1,4 +1,4 @@
package com.shieldai.android.ui.screens.onboarding
package com.kordant.android.ui.screens.onboarding
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row
@@ -24,10 +24,10 @@ import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.unit.dp
import com.shieldai.android.ui.components.InputType
import com.shieldai.android.ui.components.ShieldButton
import com.shieldai.android.ui.components.ShieldButtonVariant
import com.shieldai.android.ui.components.ShieldTextField
import com.kordant.android.ui.components.InputType
import com.kordant.android.ui.components.ShieldButton
import com.kordant.android.ui.components.ShieldButtonVariant
import com.kordant.android.ui.components.ShieldTextField
@Composable
fun FamilyInviteStep(

View File

@@ -1,4 +1,4 @@
package com.shieldai.android.ui.screens.onboarding
package com.kordant.android.ui.screens.onboarding
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Box
@@ -22,8 +22,8 @@ import androidx.compose.ui.draw.clip
import androidx.compose.ui.draw.drawBehind
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.unit.dp
import com.shieldai.android.ui.theme.BrandPrimary
import com.shieldai.android.viewmodel.AuthViewModel
import com.kordant.android.ui.theme.BrandPrimary
import com.kordant.android.viewmodel.AuthViewModel
@Composable
fun OnboardingScreen(

View File

@@ -1,4 +1,4 @@
package com.shieldai.android.ui.screens.onboarding
package com.kordant.android.ui.screens.onboarding
import androidx.compose.foundation.BorderStroke
import androidx.compose.foundation.clickable
@@ -23,7 +23,7 @@ import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.unit.dp
import com.shieldai.android.ui.theme.BrandPrimary
import com.kordant.android.ui.theme.BrandPrimary
data class Plan(
val name: String,

View File

@@ -1,4 +1,4 @@
package com.shieldai.android.ui.screens.onboarding
package com.kordant.android.ui.screens.onboarding
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row
@@ -24,10 +24,10 @@ import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.unit.dp
import com.shieldai.android.ui.components.InputType
import com.shieldai.android.ui.components.ShieldButton
import com.shieldai.android.ui.components.ShieldButtonVariant
import com.shieldai.android.ui.components.ShieldTextField
import com.kordant.android.ui.components.InputType
import com.kordant.android.ui.components.ShieldButton
import com.kordant.android.ui.components.ShieldButtonVariant
import com.kordant.android.ui.components.ShieldTextField
@Composable
fun WatchlistSetupStep(

View File

@@ -1,4 +1,4 @@
package com.shieldai.android.ui.screens.services
package com.kordant.android.ui.screens.services
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Column
@@ -36,14 +36,14 @@ import androidx.compose.ui.res.painterResource
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.unit.dp
import androidx.lifecycle.viewmodel.compose.viewModel
import com.shieldai.android.R
import com.shieldai.android.ui.components.ShieldBadge
import com.shieldai.android.ui.components.ShieldButton
import com.shieldai.android.ui.components.ShieldButtonVariant
import com.shieldai.android.ui.components.ShieldCard
import com.shieldai.android.ui.components.ShieldEmptyState
import com.shieldai.android.ui.components.ShieldTextField
import com.shieldai.android.viewmodel.DarkWatchViewModel
import com.kordant.android.R
import com.kordant.android.ui.components.ShieldBadge
import com.kordant.android.ui.components.ShieldButton
import com.kordant.android.ui.components.ShieldButtonVariant
import com.kordant.android.ui.components.ShieldCard
import com.kordant.android.ui.components.ShieldEmptyState
import com.kordant.android.ui.components.ShieldTextField
import com.kordant.android.viewmodel.DarkWatchViewModel
@OptIn(ExperimentalMaterial3Api::class)
@Composable
@@ -186,7 +186,7 @@ private fun DarkWatchContent(
}
@Composable
private fun WatchlistItemCard(item: com.shieldai.android.data.model.WatchlistItem) {
private fun WatchlistItemCard(item: com.kordant.android.data.model.WatchlistItem) {
ShieldCard(modifier = Modifier.fillMaxWidth()) {
Row(
modifier = Modifier.fillMaxWidth(),
@@ -214,15 +214,15 @@ private fun WatchlistItemCard(item: com.shieldai.android.data.model.WatchlistIte
}
ShieldBadge(
text = item.status,
variant = if (item.status == "active") com.shieldai.android.ui.components.BadgeVariant.Success
else com.shieldai.android.ui.components.BadgeVariant.Default
variant = if (item.status == "active") com.kordant.android.ui.components.BadgeVariant.Success
else com.kordant.android.ui.components.BadgeVariant.Default
)
}
}
}
@Composable
private fun ExposureCard(exposure: com.shieldai.android.data.model.Exposure) {
private fun ExposureCard(exposure: com.kordant.android.data.model.Exposure) {
ShieldCard(modifier = Modifier.fillMaxWidth()) {
Column {
Row(
@@ -238,9 +238,9 @@ private fun ExposureCard(exposure: com.shieldai.android.data.model.Exposure) {
ShieldBadge(
text = exposure.severity,
variant = when (exposure.severity.lowercase()) {
"critical" -> com.shieldai.android.ui.components.BadgeVariant.Error
"high" -> com.shieldai.android.ui.components.BadgeVariant.Warning
else -> com.shieldai.android.ui.components.BadgeVariant.Info
"critical" -> com.kordant.android.ui.components.BadgeVariant.Error
"high" -> com.kordant.android.ui.components.BadgeVariant.Warning
else -> com.kordant.android.ui.components.BadgeVariant.Info
}
)
}

View File

@@ -1,4 +1,4 @@
package com.shieldai.android.ui.screens.services
package com.kordant.android.ui.screens.services
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Column
@@ -36,15 +36,15 @@ import androidx.compose.ui.res.painterResource
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.unit.dp
import androidx.lifecycle.viewmodel.compose.viewModel
import com.shieldai.android.R
import com.shieldai.android.ui.components.BadgeVariant
import com.shieldai.android.ui.components.ShieldBadge
import com.shieldai.android.ui.components.ShieldButton
import com.shieldai.android.ui.components.ShieldButtonVariant
import com.shieldai.android.ui.components.ShieldCard
import com.shieldai.android.ui.components.ShieldEmptyState
import com.shieldai.android.ui.components.ShieldTextField
import com.shieldai.android.viewmodel.HomeTitleViewModel
import com.kordant.android.R
import com.kordant.android.ui.components.BadgeVariant
import com.kordant.android.ui.components.ShieldBadge
import com.kordant.android.ui.components.ShieldButton
import com.kordant.android.ui.components.ShieldButtonVariant
import com.kordant.android.ui.components.ShieldCard
import com.kordant.android.ui.components.ShieldEmptyState
import com.kordant.android.ui.components.ShieldTextField
import com.kordant.android.viewmodel.HomeTitleViewModel
@OptIn(ExperimentalMaterial3Api::class)
@Composable
@@ -160,7 +160,7 @@ private fun HomeTitleContent(
}
@Composable
private fun PropertyCard(property: com.shieldai.android.data.model.Property) {
private fun PropertyCard(property: com.kordant.android.data.model.Property) {
ShieldCard(modifier = Modifier.fillMaxWidth()) {
Column {
Row(

View File

@@ -1,4 +1,4 @@
package com.shieldai.android.ui.screens.services
package com.kordant.android.ui.screens.services
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Column
@@ -36,15 +36,15 @@ import androidx.compose.ui.res.painterResource
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.unit.dp
import androidx.lifecycle.viewmodel.compose.viewModel
import com.shieldai.android.R
import com.shieldai.android.ui.components.BadgeVariant
import com.shieldai.android.ui.components.ShieldBadge
import com.shieldai.android.ui.components.ShieldButton
import com.shieldai.android.ui.components.ShieldButtonVariant
import com.shieldai.android.ui.components.ShieldCard
import com.shieldai.android.ui.components.ShieldEmptyState
import com.shieldai.android.ui.components.ShieldTextField
import com.shieldai.android.viewmodel.RemoveBrokersViewModel
import com.kordant.android.R
import com.kordant.android.ui.components.BadgeVariant
import com.kordant.android.ui.components.ShieldBadge
import com.kordant.android.ui.components.ShieldButton
import com.kordant.android.ui.components.ShieldButtonVariant
import com.kordant.android.ui.components.ShieldCard
import com.kordant.android.ui.components.ShieldEmptyState
import com.kordant.android.ui.components.ShieldTextField
import com.kordant.android.viewmodel.RemoveBrokersViewModel
@OptIn(ExperimentalMaterial3Api::class)
@Composable
@@ -187,7 +187,7 @@ private fun RemoveBrokersContent(
}
@Composable
private fun ListingCard(listing: com.shieldai.android.data.model.BrokerListing) {
private fun ListingCard(listing: com.kordant.android.data.model.BrokerListing) {
ShieldCard(modifier = Modifier.fillMaxWidth()) {
Column {
Row(
@@ -226,7 +226,7 @@ private fun ListingCard(listing: com.shieldai.android.data.model.BrokerListing)
}
@Composable
private fun RemovalRequestCard(request: com.shieldai.android.data.model.RemovalRequest) {
private fun RemovalRequestCard(request: com.kordant.android.data.model.RemovalRequest) {
ShieldCard(modifier = Modifier.fillMaxWidth()) {
Column {
Row(

View File

@@ -1,4 +1,4 @@
package com.shieldai.android.ui.screens.services
package com.kordant.android.ui.screens.services
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Column
@@ -37,14 +37,14 @@ import androidx.compose.ui.res.painterResource
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.unit.dp
import androidx.lifecycle.viewmodel.compose.viewModel
import com.shieldai.android.R
import com.shieldai.android.ui.components.ShieldBadge
import com.shieldai.android.ui.components.ShieldButton
import com.shieldai.android.ui.components.ShieldButtonVariant
import com.shieldai.android.ui.components.ShieldCard
import com.shieldai.android.ui.components.ShieldEmptyState
import com.shieldai.android.ui.components.ShieldTextField
import com.shieldai.android.viewmodel.SpamShieldViewModel
import com.kordant.android.R
import com.kordant.android.ui.components.ShieldBadge
import com.kordant.android.ui.components.ShieldButton
import com.kordant.android.ui.components.ShieldButtonVariant
import com.kordant.android.ui.components.ShieldCard
import com.kordant.android.ui.components.ShieldEmptyState
import com.kordant.android.ui.components.ShieldTextField
import com.kordant.android.viewmodel.SpamShieldViewModel
@OptIn(ExperimentalMaterial3Api::class)
@Composable
@@ -224,7 +224,7 @@ private fun StatCard(
@Composable
private fun RuleCard(
rule: com.shieldai.android.data.model.SpamRule,
rule: com.kordant.android.data.model.SpamRule,
onToggle: (Boolean) -> Unit
) {
ShieldCard(modifier = Modifier.fillMaxWidth()) {
@@ -244,13 +244,13 @@ private fun RuleCard(
) {
ShieldBadge(
text = rule.action,
variant = if (rule.action == "block") com.shieldai.android.ui.components.BadgeVariant.Error
else com.shieldai.android.ui.components.BadgeVariant.Warning
variant = if (rule.action == "block") com.kordant.android.ui.components.BadgeVariant.Error
else com.kordant.android.ui.components.BadgeVariant.Warning
)
if (rule.priority > 0) {
ShieldBadge(
text = "P${rule.priority}",
variant = com.shieldai.android.ui.components.BadgeVariant.Info
variant = com.kordant.android.ui.components.BadgeVariant.Info
)
}
}

View File

@@ -1,4 +1,4 @@
package com.shieldai.android.ui.screens.services
package com.kordant.android.ui.screens.services
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Column
@@ -36,15 +36,15 @@ import androidx.compose.ui.res.painterResource
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.unit.dp
import androidx.lifecycle.viewmodel.compose.viewModel
import com.shieldai.android.R
import com.shieldai.android.ui.components.BadgeVariant
import com.shieldai.android.ui.components.ShieldBadge
import com.shieldai.android.ui.components.ShieldButton
import com.shieldai.android.ui.components.ShieldButtonVariant
import com.shieldai.android.ui.components.ShieldCard
import com.shieldai.android.ui.components.ShieldEmptyState
import com.shieldai.android.ui.components.ShieldTextField
import com.shieldai.android.viewmodel.VoicePrintViewModel
import com.kordant.android.R
import com.kordant.android.ui.components.BadgeVariant
import com.kordant.android.ui.components.ShieldBadge
import com.kordant.android.ui.components.ShieldButton
import com.kordant.android.ui.components.ShieldButtonVariant
import com.kordant.android.ui.components.ShieldCard
import com.kordant.android.ui.components.ShieldEmptyState
import com.kordant.android.ui.components.ShieldTextField
import com.kordant.android.viewmodel.VoicePrintViewModel
@OptIn(ExperimentalMaterial3Api::class)
@Composable
@@ -160,7 +160,7 @@ private fun VoicePrintContent(
}
@Composable
private fun EnrollmentCard(enrollment: com.shieldai.android.data.model.VoiceEnrollment) {
private fun EnrollmentCard(enrollment: com.kordant.android.data.model.VoiceEnrollment) {
ShieldCard(modifier = Modifier.fillMaxWidth()) {
Column {
Row(

View File

@@ -1,4 +1,4 @@
package com.shieldai.android.ui.screens.settings
package com.kordant.android.ui.screens.settings
import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.Arrangement
@@ -34,14 +34,14 @@ import androidx.compose.ui.input.nestedscroll.nestedScroll
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.unit.dp
import androidx.lifecycle.viewmodel.compose.viewModel
import com.shieldai.android.ui.components.ShieldAvatar
import com.shieldai.android.ui.components.ShieldBadge
import com.shieldai.android.ui.components.ShieldButton
import com.shieldai.android.ui.components.ShieldButtonVariant
import com.shieldai.android.ui.components.ShieldCard
import com.shieldai.android.ui.components.ShieldEmptyState
import com.shieldai.android.viewmodel.AuthViewModel
import com.shieldai.android.viewmodel.SettingsViewModel
import com.kordant.android.ui.components.ShieldAvatar
import com.kordant.android.ui.components.ShieldBadge
import com.kordant.android.ui.components.ShieldButton
import com.kordant.android.ui.components.ShieldButtonVariant
import com.kordant.android.ui.components.ShieldCard
import com.kordant.android.ui.components.ShieldEmptyState
import com.kordant.android.viewmodel.AuthViewModel
import com.kordant.android.viewmodel.SettingsViewModel
@OptIn(ExperimentalMaterial3Api::class)
@Composable
@@ -184,7 +184,7 @@ private fun SettingsContent(
}
@Composable
private fun AccountSection(user: com.shieldai.android.data.model.User) {
private fun AccountSection(user: com.kordant.android.data.model.User) {
Column {
Text(
text = "Account",
@@ -214,10 +214,10 @@ private fun AccountSection(user: com.shieldai.android.data.model.User) {
)
Row(horizontalArrangement = Arrangement.spacedBy(8.dp)) {
if (user.emailVerified) {
ShieldBadge(text = "Email verified", variant = com.shieldai.android.ui.components.BadgeVariant.Success)
ShieldBadge(text = "Email verified", variant = com.kordant.android.ui.components.BadgeVariant.Success)
}
if (user.phoneVerified) {
ShieldBadge(text = "Phone verified", variant = com.shieldai.android.ui.components.BadgeVariant.Success)
ShieldBadge(text = "Phone verified", variant = com.kordant.android.ui.components.BadgeVariant.Success)
}
}
}
@@ -227,7 +227,7 @@ private fun AccountSection(user: com.shieldai.android.data.model.User) {
@Composable
private fun SubscriptionSection(
subscription: com.shieldai.android.data.model.Subscription?,
subscription: com.kordant.android.data.model.Subscription?,
onUpgrade: () -> Unit
) {
Column {
@@ -260,7 +260,7 @@ private fun SubscriptionSection(
text = "Upgrade",
onClick = onUpgrade,
variant = ShieldButtonVariant.Secondary,
size = com.shieldai.android.ui.components.ShieldButtonSize.Small
size = com.kordant.android.ui.components.ShieldButtonSize.Small
)
}
}

View File

@@ -1,4 +1,4 @@
package com.shieldai.android.ui.theme
package com.kordant.android.ui.theme
import androidx.compose.ui.graphics.Color

View File

@@ -1,4 +1,4 @@
package com.shieldai.android.ui.theme
package com.kordant.android.ui.theme
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.material3.Shapes

View File

@@ -1,4 +1,4 @@
package com.shieldai.android.ui.theme
package com.kordant.android.ui.theme
import android.os.Build
import androidx.compose.foundation.isSystemInDarkTheme

View File

@@ -1,4 +1,4 @@
package com.shieldai.android.ui.theme
package com.kordant.android.ui.theme
import androidx.compose.material3.Typography
import androidx.compose.ui.text.TextStyle

View File

@@ -1,9 +1,9 @@
package com.shieldai.android.util
package com.kordant.android.util
import androidx.compose.ui.graphics.Color
import com.shieldai.android.ui.theme.Error
import com.shieldai.android.ui.theme.Success
import com.shieldai.android.ui.theme.Warning
import com.kordant.android.ui.theme.Error
import com.kordant.android.ui.theme.Success
import com.kordant.android.ui.theme.Warning
enum class PasswordStrength {
WEAK, FAIR, STRONG, VERY_STRONG

View File

@@ -1,12 +1,12 @@
package com.shieldai.android.viewmodel
package com.kordant.android.viewmodel
import androidx.lifecycle.ViewModel
import androidx.lifecycle.ViewModelProvider
import androidx.lifecycle.viewModelScope
import com.shieldai.android.KordantApp
import com.shieldai.android.data.model.Alert
import com.shieldai.android.data.repository.AlertRepository
import com.shieldai.android.di.RepositoryModule
import com.kordant.android.KordantApp
import com.kordant.android.data.model.Alert
import com.kordant.android.data.repository.AlertRepository
import com.kordant.android.di.RepositoryModule
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.flow.asStateFlow
@@ -33,7 +33,7 @@ class AlertDetailViewModel : ViewModel() {
_uiState.value = _uiState.value.copy(isLoading = true, error = null)
try {
val result = alertRepo.getAlerts()
if (result is com.shieldai.android.data.remote.ApiResult.Success) {
if (result is com.kordant.android.data.remote.ApiResult.Success) {
val alert = result.data.find { it.id == alertId }
val correlated = alert?.let {
result.data.filter { a ->

View File

@@ -1,14 +1,14 @@
package com.shieldai.android.viewmodel
package com.kordant.android.viewmodel
import androidx.lifecycle.ViewModel
import androidx.lifecycle.ViewModelProvider
import androidx.lifecycle.viewModelScope
import com.shieldai.android.KordantApp
import com.shieldai.android.data.repository.AuthRepository
import com.shieldai.android.data.repository.AuthRepositoryImpl
import com.shieldai.android.data.repository.User
import com.shieldai.android.util.calculatePasswordStrength
import com.shieldai.android.util.passwordStrengthProgress
import com.kordant.android.KordantApp
import com.kordant.android.data.repository.AuthRepository
import com.kordant.android.data.repository.AuthRepositoryImpl
import com.kordant.android.data.repository.User
import com.kordant.android.util.calculatePasswordStrength
import com.kordant.android.util.passwordStrengthProgress
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.flow.asStateFlow

View File

@@ -1,13 +1,13 @@
package com.shieldai.android.viewmodel
package com.kordant.android.viewmodel
import androidx.lifecycle.ViewModel
import androidx.lifecycle.ViewModelProvider
import androidx.lifecycle.viewModelScope
import com.shieldai.android.KordantApp
import com.shieldai.android.data.model.Exposure
import com.shieldai.android.data.model.WatchlistItem
import com.shieldai.android.data.repository.DarkWatchRepository
import com.shieldai.android.di.RepositoryModule
import com.kordant.android.KordantApp
import com.kordant.android.data.model.Exposure
import com.kordant.android.data.model.WatchlistItem
import com.kordant.android.data.repository.DarkWatchRepository
import com.kordant.android.di.RepositoryModule
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.flow.asStateFlow
@@ -44,11 +44,11 @@ class DarkWatchViewModel : ViewModel() {
val watchlistResult = repo.getWatchlist(forceRefresh)
val exposuresResult = repo.getExposures(forceRefresh)
val watchlist = if (watchlistResult is com.shieldai.android.data.remote.ApiResult.Success) {
val watchlist = if (watchlistResult is com.kordant.android.data.remote.ApiResult.Success) {
watchlistResult.data
} else emptyList()
val exposures = if (exposuresResult is com.shieldai.android.data.remote.ApiResult.Success) {
val exposures = if (exposuresResult is com.kordant.android.data.remote.ApiResult.Success) {
exposuresResult.data
} else emptyList()
@@ -70,7 +70,7 @@ class DarkWatchViewModel : ViewModel() {
viewModelScope.launch {
_uiState.value = _uiState.value.copy(isAdding = true, error = null)
val result = repo.addWatchlistItem(type, value, label)
if (result is com.shieldai.android.data.remote.ApiResult.Error) {
if (result is com.kordant.android.data.remote.ApiResult.Error) {
_uiState.value = _uiState.value.copy(
isAdding = false,
error = result.message

View File

@@ -1,17 +1,17 @@
package com.shieldai.android.viewmodel
package com.kordant.android.viewmodel
import androidx.lifecycle.ViewModel
import androidx.lifecycle.ViewModelProvider
import androidx.lifecycle.viewModelScope
import com.shieldai.android.KordantApp
import com.shieldai.android.data.model.Alert
import com.shieldai.android.data.repository.AlertRepository
import com.shieldai.android.data.repository.DarkWatchRepository
import com.shieldai.android.data.repository.HomeTitleRepository
import com.shieldai.android.data.repository.RemoveBrokersRepository
import com.shieldai.android.data.repository.SpamShieldRepository
import com.shieldai.android.data.repository.VoicePrintRepository
import com.shieldai.android.di.RepositoryModule
import com.kordant.android.KordantApp
import com.kordant.android.data.model.Alert
import com.kordant.android.data.repository.AlertRepository
import com.kordant.android.data.repository.DarkWatchRepository
import com.kordant.android.data.repository.HomeTitleRepository
import com.kordant.android.data.repository.RemoveBrokersRepository
import com.kordant.android.data.repository.SpamShieldRepository
import com.kordant.android.data.repository.VoicePrintRepository
import com.kordant.android.di.RepositoryModule
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.flow.asStateFlow
@@ -74,27 +74,27 @@ class DashboardViewModel : ViewModel() {
val removalsResult = removeBrokersRepo.getRemovalRequests()
val alerts = when (alertsResult) {
is com.shieldai.android.data.remote.ApiResult.Success -> alertsResult.data
is com.kordant.android.data.remote.ApiResult.Success -> alertsResult.data
else -> emptyList()
}
val watchlist = when (watchlistResult) {
is com.shieldai.android.data.remote.ApiResult.Success -> watchlistResult.data
is com.kordant.android.data.remote.ApiResult.Success -> watchlistResult.data
else -> emptyList()
}
val enrollments = when (enrollmentsResult) {
is com.shieldai.android.data.remote.ApiResult.Success -> enrollmentsResult.data
is com.kordant.android.data.remote.ApiResult.Success -> enrollmentsResult.data
else -> emptyList()
}
val rules = when (rulesResult) {
is com.shieldai.android.data.remote.ApiResult.Success -> rulesResult.data
is com.kordant.android.data.remote.ApiResult.Success -> rulesResult.data
else -> emptyList()
}
val properties = when (propertiesResult) {
is com.shieldai.android.data.remote.ApiResult.Success -> propertiesResult.data
is com.kordant.android.data.remote.ApiResult.Success -> propertiesResult.data
else -> emptyList()
}
val removals = when (removalsResult) {
is com.shieldai.android.data.remote.ApiResult.Success -> removalsResult.data
is com.kordant.android.data.remote.ApiResult.Success -> removalsResult.data
else -> emptyList()
}

View File

@@ -1,12 +1,12 @@
package com.shieldai.android.viewmodel
package com.kordant.android.viewmodel
import androidx.lifecycle.ViewModel
import androidx.lifecycle.ViewModelProvider
import androidx.lifecycle.viewModelScope
import com.shieldai.android.KordantApp
import com.shieldai.android.data.model.Property
import com.shieldai.android.data.repository.HomeTitleRepository
import com.shieldai.android.di.RepositoryModule
import com.kordant.android.KordantApp
import com.kordant.android.data.model.Property
import com.kordant.android.data.repository.HomeTitleRepository
import com.kordant.android.di.RepositoryModule
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.flow.asStateFlow
@@ -40,7 +40,7 @@ class HomeTitleViewModel : ViewModel() {
_uiState.value = _uiState.value.copy(isLoading = !forceRefresh, error = null)
try {
val result = repo.getProperties(forceRefresh)
if (result is com.shieldai.android.data.remote.ApiResult.Success) {
if (result is com.kordant.android.data.remote.ApiResult.Success) {
_uiState.value = _uiState.value.copy(
isLoading = false,
properties = result.data
@@ -61,7 +61,7 @@ class HomeTitleViewModel : ViewModel() {
viewModelScope.launch {
_uiState.value = _uiState.value.copy(isAdding = true, error = null)
val result = repo.addProperty(address, type)
if (result is com.shieldai.android.data.remote.ApiResult.Error) {
if (result is com.kordant.android.data.remote.ApiResult.Error) {
_uiState.value = _uiState.value.copy(
isAdding = false,
error = result.message

View File

@@ -1,13 +1,13 @@
package com.shieldai.android.viewmodel
package com.kordant.android.viewmodel
import androidx.lifecycle.ViewModel
import androidx.lifecycle.ViewModelProvider
import androidx.lifecycle.viewModelScope
import com.shieldai.android.KordantApp
import com.shieldai.android.data.model.BrokerListing
import com.shieldai.android.data.model.RemovalRequest
import com.shieldai.android.data.repository.RemoveBrokersRepository
import com.shieldai.android.di.RepositoryModule
import com.kordant.android.KordantApp
import com.kordant.android.data.model.BrokerListing
import com.kordant.android.data.model.RemovalRequest
import com.kordant.android.data.repository.RemoveBrokersRepository
import com.kordant.android.di.RepositoryModule
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.flow.asStateFlow
@@ -44,11 +44,11 @@ class RemoveBrokersViewModel : ViewModel() {
val listingsResult = repo.getListings(forceRefresh)
val requestsResult = repo.getRemovalRequests(forceRefresh)
val listings = if (listingsResult is com.shieldai.android.data.remote.ApiResult.Success) {
val listings = if (listingsResult is com.kordant.android.data.remote.ApiResult.Success) {
listingsResult.data
} else emptyList()
val requests = if (requestsResult is com.shieldai.android.data.remote.ApiResult.Success) {
val requests = if (requestsResult is com.kordant.android.data.remote.ApiResult.Success) {
requestsResult.data
} else emptyList()
@@ -70,7 +70,7 @@ class RemoveBrokersViewModel : ViewModel() {
viewModelScope.launch {
_uiState.value = _uiState.value.copy(isCreating = true, error = null)
val result = repo.createRemovalRequest(listingId, notes)
if (result is com.shieldai.android.data.remote.ApiResult.Error) {
if (result is com.kordant.android.data.remote.ApiResult.Error) {
_uiState.value = _uiState.value.copy(
isCreating = false,
error = result.message

View File

@@ -1,14 +1,14 @@
package com.shieldai.android.viewmodel
package com.kordant.android.viewmodel
import androidx.lifecycle.ViewModel
import androidx.lifecycle.ViewModelProvider
import androidx.lifecycle.viewModelScope
import com.shieldai.android.KordantApp
import com.shieldai.android.data.model.Subscription
import com.shieldai.android.data.model.User
import com.shieldai.android.data.repository.SubscriptionRepository
import com.shieldai.android.data.repository.UserRepository
import com.shieldai.android.di.RepositoryModule
import com.kordant.android.KordantApp
import com.kordant.android.data.model.Subscription
import com.kordant.android.data.model.User
import com.kordant.android.data.repository.SubscriptionRepository
import com.kordant.android.data.repository.UserRepository
import com.kordant.android.di.RepositoryModule
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.flow.asStateFlow
@@ -50,11 +50,11 @@ class SettingsViewModel : ViewModel() {
val userResult = userRepo.getMe(forceRefresh)
val subResult = subscriptionRepo.getSubscription()
val user = if (userResult is com.shieldai.android.data.remote.ApiResult.Success) {
val user = if (userResult is com.kordant.android.data.remote.ApiResult.Success) {
userResult.data
} else null
val subscription = if (subResult is com.shieldai.android.data.remote.ApiResult.Success) {
val subscription = if (subResult is com.kordant.android.data.remote.ApiResult.Success) {
subResult.data
} else null

View File

@@ -1,12 +1,12 @@
package com.shieldai.android.viewmodel
package com.kordant.android.viewmodel
import androidx.lifecycle.ViewModel
import androidx.lifecycle.ViewModelProvider
import androidx.lifecycle.viewModelScope
import com.shieldai.android.KordantApp
import com.shieldai.android.data.model.SpamRule
import com.shieldai.android.data.repository.SpamShieldRepository
import com.shieldai.android.di.RepositoryModule
import com.kordant.android.KordantApp
import com.kordant.android.data.model.SpamRule
import com.kordant.android.data.repository.SpamShieldRepository
import com.kordant.android.di.RepositoryModule
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.flow.asStateFlow
@@ -43,7 +43,7 @@ class SpamShieldViewModel : ViewModel() {
_uiState.value = _uiState.value.copy(isLoading = !forceRefresh, error = null)
try {
val result = repo.getRules(forceRefresh)
if (result is com.shieldai.android.data.remote.ApiResult.Success) {
if (result is com.kordant.android.data.remote.ApiResult.Success) {
val stats = repo.getStats()
_uiState.value = _uiState.value.copy(
isLoading = false,
@@ -68,7 +68,7 @@ class SpamShieldViewModel : ViewModel() {
viewModelScope.launch {
_uiState.value = _uiState.value.copy(isCreating = true, error = null)
val result = repo.createRule(pattern, action, description)
if (result is com.shieldai.android.data.remote.ApiResult.Error) {
if (result is com.kordant.android.data.remote.ApiResult.Error) {
_uiState.value = _uiState.value.copy(
isCreating = false,
error = result.message

View File

@@ -1,12 +1,12 @@
package com.shieldai.android.viewmodel
package com.kordant.android.viewmodel
import androidx.lifecycle.ViewModel
import androidx.lifecycle.ViewModelProvider
import androidx.lifecycle.viewModelScope
import com.shieldai.android.KordantApp
import com.shieldai.android.data.model.VoiceEnrollment
import com.shieldai.android.data.repository.VoicePrintRepository
import com.shieldai.android.di.RepositoryModule
import com.kordant.android.KordantApp
import com.kordant.android.data.model.VoiceEnrollment
import com.kordant.android.data.repository.VoicePrintRepository
import com.kordant.android.di.RepositoryModule
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.flow.asStateFlow
@@ -44,7 +44,7 @@ class VoicePrintViewModel : ViewModel() {
} else {
repo.getEnrollments()
}
if (result is com.shieldai.android.data.remote.ApiResult.Success) {
if (result is com.kordant.android.data.remote.ApiResult.Success) {
_uiState.value = _uiState.value.copy(
isLoading = false,
enrollments = result.data
@@ -65,7 +65,7 @@ class VoicePrintViewModel : ViewModel() {
viewModelScope.launch {
_uiState.value = _uiState.value.copy(isEnrolling = true, error = null)
val result = repo.createEnrollment(name)
if (result is com.shieldai.android.data.remote.ApiResult.Error) {
if (result is com.kordant.android.data.remote.ApiResult.Error) {
_uiState.value = _uiState.value.copy(
isEnrolling = false,
error = result.message

View File

@@ -1,17 +1,17 @@
package com.shieldai.android.viewmodel
package com.kordant.android.viewmodel
import com.shieldai.android.data.model.Alert
import com.shieldai.android.data.model.Exposure
import com.shieldai.android.data.model.WatchlistItem
import com.shieldai.android.data.repository.AlertRepository
import com.shieldai.android.data.repository.DarkWatchRepository
import com.shieldai.android.data.repository.HomeTitleRepository
import com.shieldai.android.data.repository.RemoveBrokersRepository
import com.shieldai.android.data.repository.SpamShieldRepository
import com.shieldai.android.data.repository.SubscriptionRepository
import com.shieldai.android.data.repository.UserRepository
import com.shieldai.android.data.repository.VoicePrintRepository
import com.shieldai.android.data.remote.ApiResult
import com.kordant.android.data.model.Alert
import com.kordant.android.data.model.Exposure
import com.kordant.android.data.model.WatchlistItem
import com.kordant.android.data.repository.AlertRepository
import com.kordant.android.data.repository.DarkWatchRepository
import com.kordant.android.data.repository.HomeTitleRepository
import com.kordant.android.data.repository.RemoveBrokersRepository
import com.kordant.android.data.repository.SpamShieldRepository
import com.kordant.android.data.repository.SubscriptionRepository
import com.kordant.android.data.repository.UserRepository
import com.kordant.android.data.repository.VoicePrintRepository
import com.kordant.android.data.remote.ApiResult
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.test.StandardTestDispatcher

View File

@@ -4,7 +4,7 @@
<dict>
<key>SchemeUserState</key>
<dict>
<key>ShieldAI.xcscheme_^#shared#^_</key>
<key>Kordant.xcscheme_^#shared#^_</key>
<dict>
<key>orderHint</key>
<integer>0</integer>

View File

@@ -6,38 +6,119 @@ import type { JSX } from "solid-js";
vi.mock("~/lib/api", () => ({
api: {
correlation: {
getStats: { query: vi.fn().mockResolvedValue({ threatScore: 25, totalAlerts: 5, bySeverity: {}, bySource: {}, activeGroups: 2, resolvedCount: 3, falsePositiveCount: 1, threatBreakdown: [] }) },
getAlerts: { query: vi.fn().mockResolvedValue({ items: [
{ id: "1", title: "New credential leak detected", severity: "HIGH", source: "DARKWATCH", createdAt: new Date().toISOString() },
{ id: "2", title: "Suspicious call", severity: "WARNING", source: "SPAMSHIELD", createdAt: new Date().toISOString() },
], total: 2, page: 1, limit: 10, totalPages: 1 }) },
getStats: {
query: vi
.fn()
.mockResolvedValue({
threatScore: 25,
totalAlerts: 5,
bySeverity: {},
bySource: {},
activeGroups: 2,
resolvedCount: 3,
falsePositiveCount: 1,
threatBreakdown: [],
}),
},
getAlerts: {
query: vi.fn().mockResolvedValue({
items: [
{
id: "1",
title: "New credential leak detected",
severity: "HIGH",
source: "DARKWATCH",
createdAt: new Date().toISOString(),
},
{
id: "2",
title: "Suspicious call",
severity: "WARNING",
source: "SPAMSHIELD",
createdAt: new Date().toISOString(),
},
],
total: 2,
page: 1,
limit: 10,
totalPages: 1,
}),
},
resolveAlert: { mutate: vi.fn().mockResolvedValue({}) },
},
darkwatch: {
getExposures: { query: vi.fn().mockResolvedValue({ items: [], total: 0, page: 1, limit: 1, totalPages: 0 }) },
getExposures: {
query: vi
.fn()
.mockResolvedValue({
items: [],
total: 0,
page: 1,
limit: 1,
totalPages: 0,
}),
},
runScan: { mutate: vi.fn().mockResolvedValue({}) },
},
voiceprint: {
getEnrollments: { query: vi.fn().mockResolvedValue([]) },
getAnalyses: { query: vi.fn().mockResolvedValue({ items: [], total: 0, page: 1, limit: 10, totalPages: 0 }) },
getAnalyses: {
query: vi
.fn()
.mockResolvedValue({
items: [],
total: 0,
page: 1,
limit: 10,
totalPages: 0,
}),
},
},
spamshield: {
getStats: { query: vi.fn().mockResolvedValue({ period: "week", totalDetections: 10, spamCount: 8, notSpamCount: 2, accuracy: 80, activeRules: 3 }) },
getRules: { query: vi.fn().mockResolvedValue({ userRules: [], globalRules: [] }) },
getStats: {
query: vi
.fn()
.mockResolvedValue({
period: "week",
totalDetections: 10,
spamCount: 8,
notSpamCount: 2,
accuracy: 80,
activeRules: 3,
}),
},
getRules: {
query: vi.fn().mockResolvedValue({ userRules: [], globalRules: [] }),
},
},
hometitle: {
getProperties: { query: vi.fn().mockResolvedValue([]) },
getAlerts: { query: vi.fn().mockResolvedValue([]) },
},
removebrokers: {
getStats: { query: vi.fn().mockResolvedValue({ total: 0, byStatus: {}, totalListings: 0, listingsRemoved: 0, completionRate: 0 }) },
getStats: {
query: vi
.fn()
.mockResolvedValue({
total: 0,
byStatus: {},
totalListings: 0,
listingsRemoved: 0,
completionRate: 0,
}),
},
getBrokerRegistry: { query: vi.fn().mockResolvedValue([]) },
},
},
}));
vi.mock("@solidjs/router", () => ({
A: (props: { href?: string; children?: JSX.Element; class?: string; onClick?: () => void }) => (
A: (props: {
href?: string;
children?: JSX.Element;
class?: string;
onClick?: () => void;
}) => (
<a href={props.href || "#"} class={props.class} onClick={props.onClick}>
{props.children}
</a>
@@ -49,7 +130,7 @@ vi.mock("@solidjs/router", () => ({
vi.mock("~/hooks", () => ({
useAuth: () => ({
user: () => ({ name: "Test User", email: "test@shieldai.app" }),
user: () => ({ name: "Test User", email: "test@kordant.ai" }),
isAuthenticated: () => true,
isLoading: () => false,
logout: vi.fn(),
@@ -62,11 +143,41 @@ vi.mock("~/hooks", () => ({
}),
useNotifications: () => ({
alerts: () => [
{ id: "1", title: "New credential leak detected", description: "Your email was found in a data breach", severity: "HIGH", createdAt: "5m ago" },
{ id: "2", title: "VoicePrint scan completed", description: "No deepfake voice activity detected", severity: "INFO", createdAt: "1h ago" },
{ id: "3", title: "RemoveBroker opt-out confirmed", description: "Your data has been removed from Whitepages", severity: "INFO", createdAt: "3h ago" },
{ id: "4", title: "Suspicious call blocked", description: "SpamShield blocked a call", severity: "WARNING", createdAt: "6h ago" },
{ id: "5", title: "HomeTitle alert", description: "A document was filed", severity: "CRITICAL", createdAt: "1d ago" },
{
id: "1",
title: "New credential leak detected",
description: "Your email was found in a data breach",
severity: "HIGH",
createdAt: "5m ago",
},
{
id: "2",
title: "VoicePrint scan completed",
description: "No deepfake voice activity detected",
severity: "INFO",
createdAt: "1h ago",
},
{
id: "3",
title: "RemoveBroker opt-out confirmed",
description: "Your data has been removed from Whitepages",
severity: "INFO",
createdAt: "3h ago",
},
{
id: "4",
title: "Suspicious call blocked",
description: "SpamShield blocked a call",
severity: "WARNING",
createdAt: "6h ago",
},
{
id: "5",
title: "HomeTitle alert",
description: "A document was filed",
severity: "CRITICAL",
createdAt: "1d ago",
},
],
unreadCount: () => 5,
markRead: vi.fn(),
@@ -124,7 +235,9 @@ describe("BlogPage (listing)", () => {
it("renders post titles and excerpts", () => {
mount(() => <BlogPage />);
expect(document.body.textContent).toContain("AI Scam Trends to Watch in 2026");
expect(document.body.textContent).toContain(
"AI Scam Trends to Watch in 2026",
);
expect(document.body.textContent).toContain("Sarah Chen");
expect(document.body.textContent).toContain("Mike Reynolds");
});
@@ -133,7 +246,9 @@ describe("BlogPage (listing)", () => {
describe("BlogPostPage ([slug])", () => {
it("renders post content for valid slug", () => {
mount(() => <BlogPostPage />);
expect(document.body.textContent).toContain("AI Scam Trends to Watch in 2026");
expect(document.body.textContent).toContain(
"AI Scam Trends to Watch in 2026",
);
expect(document.body.textContent).toContain("Sarah Chen");
expect(document.body.textContent).toContain("Security Researcher");
expect(document.body.textContent).toContain("May 15, 2026");
@@ -150,7 +265,9 @@ describe("BlogPostPage ([slug])", () => {
it("renders social share buttons", () => {
mount(() => <BlogPostPage />);
const shareBtns = document.querySelectorAll("button[aria-label]");
const shareLabels = Array.from(shareBtns).map(b => b.getAttribute("aria-label"));
const shareLabels = Array.from(shareBtns).map((b) =>
b.getAttribute("aria-label"),
);
expect(shareLabels).toContain("Share on Twitter");
expect(shareLabels).toContain("Share on LinkedIn");
expect(shareLabels).toContain("Copy link");
@@ -192,14 +309,18 @@ describe("AdsPage", () => {
it("marks Plus plan as Most Popular", () => {
mount(() => <AdsPage />);
const badges = document.body.querySelectorAll("span");
const popularBadge = Array.from(badges).find(b => b.textContent === "Most Popular");
const popularBadge = Array.from(badges).find(
(b) => b.textContent === "Most Popular",
);
expect(popularBadge).toBeTruthy();
});
it("renders FAQ section with toggle functionality", () => {
mount(() => <AdsPage />);
expect(document.body.textContent).toContain("Frequently Asked Questions");
expect(document.body.textContent).toContain("How does Kordant detect voice clones?");
expect(document.body.textContent).toContain(
"How does Kordant detect voice clones?",
);
expect(document.body.textContent).toContain("Is my data encrypted?");
});
@@ -224,7 +345,9 @@ describe("AdsPage", () => {
it("renders CTA section with Get Started Free button", () => {
mount(() => <AdsPage />);
expect(document.body.textContent).toContain("Ready to protect your identity?");
expect(document.body.textContent).toContain(
"Ready to protect your identity?",
);
expect(document.body.textContent).toContain("Get Started Free");
});
});
@@ -276,14 +399,26 @@ describe("StatCard", () => {
it("renders up trend indicator", () => {
mount(() => (
<StatCard label="Up Trend" value="10" trend="up" trendLabel="+5%" icon={() => <svg />} />
<StatCard
label="Up Trend"
value="10"
trend="up"
trendLabel="+5%"
icon={() => <svg />}
/>
));
expect(document.body.textContent).toContain("+5%");
});
it("renders down trend indicator", () => {
mount(() => (
<StatCard label="Down Trend" value="10" trend="down" trendLabel="-3%" icon={() => <svg />} />
<StatCard
label="Down Trend"
value="10"
trend="down"
trendLabel="-3%"
icon={() => <svg />}
/>
));
expect(document.body.textContent).toContain("-3%");
});
@@ -292,7 +427,13 @@ describe("StatCard", () => {
describe("ActivityFeed", () => {
it("renders activities", () => {
const activities = [
{ id: "1", title: "Test Alert", description: "Test description", timestamp: "5m ago", type: "alert" as const },
{
id: "1",
title: "Test Alert",
description: "Test description",
timestamp: "5m ago",
type: "alert" as const,
},
];
mount(() => <ActivityFeed activities={activities} />);
expect(document.body.textContent).toContain("Recent Activity");