Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
133 changes: 67 additions & 66 deletions app/src/dev/kotlin/team/aliens/dms/android/app/DmsApp.kt
Original file line number Diff line number Diff line change
@@ -1,11 +1,9 @@
package team.aliens.dms.android.app

import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.navigationBarsPadding
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.statusBarsPadding
import androidx.compose.foundation.layout.systemBarsPadding
import androidx.compose.material3.Scaffold
import androidx.compose.material3.SnackbarHost
import androidx.compose.material3.windowsizeclass.WindowSizeClass
Expand Down Expand Up @@ -80,78 +78,81 @@ fun DmsApp(
}
}

Scaffold(
bottomBar = {
if (shouldShowBottomBar) {
BottomNavigationBar(
currentScreen = currentScreen,
onNavigate = { destination ->
if (currentScreen != destination) {
backStack.removeAll {
it is HomeScreenNav ||
it is ApplicationScreenNav ||
it is MyPageScreenNav
Box {
Scaffold(
bottomBar = {
if (shouldShowBottomBar) {
BottomNavigationBar(
currentScreen = currentScreen,
onNavigate = { destination ->
if (currentScreen != destination) {
backStack.removeAll {
it is HomeScreenNav ||
it is ApplicationScreenNav ||
it is MyPageScreenNav
}
backStack.add(destination)
}
backStack.add(destination)
}
}
)
}
}
) { paddingValues ->
NavDisplay(
modifier = Modifier
.padding(paddingValues)
.navigationBarsPadding(),
backStack = backStack,
onBack = { backStack.removeLastOrNull() },
entryProvider = entryProvider {
entry<OnboardingScreenNav> {
OnboardingRoute(
navigateToSignIn = {
backStack.clear()
backStack.add(SignInScreenNav)
},
)
}
entry<SignInScreenNav> {
SignInRoute(
navigateToMain = {
backStack.clear()
backStack.add(HomeScreenNav)
},
navigateToSignUp = {},
onShowSnackBar = { snackBarType, message ->
appState.showSnackBar(snackBarType, message)
},
)
}
entry<HomeScreenNav> {
HomeRoute(
onNavigateMeal = {
backStack.add(MealScreenNav)
}
)
}
entry<ApplicationScreenNav> {
ApplicationRoute()
}
entry<MyPageScreenNav> {
MyPageRoute()
}
entry<MealScreenNav> {
MealRoute(
onNavigateBack = { backStack.removeLastOrNull() }
)
}
},
)
Box {
}
) { paddingValues ->
NavDisplay(
modifier = Modifier
.padding(paddingValues)
.navigationBarsPadding(),
backStack = backStack,
onBack = { backStack.removeLastOrNull() },
entryProvider = entryProvider {
entry<OnboardingScreenNav> {
OnboardingRoute(
navigateToSignIn = {
backStack.clear()
backStack.add(SignInScreenNav)
},
)
}
entry<SignInScreenNav> {
SignInRoute(
navigateToMain = {
backStack.clear()
backStack.add(HomeScreenNav)
},
navigateToSignUp = {},
onShowSnackBar = { snackBarType, message ->
appState.showSnackBar(snackBarType, message)
},
)
}
entry<HomeScreenNav> {
HomeRoute(
onNavigateMeal = {
backStack.add(MealScreenNav)
},
onShowSnackBar = { snackBarType, message ->
appState.showSnackBar(snackBarType, message)
},
)
}
entry<ApplicationScreenNav> {
ApplicationRoute()
}
entry<MyPageScreenNav> {
MyPageRoute()
}
entry<MealScreenNav> {
MealRoute(
onNavigateBack = { backStack.removeLastOrNull() }
)
}
},
)
SnackbarHost(
modifier = Modifier
.statusBarsPadding()
.padding(top = 16.dp)
.align(Alignment.Center),
.align(Alignment.TopCenter),
hostState = appState.snackBarHostState,
snackbar = {
val visuals = it.visuals as? DmsSnackBarVisuals ?: return@SnackbarHost
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.flow.asStateFlow
import team.aliens.dms.android.core.jwt.JwtProvider
import ui.viewmodel.BaseViewModel
import team.aliens.dms.android.core.ui.viewmodel.BaseViewModel
import javax.inject.Inject

@HiltViewModel
Expand Down
11 changes: 11 additions & 0 deletions core/jwt/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,17 @@ android {
kotlinOptions {
jvmTarget = Versions.java.toString()
}

flavorDimensions += "environment"

productFlavors {
create("dev") {
dimension = "environment"
}
create("prod") {
dimension = "environment"
}
}
}

dependencies {
Expand Down
11 changes: 11 additions & 0 deletions core/network/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,17 @@ android {
kotlinOptions {
jvmTarget = Versions.java.toString()
}

flavorDimensions += "environment"

productFlavors {
create("dev") {
dimension = "environment"
}
create("prod") {
dimension = "environment"
}
}
}

dependencies {
Expand Down
11 changes: 11 additions & 0 deletions core/school/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,17 @@ android {
kotlinOptions {
jvmTarget = Versions.java.toString()
}

flavorDimensions += "environment"

productFlavors {
create("dev") {
dimension = "environment"
}
create("prod") {
dimension = "environment"
}
}
}

dependencies {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,9 +16,9 @@ import androidx.compose.ui.unit.dp
import team.aliens.dms.android.core.designsystem.DmsTheme
import team.aliens.dms.android.core.designsystem.R
import team.aliens.dms.android.core.designsystem.shadow
import team.aliens.dms.android.core.designsystem.PaddingDefaults
import team.aliens.dms.android.core.designsystem.horizontalPadding
import team.aliens.dms.android.core.designsystem.verticalPadding
import team.aliens.dms.android.core.ui.PaddingDefaults
import team.aliens.dms.android.core.ui.horizontalPadding
import team.aliens.dms.android.core.ui.verticalPadding

@Composable
fun FloatingNotice(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package team.aliens.dms.android.core.widget.meal
import android.content.Context
import androidx.glance.appwidget.GlanceAppWidget
import androidx.glance.appwidget.GlanceAppWidgetReceiver
import team.aliens.dms.android.core.widget.MealWorker

class MealWidgetReceiver : GlanceAppWidgetReceiver() {
override val glanceAppWidget: GlanceAppWidget
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package team.aliens.dms.android.core.widget.meal
package team.aliens.dms.android.core.widget

import android.content.Context
import android.os.Build
Expand All @@ -15,6 +15,9 @@ import androidx.work.WorkManager
import androidx.work.WorkerParameters
import dagger.assisted.Assisted
import dagger.assisted.AssistedInject
import team.aliens.dms.android.core.widget.meal.MealGlanceWidget
import team.aliens.dms.android.core.widget.meal.MealInfo
import team.aliens.dms.android.core.widget.meal.MealInfoStateDefinition
import team.aliens.dms.android.core.widget.meal.mapper.toEntity
import team.aliens.dms.android.data.meal.repository.MealRepository
import team.aliens.dms.android.shared.date.util.now
Expand Down
11 changes: 11 additions & 0 deletions data/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,17 @@ android {
kotlinOptions {
jvmTarget = Versions.java.toString()
}

flavorDimensions += "environment"

productFlavors {
create("dev") {
dimension = "environment"
}
create("prod") {
dimension = "environment"
}
}
}

dependencies {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
package team.aliens.dms.android.data.auth.repository

import team.aliens.dms.android.data.auth.model.EmailVerificationType
import team.aliens.dms.android.data.auth.model.HashedEmail

abstract class AuthRepository {

abstract suspend fun signIn(
accountId: String,
password: String,
deviceToken: String,
autoSignIn: Boolean = true,
): Result<Unit>

abstract suspend fun sendEmailVerificationCode(
email: String,
type: EmailVerificationType,
): Result<Unit>

abstract suspend fun checkEmailVerificationCode(
email: String,
code: String,
type: EmailVerificationType,
): Result<Unit>

abstract suspend fun checkIdExists(accountId: String): Result<HashedEmail>

abstract suspend fun signOut(): Result<Unit>
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,88 @@
package team.aliens.dms.android.data.auth.repository

import team.aliens.dms.android.core.jwt.JwtProvider
import team.aliens.dms.android.core.network.util.statusMapping
import team.aliens.dms.android.core.school.SchoolProvider
import team.aliens.dms.android.data.auth.exception.BadRequestException
import team.aliens.dms.android.data.auth.exception.PasswordMismatchException
import team.aliens.dms.android.data.auth.exception.UserNotFoundException
import team.aliens.dms.android.data.auth.mapper.extractFeatures
import team.aliens.dms.android.data.auth.mapper.extractTokens
import team.aliens.dms.android.data.auth.model.EmailVerificationType
import team.aliens.dms.android.data.auth.model.HashedEmail
import team.aliens.dms.android.network.auth.datasource.NetworkAuthDataSource
import team.aliens.dms.android.network.auth.model.SendEmailVerificationCodeRequest
import team.aliens.dms.android.network.auth.model.SignInRequest
import javax.inject.Inject

internal class AuthRepositoryImpl @Inject constructor(
private val networkAuthDataSource: NetworkAuthDataSource,
private val jwtProvider: JwtProvider,
private val schoolProvider: SchoolProvider,
) : AuthRepository() {

override suspend fun signIn(
accountId: String,
password: String,
deviceToken: String,
autoSignIn: Boolean,
): Result<Unit> = runCatching {
val signInResponse = statusMapping(
onBadRequest = { throw BadRequestException() },
onUnauthorized = { throw PasswordMismatchException() },
onNotFound = { throw UserNotFoundException() },
) {
networkAuthDataSource.signIn(
request = SignInRequest(
accountId = accountId,
password = password,
deviceToken = deviceToken,
),
)
}

// FIXME: λ§Œμ•½ μžλ™ λ‘œκ·ΈμΈμ„ ν•˜μ§€ μ•Šμ€ μƒνƒœμ—μ„œ 토큰 μž¬λ°œκΈ‰μ€ μ–΄λ–»κ²Œ μ²˜λ¦¬ν•˜λŠ”κ°€?
if (autoSignIn) {
val tokens = signInResponse.extractTokens()
val features = signInResponse.extractFeatures()
jwtProvider.updateTokens(tokens)
schoolProvider.updateFeatures(features)
}
Comment on lines +44 to +50

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

FIXME μ£Όμ„μ—μ„œ μ§€μ λœ 바와 같이, autoSignIn이 false일 경우의 토큰 처리 둜직이 λΆˆμ™„μ „ν•©λ‹ˆλ‹€. ν˜„μž¬ μ½”λ“œλŠ” autoSignIn이 true일 λ•Œλ§Œ 토큰을 μ €μž₯ν•˜κ³  있으며, false일 κ²½μš°μ—λŠ” 둜그인 μ‹œ λ°œκΈ‰λœ 토큰을 μ‚¬μš©ν•˜μ§€ μ•Šκ³  버리고 μžˆμŠ΅λ‹ˆλ‹€. μžλ™ λ‘œκ·ΈμΈμ„ μ‚¬μš©ν•˜μ§€ μ•Šλ”λΌλ„ μ•± μ„Έμ…˜ λ™μ•ˆμ—λŠ” 토큰을 λ©”λͺ¨λ¦¬μ— μœ μ§€ν•˜μ—¬ API ν˜ΈμΆœμ— μ‚¬μš©ν•΄μ•Ό ν•©λ‹ˆλ‹€. 이 뢀뢄을 λͺ…ν™•νžˆ κ΅¬ν˜„ν•΄μ•Ό ν•©λ‹ˆλ‹€.

}

override suspend fun sendEmailVerificationCode(
email: String,
type: EmailVerificationType,
): Result<Unit> = runCatching {
networkAuthDataSource.sendEmailVerificationCode(
request = SendEmailVerificationCodeRequest(
email = email,
type = type.name,
),
)
}

override suspend fun checkEmailVerificationCode(
email: String,
code: String,
type: EmailVerificationType,
): Result<Unit> = runCatching {
networkAuthDataSource.checkEmailVerificationCode(
email = email,
code = code,
type = type.name,
)
}

override suspend fun checkIdExists(accountId: String): Result<HashedEmail> = runCatching {
networkAuthDataSource.checkIdExists(
accountId = accountId,
).email
}


override suspend fun signOut(): Result<Unit> = runCatching {
jwtProvider.clearCaches()
schoolProvider.clearCaches()
}
}
Loading
Loading