diff --git a/app/build.gradle b/app/build.gradle index 9e96163..fae80a1 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -2,6 +2,9 @@ plugins { id 'com.android.application' id 'org.jetbrains.kotlin.plugin.serialization' version '1.9.0' id 'org.jetbrains.kotlin.android' + id 'kotlin-android' + id 'kotlin-kapt' + id 'com.google.dagger.hilt.android' } Properties properties = new Properties() @@ -77,4 +80,12 @@ dependencies { // Glide 라이브러리 추가 implementation 'com.github.bumptech.glide:glide:4.12.0' annotationProcessor 'com.github.bumptech.glide:compiler:4.12.0' + + // Hilt + implementation 'com.google.dagger:hilt-android:2.48' + kapt 'com.google.dagger:hilt-compiler:2.48' +} + +kapt { + correctErrorTypes = true } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index ece8e3d..e790c9d 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -7,6 +7,7 @@ @@ -26,10 +27,10 @@ diff --git a/app/src/main/java/com/sopt/now/NowSopt.kt b/app/src/main/java/com/sopt/now/NowSopt.kt new file mode 100644 index 0000000..e087b64 --- /dev/null +++ b/app/src/main/java/com/sopt/now/NowSopt.kt @@ -0,0 +1,21 @@ +package com.sopt.now + +import android.app.Application +import android.content.Context +import androidx.appcompat.app.AppCompatDelegate +import dagger.hilt.android.HiltAndroidApp + +@HiltAndroidApp +class NowSopt : Application() { + override fun onCreate() { + super.onCreate() + appContext = applicationContext + + AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO) + } + + companion object { + lateinit var appContext: Context + private set + } +} \ No newline at end of file diff --git a/app/src/main/java/com/sopt/now/data/di/NetworkModule.kt b/app/src/main/java/com/sopt/now/data/di/NetworkModule.kt new file mode 100644 index 0000000..2ca1f61 --- /dev/null +++ b/app/src/main/java/com/sopt/now/data/di/NetworkModule.kt @@ -0,0 +1,77 @@ +package com.sopt.now.data.di + +import android.util.Log +import com.jakewharton.retrofit2.converter.kotlinx.serialization.asConverterFactory +import com.sopt.now.data.service.AuthService +import com.sopt.now.data.service.FriendService +import com.sopt.now.data.service.UserService +import dagger.Module +import dagger.Provides +import dagger.hilt.InstallIn +import dagger.hilt.components.SingletonComponent +import kotlinx.serialization.json.Json +import okhttp3.Interceptor +import okhttp3.MediaType.Companion.toMediaType +import okhttp3.OkHttpClient +import okhttp3.logging.HttpLoggingInterceptor +import retrofit2.Retrofit +import javax.inject.Singleton + +@Module +@InstallIn(SingletonComponent::class) +object NetworkModule { + private const val CONTENT_TYPE = "application/json" + private val json: Json = + Json { + ignoreUnknownKeys = true + } + + private fun getLogOkHttpClient(): Interceptor { + val loggingInterceptor = + HttpLoggingInterceptor { message -> + Log.d("Retrofit2", "CONNECTION INFO -> $message") + } + loggingInterceptor.level = HttpLoggingInterceptor.Level.BODY + return loggingInterceptor + } + + private val okHttpClient = + OkHttpClient.Builder() + .addInterceptor(getLogOkHttpClient()) + .build() + + @Singleton + @Provides + fun provideRetrofit(): Retrofit.Builder { + return Retrofit.Builder() + .client(okHttpClient) + .addConverterFactory(json.asConverterFactory(CONTENT_TYPE.toMediaType())) + } + + @Singleton + @Provides + fun provideAuthService( + retrofitBuilder: Retrofit.Builder, + @AuthBaseUrl url: String, + ): AuthService { + return retrofitBuilder.baseUrl(url).build().create(AuthService::class.java) + } + + @Singleton + @Provides + fun provideUserService( + retrofitBuilder: Retrofit.Builder, + @AuthBaseUrl url: String, + ): UserService { + return retrofitBuilder.baseUrl(url).build().create(UserService::class.java) + } + + @Singleton + @Provides + fun provideFriendService( + retrofitBuilder: Retrofit.Builder, + @FriendBaseUrl url: String, + ): FriendService { + return retrofitBuilder.baseUrl(url).build().create(FriendService::class.java) + } +} diff --git a/app/src/main/java/com/sopt/now/data/di/UrlModule.kt b/app/src/main/java/com/sopt/now/data/di/UrlModule.kt new file mode 100644 index 0000000..cca3d98 --- /dev/null +++ b/app/src/main/java/com/sopt/now/data/di/UrlModule.kt @@ -0,0 +1,28 @@ +package com.sopt.now.data.di + +import com.sopt.now.BuildConfig +import dagger.Module +import dagger.Provides +import dagger.hilt.InstallIn +import dagger.hilt.components.SingletonComponent +import javax.inject.Qualifier + +@Module +@InstallIn(SingletonComponent::class) +object UrlModule { + @AuthBaseUrl + @Provides + fun provideAuthBaseUrl(): String = BuildConfig.AUTH_BASE_URL + + @FriendBaseUrl + @Provides + fun provideFriendBaseUrl(): String = BuildConfig.FRIEND_BASE_URL +} + +@Retention(AnnotationRetention.BINARY) +@Qualifier +annotation class AuthBaseUrl + +@Retention(AnnotationRetention.BINARY) +@Qualifier +annotation class FriendBaseUrl \ No newline at end of file diff --git a/app/src/main/java/com/sopt/now/data/repository/AuthRepository.kt b/app/src/main/java/com/sopt/now/data/repository/AuthRepository.kt new file mode 100644 index 0000000..b2b7d69 --- /dev/null +++ b/app/src/main/java/com/sopt/now/data/repository/AuthRepository.kt @@ -0,0 +1,25 @@ +package com.sopt.now.data.repository + +import com.sopt.now.data.request.RequestSignInDto +import com.sopt.now.data.request.RequestSignUpDto +import com.sopt.now.data.response.ResponseSignInDto +import com.sopt.now.data.response.ResponseSignUpDto +import com.sopt.now.data.service.AuthService +import retrofit2.Response +import javax.inject.Inject +import javax.inject.Singleton + +@Singleton +class AuthRepository +@Inject +constructor( + private val authService: AuthService, +) { + suspend fun signUp(request: RequestSignUpDto): Response { + return authService.signUp(request) + } + + suspend fun signIn(request: RequestSignInDto): Response { + return authService.signIn(request) + } +} diff --git a/app/src/main/java/com/sopt/now/data/repository/FriendRepository.kt b/app/src/main/java/com/sopt/now/data/repository/FriendRepository.kt new file mode 100644 index 0000000..f1b805f --- /dev/null +++ b/app/src/main/java/com/sopt/now/data/repository/FriendRepository.kt @@ -0,0 +1,18 @@ +package com.sopt.now.data.repository + +import com.sopt.now.data.response.ResponseFriendsInfoDto +import com.sopt.now.data.service.FriendService +import retrofit2.Response +import javax.inject.Inject +import javax.inject.Singleton + +@Singleton +class FriendRepository +@Inject +constructor( + private val friendService: FriendService, +) { + suspend fun getFriendsInfo(i: Int): Response { + return friendService.getFriendsInfo(2) + } +} diff --git a/app/src/main/java/com/sopt/now/data/repository/UserRepository.kt b/app/src/main/java/com/sopt/now/data/repository/UserRepository.kt new file mode 100644 index 0000000..f2816f6 --- /dev/null +++ b/app/src/main/java/com/sopt/now/data/repository/UserRepository.kt @@ -0,0 +1,18 @@ +package com.sopt.now.data.repository + +import com.sopt.now.data.response.ResponseUserInfoDto +import com.sopt.now.data.service.UserService +import retrofit2.Response +import javax.inject.Inject +import javax.inject.Singleton + +@Singleton +class UserRepository +@Inject +constructor( + private val userService: UserService, +) { + suspend fun getUserInfo(memberId: Int): Response { + return userService.getUserInfo(memberId) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/sopt/now/signIn/RequestSignInDto.kt b/app/src/main/java/com/sopt/now/data/request/RequestSignInDto.kt similarity index 88% rename from app/src/main/java/com/sopt/now/signIn/RequestSignInDto.kt rename to app/src/main/java/com/sopt/now/data/request/RequestSignInDto.kt index 1bb6002..96f43f1 100644 --- a/app/src/main/java/com/sopt/now/signIn/RequestSignInDto.kt +++ b/app/src/main/java/com/sopt/now/data/request/RequestSignInDto.kt @@ -1,4 +1,4 @@ -package com.sopt.now.signIn +package com.sopt.now.data.request import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable diff --git a/app/src/main/java/com/sopt/now/signUp/RequestSignUpDto.kt b/app/src/main/java/com/sopt/now/data/request/RequestSignUpDto.kt similarity index 91% rename from app/src/main/java/com/sopt/now/signUp/RequestSignUpDto.kt rename to app/src/main/java/com/sopt/now/data/request/RequestSignUpDto.kt index 25c0ef9..0839a44 100644 --- a/app/src/main/java/com/sopt/now/signUp/RequestSignUpDto.kt +++ b/app/src/main/java/com/sopt/now/data/request/RequestSignUpDto.kt @@ -1,4 +1,4 @@ -package com.sopt.now.signUp +package com.sopt.now.data.request import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable diff --git a/app/src/main/java/com/sopt/now/main/homeFragment/ResponseFriendsInfoDto.kt b/app/src/main/java/com/sopt/now/data/response/ResponseFriendsInfoDto.kt similarity index 95% rename from app/src/main/java/com/sopt/now/main/homeFragment/ResponseFriendsInfoDto.kt rename to app/src/main/java/com/sopt/now/data/response/ResponseFriendsInfoDto.kt index dd06c50..d160658 100644 --- a/app/src/main/java/com/sopt/now/main/homeFragment/ResponseFriendsInfoDto.kt +++ b/app/src/main/java/com/sopt/now/data/response/ResponseFriendsInfoDto.kt @@ -1,7 +1,7 @@ -package com.sopt.now.main.homeFragment +package com.sopt.now.data.response -import kotlinx.serialization.Serializable import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable @Serializable data class ResponseFriendsInfoDto( diff --git a/app/src/main/java/com/sopt/now/signIn/ResponseSignInDto.kt b/app/src/main/java/com/sopt/now/data/response/ResponseSignInDto.kt similarity index 86% rename from app/src/main/java/com/sopt/now/signIn/ResponseSignInDto.kt rename to app/src/main/java/com/sopt/now/data/response/ResponseSignInDto.kt index e27244d..83da1cf 100644 --- a/app/src/main/java/com/sopt/now/signIn/ResponseSignInDto.kt +++ b/app/src/main/java/com/sopt/now/data/response/ResponseSignInDto.kt @@ -1,4 +1,4 @@ -package com.sopt.now.signIn +package com.sopt.now.data.response import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable diff --git a/app/src/main/java/com/sopt/now/signUp/ResponseSignUpDto.kt b/app/src/main/java/com/sopt/now/data/response/ResponseSignUpDto.kt similarity index 86% rename from app/src/main/java/com/sopt/now/signUp/ResponseSignUpDto.kt rename to app/src/main/java/com/sopt/now/data/response/ResponseSignUpDto.kt index 5247516..3f8d721 100644 --- a/app/src/main/java/com/sopt/now/signUp/ResponseSignUpDto.kt +++ b/app/src/main/java/com/sopt/now/data/response/ResponseSignUpDto.kt @@ -1,4 +1,4 @@ -package com.sopt.now.signUp +package com.sopt.now.data.response import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable diff --git a/app/src/main/java/com/sopt/now/main/ResponseUserInfoDto.kt b/app/src/main/java/com/sopt/now/data/response/ResponseUserInfoDto.kt similarity index 93% rename from app/src/main/java/com/sopt/now/main/ResponseUserInfoDto.kt rename to app/src/main/java/com/sopt/now/data/response/ResponseUserInfoDto.kt index 7f3d7be..e86a735 100644 --- a/app/src/main/java/com/sopt/now/main/ResponseUserInfoDto.kt +++ b/app/src/main/java/com/sopt/now/data/response/ResponseUserInfoDto.kt @@ -1,4 +1,4 @@ -package com.sopt.now.main +package com.sopt.now.data.response import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable diff --git a/app/src/main/java/com/sopt/now/data/service/AuthService.kt b/app/src/main/java/com/sopt/now/data/service/AuthService.kt new file mode 100644 index 0000000..f4dab62 --- /dev/null +++ b/app/src/main/java/com/sopt/now/data/service/AuthService.kt @@ -0,0 +1,21 @@ +package com.sopt.now.data.service + +import com.sopt.now.data.request.RequestSignInDto +import com.sopt.now.data.request.RequestSignUpDto +import com.sopt.now.data.response.ResponseSignInDto +import com.sopt.now.data.response.ResponseSignUpDto +import retrofit2.Response +import retrofit2.http.Body +import retrofit2.http.POST + +interface AuthService { + @POST("member/join") + suspend fun signUp( + @Body request: RequestSignUpDto, + ): Response + + @POST("member/login") + suspend fun signIn( + @Body request: RequestSignInDto, + ): Response +} \ No newline at end of file diff --git a/app/src/main/java/com/sopt/now/data/service/FriendService.kt b/app/src/main/java/com/sopt/now/data/service/FriendService.kt new file mode 100644 index 0000000..b015290 --- /dev/null +++ b/app/src/main/java/com/sopt/now/data/service/FriendService.kt @@ -0,0 +1,13 @@ +package com.sopt.now.data.service + +import com.sopt.now.data.response.ResponseFriendsInfoDto +import retrofit2.Response +import retrofit2.http.GET +import retrofit2.http.Query + +interface FriendService { + @GET("/api/users") + suspend fun getFriendsInfo( + @Query("page") page: Int, + ): Response +} \ No newline at end of file diff --git a/app/src/main/java/com/sopt/now/data/service/UserService.kt b/app/src/main/java/com/sopt/now/data/service/UserService.kt new file mode 100644 index 0000000..bd88829 --- /dev/null +++ b/app/src/main/java/com/sopt/now/data/service/UserService.kt @@ -0,0 +1,13 @@ +package com.sopt.now.data.service + +import com.sopt.now.data.response.ResponseUserInfoDto +import retrofit2.Response +import retrofit2.http.GET +import retrofit2.http.Header + +interface UserService { + @GET("member/info") + suspend fun getUserInfo( + @Header("memberId") memberId: Int, + ): Response +} \ No newline at end of file diff --git a/app/src/main/java/com/sopt/now/main/homeFragment/HomeViewModel.kt b/app/src/main/java/com/sopt/now/main/homeFragment/HomeViewModel.kt deleted file mode 100644 index c6db394..0000000 --- a/app/src/main/java/com/sopt/now/main/homeFragment/HomeViewModel.kt +++ /dev/null @@ -1,86 +0,0 @@ -package com.sopt.now.main.homeFragment - -import android.util.Log -import androidx.lifecycle.LiveData -import androidx.lifecycle.MutableLiveData -import androidx.lifecycle.ViewModel -import androidx.recyclerview.widget.RecyclerView -import com.sopt.now.R -import com.sopt.now.main.ResponseUserInfoDto -import com.sopt.now.service.ServicePool -import retrofit2.Call -import retrofit2.Callback -import retrofit2.Response - -class HomeViewModel : ViewModel() { - - private val _userInfo = MutableLiveData() - val userInfo: LiveData - get() = _userInfo - - private val _friendsInfo = MutableLiveData?>() - val friendsInfo: LiveData?> - get() = _friendsInfo - - private val userService by lazy { ServicePool.userService } - private val friendService by lazy { ServicePool.friendService } - - fun fetchUserInfo(userId: Int) { - userService.getUserInfo(userId).enqueue(object : Callback { - override fun onResponse( - call: Call, - response: Response - ) { - if (response.isSuccessful) { - val responseUserInfoDto = response.body() - val userProfileInfo = responseUserInfoDto?.data?.let { userData -> - HomeData.UserProfile( - R.drawable.sonminjae_profile, - userData.nickname, - userData.phone, - userData.authenticationId) - } - _userInfo.value = userProfileInfo - } - } - override fun onFailure(call: Call, t: Throwable) { - Log.e("HomeViewModel", t.message.toString()) - } - }) - } - - fun fetchFriendsInfo() { - friendService.getFriendsInfo(2).enqueue(object : Callback { - override fun onResponse( - call: Call, - response: Response - ) { - if (response.isSuccessful) { - val responseFriendsInfoDto = response.body() - val friendProfiles = responseFriendsInfoDto?.data?.map { friendData -> - HomeData.FriendProfile( - friendData.avatar, - "${friendData.firstName} ${ friendData.lastName}", - friendData.email - ) - } - _friendsInfo.postValue(friendProfiles) - } - } - - override fun onFailure(call: Call, t: Throwable) { - Log.e("HomeViewModel", t.message.toString()) - } - }) - } - fun updateUserProfileUI(view: RecyclerView, it: HomeData.UserProfile) { - val adapter = view.adapter as? HomeViewAdapter - adapter?.setUserProfileList(it) - } - - - fun updateFriendProfilesUI(view: RecyclerView, it: List) { - val adapter = view.adapter as? HomeViewAdapter - adapter?.setFriendProfileList(it) - } -} \ No newline at end of file diff --git a/app/src/main/java/com/sopt/now/main/myPageFragment/MyPageFragment.kt b/app/src/main/java/com/sopt/now/main/myPageFragment/MyPageFragment.kt deleted file mode 100644 index 45cc66a..0000000 --- a/app/src/main/java/com/sopt/now/main/myPageFragment/MyPageFragment.kt +++ /dev/null @@ -1,84 +0,0 @@ -package com.sopt.now.main.myPageFragment - -import android.os.Bundle -import android.util.Log -import android.view.LayoutInflater -import android.view.View -import android.view.ViewGroup -import android.widget.Toast -import androidx.fragment.app.Fragment -import com.sopt.now.service.ServicePool -import com.sopt.now.main.ResponseUserInfoDto -import com.sopt.now.databinding.FragmentMypageBinding -import retrofit2.Call -import retrofit2.Callback -import retrofit2.Response - -class MyPageFragment : Fragment() { - private var _binding: FragmentMypageBinding? = null - private val binding - get() = requireNotNull(_binding) { - "바인딩 객체를 생성해야 합니다." - } - - private var memberId: String? = null - - companion object { - fun newInstance(memberId: String?): MyPageFragment { - val fragment = MyPageFragment() - val args = Bundle().apply { - putString("memberId", memberId) - } - fragment.arguments = args - return fragment - } - } - - override fun onCreateView( - inflater: LayoutInflater, - container: ViewGroup?, - savedInstanceState: Bundle? - ): View { - _binding = FragmentMypageBinding.inflate(inflater, container, false) - return binding.root - } - - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { - super.onViewCreated(view, savedInstanceState) - - memberId = activity?.intent?.getStringExtra("memberId") ?: "0" - - memberId?.let { memberId -> - ServicePool.userService.getUserInfo(memberId.toInt()).enqueue(object : - Callback { - override fun onResponse( - call: Call, - response: Response - ) { - if (response.isSuccessful) { - val userInfo = response.body()?.data - - userInfo?.let { - binding.tvMyPageId.text = " ${it.authenticationId}" - binding.tvMyPagePw.text = " ${it.nickname}" - binding.tvMyPagePhoneNumber.text = " ${it.phone}" - } - } else { - Toast.makeText(requireContext(), "회원 정보를 가져오는데 실패했습니다.", Toast.LENGTH_SHORT) - .show() - } - } - - override fun onFailure(call: Call, t: Throwable) { - Log.e("MyPageFragment", "Failed to fetch user info: ${t.message}") - Toast.makeText(requireContext(), "서버와의 통신 실패", Toast.LENGTH_SHORT).show() - } - }) - } - } - - override fun onDestroyView() { - super.onDestroyView() - _binding = null - } -} \ No newline at end of file diff --git a/app/src/main/java/com/sopt/now/service/ApiFactory.kt b/app/src/main/java/com/sopt/now/service/ApiFactory.kt deleted file mode 100644 index 3b58c85..0000000 --- a/app/src/main/java/com/sopt/now/service/ApiFactory.kt +++ /dev/null @@ -1,46 +0,0 @@ -package com.sopt.now.service - -import com.jakewharton.retrofit2.converter.kotlinx.serialization.asConverterFactory -import com.sopt.now.BuildConfig -import com.sopt.now.BuildConfig.AUTH_BASE_URL -import com.sopt.now.BuildConfig.FRIEND_BASE_URL -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 - - -object ApiFactory { - private const val AUTH_BASE_URL: String = BuildConfig.AUTH_BASE_URL - private const val FRIEND_BASE_URL: String = BuildConfig.FRIEND_BASE_URL - - // HTTP 로깅 인터셉터 설정 - private val loggingInterceptor = HttpLoggingInterceptor().apply { - level = HttpLoggingInterceptor.Level.BODY - } - - // OkHttpClient 설정 - private val okHttpClient = OkHttpClient.Builder() - .addInterceptor(loggingInterceptor) // 로깅 인터셉터 추가 - .connectTimeout(30, TimeUnit.SECONDS) // 연결 타임아웃 - .readTimeout(30, TimeUnit.SECONDS) // 읽기 타임아웃 - .writeTimeout(30, TimeUnit.SECONDS) // 쓰기 타임아웃 - .build() - - fun provideRetrofit(url:String): Retrofit { - return Retrofit.Builder() - .baseUrl(url) - .client(okHttpClient) - .addConverterFactory(Json.asConverterFactory("application/json".toMediaType())) - .build() - } - inline fun create(url: String): T = provideRetrofit(url).create(T::class.java) -} - -object ServicePool { - val authService = ApiFactory.create(AUTH_BASE_URL) - val userService = ApiFactory.create(AUTH_BASE_URL) - val friendService = ApiFactory.create(FRIEND_BASE_URL) -} \ No newline at end of file diff --git a/app/src/main/java/com/sopt/now/service/AuthService.kt b/app/src/main/java/com/sopt/now/service/AuthService.kt deleted file mode 100644 index a4b7014..0000000 --- a/app/src/main/java/com/sopt/now/service/AuthService.kt +++ /dev/null @@ -1,25 +0,0 @@ -package com.sopt.now.service - -import com.sopt.now.main.ResponseUserInfoDto -import com.sopt.now.signIn.RequestSignInDto -import com.sopt.now.signUp.RequestSignUpDto -import com.sopt.now.signIn.ResponseSignInDto -import com.sopt.now.signUp.ResponseSignUpDto -import retrofit2.Call -import retrofit2.Response -import retrofit2.http.Body -import retrofit2.http.GET -import retrofit2.http.Header -import retrofit2.http.POST - -interface AuthService { - @POST("member/join") - suspend fun signUp( - @Body request: RequestSignUpDto, - ): Response - - @POST("member/login") - fun signIn( - @Body request: RequestSignInDto, - ): Call -} \ No newline at end of file diff --git a/app/src/main/java/com/sopt/now/service/FriendService.kt b/app/src/main/java/com/sopt/now/service/FriendService.kt deleted file mode 100644 index 276865c..0000000 --- a/app/src/main/java/com/sopt/now/service/FriendService.kt +++ /dev/null @@ -1,13 +0,0 @@ -package com.sopt.now.service - -import com.sopt.now.main.homeFragment.ResponseFriendsInfoDto -import retrofit2.Call -import retrofit2.http.GET -import retrofit2.http.Query - -interface FriendService { - @GET("/api/users") - fun getFriendsInfo( - @Query("page") page: Int, - ): Call -} \ No newline at end of file diff --git a/app/src/main/java/com/sopt/now/service/UserService.kt b/app/src/main/java/com/sopt/now/service/UserService.kt deleted file mode 100644 index 58bea8c..0000000 --- a/app/src/main/java/com/sopt/now/service/UserService.kt +++ /dev/null @@ -1,13 +0,0 @@ -package com.sopt.now.service - -import com.sopt.now.main.ResponseUserInfoDto -import retrofit2.Call -import retrofit2.http.GET -import retrofit2.http.Header - -interface UserService { - @GET("member/info") - fun getUserInfo( - @Header("memberId") memberId: Int, - ): Call -} \ No newline at end of file diff --git a/app/src/main/java/com/sopt/now/signIn/SignInViewModel.kt b/app/src/main/java/com/sopt/now/signIn/SignInViewModel.kt deleted file mode 100644 index 41a83bc..0000000 --- a/app/src/main/java/com/sopt/now/signIn/SignInViewModel.kt +++ /dev/null @@ -1,49 +0,0 @@ -package com.sopt.now.signIn - -import android.util.Log -import androidx.lifecycle.MutableLiveData -import androidx.lifecycle.ViewModel -import com.sopt.now.service.ServicePool -import retrofit2.Call -import retrofit2.Callback -import retrofit2.Response - -class SignInViewModel : ViewModel() { - private val authService by lazy { ServicePool.authService } - val liveData = MutableLiveData() - - fun signIn(request: RequestSignInDto) { - authService.signIn(request).enqueue(object : Callback { - override fun onResponse( - call: Call, - response: Response, - ) { - if (response.isSuccessful) { - val data: ResponseSignInDto? = response.body() - val memberId = response.headers()["location"] - liveData.value = SignInState( - isSuccess = true, - message = "로그인 성공! 유저의 ID는 $memberId 입니둥", - memberId = memberId - ) - Log.d("SignIn", "data: $data, userId: $memberId") - } else { - val error = response.message() - liveData.value = SignInState( - isSuccess = false, - message = "로그인 실패 $error", - memberId = null - ) - } - } - - override fun onFailure(call: Call, t: Throwable) { - liveData.value = SignInState( - isSuccess = false, - message = "서버 에러", - memberId = null - ) - } - }) - } -} \ No newline at end of file diff --git a/app/src/main/java/com/sopt/now/signUp/SignUpViewModel.kt b/app/src/main/java/com/sopt/now/signUp/SignUpViewModel.kt deleted file mode 100644 index d39f77d..0000000 --- a/app/src/main/java/com/sopt/now/signUp/SignUpViewModel.kt +++ /dev/null @@ -1,42 +0,0 @@ -package com.sopt.now.signUp - -import android.util.Log -import androidx.lifecycle.LiveData -import androidx.lifecycle.MutableLiveData -import androidx.lifecycle.ViewModel -import androidx.lifecycle.viewModelScope -import com.sopt.now.service.ServicePool -import kotlinx.coroutines.launch -import retrofit2.Call -import retrofit2.Callback -import retrofit2.Response - -class SignUpViewModel : ViewModel() { - private val authService by lazy { ServicePool.authService } - val liveData = MutableLiveData() - - private val _navigateToSignIn = MutableLiveData() - val navigateToSignIn: LiveData - get() = _navigateToSignIn - - fun signUp(request: RequestSignUpDto) { - viewModelScope.launch { - runCatching { - authService.signUp(request) - }.onSuccess { - liveData.value = SignUpState(true, "회원가입 성공") - moveToSignInActivity() - }.onFailure { - liveData.value = SignUpState(false, "회원가입 실패") - } - } - } - - private fun moveToSignInActivity() { - _navigateToSignIn.value = true - } - - fun doneNavigatingToSignIn() { - _navigateToSignIn.value = false - } -} \ No newline at end of file diff --git a/app/src/main/java/com/sopt/now/main/MainActivity.kt b/app/src/main/java/com/sopt/now/ui/main/MainActivity.kt similarity index 86% rename from app/src/main/java/com/sopt/now/main/MainActivity.kt rename to app/src/main/java/com/sopt/now/ui/main/MainActivity.kt index 4cb3d88..586e489 100644 --- a/app/src/main/java/com/sopt/now/main/MainActivity.kt +++ b/app/src/main/java/com/sopt/now/ui/main/MainActivity.kt @@ -1,4 +1,4 @@ -package com.sopt.now.main +package com.sopt.now.ui.main import android.os.Bundle import android.util.Log @@ -6,10 +6,12 @@ import androidx.appcompat.app.AppCompatActivity import androidx.fragment.app.Fragment import com.sopt.now.R import com.sopt.now.databinding.ActivityMainBinding -import com.sopt.now.main.homeFragment.HomeFragment -import com.sopt.now.main.myPageFragment.MyPageFragment -import com.sopt.now.main.searchFragment.SearchFragment +import com.sopt.now.ui.main.home.HomeFragment +import com.sopt.now.ui.main.myPage.MyPageFragment +import com.sopt.now.ui.main.search.SearchFragment +import dagger.hilt.android.AndroidEntryPoint +@AndroidEntryPoint class MainActivity : AppCompatActivity() { private lateinit var binding: ActivityMainBinding override fun onCreate(savedInstanceState: Bundle?) { @@ -18,7 +20,7 @@ class MainActivity : AppCompatActivity() { setContentView(binding.root) val memberId = intent.getStringExtra("memberId") - Log.e("MainActivity", "memberId: ${memberId}") + Log.e("MainActivity", "memberId: $memberId") val currentFragment = supportFragmentManager.findFragmentById(binding.fcvMain.id) if (currentFragment == null) { diff --git a/app/src/main/java/com/sopt/now/main/homeFragment/HomeData.kt b/app/src/main/java/com/sopt/now/ui/main/home/HomeData.kt similarity index 75% rename from app/src/main/java/com/sopt/now/main/homeFragment/HomeData.kt rename to app/src/main/java/com/sopt/now/ui/main/home/HomeData.kt index def39d7..3b205f8 100644 --- a/app/src/main/java/com/sopt/now/main/homeFragment/HomeData.kt +++ b/app/src/main/java/com/sopt/now/ui/main/home/HomeData.kt @@ -1,8 +1,6 @@ -package com.sopt.now.main.homeFragment +package com.sopt.now.ui.main.home import androidx.annotation.DrawableRes -import kotlinx.serialization.SerialName -import kotlinx.serialization.Serializable class HomeData { data class UserProfile( diff --git a/app/src/main/java/com/sopt/now/main/homeFragment/HomeFragment.kt b/app/src/main/java/com/sopt/now/ui/main/home/HomeFragment.kt similarity index 84% rename from app/src/main/java/com/sopt/now/main/homeFragment/HomeFragment.kt rename to app/src/main/java/com/sopt/now/ui/main/home/HomeFragment.kt index 73b2a62..2712daa 100644 --- a/app/src/main/java/com/sopt/now/main/homeFragment/HomeFragment.kt +++ b/app/src/main/java/com/sopt/now/ui/main/home/HomeFragment.kt @@ -1,4 +1,4 @@ -package com.sopt.now.main.homeFragment +package com.sopt.now.ui.main.home import android.os.Bundle import android.view.LayoutInflater @@ -8,9 +8,10 @@ import androidx.fragment.app.Fragment import androidx.fragment.app.viewModels import androidx.lifecycle.Observer import androidx.recyclerview.widget.LinearLayoutManager -import androidx.recyclerview.widget.RecyclerView import com.sopt.now.databinding.FragmentHomeBinding +import dagger.hilt.android.AndroidEntryPoint +@AndroidEntryPoint class HomeFragment : Fragment() { private var _binding: FragmentHomeBinding? = null private val binding @@ -19,17 +20,6 @@ class HomeFragment : Fragment() { } private val viewModel by viewModels() - companion object { - fun newInstance(memberId: String?): HomeFragment { - val fragment = HomeFragment() - val args = Bundle().apply { - putString("memberId", memberId) - } - fragment.arguments = args - return fragment - } - } - override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, @@ -42,11 +32,21 @@ class HomeFragment : Fragment() { override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) val memberId = activity?.intent?.getStringExtra("memberId") ?: "0" - val homeProfiledAdapter = HomeViewAdapter() + fetchUserInfo(memberId) + fetchFriendsInfo() + observeInfoList() + } + + private fun fetchUserInfo(memberId: String?) { + viewModel.fetchUserInfo(memberId?.toInt() ?: 0) + } - viewModel.fetchUserInfo(memberId.toInt()) + private fun fetchFriendsInfo() { viewModel.fetchFriendsInfo() + } + private fun observeInfoList() { + val homeProfiledAdapter = HomeViewAdapter() binding.rvHomeFriendList.run { adapter = homeProfiledAdapter layoutManager = LinearLayoutManager(requireContext()) @@ -54,10 +54,10 @@ class HomeFragment : Fragment() { homeProfiledAdapter.setFriendProfileList(viewModel.friendsInfo.value) viewModel.userInfo.observe(viewLifecycleOwner, Observer { userProfile -> - userProfile?.let { viewModel.updateUserProfileUI(this,it) } + userProfile?.let { viewModel.updateUserProfileUI(this, it) } }) viewModel.friendsInfo.observe(viewLifecycleOwner, Observer { friendProfiles -> - friendProfiles?.let { viewModel.updateFriendProfilesUI(this,it) } + friendProfiles?.let { viewModel.updateFriendProfilesUI(this, it) } }) } } @@ -66,4 +66,15 @@ class HomeFragment : Fragment() { super.onDestroyView() _binding = null } + + companion object { + fun newInstance(memberId: String?): HomeFragment { + val fragment = HomeFragment() + val args = Bundle().apply { + putString("memberId", memberId) + } + fragment.arguments = args + return fragment + } + } } \ No newline at end of file diff --git a/app/src/main/java/com/sopt/now/main/homeFragment/HomeViewAdapter.kt b/app/src/main/java/com/sopt/now/ui/main/home/HomeViewAdapter.kt similarity index 98% rename from app/src/main/java/com/sopt/now/main/homeFragment/HomeViewAdapter.kt rename to app/src/main/java/com/sopt/now/ui/main/home/HomeViewAdapter.kt index 89554e5..d57c985 100644 --- a/app/src/main/java/com/sopt/now/main/homeFragment/HomeViewAdapter.kt +++ b/app/src/main/java/com/sopt/now/ui/main/home/HomeViewAdapter.kt @@ -1,4 +1,4 @@ -package com.sopt.now.main.homeFragment +package com.sopt.now.ui.main.home import android.view.LayoutInflater import android.view.ViewGroup diff --git a/app/src/main/java/com/sopt/now/main/homeFragment/HomeViewHolder.kt b/app/src/main/java/com/sopt/now/ui/main/home/HomeViewHolder.kt similarity index 89% rename from app/src/main/java/com/sopt/now/main/homeFragment/HomeViewHolder.kt rename to app/src/main/java/com/sopt/now/ui/main/home/HomeViewHolder.kt index 4e83498..ffcf1d1 100644 --- a/app/src/main/java/com/sopt/now/main/homeFragment/HomeViewHolder.kt +++ b/app/src/main/java/com/sopt/now/ui/main/home/HomeViewHolder.kt @@ -1,12 +1,9 @@ -package com.sopt.now.main.homeFragment +package com.sopt.now.ui.main.home -import androidx.lifecycle.LiveData import androidx.recyclerview.widget.RecyclerView import com.bumptech.glide.Glide -import com.sopt.now.R import com.sopt.now.databinding.ItemFriendBinding import com.sopt.now.databinding.ItemUserBinding -import com.sopt.now.main.ResponseUserInfoDto class HomeViewHolder { class UserViewHolder(private val binding: ItemUserBinding) : diff --git a/app/src/main/java/com/sopt/now/ui/main/home/HomeViewModel.kt b/app/src/main/java/com/sopt/now/ui/main/home/HomeViewModel.kt new file mode 100644 index 0000000..8562de1 --- /dev/null +++ b/app/src/main/java/com/sopt/now/ui/main/home/HomeViewModel.kt @@ -0,0 +1,83 @@ +package com.sopt.now.ui.main.home + +import android.util.Log +import androidx.lifecycle.LiveData +import androidx.lifecycle.MutableLiveData +import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import androidx.recyclerview.widget.RecyclerView +import com.sopt.now.R +import com.sopt.now.data.repository.FriendRepository +import com.sopt.now.data.repository.UserRepository +import dagger.hilt.android.lifecycle.HiltViewModel +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch +import javax.inject.Inject + +@HiltViewModel +class HomeViewModel +@Inject constructor( + private val userRepository: UserRepository, + private val friendRepository: FriendRepository, +) : ViewModel() { + + private val _userInfo = MutableLiveData() + val userInfo: LiveData + get() = _userInfo + + private val _friendsInfo = MutableLiveData?>() + val friendsInfo: LiveData?> + get() = _friendsInfo + + fun fetchUserInfo(memberId: Int) { + viewModelScope.launch(Dispatchers.IO) { + runCatching { + userRepository.getUserInfo(memberId) + }.onSuccess { + val responseUserInfoDto = it.body() + val userProfileInfo = responseUserInfoDto?.data?.let { userData -> + HomeData.UserProfile( + R.drawable.sonminjae_profile, + userData.nickname, + userData.phone, + userData.authenticationId + ) + } + _userInfo.postValue(userProfileInfo) + }.onFailure { + Log.e("HomeViewModel", it.message.toString()) + } + } + } + + fun fetchFriendsInfo() { + viewModelScope.launch(Dispatchers.IO) { + runCatching { + friendRepository.getFriendsInfo(2) + }.onSuccess { + val responseFriendsInfoDto = it.body() + val friendProfiles = responseFriendsInfoDto?.data?.map { friendData -> + HomeData.FriendProfile( + friendData.avatar, + "${friendData.firstName} ${friendData.lastName}", + friendData.email + ) + } + _friendsInfo.postValue(friendProfiles) + }.onFailure { + Log.e("HomeViewModel", it.message.toString()) + } + } + } + + fun updateUserProfileUI(view: RecyclerView, it: HomeData.UserProfile) { + val adapter = view.adapter as? HomeViewAdapter + adapter?.setUserProfileList(it) + } + + + fun updateFriendProfilesUI(view: RecyclerView, it: List) { + val adapter = view.adapter as? HomeViewAdapter + adapter?.setFriendProfileList(it) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/sopt/now/ui/main/myPage/MyPageFragment.kt b/app/src/main/java/com/sopt/now/ui/main/myPage/MyPageFragment.kt new file mode 100644 index 0000000..cbf873d --- /dev/null +++ b/app/src/main/java/com/sopt/now/ui/main/myPage/MyPageFragment.kt @@ -0,0 +1,69 @@ +package com.sopt.now.ui.main.myPage + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.fragment.app.Fragment +import androidx.fragment.app.viewModels +import com.sopt.now.databinding.FragmentMypageBinding +import dagger.hilt.android.AndroidEntryPoint + +@AndroidEntryPoint +class MyPageFragment : Fragment() { + private var _binding: FragmentMypageBinding? = null + private val binding + get() = requireNotNull(_binding) { + "바인딩 객체를 생성해야 합니다." + } + + private val viewModel by viewModels() + + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): View { + _binding = FragmentMypageBinding.inflate(inflater, container, false) + return binding.root + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + val memberId: String = activity?.intent?.getStringExtra("memberId") ?: "0" + fetchUserInfo(memberId) + observeUserInfo() + } + + private fun fetchUserInfo(memberId: String?) { + viewModel.fetchUserInfo(memberId?.toInt() ?: 0) + } + + private fun observeUserInfo() { + with(binding) { + viewModel.userInfo.observe(viewLifecycleOwner) { + it?.let { + tvMyPageShowName.text = it.data.nickname + tvMyPageShowId.text = it.data.authenticationId + tvMyPageShowPhoneNumber.text = it.data.phone + } + } + } + } + + override fun onDestroyView() { + super.onDestroyView() + _binding = null + } + + companion object { + fun newInstance(memberId: String?): MyPageFragment { + val fragment = MyPageFragment() + val args = Bundle().apply { + putString("memberId", memberId) + } + fragment.arguments = args + return fragment + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/sopt/now/ui/main/myPage/MyPageViewModel.kt b/app/src/main/java/com/sopt/now/ui/main/myPage/MyPageViewModel.kt new file mode 100644 index 0000000..e5daf9c --- /dev/null +++ b/app/src/main/java/com/sopt/now/ui/main/myPage/MyPageViewModel.kt @@ -0,0 +1,35 @@ +package com.sopt.now.ui.main.myPage + +import android.util.Log +import androidx.lifecycle.LiveData +import androidx.lifecycle.MutableLiveData +import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import com.sopt.now.data.repository.UserRepository +import com.sopt.now.data.response.ResponseUserInfoDto +import dagger.hilt.android.lifecycle.HiltViewModel +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch +import javax.inject.Inject + +@HiltViewModel +class MyPageViewModel +@Inject constructor( + private val userRepository: UserRepository +) : ViewModel() { + private val _userInfo = MutableLiveData() + val userInfo: LiveData + get() = _userInfo + + fun fetchUserInfo(memberId: Int) { + viewModelScope.launch(Dispatchers.IO) { + runCatching { + userRepository.getUserInfo(memberId) + }.onSuccess { + _userInfo.postValue(it.body()) + }.onFailure { + Log.e("MyPageViewModel", it.message.toString()) + } + } + } +} diff --git a/app/src/main/java/com/sopt/now/main/searchFragment/SearchFragment.kt b/app/src/main/java/com/sopt/now/ui/main/search/SearchFragment.kt similarity index 90% rename from app/src/main/java/com/sopt/now/main/searchFragment/SearchFragment.kt rename to app/src/main/java/com/sopt/now/ui/main/search/SearchFragment.kt index ec452e8..e7a5ad8 100644 --- a/app/src/main/java/com/sopt/now/main/searchFragment/SearchFragment.kt +++ b/app/src/main/java/com/sopt/now/ui/main/search/SearchFragment.kt @@ -1,4 +1,4 @@ -package com.sopt.now.main.searchFragment +package com.sopt.now.ui.main.search import android.os.Bundle import android.view.LayoutInflater @@ -6,7 +6,9 @@ import android.view.View import android.view.ViewGroup import androidx.fragment.app.Fragment import com.sopt.now.databinding.FragmentSearchBinding +import dagger.hilt.android.AndroidEntryPoint +@AndroidEntryPoint class SearchFragment : Fragment() { private var _binding: FragmentSearchBinding? = null private val binding diff --git a/app/src/main/java/com/sopt/now/signIn/SignInActivity.kt b/app/src/main/java/com/sopt/now/ui/signIn/SignInActivity.kt similarity index 73% rename from app/src/main/java/com/sopt/now/signIn/SignInActivity.kt rename to app/src/main/java/com/sopt/now/ui/signIn/SignInActivity.kt index e19c097..5c270a1 100644 --- a/app/src/main/java/com/sopt/now/signIn/SignInActivity.kt +++ b/app/src/main/java/com/sopt/now/ui/signIn/SignInActivity.kt @@ -1,14 +1,17 @@ -package com.sopt.now.signIn +package com.sopt.now.ui.signIn import android.content.Intent import android.os.Bundle import android.widget.Toast import androidx.activity.viewModels import androidx.appcompat.app.AppCompatActivity -import com.sopt.now.main.MainActivity -import com.sopt.now.signUp.SignUpActivity +import com.sopt.now.data.request.RequestSignInDto import com.sopt.now.databinding.ActivitySigninBinding +import com.sopt.now.ui.main.MainActivity +import com.sopt.now.ui.signUp.SignUpActivity +import dagger.hilt.android.AndroidEntryPoint +@AndroidEntryPoint class SignInActivity : AppCompatActivity() { private val binding by lazy { ActivitySigninBinding.inflate(layoutInflater) } @@ -33,11 +36,10 @@ class SignInActivity : AppCompatActivity() { private fun initObserver() { viewModel.liveData.observe(this) { - signInState -> - Toast.makeText(this,signInState.message,Toast.LENGTH_SHORT).show() - if(signInState.isSuccess) { - val intent = Intent(this@SignInActivity, MainActivity::class.java).apply{ - signInState.memberId?.let { memberId -> putExtra("memberId",memberId) } + showToast(it.message) + if (it.isSuccess) { + val intent = Intent(this@SignInActivity, MainActivity::class.java).apply { + it.memberId?.let { memberId -> putExtra("memberId", memberId) } } startActivity(intent) } @@ -52,4 +54,8 @@ class SignInActivity : AppCompatActivity() { password = password, ) } + + private fun showToast(message: String) { + Toast.makeText(this, message, Toast.LENGTH_SHORT).show() + } } \ No newline at end of file diff --git a/app/src/main/java/com/sopt/now/signIn/SignInState.kt b/app/src/main/java/com/sopt/now/ui/signIn/SignInState.kt similarity index 78% rename from app/src/main/java/com/sopt/now/signIn/SignInState.kt rename to app/src/main/java/com/sopt/now/ui/signIn/SignInState.kt index 8399f3f..f18b4a5 100644 --- a/app/src/main/java/com/sopt/now/signIn/SignInState.kt +++ b/app/src/main/java/com/sopt/now/ui/signIn/SignInState.kt @@ -1,4 +1,4 @@ -package com.sopt.now.signIn +package com.sopt.now.ui.signIn data class SignInState( val isSuccess: Boolean, diff --git a/app/src/main/java/com/sopt/now/ui/signIn/SignInViewModel.kt b/app/src/main/java/com/sopt/now/ui/signIn/SignInViewModel.kt new file mode 100644 index 0000000..bd4580d --- /dev/null +++ b/app/src/main/java/com/sopt/now/ui/signIn/SignInViewModel.kt @@ -0,0 +1,47 @@ +package com.sopt.now.ui.signIn + +import androidx.lifecycle.LiveData +import androidx.lifecycle.MutableLiveData +import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import com.sopt.now.data.repository.AuthRepository +import com.sopt.now.data.request.RequestSignInDto +import dagger.hilt.android.lifecycle.HiltViewModel +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch +import javax.inject.Inject + +@HiltViewModel +class SignInViewModel +@Inject constructor( + private val authRepository: AuthRepository +) : ViewModel() { + val liveData = MutableLiveData() + + private val _navigateToMain = MutableLiveData() + val navigateToMain: LiveData + get() = _navigateToMain + + fun signIn(request: RequestSignInDto) { + viewModelScope.launch(Dispatchers.IO) { + runCatching { + authRepository.signIn(request) + }.onSuccess { + val memberId = it.headers()["location"] + liveData.postValue(SignInState(true, "로그인 성공! 유저의 ID는 $memberId 입니둥", memberId)) + moveToMainActivity() + }.onFailure { + val error = it.message + liveData.postValue(SignInState(false, "로그인 실패 $error", null)) + } + } + } + + private fun moveToMainActivity() { + _navigateToMain.postValue(true) + } + + fun doneNavigatingToSignIn() { + _navigateToMain.postValue(false) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/sopt/now/signUp/SignUpActivity.kt b/app/src/main/java/com/sopt/now/ui/signUp/SignUpActivity.kt similarity index 90% rename from app/src/main/java/com/sopt/now/signUp/SignUpActivity.kt rename to app/src/main/java/com/sopt/now/ui/signUp/SignUpActivity.kt index d04813c..4fed723 100644 --- a/app/src/main/java/com/sopt/now/signUp/SignUpActivity.kt +++ b/app/src/main/java/com/sopt/now/ui/signUp/SignUpActivity.kt @@ -1,13 +1,16 @@ -package com.sopt.now.signUp +package com.sopt.now.ui.signUp import android.content.Intent import android.os.Bundle import android.widget.Toast import androidx.activity.viewModels import androidx.appcompat.app.AppCompatActivity +import com.sopt.now.data.request.RequestSignUpDto import com.sopt.now.databinding.ActivitySignupBinding -import com.sopt.now.signIn.SignInActivity +import com.sopt.now.ui.signIn.SignInActivity +import dagger.hilt.android.AndroidEntryPoint +@AndroidEntryPoint class SignUpActivity : AppCompatActivity() { private val binding by lazy { ActivitySignupBinding.inflate(layoutInflater) } diff --git a/app/src/main/java/com/sopt/now/signUp/SignUpState.kt b/app/src/main/java/com/sopt/now/ui/signUp/SignUpState.kt similarity index 71% rename from app/src/main/java/com/sopt/now/signUp/SignUpState.kt rename to app/src/main/java/com/sopt/now/ui/signUp/SignUpState.kt index eb5b271..dcf5c9e 100644 --- a/app/src/main/java/com/sopt/now/signUp/SignUpState.kt +++ b/app/src/main/java/com/sopt/now/ui/signUp/SignUpState.kt @@ -1,4 +1,4 @@ -package com.sopt.now.signUp +package com.sopt.now.ui.signUp data class SignUpState( val isSuccess: Boolean, diff --git a/app/src/main/java/com/sopt/now/ui/signUp/SignUpViewModel.kt b/app/src/main/java/com/sopt/now/ui/signUp/SignUpViewModel.kt new file mode 100644 index 0000000..e25e03e --- /dev/null +++ b/app/src/main/java/com/sopt/now/ui/signUp/SignUpViewModel.kt @@ -0,0 +1,45 @@ +package com.sopt.now.ui.signUp + +import androidx.lifecycle.LiveData +import androidx.lifecycle.MutableLiveData +import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import com.sopt.now.data.repository.AuthRepository +import com.sopt.now.data.request.RequestSignUpDto +import dagger.hilt.android.lifecycle.HiltViewModel +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch +import javax.inject.Inject + +@HiltViewModel +class SignUpViewModel +@Inject constructor( + private val authRepository: AuthRepository +) : ViewModel() { + val liveData = MutableLiveData() + + private val _navigateToSignIn = MutableLiveData() + val navigateToSignIn: LiveData + get() = _navigateToSignIn + + fun signUp(request: RequestSignUpDto) { + viewModelScope.launch(Dispatchers.IO) { + runCatching { + authRepository.signUp(request) + }.onSuccess { + liveData.postValue(SignUpState(true, "회원가입 성공")) + moveToSignInActivity() + }.onFailure { + liveData.postValue(SignUpState(false, "회원가입 실패")) + } + } + } + + private fun moveToSignInActivity() { + _navigateToSignIn.postValue(true) + } + + fun doneNavigatingToSignIn() { + _navigateToSignIn.postValue(false) + } +} \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_mypage.xml b/app/src/main/res/layout/fragment_mypage.xml index cf67fe2..c122dd0 100644 --- a/app/src/main/res/layout/fragment_mypage.xml +++ b/app/src/main/res/layout/fragment_mypage.xml @@ -59,32 +59,11 @@ app:layout_constraintTop_toBottomOf="@+id/tvMyPageId" app:layout_constraintStart_toStartOf="parent"/> - - - -