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 | | Document | Location |
|----------|----------| |----------|----------|
| Product Plan | `plans/SHIELDAI-product-plan.md` | | Product Plan | `plans/Kordant-product-plan.md` |
| Technical Architecture | `plans/SHIELDAI-technical-architecture.md` | | Technical Architecture | `plans/Kordant-technical-architecture.md` |
| Infrastructure | `infra/README.md` | | Infrastructure | `infra/README.md` |
| Rollback Runbook | `infra/ROLLBACK.md` | | Rollback Runbook | `infra/ROLLBACK.md` |
| Stripe Integration | `docs/STRIPE_INTEGRATION.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 android.os.Bundle
import androidx.activity.ComponentActivity import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent import androidx.activity.compose.setContent
import androidx.activity.enableEdgeToEdge import androidx.activity.enableEdgeToEdge
import com.shieldai.android.navigation.AppNavigation import com.kordant.android.navigation.AppNavigation
import com.shieldai.android.ui.theme.KordantTheme import com.kordant.android.ui.theme.KordantTheme
class MainActivity : ComponentActivity() { class MainActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {

View File

@@ -1,8 +1,8 @@
package com.shieldai.android package com.kordant.android
import android.app.Application import android.app.Application
import com.shieldai.android.data.repository.AuthRepository import com.kordant.android.data.repository.AuthRepository
import com.shieldai.android.data.repository.AuthRepositoryImpl import com.kordant.android.data.repository.AuthRepositoryImpl
class KordantApp : Application() { class KordantApp : Application() {
lateinit var authRepository: AuthRepository 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 android.content.Context
import kotlinx.serialization.Serializable 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.SerialName
import kotlinx.serialization.Serializable 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.SerialName
import kotlinx.serialization.Serializable 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.SerialName
import kotlinx.serialization.Serializable 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.SerialName
import kotlinx.serialization.Serializable 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.SerialName
import kotlinx.serialization.Serializable 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.SerialName
import kotlinx.serialization.Serializable 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.SerialName
import kotlinx.serialization.Serializable 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.SerialName
import kotlinx.serialization.Serializable 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.SerialName
import kotlinx.serialization.Serializable 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.SerialName
import kotlinx.serialization.Serializable 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.SerialName
import kotlinx.serialization.Serializable 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.Context
import android.content.SharedPreferences import android.content.SharedPreferences
@@ -11,7 +11,7 @@ class AuthInterceptor(context: Context) : Interceptor {
private val securePrefs: SharedPreferences = EncryptedSharedPreferences.create( private val securePrefs: SharedPreferences = EncryptedSharedPreferences.create(
context, context,
"shieldai_auth_prefs", "kordant_auth_prefs",
MasterKey.Builder(context).setKeyScheme(MasterKey.KeyScheme.AES256_GCM).build(), MasterKey.Builder(context).setKeyScheme(MasterKey.KeyScheme.AES256_GCM).build(),
EncryptedSharedPreferences.PrefKeyEncryptionScheme.AES256_SIV, EncryptedSharedPreferences.PrefKeyEncryptionScheme.AES256_SIV,
EncryptedSharedPreferences.PrefValueEncryptionScheme.AES256_GCM, 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 kotlinx.coroutines.delay
import kotlin.math.min 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.kordant.android.data.model.Alert
import com.shieldai.android.data.model.BrokerListing import com.kordant.android.data.model.BrokerListing
import com.shieldai.android.data.model.Exposure import com.kordant.android.data.model.Exposure
import com.shieldai.android.data.model.Property import com.kordant.android.data.model.Property
import com.shieldai.android.data.model.RemovalRequest import com.kordant.android.data.model.RemovalRequest
import com.shieldai.android.data.model.SpamRule import com.kordant.android.data.model.SpamRule
import com.shieldai.android.data.model.Subscription import com.kordant.android.data.model.Subscription
import com.shieldai.android.data.model.User import com.kordant.android.data.model.User
import com.shieldai.android.data.model.VoiceAnalysis import com.kordant.android.data.model.VoiceAnalysis
import com.shieldai.android.data.model.VoiceEnrollment import com.kordant.android.data.model.VoiceEnrollment
import com.shieldai.android.data.model.WatchlistItem import com.kordant.android.data.model.WatchlistItem
import kotlinx.serialization.json.JsonObject import kotlinx.serialization.json.JsonObject
import retrofit2.http.Body import retrofit2.http.Body
import retrofit2.http.POST 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.Serializable
import kotlinx.serialization.json.JsonElement 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 android.content.Context
import com.shieldai.android.data.local.CacheManager import com.kordant.android.data.local.CacheManager
import com.shieldai.android.data.model.Alert import com.kordant.android.data.model.Alert
import com.shieldai.android.data.remote.ApiResult import com.kordant.android.data.remote.ApiResult
import com.shieldai.android.data.remote.ErrorHandler import com.kordant.android.data.remote.ErrorHandler
import com.shieldai.android.data.remote.TRPCApiService import com.kordant.android.data.remote.TRPCApiService
import com.shieldai.android.data.remote.TRPCRequest import com.kordant.android.data.remote.TRPCRequest
import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.serialization.json.buildJsonObject 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.Context
import android.content.SharedPreferences import android.content.SharedPreferences
@@ -38,7 +38,7 @@ interface AuthRepository {
class AuthRepositoryImpl( class AuthRepositoryImpl(
context: Context, context: Context,
private val baseUrl: String = "https://api.shieldai.com" private val baseUrl: String = "https://kordant.ai/api"
) : AuthRepository { ) : AuthRepository {
private val JSON_MEDIA_TYPE = "application/json; charset=utf-8".toMediaType() private val JSON_MEDIA_TYPE = "application/json; charset=utf-8".toMediaType()
@@ -54,7 +54,7 @@ class AuthRepositoryImpl(
private val securePrefs: SharedPreferences = EncryptedSharedPreferences.create( private val securePrefs: SharedPreferences = EncryptedSharedPreferences.create(
context, context,
"shieldai_auth_prefs", "kordant_auth_prefs",
masterKey, masterKey,
EncryptedSharedPreferences.PrefKeyEncryptionScheme.AES256_SIV, EncryptedSharedPreferences.PrefKeyEncryptionScheme.AES256_SIV,
EncryptedSharedPreferences.PrefValueEncryptionScheme.AES256_GCM 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 android.content.Context
import com.shieldai.android.data.local.CacheManager import com.kordant.android.data.local.CacheManager
import com.shieldai.android.data.model.Exposure import com.kordant.android.data.model.Exposure
import com.shieldai.android.data.model.WatchlistItem import com.kordant.android.data.model.WatchlistItem
import com.shieldai.android.data.remote.ApiResult import com.kordant.android.data.remote.ApiResult
import com.shieldai.android.data.remote.ErrorHandler import com.kordant.android.data.remote.ErrorHandler
import com.shieldai.android.data.remote.TRPCApiService import com.kordant.android.data.remote.TRPCApiService
import com.shieldai.android.data.remote.TRPCRequest import com.kordant.android.data.remote.TRPCRequest
import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.serialization.json.buildJsonObject 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 android.content.Context
import com.shieldai.android.data.local.CacheManager import com.kordant.android.data.local.CacheManager
import com.shieldai.android.data.model.Property import com.kordant.android.data.model.Property
import com.shieldai.android.data.remote.ApiResult import com.kordant.android.data.remote.ApiResult
import com.shieldai.android.data.remote.ErrorHandler import com.kordant.android.data.remote.ErrorHandler
import com.shieldai.android.data.remote.TRPCApiService import com.kordant.android.data.remote.TRPCApiService
import com.shieldai.android.data.remote.TRPCRequest import com.kordant.android.data.remote.TRPCRequest
import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.serialization.json.buildJsonObject 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 android.content.Context
import com.shieldai.android.data.local.CacheManager import com.kordant.android.data.local.CacheManager
import com.shieldai.android.data.model.BrokerListing import com.kordant.android.data.model.BrokerListing
import com.shieldai.android.data.model.RemovalRequest import com.kordant.android.data.model.RemovalRequest
import com.shieldai.android.data.remote.ApiResult import com.kordant.android.data.remote.ApiResult
import com.shieldai.android.data.remote.ErrorHandler import com.kordant.android.data.remote.ErrorHandler
import com.shieldai.android.data.remote.TRPCApiService import com.kordant.android.data.remote.TRPCApiService
import com.shieldai.android.data.remote.TRPCRequest import com.kordant.android.data.remote.TRPCRequest
import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.serialization.json.buildJsonObject 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 android.content.Context
import com.shieldai.android.data.local.CacheManager import com.kordant.android.data.local.CacheManager
import com.shieldai.android.data.model.SpamRule import com.kordant.android.data.model.SpamRule
import com.shieldai.android.data.remote.ApiResult import com.kordant.android.data.remote.ApiResult
import com.shieldai.android.data.remote.ErrorHandler import com.kordant.android.data.remote.ErrorHandler
import com.shieldai.android.data.remote.TRPCApiService import com.kordant.android.data.remote.TRPCApiService
import com.shieldai.android.data.remote.TRPCRequest import com.kordant.android.data.remote.TRPCRequest
import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.serialization.json.buildJsonObject 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 android.content.Context
import com.shieldai.android.data.local.CacheManager import com.kordant.android.data.local.CacheManager
import com.shieldai.android.data.model.Subscription import com.kordant.android.data.model.Subscription
import com.shieldai.android.data.remote.ApiResult import com.kordant.android.data.remote.ApiResult
import com.shieldai.android.data.remote.ErrorHandler import com.kordant.android.data.remote.ErrorHandler
import com.shieldai.android.data.remote.TRPCApiService import com.kordant.android.data.remote.TRPCApiService
import com.shieldai.android.data.remote.TRPCRequest import com.kordant.android.data.remote.TRPCRequest
import kotlinx.serialization.json.buildJsonObject import kotlinx.serialization.json.buildJsonObject
import kotlinx.serialization.json.put 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 android.content.Context
import com.shieldai.android.data.local.CacheManager import com.kordant.android.data.local.CacheManager
import com.shieldai.android.data.model.User import com.kordant.android.data.model.User
import com.shieldai.android.data.remote.ApiResult import com.kordant.android.data.remote.ApiResult
import com.shieldai.android.data.remote.ErrorHandler import com.kordant.android.data.remote.ErrorHandler
import com.shieldai.android.data.remote.TRPCApiService import com.kordant.android.data.remote.TRPCApiService
import com.shieldai.android.data.remote.TRPCRequest import com.kordant.android.data.remote.TRPCRequest
import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.serialization.json.buildJsonObject 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 android.content.Context
import com.shieldai.android.data.local.CacheManager import com.kordant.android.data.local.CacheManager
import com.shieldai.android.data.model.VoiceAnalysis import com.kordant.android.data.model.VoiceAnalysis
import com.shieldai.android.data.model.VoiceEnrollment import com.kordant.android.data.model.VoiceEnrollment
import com.shieldai.android.data.remote.ApiResult import com.kordant.android.data.remote.ApiResult
import com.shieldai.android.data.remote.ErrorHandler import com.kordant.android.data.remote.ErrorHandler
import com.shieldai.android.data.remote.TRPCApiService import com.kordant.android.data.remote.TRPCApiService
import com.shieldai.android.data.remote.TRPCRequest import com.kordant.android.data.remote.TRPCRequest
import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.serialization.json.buildJsonObject 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 android.content.Context
import androidx.work.CoroutineWorker import androidx.work.CoroutineWorker
@@ -29,7 +29,7 @@ class OfflineWorker(
try { try {
val body = request.body.toRequestBody(jsonMediaType) val body = request.body.toRequestBody(jsonMediaType)
val httpRequest = Request.Builder() val httpRequest = Request.Builder()
.url("https://api.shieldai.com/${request.endpoint}") .url("https://kordant.ai/api/${request.endpoint}")
.method(request.method, body) .method(request.method, body)
.build() .build()
val response = client.newCall(httpRequest).execute() 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 android.content.Context
import kotlinx.serialization.Serializable 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.content.Context
import android.net.ConnectivityManager 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 android.content.Context
import com.shieldai.android.data.local.CacheManager import com.kordant.android.data.local.CacheManager
object DatabaseModule { object DatabaseModule {
fun initializeCache(context: Context) { 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 android.content.Context
import com.jakewharton.retrofit2.converter.kotlinx.serialization.asConverterFactory import com.jakewharton.retrofit2.converter.kotlinx.serialization.asConverterFactory
import com.shieldai.android.data.remote.AuthInterceptor import com.kordant.android.data.remote.AuthInterceptor
import com.shieldai.android.data.remote.TRPCApiService import com.kordant.android.data.remote.TRPCApiService
import kotlinx.serialization.json.Json import kotlinx.serialization.json.Json
import okhttp3.MediaType.Companion.toMediaType import okhttp3.MediaType.Companion.toMediaType
import okhttp3.OkHttpClient import okhttp3.OkHttpClient

View File

@@ -1,14 +1,14 @@
package com.shieldai.android.di package com.kordant.android.di
import android.content.Context import android.content.Context
import com.shieldai.android.data.repository.AlertRepository import com.kordant.android.data.repository.AlertRepository
import com.shieldai.android.data.repository.DarkWatchRepository import com.kordant.android.data.repository.DarkWatchRepository
import com.shieldai.android.data.repository.HomeTitleRepository import com.kordant.android.data.repository.HomeTitleRepository
import com.shieldai.android.data.repository.RemoveBrokersRepository import com.kordant.android.data.repository.RemoveBrokersRepository
import com.shieldai.android.data.repository.SpamShieldRepository import com.kordant.android.data.repository.SpamShieldRepository
import com.shieldai.android.data.repository.SubscriptionRepository import com.kordant.android.data.repository.SubscriptionRepository
import com.shieldai.android.data.repository.UserRepository import com.kordant.android.data.repository.UserRepository
import com.shieldai.android.data.repository.VoicePrintRepository import com.kordant.android.data.repository.VoicePrintRepository
object RepositoryModule { object RepositoryModule {
private var userRepository: UserRepository? = null 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 android.app.Application
import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.padding
@@ -11,8 +11,8 @@ import androidx.compose.ui.platform.LocalContext
import androidx.lifecycle.viewmodel.compose.viewModel import androidx.lifecycle.viewmodel.compose.viewModel
import androidx.navigation.compose.currentBackStackEntryAsState import androidx.navigation.compose.currentBackStackEntryAsState
import androidx.navigation.compose.rememberNavController import androidx.navigation.compose.rememberNavController
import com.shieldai.android.KordantApp import com.kordant.android.KordantApp
import com.shieldai.android.viewmodel.AuthViewModel import com.kordant.android.viewmodel.AuthViewModel
@Composable @Composable
fun AppNavigation() { 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.Icon
import androidx.compose.material3.NavigationBar import androidx.compose.material3.NavigationBar
@@ -7,7 +7,7 @@ import androidx.compose.material3.Text
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.ui.graphics.vector.ImageVector import androidx.compose.ui.graphics.vector.ImageVector
import androidx.compose.ui.res.vectorResource import androidx.compose.ui.res.vectorResource
import com.shieldai.android.R import com.kordant.android.R
data class BottomNavItem( data class BottomNavItem(
val screen: Screen, 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.Box
import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Arrangement
@@ -26,20 +26,20 @@ 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 androidx.navigation.navArgument import androidx.navigation.navArgument
import com.shieldai.android.R import com.kordant.android.R
import com.shieldai.android.ui.screens.auth.AuthScreen import com.kordant.android.ui.screens.auth.AuthScreen
import com.shieldai.android.ui.screens.auth.ForgotPasswordScreen import com.kordant.android.ui.screens.auth.ForgotPasswordScreen
import com.shieldai.android.ui.screens.auth.ResetPasswordScreen import com.kordant.android.ui.screens.auth.ResetPasswordScreen
import com.shieldai.android.ui.screens.dashboard.AlertDetailScreen import com.kordant.android.ui.screens.dashboard.AlertDetailScreen
import com.shieldai.android.ui.screens.dashboard.DashboardScreen import com.kordant.android.ui.screens.dashboard.DashboardScreen
import com.shieldai.android.ui.screens.onboarding.OnboardingScreen import com.kordant.android.ui.screens.onboarding.OnboardingScreen
import com.shieldai.android.ui.screens.services.DarkWatchScreen import com.kordant.android.ui.screens.services.DarkWatchScreen
import com.shieldai.android.ui.screens.services.HomeTitleScreen import com.kordant.android.ui.screens.services.HomeTitleScreen
import com.shieldai.android.ui.screens.services.RemoveBrokersScreen import com.kordant.android.ui.screens.services.RemoveBrokersScreen
import com.shieldai.android.ui.screens.services.SpamShieldScreen import com.kordant.android.ui.screens.services.SpamShieldScreen
import com.shieldai.android.ui.screens.services.VoicePrintScreen import com.kordant.android.ui.screens.services.VoicePrintScreen
import com.shieldai.android.ui.screens.settings.SettingsScreen import com.kordant.android.ui.screens.settings.SettingsScreen
import com.shieldai.android.viewmodel.AuthViewModel import com.kordant.android.viewmodel.AuthViewModel
data class ServiceNavCard( data class ServiceNavCard(
val title: String, val title: String,
@@ -224,7 +224,7 @@ private fun ServicesHubScreen(
) { ) {
items(services.size) { index -> items(services.size) { index ->
val service = services[index] val service = services[index]
com.shieldai.android.ui.components.ShieldCard( com.kordant.android.ui.components.ShieldCard(
onClick = { onNavigateToService(service.route) }, onClick = { onNavigateToService(service.route) },
modifier = Modifier.fillMaxWidth() modifier = Modifier.fillMaxWidth()
) { ) {
@@ -269,7 +269,7 @@ private fun AlertsScreen(
fontWeight = FontWeight.Bold, fontWeight = FontWeight.Bold,
modifier = Modifier.padding(bottom = 16.dp) modifier = Modifier.padding(bottom = 16.dp)
) )
com.shieldai.android.ui.components.ShieldEmptyState( com.kordant.android.ui.components.ShieldEmptyState(
title = "No alerts", title = "No alerts",
description = "You have no recent 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) { sealed class Screen(val route: String) {
data object Dashboard : Screen("dashboard") 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 android.content.res.Configuration
import androidx.compose.foundation.layout.Arrangement 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.text.style.TextAlign
import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import com.shieldai.android.ui.theme.KordantTheme import com.kordant.android.ui.theme.KordantTheme
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
@OptIn(ExperimentalMaterial3Api::class) @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.Canvas
import androidx.compose.foundation.background 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.dp
import androidx.compose.ui.unit.sp import androidx.compose.ui.unit.sp
import coil.compose.AsyncImage import coil.compose.AsyncImage
import com.shieldai.android.ui.theme.BrandPrimary import com.kordant.android.ui.theme.BrandPrimary
import com.shieldai.android.ui.theme.Success import com.kordant.android.ui.theme.Success
enum class AvatarSize(val dimension: Dp, val fontSize: TextUnit) { enum class AvatarSize(val dimension: Dp, val fontSize: TextUnit) {
Small(32.dp, 12.sp), 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.Row
import androidx.compose.foundation.layout.Spacer 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.Color
import androidx.compose.ui.graphics.painter.Painter import androidx.compose.ui.graphics.painter.Painter
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import com.shieldai.android.ui.theme.Error import com.kordant.android.ui.theme.Error
import com.shieldai.android.ui.theme.Info import com.kordant.android.ui.theme.Info
import com.shieldai.android.ui.theme.Success import com.kordant.android.ui.theme.Success
import com.shieldai.android.ui.theme.TextPrimaryLight import com.kordant.android.ui.theme.TextPrimaryLight
import com.shieldai.android.ui.theme.TextSecondaryLight import com.kordant.android.ui.theme.TextSecondaryLight
import com.shieldai.android.ui.theme.Warning import com.kordant.android.ui.theme.Warning
enum class BadgeVariant { enum class BadgeVariant {
Default, Success, Warning, Error, Info 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.RowScope
import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.Spacer
@@ -18,8 +18,8 @@ import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier 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 com.shieldai.android.ui.theme.BrandPrimary import com.kordant.android.ui.theme.BrandPrimary
import com.shieldai.android.ui.theme.Error import com.kordant.android.ui.theme.Error
enum class ShieldButtonVariant { enum class ShieldButtonVariant {
Primary, Secondary, Ghost, Danger 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.BorderStroke
import androidx.compose.foundation.background 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.Brush
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 com.shieldai.android.ui.theme.BrandAccent import com.kordant.android.ui.theme.BrandAccent
import com.shieldai.android.ui.theme.BrandPrimary import com.kordant.android.ui.theme.BrandPrimary
import com.shieldai.android.ui.theme.OutlineLight import com.kordant.android.ui.theme.OutlineLight
val GradientCardBrush = Brush.linearGradient( val GradientCardBrush = Brush.linearGradient(
colors = listOf( 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.Arrangement
import androidx.compose.foundation.layout.Column 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.Column
import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.Spacer
@@ -19,7 +19,7 @@ import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
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.shieldai.android.ui.theme.BrandPrimary import com.kordant.android.ui.theme.BrandPrimary
data class ModalAction( data class ModalAction(
val text: String, 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.Column
import androidx.compose.foundation.layout.fillMaxWidth 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.graphics.StrokeCap
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.shieldai.android.ui.theme.BrandAccent import com.kordant.android.ui.theme.BrandAccent
import com.shieldai.android.ui.theme.BrandPrimary import com.kordant.android.ui.theme.BrandPrimary
import com.shieldai.android.ui.theme.Error import com.kordant.android.ui.theme.Error
import com.shieldai.android.ui.theme.OutlineLight import com.kordant.android.ui.theme.OutlineLight
import com.shieldai.android.ui.theme.Success import com.kordant.android.ui.theme.Success
import com.shieldai.android.ui.theme.Warning import com.kordant.android.ui.theme.Warning
enum class ProgressColor { enum class ProgressColor {
Primary, Accent, Success, Warning, Error 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.LinearEasing
import androidx.compose.animation.core.RepeatMode 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.Brush
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 com.shieldai.android.ui.theme.OutlineLight import com.kordant.android.ui.theme.OutlineLight
@Composable @Composable
fun ShieldSkeletonLine( 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.Column
import androidx.compose.foundation.layout.fillMaxWidth 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.PasswordVisualTransformation
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.shieldai.android.ui.theme.Error import com.kordant.android.ui.theme.Error
enum class InputType { enum class InputType {
Text, Email, Password, Number, Phone 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.fillMaxWidth
import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.padding
@@ -13,11 +13,11 @@ import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier 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 com.shieldai.android.ui.theme.Error import com.kordant.android.ui.theme.Error
import com.shieldai.android.ui.theme.Info import com.kordant.android.ui.theme.Info
import com.shieldai.android.ui.theme.Success import com.kordant.android.ui.theme.Success
import com.shieldai.android.ui.theme.TextPrimaryDark import com.kordant.android.ui.theme.TextPrimaryDark
import com.shieldai.android.ui.theme.Warning import com.kordant.android.ui.theme.Warning
enum class ToastVariant { enum class ToastVariant {
Success, Error, Warning, Info 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.Canvas
import androidx.compose.foundation.layout.Column 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.DrawScope
import androidx.compose.ui.graphics.drawscope.scale import androidx.compose.ui.graphics.drawscope.scale
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import com.shieldai.android.ui.theme.Error import com.kordant.android.ui.theme.Error
import com.shieldai.android.ui.theme.Success import com.kordant.android.ui.theme.Success
import com.shieldai.android.ui.theme.Warning import com.kordant.android.ui.theme.Warning
@Composable @Composable
fun ThreatGauge( 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.Image
import androidx.compose.foundation.layout.Column 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.res.painterResource
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.shieldai.android.R import com.kordant.android.R
import com.shieldai.android.ui.components.ShieldCard import com.kordant.android.ui.components.ShieldCard
import com.shieldai.android.viewmodel.AuthViewModel import com.kordant.android.viewmodel.AuthViewModel
@Composable @Composable
fun AuthScreen( 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.content.Context
import android.security.identity.IdentityCredentialException import android.security.identity.IdentityCredentialException
@@ -79,11 +79,11 @@ fun canUseBiometric(context: Context): Boolean {
} }
fun isBiometricEnabled(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) return prefs.getBoolean("biometric_enabled", false)
} }
fun setBiometricEnabled(context: Context, enabled: Boolean) { 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() 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.Column
import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.Spacer
@@ -21,12 +21,12 @@ import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
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.shieldai.android.ui.components.InputType import com.kordant.android.ui.components.InputType
import com.shieldai.android.ui.components.ShieldButton import com.kordant.android.ui.components.ShieldButton
import com.shieldai.android.ui.components.ShieldButtonVariant import com.kordant.android.ui.components.ShieldButtonVariant
import com.shieldai.android.ui.components.ShieldCard import com.kordant.android.ui.components.ShieldCard
import com.shieldai.android.ui.components.ShieldTextField import com.kordant.android.ui.components.ShieldTextField
import com.shieldai.android.viewmodel.AuthViewModel import com.kordant.android.viewmodel.AuthViewModel
@Composable @Composable
fun ForgotPasswordScreen( 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.app.Activity
import android.content.Intent 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.GoogleSignInClient
import com.google.android.gms.auth.api.signin.GoogleSignInOptions import com.google.android.gms.auth.api.signin.GoogleSignInOptions
import com.google.android.gms.common.api.ApiException import com.google.android.gms.common.api.ApiException
import com.shieldai.android.ui.components.InputType import com.kordant.android.ui.components.InputType
import com.shieldai.android.ui.components.ShieldButton import com.kordant.android.ui.components.ShieldButton
import com.shieldai.android.ui.components.ShieldTextField import com.kordant.android.ui.components.ShieldTextField
import com.shieldai.android.ui.theme.BrandPrimary import com.kordant.android.ui.theme.BrandPrimary
import com.shieldai.android.viewmodel.AuthUiState import com.kordant.android.viewmodel.AuthUiState
import com.shieldai.android.viewmodel.AuthViewModel import com.kordant.android.viewmodel.AuthViewModel
@Composable @Composable
fun LoginScreen( fun LoginScreen(
@@ -53,7 +53,7 @@ fun LoginScreen(
val gso = remember { val gso = remember {
GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN) 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() .requestEmail()
.build() .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.Column
import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.Spacer
@@ -21,11 +21,11 @@ import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
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.shieldai.android.ui.components.InputType import com.kordant.android.ui.components.InputType
import com.shieldai.android.ui.components.ShieldButton import com.kordant.android.ui.components.ShieldButton
import com.shieldai.android.ui.components.ShieldCard import com.kordant.android.ui.components.ShieldCard
import com.shieldai.android.ui.components.ShieldTextField import com.kordant.android.ui.components.ShieldTextField
import com.shieldai.android.viewmodel.AuthViewModel import com.kordant.android.viewmodel.AuthViewModel
@Composable @Composable
fun ResetPasswordScreen( 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.Column
import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Row
@@ -19,16 +19,16 @@ import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
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.shieldai.android.ui.components.InputType import com.kordant.android.ui.components.InputType
import com.shieldai.android.ui.components.ProgressColor import com.kordant.android.ui.components.ProgressColor
import com.shieldai.android.ui.components.ShieldButton import com.kordant.android.ui.components.ShieldButton
import com.shieldai.android.ui.components.ShieldProgressBar import com.kordant.android.ui.components.ShieldProgressBar
import com.shieldai.android.ui.components.ShieldTextField import com.kordant.android.ui.components.ShieldTextField
import com.shieldai.android.util.PasswordStrength import com.kordant.android.util.PasswordStrength
import com.shieldai.android.util.calculatePasswordStrength import com.kordant.android.util.calculatePasswordStrength
import com.shieldai.android.util.passwordStrengthLabel import com.kordant.android.util.passwordStrengthLabel
import com.shieldai.android.viewmodel.AuthUiState import com.kordant.android.viewmodel.AuthUiState
import com.shieldai.android.viewmodel.AuthViewModel import com.kordant.android.viewmodel.AuthViewModel
@Composable @Composable
fun SignupScreen( 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.Arrangement
import androidx.compose.foundation.layout.Column 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.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.shieldai.android.data.model.Alert import com.kordant.android.data.model.Alert
import com.shieldai.android.ui.components.BadgeVariant import com.kordant.android.ui.components.BadgeVariant
import com.shieldai.android.ui.components.ShieldBadge import com.kordant.android.ui.components.ShieldBadge
import com.shieldai.android.ui.components.ShieldButton import com.kordant.android.ui.components.ShieldButton
import com.shieldai.android.ui.components.ShieldButtonVariant import com.kordant.android.ui.components.ShieldButtonVariant
import com.shieldai.android.ui.components.ShieldCard import com.kordant.android.ui.components.ShieldCard
import com.shieldai.android.ui.components.ShieldEmptyState import com.kordant.android.ui.components.ShieldEmptyState
import com.shieldai.android.ui.viewmodel.AlertDetailViewModel import com.kordant.android.ui.viewmodel.AlertDetailViewModel
@OptIn(ExperimentalMaterial3Api::class) @OptIn(ExperimentalMaterial3Api::class)
@Composable @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.Arrangement
import androidx.compose.foundation.layout.Box 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.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.shieldai.android.R import com.kordant.android.R
import com.shieldai.android.data.model.Alert import com.kordant.android.data.model.Alert
import com.shieldai.android.ui.components.BadgeVariant import com.kordant.android.ui.components.BadgeVariant
import com.shieldai.android.ui.components.ShieldBadge import com.kordant.android.ui.components.ShieldBadge
import com.shieldai.android.ui.components.ShieldButton import com.kordant.android.ui.components.ShieldButton
import com.shieldai.android.ui.components.ShieldButtonVariant import com.kordant.android.ui.components.ShieldButtonVariant
import com.shieldai.android.ui.components.ShieldCard import com.kordant.android.ui.components.ShieldCard
import com.shieldai.android.ui.components.ShieldEmptyState import com.kordant.android.ui.components.ShieldEmptyState
import com.shieldai.android.ui.components.ShieldSkeletonCard import com.kordant.android.ui.components.ShieldSkeletonCard
import com.shieldai.android.ui.components.ThreatGauge import com.kordant.android.ui.components.ThreatGauge
import com.shieldai.android.viewmodel.DashboardViewModel import com.kordant.android.viewmodel.DashboardViewModel
import com.shieldai.android.viewmodel.DashboardViewModel as DashboardVM import com.kordant.android.viewmodel.DashboardViewModel as DashboardVM
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
data class ServiceSummary( 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.Animatable
import androidx.compose.animation.core.tween 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.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.shieldai.android.ui.components.ShieldButton import com.kordant.android.ui.components.ShieldButton
import com.shieldai.android.ui.theme.BrandPrimary import com.kordant.android.ui.theme.BrandPrimary
import com.shieldai.android.ui.theme.Success import com.kordant.android.ui.theme.Success
@Composable @Composable
fun CompleteStep(onComplete: () -> Unit) { 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.Column
import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Row
@@ -24,10 +24,10 @@ import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
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.shieldai.android.ui.components.InputType import com.kordant.android.ui.components.InputType
import com.shieldai.android.ui.components.ShieldButton import com.kordant.android.ui.components.ShieldButton
import com.shieldai.android.ui.components.ShieldButtonVariant import com.kordant.android.ui.components.ShieldButtonVariant
import com.shieldai.android.ui.components.ShieldTextField import com.kordant.android.ui.components.ShieldTextField
@Composable @Composable
fun FamilyInviteStep( 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.Arrangement
import androidx.compose.foundation.layout.Box 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.draw.drawBehind
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 com.shieldai.android.ui.theme.BrandPrimary import com.kordant.android.ui.theme.BrandPrimary
import com.shieldai.android.viewmodel.AuthViewModel import com.kordant.android.viewmodel.AuthViewModel
@Composable @Composable
fun OnboardingScreen( 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.BorderStroke
import androidx.compose.foundation.clickable import androidx.compose.foundation.clickable
@@ -23,7 +23,7 @@ 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.shieldai.android.ui.theme.BrandPrimary import com.kordant.android.ui.theme.BrandPrimary
data class Plan( data class Plan(
val name: String, 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.Column
import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Row
@@ -24,10 +24,10 @@ import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
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.shieldai.android.ui.components.InputType import com.kordant.android.ui.components.InputType
import com.shieldai.android.ui.components.ShieldButton import com.kordant.android.ui.components.ShieldButton
import com.shieldai.android.ui.components.ShieldButtonVariant import com.kordant.android.ui.components.ShieldButtonVariant
import com.shieldai.android.ui.components.ShieldTextField import com.kordant.android.ui.components.ShieldTextField
@Composable @Composable
fun WatchlistSetupStep( 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.Arrangement
import androidx.compose.foundation.layout.Column 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.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.shieldai.android.R import com.kordant.android.R
import com.shieldai.android.ui.components.ShieldBadge import com.kordant.android.ui.components.ShieldBadge
import com.shieldai.android.ui.components.ShieldButton import com.kordant.android.ui.components.ShieldButton
import com.shieldai.android.ui.components.ShieldButtonVariant import com.kordant.android.ui.components.ShieldButtonVariant
import com.shieldai.android.ui.components.ShieldCard import com.kordant.android.ui.components.ShieldCard
import com.shieldai.android.ui.components.ShieldEmptyState import com.kordant.android.ui.components.ShieldEmptyState
import com.shieldai.android.ui.components.ShieldTextField import com.kordant.android.ui.components.ShieldTextField
import com.shieldai.android.viewmodel.DarkWatchViewModel import com.kordant.android.viewmodel.DarkWatchViewModel
@OptIn(ExperimentalMaterial3Api::class) @OptIn(ExperimentalMaterial3Api::class)
@Composable @Composable
@@ -186,7 +186,7 @@ private fun DarkWatchContent(
} }
@Composable @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()) { ShieldCard(modifier = Modifier.fillMaxWidth()) {
Row( Row(
modifier = Modifier.fillMaxWidth(), modifier = Modifier.fillMaxWidth(),
@@ -214,15 +214,15 @@ private fun WatchlistItemCard(item: com.shieldai.android.data.model.WatchlistIte
} }
ShieldBadge( ShieldBadge(
text = item.status, text = item.status,
variant = if (item.status == "active") com.shieldai.android.ui.components.BadgeVariant.Success variant = if (item.status == "active") com.kordant.android.ui.components.BadgeVariant.Success
else com.shieldai.android.ui.components.BadgeVariant.Default else com.kordant.android.ui.components.BadgeVariant.Default
) )
} }
} }
} }
@Composable @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()) { ShieldCard(modifier = Modifier.fillMaxWidth()) {
Column { Column {
Row( Row(
@@ -238,9 +238,9 @@ private fun ExposureCard(exposure: com.shieldai.android.data.model.Exposure) {
ShieldBadge( ShieldBadge(
text = exposure.severity, text = exposure.severity,
variant = when (exposure.severity.lowercase()) { variant = when (exposure.severity.lowercase()) {
"critical" -> com.shieldai.android.ui.components.BadgeVariant.Error "critical" -> com.kordant.android.ui.components.BadgeVariant.Error
"high" -> com.shieldai.android.ui.components.BadgeVariant.Warning "high" -> com.kordant.android.ui.components.BadgeVariant.Warning
else -> com.shieldai.android.ui.components.BadgeVariant.Info 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.Arrangement
import androidx.compose.foundation.layout.Column 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.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.shieldai.android.R import com.kordant.android.R
import com.shieldai.android.ui.components.BadgeVariant import com.kordant.android.ui.components.BadgeVariant
import com.shieldai.android.ui.components.ShieldBadge import com.kordant.android.ui.components.ShieldBadge
import com.shieldai.android.ui.components.ShieldButton import com.kordant.android.ui.components.ShieldButton
import com.shieldai.android.ui.components.ShieldButtonVariant import com.kordant.android.ui.components.ShieldButtonVariant
import com.shieldai.android.ui.components.ShieldCard import com.kordant.android.ui.components.ShieldCard
import com.shieldai.android.ui.components.ShieldEmptyState import com.kordant.android.ui.components.ShieldEmptyState
import com.shieldai.android.ui.components.ShieldTextField import com.kordant.android.ui.components.ShieldTextField
import com.shieldai.android.viewmodel.HomeTitleViewModel import com.kordant.android.viewmodel.HomeTitleViewModel
@OptIn(ExperimentalMaterial3Api::class) @OptIn(ExperimentalMaterial3Api::class)
@Composable @Composable
@@ -160,7 +160,7 @@ private fun HomeTitleContent(
} }
@Composable @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()) { ShieldCard(modifier = Modifier.fillMaxWidth()) {
Column { Column {
Row( 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.Arrangement
import androidx.compose.foundation.layout.Column 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.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.shieldai.android.R import com.kordant.android.R
import com.shieldai.android.ui.components.BadgeVariant import com.kordant.android.ui.components.BadgeVariant
import com.shieldai.android.ui.components.ShieldBadge import com.kordant.android.ui.components.ShieldBadge
import com.shieldai.android.ui.components.ShieldButton import com.kordant.android.ui.components.ShieldButton
import com.shieldai.android.ui.components.ShieldButtonVariant import com.kordant.android.ui.components.ShieldButtonVariant
import com.shieldai.android.ui.components.ShieldCard import com.kordant.android.ui.components.ShieldCard
import com.shieldai.android.ui.components.ShieldEmptyState import com.kordant.android.ui.components.ShieldEmptyState
import com.shieldai.android.ui.components.ShieldTextField import com.kordant.android.ui.components.ShieldTextField
import com.shieldai.android.viewmodel.RemoveBrokersViewModel import com.kordant.android.viewmodel.RemoveBrokersViewModel
@OptIn(ExperimentalMaterial3Api::class) @OptIn(ExperimentalMaterial3Api::class)
@Composable @Composable
@@ -187,7 +187,7 @@ private fun RemoveBrokersContent(
} }
@Composable @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()) { ShieldCard(modifier = Modifier.fillMaxWidth()) {
Column { Column {
Row( Row(
@@ -226,7 +226,7 @@ private fun ListingCard(listing: com.shieldai.android.data.model.BrokerListing)
} }
@Composable @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()) { ShieldCard(modifier = Modifier.fillMaxWidth()) {
Column { Column {
Row( 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.Arrangement
import androidx.compose.foundation.layout.Column 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.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.shieldai.android.R import com.kordant.android.R
import com.shieldai.android.ui.components.ShieldBadge import com.kordant.android.ui.components.ShieldBadge
import com.shieldai.android.ui.components.ShieldButton import com.kordant.android.ui.components.ShieldButton
import com.shieldai.android.ui.components.ShieldButtonVariant import com.kordant.android.ui.components.ShieldButtonVariant
import com.shieldai.android.ui.components.ShieldCard import com.kordant.android.ui.components.ShieldCard
import com.shieldai.android.ui.components.ShieldEmptyState import com.kordant.android.ui.components.ShieldEmptyState
import com.shieldai.android.ui.components.ShieldTextField import com.kordant.android.ui.components.ShieldTextField
import com.shieldai.android.viewmodel.SpamShieldViewModel import com.kordant.android.viewmodel.SpamShieldViewModel
@OptIn(ExperimentalMaterial3Api::class) @OptIn(ExperimentalMaterial3Api::class)
@Composable @Composable
@@ -224,7 +224,7 @@ private fun StatCard(
@Composable @Composable
private fun RuleCard( private fun RuleCard(
rule: com.shieldai.android.data.model.SpamRule, rule: com.kordant.android.data.model.SpamRule,
onToggle: (Boolean) -> Unit onToggle: (Boolean) -> Unit
) { ) {
ShieldCard(modifier = Modifier.fillMaxWidth()) { ShieldCard(modifier = Modifier.fillMaxWidth()) {
@@ -244,13 +244,13 @@ private fun RuleCard(
) { ) {
ShieldBadge( ShieldBadge(
text = rule.action, text = rule.action,
variant = if (rule.action == "block") com.shieldai.android.ui.components.BadgeVariant.Error variant = if (rule.action == "block") com.kordant.android.ui.components.BadgeVariant.Error
else com.shieldai.android.ui.components.BadgeVariant.Warning else com.kordant.android.ui.components.BadgeVariant.Warning
) )
if (rule.priority > 0) { if (rule.priority > 0) {
ShieldBadge( ShieldBadge(
text = "P${rule.priority}", 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.Arrangement
import androidx.compose.foundation.layout.Column 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.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.shieldai.android.R import com.kordant.android.R
import com.shieldai.android.ui.components.BadgeVariant import com.kordant.android.ui.components.BadgeVariant
import com.shieldai.android.ui.components.ShieldBadge import com.kordant.android.ui.components.ShieldBadge
import com.shieldai.android.ui.components.ShieldButton import com.kordant.android.ui.components.ShieldButton
import com.shieldai.android.ui.components.ShieldButtonVariant import com.kordant.android.ui.components.ShieldButtonVariant
import com.shieldai.android.ui.components.ShieldCard import com.kordant.android.ui.components.ShieldCard
import com.shieldai.android.ui.components.ShieldEmptyState import com.kordant.android.ui.components.ShieldEmptyState
import com.shieldai.android.ui.components.ShieldTextField import com.kordant.android.ui.components.ShieldTextField
import com.shieldai.android.viewmodel.VoicePrintViewModel import com.kordant.android.viewmodel.VoicePrintViewModel
@OptIn(ExperimentalMaterial3Api::class) @OptIn(ExperimentalMaterial3Api::class)
@Composable @Composable
@@ -160,7 +160,7 @@ private fun VoicePrintContent(
} }
@Composable @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()) { ShieldCard(modifier = Modifier.fillMaxWidth()) {
Column { Column {
Row( 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.clickable
import androidx.compose.foundation.layout.Arrangement 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.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.shieldai.android.ui.components.ShieldAvatar import com.kordant.android.ui.components.ShieldAvatar
import com.shieldai.android.ui.components.ShieldBadge import com.kordant.android.ui.components.ShieldBadge
import com.shieldai.android.ui.components.ShieldButton import com.kordant.android.ui.components.ShieldButton
import com.shieldai.android.ui.components.ShieldButtonVariant import com.kordant.android.ui.components.ShieldButtonVariant
import com.shieldai.android.ui.components.ShieldCard import com.kordant.android.ui.components.ShieldCard
import com.shieldai.android.ui.components.ShieldEmptyState import com.kordant.android.ui.components.ShieldEmptyState
import com.shieldai.android.viewmodel.AuthViewModel import com.kordant.android.viewmodel.AuthViewModel
import com.shieldai.android.viewmodel.SettingsViewModel import com.kordant.android.viewmodel.SettingsViewModel
@OptIn(ExperimentalMaterial3Api::class) @OptIn(ExperimentalMaterial3Api::class)
@Composable @Composable
@@ -184,7 +184,7 @@ private fun SettingsContent(
} }
@Composable @Composable
private fun AccountSection(user: com.shieldai.android.data.model.User) { private fun AccountSection(user: com.kordant.android.data.model.User) {
Column { Column {
Text( Text(
text = "Account", text = "Account",
@@ -214,10 +214,10 @@ private fun AccountSection(user: com.shieldai.android.data.model.User) {
) )
Row(horizontalArrangement = Arrangement.spacedBy(8.dp)) { Row(horizontalArrangement = Arrangement.spacedBy(8.dp)) {
if (user.emailVerified) { 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) { 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 @Composable
private fun SubscriptionSection( private fun SubscriptionSection(
subscription: com.shieldai.android.data.model.Subscription?, subscription: com.kordant.android.data.model.Subscription?,
onUpgrade: () -> Unit onUpgrade: () -> Unit
) { ) {
Column { Column {
@@ -260,7 +260,7 @@ private fun SubscriptionSection(
text = "Upgrade", text = "Upgrade",
onClick = onUpgrade, onClick = onUpgrade,
variant = ShieldButtonVariant.Secondary, 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 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.foundation.shape.RoundedCornerShape
import androidx.compose.material3.Shapes 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 android.os.Build
import androidx.compose.foundation.isSystemInDarkTheme 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.material3.Typography
import androidx.compose.ui.text.TextStyle 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 androidx.compose.ui.graphics.Color
import com.shieldai.android.ui.theme.Error import com.kordant.android.ui.theme.Error
import com.shieldai.android.ui.theme.Success import com.kordant.android.ui.theme.Success
import com.shieldai.android.ui.theme.Warning import com.kordant.android.ui.theme.Warning
enum class PasswordStrength { enum class PasswordStrength {
WEAK, FAIR, STRONG, VERY_STRONG 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.ViewModel
import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.ViewModelProvider
import androidx.lifecycle.viewModelScope import androidx.lifecycle.viewModelScope
import com.shieldai.android.KordantApp import com.kordant.android.KordantApp
import com.shieldai.android.data.model.Alert import com.kordant.android.data.model.Alert
import com.shieldai.android.data.repository.AlertRepository import com.kordant.android.data.repository.AlertRepository
import com.shieldai.android.di.RepositoryModule import com.kordant.android.di.RepositoryModule
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
@@ -33,7 +33,7 @@ class AlertDetailViewModel : ViewModel() {
_uiState.value = _uiState.value.copy(isLoading = true, error = null) _uiState.value = _uiState.value.copy(isLoading = true, error = null)
try { try {
val result = alertRepo.getAlerts() 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 alert = result.data.find { it.id == alertId }
val correlated = alert?.let { val correlated = alert?.let {
result.data.filter { a -> 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.ViewModel
import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.ViewModelProvider
import androidx.lifecycle.viewModelScope import androidx.lifecycle.viewModelScope
import com.shieldai.android.KordantApp import com.kordant.android.KordantApp
import com.shieldai.android.data.repository.AuthRepository import com.kordant.android.data.repository.AuthRepository
import com.shieldai.android.data.repository.AuthRepositoryImpl import com.kordant.android.data.repository.AuthRepositoryImpl
import com.shieldai.android.data.repository.User import com.kordant.android.data.repository.User
import com.shieldai.android.util.calculatePasswordStrength import com.kordant.android.util.calculatePasswordStrength
import com.shieldai.android.util.passwordStrengthProgress import com.kordant.android.util.passwordStrengthProgress
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,13 +1,13 @@
package com.shieldai.android.viewmodel package com.kordant.android.viewmodel
import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModel
import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.ViewModelProvider
import androidx.lifecycle.viewModelScope import androidx.lifecycle.viewModelScope
import com.shieldai.android.KordantApp import com.kordant.android.KordantApp
import com.shieldai.android.data.model.Exposure import com.kordant.android.data.model.Exposure
import com.shieldai.android.data.model.WatchlistItem import com.kordant.android.data.model.WatchlistItem
import com.shieldai.android.data.repository.DarkWatchRepository import com.kordant.android.data.repository.DarkWatchRepository
import com.shieldai.android.di.RepositoryModule import com.kordant.android.di.RepositoryModule
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
@@ -44,11 +44,11 @@ class DarkWatchViewModel : ViewModel() {
val watchlistResult = repo.getWatchlist(forceRefresh) val watchlistResult = repo.getWatchlist(forceRefresh)
val exposuresResult = repo.getExposures(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 watchlistResult.data
} else emptyList() } 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 exposuresResult.data
} else emptyList() } else emptyList()
@@ -70,7 +70,7 @@ class DarkWatchViewModel : ViewModel() {
viewModelScope.launch { viewModelScope.launch {
_uiState.value = _uiState.value.copy(isAdding = true, error = null) _uiState.value = _uiState.value.copy(isAdding = true, error = null)
val result = repo.addWatchlistItem(type, value, label) 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( _uiState.value = _uiState.value.copy(
isAdding = false, isAdding = false,
error = result.message 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.ViewModel
import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.ViewModelProvider
import androidx.lifecycle.viewModelScope import androidx.lifecycle.viewModelScope
import com.shieldai.android.KordantApp import com.kordant.android.KordantApp
import com.shieldai.android.data.model.Alert import com.kordant.android.data.model.Alert
import com.shieldai.android.data.repository.AlertRepository import com.kordant.android.data.repository.AlertRepository
import com.shieldai.android.data.repository.DarkWatchRepository import com.kordant.android.data.repository.DarkWatchRepository
import com.shieldai.android.data.repository.HomeTitleRepository import com.kordant.android.data.repository.HomeTitleRepository
import com.shieldai.android.data.repository.RemoveBrokersRepository import com.kordant.android.data.repository.RemoveBrokersRepository
import com.shieldai.android.data.repository.SpamShieldRepository import com.kordant.android.data.repository.SpamShieldRepository
import com.shieldai.android.data.repository.VoicePrintRepository import com.kordant.android.data.repository.VoicePrintRepository
import com.shieldai.android.di.RepositoryModule import com.kordant.android.di.RepositoryModule
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
@@ -74,27 +74,27 @@ class DashboardViewModel : ViewModel() {
val removalsResult = removeBrokersRepo.getRemovalRequests() val removalsResult = removeBrokersRepo.getRemovalRequests()
val alerts = when (alertsResult) { 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() else -> emptyList()
} }
val watchlist = when (watchlistResult) { 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() else -> emptyList()
} }
val enrollments = when (enrollmentsResult) { 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() else -> emptyList()
} }
val rules = when (rulesResult) { 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() else -> emptyList()
} }
val properties = when (propertiesResult) { 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() else -> emptyList()
} }
val removals = when (removalsResult) { 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() 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.ViewModel
import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.ViewModelProvider
import androidx.lifecycle.viewModelScope import androidx.lifecycle.viewModelScope
import com.shieldai.android.KordantApp import com.kordant.android.KordantApp
import com.shieldai.android.data.model.Property import com.kordant.android.data.model.Property
import com.shieldai.android.data.repository.HomeTitleRepository import com.kordant.android.data.repository.HomeTitleRepository
import com.shieldai.android.di.RepositoryModule import com.kordant.android.di.RepositoryModule
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
@@ -40,7 +40,7 @@ class HomeTitleViewModel : ViewModel() {
_uiState.value = _uiState.value.copy(isLoading = !forceRefresh, error = null) _uiState.value = _uiState.value.copy(isLoading = !forceRefresh, error = null)
try { try {
val result = repo.getProperties(forceRefresh) 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( _uiState.value = _uiState.value.copy(
isLoading = false, isLoading = false,
properties = result.data properties = result.data
@@ -61,7 +61,7 @@ class HomeTitleViewModel : ViewModel() {
viewModelScope.launch { viewModelScope.launch {
_uiState.value = _uiState.value.copy(isAdding = true, error = null) _uiState.value = _uiState.value.copy(isAdding = true, error = null)
val result = repo.addProperty(address, type) 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( _uiState.value = _uiState.value.copy(
isAdding = false, isAdding = false,
error = result.message 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.ViewModel
import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.ViewModelProvider
import androidx.lifecycle.viewModelScope import androidx.lifecycle.viewModelScope
import com.shieldai.android.KordantApp import com.kordant.android.KordantApp
import com.shieldai.android.data.model.BrokerListing import com.kordant.android.data.model.BrokerListing
import com.shieldai.android.data.model.RemovalRequest import com.kordant.android.data.model.RemovalRequest
import com.shieldai.android.data.repository.RemoveBrokersRepository import com.kordant.android.data.repository.RemoveBrokersRepository
import com.shieldai.android.di.RepositoryModule import com.kordant.android.di.RepositoryModule
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
@@ -44,11 +44,11 @@ class RemoveBrokersViewModel : ViewModel() {
val listingsResult = repo.getListings(forceRefresh) val listingsResult = repo.getListings(forceRefresh)
val requestsResult = repo.getRemovalRequests(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 listingsResult.data
} else emptyList() } 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 requestsResult.data
} else emptyList() } else emptyList()
@@ -70,7 +70,7 @@ class RemoveBrokersViewModel : ViewModel() {
viewModelScope.launch { viewModelScope.launch {
_uiState.value = _uiState.value.copy(isCreating = true, error = null) _uiState.value = _uiState.value.copy(isCreating = true, error = null)
val result = repo.createRemovalRequest(listingId, notes) 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( _uiState.value = _uiState.value.copy(
isCreating = false, isCreating = false,
error = result.message 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.ViewModel
import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.ViewModelProvider
import androidx.lifecycle.viewModelScope import androidx.lifecycle.viewModelScope
import com.shieldai.android.KordantApp import com.kordant.android.KordantApp
import com.shieldai.android.data.model.Subscription import com.kordant.android.data.model.Subscription
import com.shieldai.android.data.model.User import com.kordant.android.data.model.User
import com.shieldai.android.data.repository.SubscriptionRepository import com.kordant.android.data.repository.SubscriptionRepository
import com.shieldai.android.data.repository.UserRepository import com.kordant.android.data.repository.UserRepository
import com.shieldai.android.di.RepositoryModule import com.kordant.android.di.RepositoryModule
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
@@ -50,11 +50,11 @@ class SettingsViewModel : ViewModel() {
val userResult = userRepo.getMe(forceRefresh) val userResult = userRepo.getMe(forceRefresh)
val subResult = subscriptionRepo.getSubscription() 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 userResult.data
} else null } 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 subResult.data
} else null } 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.ViewModel
import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.ViewModelProvider
import androidx.lifecycle.viewModelScope import androidx.lifecycle.viewModelScope
import com.shieldai.android.KordantApp import com.kordant.android.KordantApp
import com.shieldai.android.data.model.SpamRule import com.kordant.android.data.model.SpamRule
import com.shieldai.android.data.repository.SpamShieldRepository import com.kordant.android.data.repository.SpamShieldRepository
import com.shieldai.android.di.RepositoryModule import com.kordant.android.di.RepositoryModule
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
@@ -43,7 +43,7 @@ class SpamShieldViewModel : ViewModel() {
_uiState.value = _uiState.value.copy(isLoading = !forceRefresh, error = null) _uiState.value = _uiState.value.copy(isLoading = !forceRefresh, error = null)
try { try {
val result = repo.getRules(forceRefresh) 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() val stats = repo.getStats()
_uiState.value = _uiState.value.copy( _uiState.value = _uiState.value.copy(
isLoading = false, isLoading = false,
@@ -68,7 +68,7 @@ class SpamShieldViewModel : ViewModel() {
viewModelScope.launch { viewModelScope.launch {
_uiState.value = _uiState.value.copy(isCreating = true, error = null) _uiState.value = _uiState.value.copy(isCreating = true, error = null)
val result = repo.createRule(pattern, action, description) 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( _uiState.value = _uiState.value.copy(
isCreating = false, isCreating = false,
error = result.message 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.ViewModel
import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.ViewModelProvider
import androidx.lifecycle.viewModelScope import androidx.lifecycle.viewModelScope
import com.shieldai.android.KordantApp import com.kordant.android.KordantApp
import com.shieldai.android.data.model.VoiceEnrollment import com.kordant.android.data.model.VoiceEnrollment
import com.shieldai.android.data.repository.VoicePrintRepository import com.kordant.android.data.repository.VoicePrintRepository
import com.shieldai.android.di.RepositoryModule import com.kordant.android.di.RepositoryModule
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
@@ -44,7 +44,7 @@ class VoicePrintViewModel : ViewModel() {
} else { } else {
repo.getEnrollments() 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( _uiState.value = _uiState.value.copy(
isLoading = false, isLoading = false,
enrollments = result.data enrollments = result.data
@@ -65,7 +65,7 @@ class VoicePrintViewModel : ViewModel() {
viewModelScope.launch { viewModelScope.launch {
_uiState.value = _uiState.value.copy(isEnrolling = true, error = null) _uiState.value = _uiState.value.copy(isEnrolling = true, error = null)
val result = repo.createEnrollment(name) 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( _uiState.value = _uiState.value.copy(
isEnrolling = false, isEnrolling = false,
error = result.message 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.kordant.android.data.model.Alert
import com.shieldai.android.data.model.Exposure import com.kordant.android.data.model.Exposure
import com.shieldai.android.data.model.WatchlistItem import com.kordant.android.data.model.WatchlistItem
import com.shieldai.android.data.repository.AlertRepository import com.kordant.android.data.repository.AlertRepository
import com.shieldai.android.data.repository.DarkWatchRepository import com.kordant.android.data.repository.DarkWatchRepository
import com.shieldai.android.data.repository.HomeTitleRepository import com.kordant.android.data.repository.HomeTitleRepository
import com.shieldai.android.data.repository.RemoveBrokersRepository import com.kordant.android.data.repository.RemoveBrokersRepository
import com.shieldai.android.data.repository.SpamShieldRepository import com.kordant.android.data.repository.SpamShieldRepository
import com.shieldai.android.data.repository.SubscriptionRepository import com.kordant.android.data.repository.SubscriptionRepository
import com.shieldai.android.data.repository.UserRepository import com.kordant.android.data.repository.UserRepository
import com.shieldai.android.data.repository.VoicePrintRepository import com.kordant.android.data.repository.VoicePrintRepository
import com.shieldai.android.data.remote.ApiResult import com.kordant.android.data.remote.ApiResult
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.test.StandardTestDispatcher import kotlinx.coroutines.test.StandardTestDispatcher

View File

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

View File

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