Skip to content

Commit

Permalink
Update project
Browse files Browse the repository at this point in the history
  • Loading branch information
michaelbel committed Mar 16, 2024
1 parent 8f1cb44 commit 6cfc90f
Show file tree
Hide file tree
Showing 8 changed files with 78 additions and 18 deletions.
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
package org.michaelbel.movies.interactor

import org.michaelbel.movies.interactor.entity.Password
import org.michaelbel.movies.interactor.entity.Username
import org.michaelbel.movies.network.model.Session
import org.michaelbel.movies.network.model.Token

Expand All @@ -8,8 +10,8 @@ interface AuthenticationInteractor {
suspend fun createRequestToken(loginViaTmdb: Boolean): Token

suspend fun createSessionWithLogin(
username: String,
password: String,
username: Username,
password: Password,
requestToken: String
): Token

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package org.michaelbel.movies.interactor.entity

@JvmInline
value class Password(
val value: String
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package org.michaelbel.movies.interactor.entity

@JvmInline
value class Username(
val value: String
)
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@ import javax.inject.Singleton
import kotlinx.coroutines.withContext
import org.michaelbel.movies.common.dispatchers.MoviesDispatchers
import org.michaelbel.movies.interactor.AuthenticationInteractor
import org.michaelbel.movies.interactor.entity.Password
import org.michaelbel.movies.interactor.entity.Username
import org.michaelbel.movies.network.model.Session
import org.michaelbel.movies.network.model.Token
import org.michaelbel.movies.repository.AuthenticationRepository
Expand All @@ -20,12 +22,12 @@ internal class AuthenticationInteractorImpl @Inject constructor(
}

override suspend fun createSessionWithLogin(
username: String,
password: String,
username: Username,
password: Password,
requestToken: String
): Token {
return withContext(dispatchers.io) {
authenticationRepository.createSessionWithLogin(username, password, requestToken)
authenticationRepository.createSessionWithLogin(username.value, password.value, requestToken)
}
}

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package org.michaelbel.movies.interactor.ktx

import androidx.compose.runtime.MutableState
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.saveable.Saver
import org.michaelbel.movies.interactor.entity.Password

val Password.isNotEmpty: Boolean
get() = value.isNotEmpty()

val Password.trim: Password
get() = Password(value.trim())

val PasswordSaver: Saver<MutableState<Password>, String>
get() = Saver(
save = { it.value.value },
restore = { mutableStateOf(Password(it)) }
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package org.michaelbel.movies.interactor.ktx

import androidx.compose.runtime.MutableState
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.saveable.Saver
import org.michaelbel.movies.interactor.entity.Username

val Username.isNotEmpty: Boolean
get() = value.isNotEmpty()

val Username.trim: Username
get() = Username(value.trim())

val UsernameSaver: Saver<MutableState<Username>, String>
get() = Saver(
save = { it.value.value },
restore = { mutableStateOf(Username(it)) }
)
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,8 @@ import org.michaelbel.movies.common.exceptions.CreateSessionException
import org.michaelbel.movies.common.exceptions.CreateSessionWithLoginException
import org.michaelbel.movies.common.viewmodel.BaseViewModel
import org.michaelbel.movies.interactor.Interactor
import org.michaelbel.movies.interactor.entity.Password
import org.michaelbel.movies.interactor.entity.Username

@HiltViewModel
class AuthViewModel @Inject constructor(
Expand Down Expand Up @@ -40,7 +42,7 @@ class AuthViewModel @Inject constructor(
}
}

fun onSignInClick(username: String, password: String, onResult: () -> Unit) = launch {
fun onSignInClick(username: Username, password: Password, onResult: () -> Unit) = launch {
error = null
signInLoading = true
val token = interactor.createRequestToken(loginViaTmdb = false)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,12 @@ import org.michaelbel.movies.auth_impl.R
import org.michaelbel.movies.common.browser.openUrl
import org.michaelbel.movies.common.exceptions.CreateSessionWithLoginException
import org.michaelbel.movies.common.theme.AppTheme
import org.michaelbel.movies.interactor.entity.Password
import org.michaelbel.movies.interactor.entity.Username
import org.michaelbel.movies.interactor.ktx.PasswordSaver
import org.michaelbel.movies.interactor.ktx.UsernameSaver
import org.michaelbel.movies.interactor.ktx.isNotEmpty
import org.michaelbel.movies.interactor.ktx.trim
import org.michaelbel.movies.network.TMDB_AUTH_REDIRECT_URL
import org.michaelbel.movies.network.TMDB_AUTH_URL
import org.michaelbel.movies.network.TMDB_PRIVACY_POLICY
Expand Down Expand Up @@ -91,7 +97,7 @@ internal fun AuthScreenContent(
loginLoading: Boolean,
requestToken: String?,
onBackClick: () -> Unit,
onSignInClick: (String, String) -> Unit,
onSignInClick: (Username, Password) -> Unit,
onLoginClick: () -> Unit,
onResetRequestToken: () -> Unit,
modifier: Modifier = Modifier
Expand All @@ -102,8 +108,8 @@ internal fun AuthScreenContent(
val focusManager = LocalFocusManager.current
val scrollState = rememberScrollState()

var username by rememberSaveable { mutableStateOf("") }
var password by rememberSaveable { mutableStateOf("") }
var username by rememberSaveable(saver = UsernameSaver) { mutableStateOf(Username("")) }
var password by rememberSaveable(saver = PasswordSaver) { mutableStateOf(Password("")) }
var passwordVisible by rememberSaveable { mutableStateOf(false) }

if (requestToken != null) {
Expand Down Expand Up @@ -161,9 +167,9 @@ internal fun AuthScreenContent(
)

OutlinedTextField(
value = username,
onValueChange = { value: String ->
username = value
value = username.value,
onValueChange = { value ->
username = Username(value)
},
modifier = Modifier.constrainAs(usernameField) {
width = Dimension.fillToConstraints
Expand Down Expand Up @@ -191,9 +197,9 @@ internal fun AuthScreenContent(
)

OutlinedTextField(
value = password,
onValueChange = { value: String ->
password = value
value = password.value,
onValueChange = { value ->
password = Password(value)
},
modifier = Modifier.constrainAs(passwordField) {
width = Dimension.fillToConstraints
Expand All @@ -209,7 +215,7 @@ internal fun AuthScreenContent(
},
trailingIcon = {
AnimatedVisibility(
visible = password.isNotEmpty(),
visible = password.isNotEmpty,
enter = fadeIn(),
exit = fadeOut()
) {
Expand Down Expand Up @@ -284,15 +290,15 @@ internal fun AuthScreenContent(
}

Button(
onClick = { onSignInClick(username.trim(), password.trim()) },
onClick = { onSignInClick(username.trim, password.trim) },
modifier = Modifier.constrainAs(signInButton) {
width = Dimension.fillToConstraints
height = Dimension.wrapContent
start.linkTo(parent.start, 16.dp)
top.linkTo(if (error != null && error is CreateSessionWithLoginException) resetPasswordButton.bottom else passwordField.bottom, 16.dp)
end.linkTo(parent.end, 16.dp)
},
enabled = username.isNotEmpty() && password.isNotEmpty() && !signInLoading,
enabled = username.isNotEmpty && password.isNotEmpty && !signInLoading,
colors = ButtonDefaults.buttonColors(
containerColor = MaterialTheme.colorScheme.surfaceTint
),
Expand Down

0 comments on commit 6cfc90f

Please sign in to comment.