Implement token cashing
Fix theme
This commit is contained in:
parent
0d24787c17
commit
64dddb4495
@ -11,7 +11,7 @@ import retrofit2.http.PUT
|
|||||||
import retrofit2.http.Query
|
import retrofit2.http.Query
|
||||||
|
|
||||||
interface RetrofitApi {
|
interface RetrofitApi {
|
||||||
@GET("employee/admin/auth")
|
@GET("employee/auth")
|
||||||
fun auth(@Header("Authorization") token: String): Call<ResponseBody>
|
fun auth(@Header("Authorization") token: String): Call<ResponseBody>
|
||||||
|
|
||||||
@GET("employee/info")
|
@GET("employee/info")
|
||||||
|
@ -12,5 +12,4 @@ class LoginUseCase @Inject constructor(private val domainRepositoryImpl: DomainR
|
|||||||
suspend fun auth(email: String, password: String): LoginResult {
|
suspend fun auth(email: String, password: String): LoginResult {
|
||||||
return domainRepositoryImpl.auth(email, password)
|
return domainRepositoryImpl.auth(email, password)
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
@ -0,0 +1,10 @@
|
|||||||
|
package com.nto.domain.usecase
|
||||||
|
|
||||||
|
import com.nto.domain.repository.DomainRepositoryImpl
|
||||||
|
import javax.inject.Inject
|
||||||
|
|
||||||
|
class SplashScreenUseCase @Inject constructor(private val domainRepositoryImpl: DomainRepositoryImpl) {
|
||||||
|
suspend fun getToken(): String? {
|
||||||
|
return domainRepositoryImpl.getToken()
|
||||||
|
}
|
||||||
|
}
|
@ -1,42 +1,48 @@
|
|||||||
package com.nto.presentation
|
package com.nto.presentation
|
||||||
|
|
||||||
import android.app.Activity
|
|
||||||
import android.os.Build
|
|
||||||
import android.os.Bundle
|
import android.os.Bundle
|
||||||
import android.view.WindowInsets
|
|
||||||
import androidx.activity.ComponentActivity
|
import androidx.activity.ComponentActivity
|
||||||
import androidx.activity.compose.LocalActivity
|
|
||||||
import androidx.activity.compose.setContent
|
import androidx.activity.compose.setContent
|
||||||
import androidx.activity.enableEdgeToEdge
|
import androidx.activity.viewModels
|
||||||
import androidx.compose.foundation.layout.fillMaxSize
|
import androidx.compose.foundation.layout.fillMaxSize
|
||||||
import androidx.compose.foundation.layout.padding
|
import androidx.compose.foundation.layout.padding
|
||||||
import androidx.compose.material3.OutlinedButton
|
|
||||||
import androidx.compose.material3.Scaffold
|
import androidx.compose.material3.Scaffold
|
||||||
|
import androidx.compose.runtime.collectAsState
|
||||||
import androidx.compose.ui.Modifier
|
import androidx.compose.ui.Modifier
|
||||||
|
import androidx.compose.ui.graphics.Color
|
||||||
import androidx.compose.ui.graphics.toArgb
|
import androidx.compose.ui.graphics.toArgb
|
||||||
import androidx.compose.ui.platform.LocalContext
|
import androidx.hilt.navigation.compose.hiltViewModel
|
||||||
import androidx.navigation.compose.rememberNavController
|
import androidx.navigation.compose.rememberNavController
|
||||||
import com.nto.presentation.composable.Navigation
|
import com.nto.presentation.composable.Navigation
|
||||||
|
import com.nto.presentation.screens.splashScreen.SplashScreenViewModel
|
||||||
import com.nto.presentation.theme.NTOTheme
|
import com.nto.presentation.theme.NTOTheme
|
||||||
|
import com.nto.presentation.theme.TextColor
|
||||||
import dagger.hilt.android.AndroidEntryPoint
|
import dagger.hilt.android.AndroidEntryPoint
|
||||||
|
|
||||||
|
|
||||||
@AndroidEntryPoint
|
@AndroidEntryPoint
|
||||||
class MainActivity : ComponentActivity() {
|
class MainActivity : ComponentActivity() {
|
||||||
|
val viewmodel by viewModels<SplashScreenViewModel>()
|
||||||
|
|
||||||
override fun onCreate(savedInstanceState: Bundle?) {
|
override fun onCreate(savedInstanceState: Bundle?) {
|
||||||
super.onCreate(savedInstanceState)
|
super.onCreate(savedInstanceState)
|
||||||
setContent {
|
this.window.statusBarColor = TextColor.toArgb()
|
||||||
NTOTheme {
|
viewmodel.checkLogin().apply {
|
||||||
//XML SUCKS! We use Jetpack Compose btw :>
|
setContent {
|
||||||
this.window.statusBarColor = NTOTheme.colors.primaryText.toArgb()
|
NTOTheme {
|
||||||
Scaffold(modifier = Modifier.fillMaxSize()) { innerPadding ->
|
//XML SUCKS! We use Jetpack Compose btw :>
|
||||||
val navController = rememberNavController()
|
val state = viewmodel.state.collectAsState().value
|
||||||
Navigation(
|
|
||||||
navController = navController,
|
Scaffold(modifier = Modifier.fillMaxSize()) { innerPadding ->
|
||||||
modifier = Modifier
|
val navController = rememberNavController()
|
||||||
.padding(innerPadding)
|
Navigation(
|
||||||
.fillMaxSize()
|
navController = navController,
|
||||||
)
|
modifier = Modifier
|
||||||
|
.padding(innerPadding)
|
||||||
|
.fillMaxSize(),
|
||||||
|
skipAuth = state.skipAuth
|
||||||
|
)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -11,11 +11,11 @@ import com.nto.presentation.screens.profileScreen.ProfileScreen
|
|||||||
import com.nto.presentation.screens.scanResult.ScanResultScreen
|
import com.nto.presentation.screens.scanResult.ScanResultScreen
|
||||||
|
|
||||||
@Composable
|
@Composable
|
||||||
fun Navigation(navController: NavHostController, modifier: Modifier = Modifier) {
|
fun Navigation(navController: NavHostController, skipAuth: Boolean, modifier: Modifier = Modifier) {
|
||||||
NavHost(
|
NavHost(
|
||||||
navController = navController,
|
navController = navController,
|
||||||
modifier = modifier,
|
modifier = modifier,
|
||||||
startDestination = Destinations.Login
|
startDestination = if (skipAuth) Destinations.Profile else Destinations.Login
|
||||||
) {
|
) {
|
||||||
composable<Destinations.Login> {
|
composable<Destinations.Login> {
|
||||||
LoginScreen(navController)
|
LoginScreen(navController)
|
||||||
|
@ -20,7 +20,6 @@ import androidx.compose.ui.Alignment
|
|||||||
import androidx.compose.ui.Modifier
|
import androidx.compose.ui.Modifier
|
||||||
import androidx.compose.ui.draw.clip
|
import androidx.compose.ui.draw.clip
|
||||||
import androidx.compose.ui.layout.ContentScale
|
import androidx.compose.ui.layout.ContentScale
|
||||||
import androidx.compose.ui.res.colorResource
|
|
||||||
import androidx.compose.ui.res.painterResource
|
import androidx.compose.ui.res.painterResource
|
||||||
import androidx.compose.ui.res.stringResource
|
import androidx.compose.ui.res.stringResource
|
||||||
import androidx.compose.ui.text.font.FontWeight
|
import androidx.compose.ui.text.font.FontWeight
|
||||||
|
@ -18,7 +18,9 @@ import kotlinx.coroutines.launch
|
|||||||
import javax.inject.Inject
|
import javax.inject.Inject
|
||||||
|
|
||||||
@HiltViewModel
|
@HiltViewModel
|
||||||
class LoginViewModel @Inject constructor(private val useCase: LoginUseCase, @ApplicationContext private val context: Context) : ViewModel() {
|
class LoginViewModel @Inject constructor(
|
||||||
|
private val useCase: LoginUseCase, @ApplicationContext private val context: Context
|
||||||
|
) : ViewModel() {
|
||||||
private val _state = MutableStateFlow(LoginScreenState())
|
private val _state = MutableStateFlow(LoginScreenState())
|
||||||
|
|
||||||
val state: StateFlow<LoginScreenState>
|
val state: StateFlow<LoginScreenState>
|
||||||
@ -52,7 +54,7 @@ class LoginViewModel @Inject constructor(private val useCase: LoginUseCase, @App
|
|||||||
if (result.successful) {
|
if (result.successful) {
|
||||||
Dispatchers.Main {
|
Dispatchers.Main {
|
||||||
navController.navigate(Destinations.Profile) {
|
navController.navigate(Destinations.Profile) {
|
||||||
popUpTo<Destinations.Login>() {
|
popUpTo<Destinations.Login> {
|
||||||
inclusive = true
|
inclusive = true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -16,18 +16,22 @@ data class ProfileState(
|
|||||||
var job: String = "",
|
var job: String = "",
|
||||||
var isUnauthorized: Boolean = false,
|
var isUnauthorized: Boolean = false,
|
||||||
val visits: List<VisitCardDTO> = listOf()
|
val visits: List<VisitCardDTO> = listOf()
|
||||||
){
|
) {
|
||||||
fun deserialize(o: UserDTO, context: Context){
|
fun deserialize(o: UserDTO, context: Context) {
|
||||||
val dateFormat = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")
|
val dateFormat = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")
|
||||||
this.firstName = o.firstName
|
this.firstName = o.firstName
|
||||||
this.secondName = o.secondName
|
this.secondName = o.secondName
|
||||||
this.thirdName = o.thirdName
|
this.thirdName = o.thirdName
|
||||||
this.lastOpen = o.lastVisit.format(dateFormat)
|
this.lastOpen = try {
|
||||||
|
o.lastVisit.format(dateFormat)
|
||||||
|
} catch (e: NullPointerException) {
|
||||||
|
"Exception!"
|
||||||
|
}
|
||||||
this.job = translatePosition(o.position, context)
|
this.job = translatePosition(o.position, context)
|
||||||
this.isUnauthorized = o.isUnauthorized
|
this.isUnauthorized = o.isUnauthorized
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun translatePosition(position: Position, context:Context): String {
|
private fun translatePosition(position: Position, context: Context): String {
|
||||||
return when (position) {
|
return when (position) {
|
||||||
Position.TESTER -> context.getString(R.string.label_tester)
|
Position.TESTER -> context.getString(R.string.label_tester)
|
||||||
Position.DEVELOPER -> context.getString(R.string.label_developer)
|
Position.DEVELOPER -> context.getString(R.string.label_developer)
|
||||||
|
@ -0,0 +1,5 @@
|
|||||||
|
package com.nto.presentation.screens.splashScreen
|
||||||
|
|
||||||
|
data class SplashScreenState(
|
||||||
|
val skipAuth: Boolean = false
|
||||||
|
)
|
@ -0,0 +1,31 @@
|
|||||||
|
package com.nto.presentation.screens.splashScreen
|
||||||
|
|
||||||
|
import androidx.lifecycle.ViewModel
|
||||||
|
import androidx.lifecycle.viewModelScope
|
||||||
|
import com.nto.domain.usecase.SplashScreenUseCase
|
||||||
|
import dagger.hilt.android.lifecycle.HiltViewModel
|
||||||
|
import kotlinx.coroutines.Dispatchers
|
||||||
|
import kotlinx.coroutines.flow.MutableStateFlow
|
||||||
|
import kotlinx.coroutines.flow.StateFlow
|
||||||
|
import kotlinx.coroutines.flow.asStateFlow
|
||||||
|
import kotlinx.coroutines.launch
|
||||||
|
import javax.inject.Inject
|
||||||
|
|
||||||
|
@HiltViewModel
|
||||||
|
class SplashScreenViewModel @Inject constructor(private val useCase: SplashScreenUseCase) : ViewModel(){
|
||||||
|
private val _state = MutableStateFlow(
|
||||||
|
SplashScreenState()
|
||||||
|
)
|
||||||
|
|
||||||
|
val state: StateFlow<SplashScreenState>
|
||||||
|
get() = _state.asStateFlow()
|
||||||
|
|
||||||
|
fun checkLogin(){
|
||||||
|
viewModelScope.launch(Dispatchers.IO) {
|
||||||
|
val token = useCase.getToken()
|
||||||
|
if (!token.isNullOrBlank()){
|
||||||
|
_state.tryEmit(_state.value.copy(skipAuth = true))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -12,6 +12,7 @@ val Green = Color(0xFF738D73)
|
|||||||
val GreenDisabled = Color(0xFFCAD5CA)
|
val GreenDisabled = Color(0xFFCAD5CA)
|
||||||
val Error = Color(0xFFD28989)
|
val Error = Color(0xFFD28989)
|
||||||
val Warning = Color(0xFFCFC37F)
|
val Warning = Color(0xFFCFC37F)
|
||||||
|
val TextColor = Color(0xFF211A1D)
|
||||||
|
|
||||||
@Immutable
|
@Immutable
|
||||||
data class AppColors(
|
data class AppColors(
|
||||||
@ -51,7 +52,7 @@ val extendedColor = AppColors(
|
|||||||
secondaryBackground = Color.Black,
|
secondaryBackground = Color.Black,
|
||||||
inputFieldBackground = BoxGray,
|
inputFieldBackground = BoxGray,
|
||||||
disabledText = TextGray,
|
disabledText = TextGray,
|
||||||
primaryText = Color.Black,
|
primaryText = TextColor,
|
||||||
secondaryText = Color.White,
|
secondaryText = Color.White,
|
||||||
button = Green,
|
button = Green,
|
||||||
buttonDisabled = GreenDisabled,
|
buttonDisabled = GreenDisabled,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user