Skip to content

Commit

Permalink
Merge pull request #74 from AdultOfNineteen/feat/issue-73
Browse files Browse the repository at this point in the history
[FEAT] 액세스 토큰 만료 시 로그인 화면으로 이동
  • Loading branch information
DongChyeon authored May 4, 2024
2 parents 7cebb11 + 588d966 commit 150cdd1
Show file tree
Hide file tree
Showing 6 changed files with 73 additions and 6 deletions.
8 changes: 7 additions & 1 deletion app/src/main/java/com/teamwiney/winey/MainActivity.kt
Original file line number Diff line number Diff line change
Expand Up @@ -7,11 +7,14 @@ import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.material3.Surface
import androidx.compose.ui.Modifier
import androidx.core.view.WindowCompat
import com.teamwiney.core.common.rememberWineyAppState
import com.teamwiney.core.common.rememberWineyBottomSheetState
import com.teamwiney.ui.theme.WineyTheme
import dagger.hilt.android.AndroidEntryPoint

@AndroidEntryPoint
class MainActivity : ComponentActivity() {

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
// WindowInset 직접 조절하기 위해서
Expand All @@ -22,7 +25,10 @@ class MainActivity : ComponentActivity() {
modifier = Modifier.fillMaxSize(),
color = WineyTheme.colors.background_1
) {
WineyNavHost()
WineyNavHost(
appState = rememberWineyAppState(),
bottomSheetState = rememberWineyBottomSheetState()
)
}
}
}
Expand Down
60 changes: 55 additions & 5 deletions app/src/main/java/com/teamwiney/winey/WineyNavHost.kt
Original file line number Diff line number Diff line change
@@ -1,5 +1,9 @@
package com.teamwiney.winey

import android.content.BroadcastReceiver
import android.content.Context
import android.content.Intent
import android.content.IntentFilter
import android.util.Log
import androidx.compose.animation.AnimatedVisibility
import androidx.compose.animation.slideInVertically
Expand All @@ -15,24 +19,29 @@ import androidx.compose.material.Snackbar
import androidx.compose.material.SnackbarHost
import androidx.compose.material.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.DisposableEffect
import androidx.compose.runtime.getValue
import androidx.compose.runtime.rememberUpdatedState
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.unit.dp
import androidx.localbroadcastmanager.content.LocalBroadcastManager
import androidx.navigation.NavDestination
import androidx.navigation.NavType
import androidx.navigation.compose.NavHost
import androidx.navigation.compose.composable
import androidx.navigation.navArgument
import androidx.navigation.navOptions
import com.teamwiney.analysis.analysisGraph
import com.teamwiney.auth.authGraph
import com.teamwiney.core.common.WineyAppState
import com.teamwiney.core.common.WineyBottomSheetState
import com.teamwiney.core.common.navigation.AuthDestinations
import com.teamwiney.core.common.navigation.HomeDestinations
import com.teamwiney.core.common.navigation.MapDestinations
import com.teamwiney.core.common.navigation.ReusableDestinations
import com.teamwiney.core.common.navigation.TopLevelDestination
import com.teamwiney.core.common.rememberWineyAppState
import com.teamwiney.core.common.rememberWineyBottomSheetState
import com.teamwiney.home.WebViewScreen
import com.teamwiney.home.homeGraph
import com.teamwiney.map.mapGraph
Expand All @@ -42,13 +51,54 @@ import com.teamwiney.ui.components.BottomNavigationBar
import com.teamwiney.ui.components.BottomNavigationItem
import com.teamwiney.ui.theme.WineyTheme

@Composable
fun TokenExpiredBroadcastReceiver(
onExpired: (intent: Intent?) -> Unit
) {
val context = LocalContext.current

val currentOnExpired by rememberUpdatedState(onExpired)

DisposableEffect(context) {
val intentFilter = IntentFilter("com.teamwiney.winey.TOKEN_EXPIRED")
val broadcast = object : BroadcastReceiver() {
override fun onReceive(context: Context?, intent: Intent?) {
currentOnExpired(intent)
}
}

LocalBroadcastManager.getInstance(context).registerReceiver(broadcast, intentFilter)
Log.d("debugging", "리시버 부착")

onDispose {
context.unregisterReceiver(broadcast)
Log.d("debugging", "리시버 부착 해제")
}
}
}

@OptIn(ExperimentalMaterialApi::class)
@Composable
fun WineyNavHost() {
val appState = rememberWineyAppState()
val bottomSheetState = rememberWineyBottomSheetState()
fun WineyNavHost(
appState: WineyAppState,
bottomSheetState: WineyBottomSheetState
) {
val navController = appState.navController

TokenExpiredBroadcastReceiver { intent ->
if (intent?.action == "com.teamwiney.winey.TOKEN_EXPIRED") {
appState.showSnackbar("토큰이 만료되었습니다. 다시 로그인해주세요.")
appState.navController.navigate(
AuthDestinations.Login.LOGIN,
navOptions {
popUpTo(AuthDestinations.Login.LOGIN) {
inclusive = true
}
}
)
}
}

ModalBottomSheetLayout(
sheetContent = {
bottomSheetState.bottomSheetContent.value?.invoke(this)
Expand Down
1 change: 1 addition & 0 deletions data/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -55,4 +55,5 @@ dependencies {
implementation(libs.datastore)
implementation(libs.compose.paging)
implementation(libs.bundles.network)
implementation(libs.local.broadcast.manager)
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
package com.teamwiney.data.network.interceptor

import android.content.Context
import android.content.Intent
import androidx.localbroadcastmanager.content.LocalBroadcastManager
import com.chuckerteam.chucker.api.ChuckerInterceptor
import com.teamwiney.core.common.base.CommonResponse
import com.teamwiney.core.common.util.Constants.ACCESS_TOKEN
Expand Down Expand Up @@ -55,6 +57,11 @@ class AuthInterceptor @Inject constructor(
dataStoreRepository.deleteStringValue(ACCESS_TOKEN)
dataStoreRepository.deleteStringValue(REFRESH_TOKEN)
}

// 리프레시 토큰을 통한 갱신 실패 시
Intent("com.teamwiney.winey.TOKEN_EXPIRED").also { intent ->
LocalBroadcastManager.getInstance(context).sendBroadcast(intent)
}
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -112,6 +112,7 @@ class SplashViewModel @Inject constructor(

is ApiResult.NetworkError -> {
postEffect(SplashContract.Effect.ShowSnackBar("네트워크 오류가 발생했습니다."))
navigateToMain()
}
}
}
Expand Down
2 changes: 2 additions & 0 deletions gradle/libs.versions.toml
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ agp_version = "8.0.2"
browser_version = "1.7.0"
kotlin_version = "1.8.10"
android_core_ktx_version = "1.10.1"
local_broadcast_manager_version = "1.0.0"
activity_compose_version = "1.7.2"
tools_build_gradle_version = "8.0.2"
compose_coil_version = "2.2.2"
Expand Down Expand Up @@ -35,6 +36,7 @@ firebase_crashlytics_version = "2.9.9"

[libraries]
android_core_ktx = { module = "androidx.core:core-ktx", version.ref = "android_core_ktx_version" }
local_broadcast_manager = { module = "androidx.localbroadcastmanager:localbroadcastmanager", version.ref = "local_broadcast_manager_version" }
appcompat = { module = "androidx.appcompat:appcompat", version.ref = "appcompat_version" }
activity_compose = { module = "androidx.activity:activity-compose", version.ref = "activity_compose_version" }
browser = { module = "androidx.browser:browser", version.ref = "browser_version" }
Expand Down

0 comments on commit 150cdd1

Please sign in to comment.