This commit is contained in:
Eric85710 2026-06-13 14:29:12 +08:00
parent 0dff849752
commit 398b7c6e50

View file

@ -10,6 +10,7 @@ import dagger.Provides
import dagger.hilt.InstallIn
import dagger.hilt.android.lifecycle.HiltViewModel
import dagger.hilt.components.SingletonComponent
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.flow.first
import kotlinx.coroutines.runBlocking
import okhttp3.OkHttpClient
@ -31,30 +32,21 @@ object NetworkModule {
.build()
}
// 修正:在這裡注入 okHttpClient
@Provides
@Singleton
fun provideRetrofit(moshi: Moshi, okHttpClient: OkHttpClient): Retrofit {
return Retrofit.Builder()
.baseUrl("http://192.168.0.189/")
.client(okHttpClient) // 關鍵:將攔截器綁定到 Retrofit
.addConverterFactory(MoshiConverterFactory.create(moshi))
.build()
}
@Provides
@Singleton
fun provideOkHttpClient(tokenManager: TokenManager): OkHttpClient {
return OkHttpClient.Builder()
.connectTimeout(15, TimeUnit.SECONDS)
.readTimeout(15, TimeUnit.SECONDS)
// 🟢 修正 2:如果使用 IP 且噴出 Hostname 錯誤才需要加這段。
// 如果後端憑證的 SAN/CN 已經有包含 192.168.0.217,這行可以刪除。
.hostnameVerifier { hostname, _ -> hostname == "192.168.0.217" }
// 🟢 如果未來改用 HTTPS 且 IP 是 192.168.0.189 遇到憑證問題再開啟
// .hostnameVerifier { hostname, _ -> hostname == "192.168.0.189" }
.addInterceptor { chain ->
// 1. 動態獲取「目前選中帳號」的 Token
// 使用 first() 確保只取目前最新的那一個值
val token = runBlocking { tokenManager.currentAccessToken.first() }
// 在 OkHttp 的背景執行緒中安全地進行同步等待
val (token, userId) = runBlocking(Dispatchers.IO) {
val t = tokenManager.currentAccessToken.first()
val id = tokenManager.currentUserId.first()
t to id
}
val requestBuilder = chain.request().newBuilder()
token?.let {
@ -63,14 +55,12 @@ object NetworkModule {
val response = chain.proceed(requestBuilder.build())
// 2. 處理 Token 失效 (401)
// 處理 Token 失效 (401)
if (response.code == 401) {
runBlocking {
// 獲取目前是哪個 ID 失效了
val currentId = tokenManager.currentUserId.first()
currentId?.let {
// 只登出當前失效的帳號,不影響其他帳號
tokenManager.logout(it)
userId?.let { id ->
// 使用 Dispatchers.IO 確保不會卡死主執行緒
runBlocking(Dispatchers.IO) {
tokenManager.logout(id)
}
}
}
@ -80,9 +70,19 @@ object NetworkModule {
.build()
}
@Provides
@Singleton
fun provideRetrofit(moshi: Moshi, okHttpClient: OkHttpClient): Retrofit {
return Retrofit.Builder()
.baseUrl("http://192.168.0.189/") // 確保與實際伺服器 IP 一致
.client(okHttpClient)
.addConverterFactory(MoshiConverterFactory.create(moshi))
.build()
}
@Provides
@Singleton
fun provideTecnologiaApi(retrofit: Retrofit): TecnologiaApi {
return retrofit.create(TecnologiaApi::class.java)
}
}
}