package com.novayaplaneta.di import com.jakewharton.retrofit2.converter.kotlinx.serialization.asConverterFactory import com.novayaplaneta.data.remote.AuthApi import com.novayaplaneta.data.remote.AuthInterceptor import com.novayaplaneta.data.remote.BackendApi import dagger.Module import dagger.Provides import dagger.hilt.InstallIn import dagger.hilt.components.SingletonComponent import kotlinx.serialization.json.Json import okhttp3.MediaType.Companion.toMediaType import okhttp3.OkHttpClient import okhttp3.logging.HttpLoggingInterceptor import retrofit2.Retrofit import java.util.concurrent.TimeUnit import javax.inject.Singleton @Module @InstallIn(SingletonComponent::class) object NetworkModule { private val json = Json { ignoreUnknownKeys = true isLenient = true encodeDefaults = false } @Provides @Singleton fun provideOkHttpClient( authInterceptor: AuthInterceptor ): OkHttpClient { val loggingInterceptor = HttpLoggingInterceptor().apply { level = HttpLoggingInterceptor.Level.BODY } return OkHttpClient.Builder() .addInterceptor(authInterceptor) .addInterceptor(loggingInterceptor) .connectTimeout(30, TimeUnit.SECONDS) .readTimeout(30, TimeUnit.SECONDS) .writeTimeout(30, TimeUnit.SECONDS) .build() } @Provides @Singleton fun provideRetrofit( okHttpClient: OkHttpClient ): Retrofit { val contentType = "application/json".toMediaType() return Retrofit.Builder() .baseUrl("http://10.0.2.2:8000/") .client(okHttpClient) .addConverterFactory(json.asConverterFactory(contentType)) .build() } @Provides @Singleton fun provideAuthApi( retrofit: Retrofit ): AuthApi { return retrofit.create(AuthApi::class.java) } @Provides @Singleton fun provideBackendApi( retrofit: Retrofit ): BackendApi { return retrofit.create(BackendApi::class.java) } }