diff --git a/app/src/main/java/com/example/login_v3/data/di/NetworkModule.kt b/app/src/main/java/com/example/login_v3/data/di/NetworkModule.kt index 1120047..f08cd04 100644 --- a/app/src/main/java/com/example/login_v3/data/di/NetworkModule.kt +++ b/app/src/main/java/com/example/login_v3/data/di/NetworkModule.kt @@ -2,6 +2,7 @@ package com.example.login_v3.data.di import androidx.lifecycle.ViewModel import com.example.login_v3.data.api.TecnologiaApi +import com.example.login_v3.data.repository.basic.TokenManager import com.squareup.moshi.Moshi import com.squareup.moshi.kotlin.reflect.KotlinJsonAdapterFactory import dagger.Module @@ -9,8 +10,12 @@ import dagger.Provides import dagger.hilt.InstallIn import dagger.hilt.android.lifecycle.HiltViewModel import dagger.hilt.components.SingletonComponent +import kotlinx.coroutines.flow.first +import kotlinx.coroutines.runBlocking +import okhttp3.OkHttpClient import retrofit2.Retrofit import retrofit2.converter.moshi.MoshiConverterFactory +import java.util.concurrent.TimeUnit import javax.inject.Inject import javax.inject.Singleton @@ -22,17 +27,43 @@ object NetworkModule { @Singleton fun provideMoshi(): Moshi { return Moshi.Builder() - // 如果未來需要加入自定義的 Adapter (例如處理 Date),在這裡加 .addLast(KotlinJsonAdapterFactory()) .build() } + // 🟢 修正:在這裡注入 okHttpClient + @Provides + @Singleton + fun provideRetrofit(moshi: Moshi, okHttpClient: OkHttpClient): Retrofit { + return Retrofit.Builder() + .baseUrl("http://192.168.0.217/") + .client(okHttpClient) // 🔥 關鍵:將攔截器綁定到 Retrofit + .addConverterFactory(MoshiConverterFactory.create(moshi)) + .build() + } + @Provides @Singleton - fun provideRetrofit(moshi: Moshi): Retrofit { // 注入 moshi - return Retrofit.Builder() - .baseUrl("http://192.168.0.217/") - .addConverterFactory(MoshiConverterFactory.create(moshi)) // 使用配置好的 moshi + fun provideOkHttpClient(tokenManager: TokenManager): OkHttpClient { + return OkHttpClient.Builder() + .connectTimeout(15, TimeUnit.SECONDS) // 連線逾時 + .readTimeout(15, TimeUnit.SECONDS) // 讀取逾時 + .addInterceptor { chain -> + val token = runBlocking { tokenManager.accessToken.first() } + val requestBuilder = chain.request().newBuilder() + + token?.let { + requestBuilder.addHeader("Authorization", "Bearer $it") + } + + val response = chain.proceed(requestBuilder.build()) + + if (response.code == 401) { + runBlocking { tokenManager.clearAuthData() } + } + + response + } .build() }