Skip to content

Commit b34e3c0

Browse files
authored
Merge pull request #43 from Nexters/feature/webview-token
웹뷰 이동 시 액세스 토큰을 전달합니다.
2 parents ef80290 + 760f430 commit b34e3c0

File tree

9 files changed

+99
-6
lines changed

9 files changed

+99
-6
lines changed

core/data/src/main/java/com/plottwist/core/data/auth/repository/LoginRepositoryImpl.kt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,4 +68,8 @@ class LoginRepositoryImpl @Inject constructor(
6868
override fun logout(): Flow<Unit> {
6969
return authDataSource.clear()
7070
}
71+
72+
override fun getAccessToken(): Flow<String?> {
73+
return authDataSource.getAccessToken()
74+
}
7175
}

core/domain/src/main/java/com/plottwist/core/domain/auth/repository/LoginRepository.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,4 +6,5 @@ interface LoginRepository {
66
suspend fun googleLogin(accountId: String): Result<Boolean>
77
fun checkLoginStatus(): Flow<Boolean>
88
fun logout(): Flow<Unit>
9+
fun getAccessToken() : Flow<String?>
910
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package com.plottwist.core.domain.auth.usecase
2+
3+
import com.plottwist.core.domain.auth.repository.LoginRepository
4+
import kotlinx.coroutines.flow.Flow
5+
import javax.inject.Inject
6+
7+
class GetAccessTokenUseCase @Inject constructor(
8+
private val loginRepository: LoginRepository
9+
) {
10+
operator fun invoke(): Flow<String?> {
11+
return loginRepository.getAccessToken()
12+
}
13+
}

feature/gathering-detail/src/main/java/com/plottwist/feature/gathering_detail/GatheringDetailViewModel.kt

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -70,12 +70,14 @@ class GatheringDetailViewModel @Inject constructor(
7070
}
7171

7272
private fun handleReceivedProposalClick() = intent {
73-
val encodedUrl = URLEncoder.encode(webUrlConfig.sentProposalsUrl,"UTF-8")
73+
val url = webUrlConfig.sentProposalsUrl.replace("{gatheringId}", state.gatheringDetail.gatheringId.toString())
74+
val encodedUrl = URLEncoder.encode(url,"UTF-8")
7475
postSideEffect(GatheringDetailSideEffect.NavigateToWebView(encodedUrl))
7576
}
7677

7778
private fun handleSentProposalClick() = intent {
78-
val encodedUrl = URLEncoder.encode(webUrlConfig.sentProposalsUrl,"UTF-8")
79+
val url = webUrlConfig.sentProposalsUrl.replace("{gatheringId}", state.gatheringDetail.gatheringId.toString())
80+
val encodedUrl = URLEncoder.encode(url,"UTF-8")
7981
postSideEffect(GatheringDetailSideEffect.NavigateToWebView(encodedUrl))
8082
}
8183

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,21 @@
11
package com.plottwist.feature.webview
22

3+
import android.webkit.WebView
4+
35
data class WebViewState(
46
val url: String = ""
57
)
68

79
sealed class WebViewAction {
810
data object ClickBack : WebViewAction()
11+
data class OnPageFinished(val webView: WebView) : WebViewAction()
12+
data class OnRequestTokenRefresh(val webView: WebView) : WebViewAction()
913
}
1014

1115
sealed class WebViewSideEffect {
1216
data object NavigateBack : WebViewSideEffect()
17+
data class UpdateSessionStorage(
18+
val webView: WebView,
19+
val accessToken: String
20+
) : WebViewSideEffect()
1321
}

feature/webview/src/main/java/com/plottwist/feature/webview/WebViewScreen.kt

Lines changed: 30 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -26,9 +26,15 @@ fun WebViewScreen(
2626
val state by viewModel.collectAsState()
2727
var webView : WebView? by remember { mutableStateOf(null) }
2828

29-
viewModel.collectSideEffect {
30-
when (it) {
29+
viewModel.collectSideEffect { sideEffect ->
30+
when (sideEffect) {
3131
WebViewSideEffect.NavigateBack -> onBack()
32+
is WebViewSideEffect.UpdateSessionStorage -> {
33+
sideEffect.webView.evaluateJavascript(
34+
"window.sessionStorage.setItem('accessToken', '${sideEffect.accessToken}')",
35+
null
36+
)
37+
}
3238
}
3339
}
3440

@@ -38,6 +44,12 @@ fun WebViewScreen(
3844
onWebViewCreated = {
3945
webView = it
4046
},
47+
onPageFinished = {
48+
viewModel.handleAction(WebViewAction.OnPageFinished(it))
49+
},
50+
onRequestTokenRefresh = {
51+
webView?.reload()
52+
},
4153
url = state.url
4254
)
4355
}
@@ -47,16 +59,20 @@ private fun WebViewScreen(
4759
onBackClick: () -> Unit,
4860
url: String,
4961
onWebViewCreated : (WebView) -> Unit,
62+
onPageFinished: (webView: WebView) -> Unit,
63+
onRequestTokenRefresh: () -> Unit,
5064
modifier: Modifier = Modifier,
5165
) {
5266
TukWebView(
5367
modifier = modifier.statusBarsPadding(),
5468
url = url,
5569
onWebViewCreated = onWebViewCreated,
70+
onPageFinished = onPageFinished,
5671
addBridge = {
5772
it.addJavascriptInterface(
5873
DefaultBridge(
59-
onNavigateHome = onBackClick
74+
onNavigateHome = onBackClick,
75+
onRequestTokenRefresh = onRequestTokenRefresh
6076
),
6177
BRIDGE_NAME
6278
)
@@ -78,11 +94,19 @@ fun WebViewAppBar(
7894

7995
internal const val BRIDGE_NAME = "AndroidBridge"
8096

81-
private class DefaultBridge(val onNavigateHome: () -> Unit) {
97+
private class DefaultBridge(
98+
val onNavigateHome: () -> Unit,
99+
val onRequestTokenRefresh: () -> Unit
100+
) {
82101
@JavascriptInterface
83102
fun navigateHome() {
84103
onNavigateHome()
85104
}
105+
106+
@JavascriptInterface
107+
fun requestTokenRefresh() {
108+
onRequestTokenRefresh()
109+
}
86110
}
87111

88112
@Preview
@@ -92,5 +116,7 @@ private fun WebViewScreenPreview() {
92116
onBackClick = {},
93117
url = "https://www.google.com",
94118
onWebViewCreated = {},
119+
onPageFinished = {},
120+
onRequestTokenRefresh = {}
95121
)
96122
}

feature/webview/src/main/java/com/plottwist/feature/webview/WebViewViewModel.kt

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,21 @@
11
package com.plottwist.feature.webview
22

3+
import android.webkit.WebView
34
import androidx.lifecycle.SavedStateHandle
45
import androidx.lifecycle.ViewModel
56
import androidx.navigation.toRoute
7+
import com.plottwist.core.domain.auth.usecase.GetAccessTokenUseCase
68
import com.plottwist.core.ui.navigation.Route
79
import dagger.hilt.android.lifecycle.HiltViewModel
10+
import kotlinx.coroutines.flow.collectLatest
811
import org.orbitmvi.orbit.ContainerHost
912
import org.orbitmvi.orbit.viewmodel.container
1013
import java.net.URLDecoder
1114
import javax.inject.Inject
1215

1316
@HiltViewModel
1417
class WebViewViewModel @Inject constructor(
18+
private val getAccessTokenUseCase: GetAccessTokenUseCase,
1519
savedStateHandle: SavedStateHandle
1620
) : ContainerHost<WebViewState, WebViewSideEffect>, ViewModel() {
1721
override val container = container<WebViewState, WebViewSideEffect>(WebViewState(
@@ -23,10 +27,26 @@ class WebViewViewModel @Inject constructor(
2327
WebViewAction.ClickBack -> {
2428
navigateBack()
2529
}
30+
31+
is WebViewAction.OnPageFinished -> {
32+
handlePageFinished(action.webView)
33+
}
34+
35+
is WebViewAction.OnRequestTokenRefresh -> {
36+
// TODO 토큰 재발급 후 액세스 토큰 웹뷰에 보내기 로직
37+
}
2638
}
2739
}
2840

2941
private fun navigateBack() = intent {
3042
postSideEffect(WebViewSideEffect.NavigateBack)
3143
}
44+
45+
private fun handlePageFinished(webView: WebView) = intent {
46+
getAccessTokenUseCase().collectLatest { accessToken ->
47+
accessToken?.let {
48+
postSideEffect(WebViewSideEffect.UpdateSessionStorage(webView, it))
49+
}
50+
}
51+
}
3252
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package com.plottwist.feature.webview.client
2+
3+
import android.webkit.WebView
4+
import android.webkit.WebViewClient
5+
6+
class TukWebViewClient(
7+
val onPageFinished: (view: WebView) -> Unit,
8+
): WebViewClient() {
9+
override fun onPageFinished(view: WebView?, url: String?) {
10+
super.onPageFinished(view, url)
11+
view?.let { onPageFinished(it) }
12+
}
13+
}

feature/webview/src/main/java/com/plottwist/feature/webview/component/TukWebView.kt

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,14 @@ import android.webkit.WebView
66
import androidx.compose.runtime.Composable
77
import androidx.compose.ui.Modifier
88
import androidx.compose.ui.viewinterop.AndroidView
9+
import com.plottwist.feature.webview.client.TukWebViewClient
910

1011
@SuppressLint("SetJavaScriptEnabled")
1112
@Composable
1213
fun TukWebView(
1314
url: String,
1415
onWebViewCreated: (webView: WebView) -> Unit,
16+
onPageFinished: (webView: WebView) -> Unit,
1517
modifier: Modifier = Modifier,
1618
addBridge: (webView: WebView)-> Unit = {}
1719
) {
@@ -35,6 +37,10 @@ fun TukWebView(
3537
setInitialScale(1)
3638
}
3739

40+
webViewClient = TukWebViewClient(
41+
onPageFinished = onPageFinished
42+
)
43+
3844
addBridge(this)
3945

4046
onWebViewCreated(this)

0 commit comments

Comments
 (0)