[android] bearer tokenの使いたい

/data/api/ApiService.kt

interface ApiService {
    @GET("user/profile")
    suspend fun getUserProfile(): Response<UserProfile>
}

data/api/AuthInterceptor.kt

class AuthInterceptor(private val tokenProvider: ()-> String?):Interceptor {
    override fun intercept(chain: Interceptor.Chain): Response {
        val token = tokenProvider()
        val request = chain.request().newBuilder().apply {
            token?.let {
                addHeader("Authorization", "Bearer $it")
            }
        }.build()
        return chain.proceed(request)
    }
}

data/api/ApiClient.kt

object ApiClient {
    fun create(tokenProvider: () -> String?): ApiService {
        val client = OkHttpClient.Builder()
            .addInterceptor(AuthInterceptor(tokenProvider))
            .build()

        return Retrofit.Builder()
            .baseUrl("https://your-api.com/") // 実際のURLに変更
            .client(client)
            .addConverterFactory(GsonConverterFactory.create())
            .build()
            .create(ApiService::class.java)
    }
}

presentation/viewmodel/MyViewModel.kt

class MyViewModel : ViewModel() {
    private val token = ""

    private val apiService = ApiClient.create {token}

    var userProfile by mutableStateOf<UserProfile?>(null)
        private set

    fun loadUserProfile() {
        viewModelScope.launch {
            try {
                val response = apiService.getUserProfile()
                if (response.isSuccessful) {
                    userProfile = response.body()
                } else {
                    // エラー処理
                }
            } catch (e: Exception) {
                // 通信エラーなど
            }
        }
    }

}

presentation/screen/ProfileScreen.kt

@Composable
fun ProfileScreen(viewModel: MyViewModel = viewModel()) {
    val profile = viewModel.userProfile

    LaunchedEffect(Unit) {
        viewModel.loadUserProfile()
    }

    profile?.let {
        Text("ユーザー名: ${it.name}")
    } ?: Text("読み込み中...")
}

domain/model/UserProfile.kt

data class UserProfile(
    val id: Int,
    val name: String,
    val email: String
)