diff --git a/README.md b/README.md index 2b969a941..9cf8cd131 100644 --- a/README.md +++ b/README.md @@ -28,26 +28,25 @@ ## πŸ“„ Package ``` πŸ“¦com.eatssu.android -β”œβ”€β”€ πŸ“‚base +β”œβ”€β”€ πŸ“‚alarm β”œβ”€β”€ πŸ“‚data -β”‚ β”œβ”€β”€ πŸ“‚db β”‚ β”œβ”€β”€ πŸ“‚dto β”‚ β”‚ β”œβ”€β”€ πŸ“‚request β”‚ β”‚ └── πŸ“‚response β”‚ β”œβ”€β”€ πŸ“‚enums -β”‚ └── πŸ“‚repository(impl) +β”‚ β”œβ”€β”€ πŸ“‚servicerepository(impl) +β”‚ └── πŸ“‚service β”œβ”€β”€ πŸ“‚di β”œβ”€β”€ πŸ“‚domain β”‚ β”œβ”€β”€ πŸ“‚model β”‚ β”œβ”€β”€ πŸ“‚repository -β”‚ β”œβ”€β”€ πŸ“‚service β”‚ └── πŸ“‚usecase β”œβ”€β”€ πŸ“‚presentation +β”‚ β”œβ”€β”€ πŸ“‚base β”‚ β”œβ”€β”€ πŸ“‚common -β”‚ └── πŸ“‚feature -β”‚ β”œβ”€β”€ πŸ“‚viewModel -β”‚ └── πŸ“‚view -β”œβ”€β”€ πŸ“‚util +β”‚ β”œβ”€β”€ πŸ“‚feature +β”‚ β”‚ └── πŸ“‚... +β”‚ └── πŸ“‚util └── πŸ“„App ``` diff --git a/app/build.gradle.kts b/app/build.gradle.kts index f858561ea..edcdb55d1 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -1,14 +1,15 @@ import java.util.Properties plugins { - id("com.android.application") - id("org.jetbrains.kotlin.android") + alias(libs.plugins.android.application) + alias(libs.plugins.kotlin.android) + alias(libs.plugins.google.services) + alias(libs.plugins.firebase.crashlytics) + alias(libs.plugins.hilt.android) id("kotlin-parcelize") - id("com.google.gms.google-services") - id("com.google.firebase.crashlytics") id("kotlin-android") id("kotlin-kapt") - id("dagger.hilt.android.plugin") + id("com.google.android.gms.oss-licenses-plugin") } android { @@ -21,8 +22,8 @@ android { applicationId = "com.eatssu.android" minSdk = 23 targetSdk = 34 - versionCode = 23 - versionName = "2.1.3" + versionCode = 24 + versionName = "2.1.4" testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" } @@ -54,6 +55,7 @@ android { debug { // applicationIdSuffix = ".debug" +// isDebuggable = false val p = Properties() p.load(project.rootProject.file("local.properties").reader()) @@ -100,7 +102,6 @@ dependencies { implementation(libs.transport.runtime) implementation(libs.activity) implementation(libs.fragment) - implementation(libs.androidx.activity) // Testing libraries testImplementation(libs.junit) @@ -151,6 +152,9 @@ dependencies { // Timber for logging implementation(libs.timber) + + // OSS + implementation(libs.oss.licenses) } kapt { diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index efa1a0811..cea7abb5b 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -41,9 +41,11 @@ android:theme="@style/Theme.EatSSUAndroid" android:usesCleartextTraffic="true" tools:targetApi="31"> - + @@ -52,17 +54,17 @@ @@ -71,31 +73,31 @@ = arrayListOf(), + @SerializedName("rating") var rating: Double? = null, + @SerializedName("briefMenus") var briefMenus: ArrayList = arrayListOf(), ) data class MenusInformationList( @@ -23,10 +23,10 @@ fun ArrayList.mapTodayMenuResponseToMenu(): List { this.forEach { mealResponse -> val menuNames = - mealResponse.menusInformationList.joinToString(separator = "+") { it.name ?: "" } + mealResponse.briefMenus.joinToString(separator = "+") { it.name ?: "" } val mealId = mealResponse.mealId ?: -1 val price = mealResponse.price ?: 0 - val mainRating = mealResponse.mainRating ?: 0.0 + val mainRating = mealResponse.rating ?: 0.0 val menu = Menu(mealId, menuNames, price, mainRating) diff --git a/app/src/main/java/com/eatssu/android/data/dto/response/MealReviewInfoResponse.kt b/app/src/main/java/com/eatssu/android/data/dto/response/MealReviewInfoResponse.kt index 717dd0d0f..b58c0b51a 100644 --- a/app/src/main/java/com/eatssu/android/data/dto/response/MealReviewInfoResponse.kt +++ b/app/src/main/java/com/eatssu/android/data/dto/response/MealReviewInfoResponse.kt @@ -1,6 +1,6 @@ package com.eatssu.android.data.dto.response -import com.eatssu.android.data.model.ReviewInfo +import com.eatssu.android.domain.model.ReviewInfo import com.google.gson.annotations.SerializedName data class GetMealReviewInfoResponse( diff --git a/app/src/main/java/com/eatssu/android/data/dto/response/MenuOfMealResponse.kt b/app/src/main/java/com/eatssu/android/data/dto/response/MenuOfMealResponse.kt index b38fe71c5..78d69a721 100644 --- a/app/src/main/java/com/eatssu/android/data/dto/response/MenuOfMealResponse.kt +++ b/app/src/main/java/com/eatssu/android/data/dto/response/MenuOfMealResponse.kt @@ -1,10 +1,10 @@ package com.eatssu.android.data.dto.response -import com.eatssu.android.data.model.MenuMini +import com.eatssu.android.domain.model.MenuMini import com.google.gson.annotations.SerializedName data class MenuOfMealResponse( - @SerializedName("menusInformation") var menusInformation: ArrayList = arrayListOf(), + @SerializedName("briefMenus") var briefMenus: ArrayList = arrayListOf(), ) data class MenusInformation( @@ -14,14 +14,13 @@ data class MenusInformation( ) -fun MenuOfMealResponse.asMenuOfMeal(): List { - val menuList = mutableListOf() +fun MenuOfMealResponse.toMenuMiniList(): List { + return briefMenus.map { it.toMenuMini() } +} - this.menusInformation.forEach { - - val menu = MenuMini(it.menuId, it.name) - menuList.add(menu) - } - - return menuList +fun MenusInformation.toMenuMini(): MenuMini { + return MenuMini( + id = this.menuId, + name = this.name + ) } \ No newline at end of file diff --git a/app/src/main/java/com/eatssu/android/data/dto/response/MenuResponse.kt b/app/src/main/java/com/eatssu/android/data/dto/response/MenuResponse.kt index 4703e2b98..1118e758c 100644 --- a/app/src/main/java/com/eatssu/android/data/dto/response/MenuResponse.kt +++ b/app/src/main/java/com/eatssu/android/data/dto/response/MenuResponse.kt @@ -1,8 +1,8 @@ package com.eatssu.android.data.dto.response -import android.util.Log -import com.eatssu.android.data.model.Menu +import com.eatssu.android.domain.model.Menu import com.google.gson.annotations.SerializedName +import timber.log.Timber data class GetFixedMenuResponse( @@ -14,7 +14,7 @@ data class GetFixedMenuResponse( data class CategoryMenuListCollection( @SerializedName("category") var category: String? = null, - @SerializedName("menuInformationList") var menuInformationList: ArrayList = arrayListOf(), + @SerializedName("menus") var menus: ArrayList = arrayListOf(), ) @@ -23,38 +23,27 @@ data class MenuInformationList( @SerializedName("menuId") var menuId: Long? = null, @SerializedName("name") var name: String? = null, @SerializedName("price") var price: Int? = null, - @SerializedName("mainRating") var mainRating: Double? = null, + @SerializedName("rating") var rating: Double? = null, ) -//fun GetFixedMenuResponse.mapFixedMenuResponseToMenu(): List { -// return this.map { fixMenuInfo -> -// Menu( -// id = fixMenuInfo.menuId ?: 0, -// name = fixMenuInfo.name ?: "", -// price = fixMenuInfo.price ?: 0, -// rate = fixMenuInfo.mainRating ?: 0.0 -// ) -// } -//} - fun GetFixedMenuResponse.mapFixedMenuResponseToMenu(): List { val menus = mutableListOf() categoryMenuListCollection.forEach { categoryMenuList -> val categoryName = categoryMenuList.category ?: "" - categoryMenuList.menuInformationList.forEach { menuInfo -> + categoryMenuList.menus.forEach { menuInfo -> val menu = Menu( id = menuInfo.menuId ?: 0, name = menuInfo.name ?: "", price = menuInfo.price ?: 0, - rate = menuInfo.mainRating ?: 0.0 + rate = menuInfo.rating ?: 0.0 ) menus.add(menu) } } - Log.d("mapFixedMenuResponseToMenu", menus.toString()) + Timber.d(menus.toString()) return menus } diff --git a/app/src/main/java/com/eatssu/android/data/dto/response/MenuReviewInfoResponse.kt b/app/src/main/java/com/eatssu/android/data/dto/response/MenuReviewInfoResponse.kt index 8d3c1dcac..6489dabad 100644 --- a/app/src/main/java/com/eatssu/android/data/dto/response/MenuReviewInfoResponse.kt +++ b/app/src/main/java/com/eatssu/android/data/dto/response/MenuReviewInfoResponse.kt @@ -1,6 +1,6 @@ package com.eatssu.android.data.dto.response -import com.eatssu.android.data.model.ReviewInfo +import com.eatssu.android.domain.model.ReviewInfo import com.google.gson.annotations.SerializedName data class GetMenuReviewInfoResponse( diff --git a/app/src/main/java/com/eatssu/android/data/dto/response/MyReviewResponse.kt b/app/src/main/java/com/eatssu/android/data/dto/response/MyReviewResponse.kt index 48888bbe7..793e335ea 100644 --- a/app/src/main/java/com/eatssu/android/data/dto/response/MyReviewResponse.kt +++ b/app/src/main/java/com/eatssu/android/data/dto/response/MyReviewResponse.kt @@ -1,6 +1,6 @@ package com.eatssu.android.data.dto.response -import com.eatssu.android.data.model.Review +import com.eatssu.android.domain.model.Review import com.google.gson.annotations.SerializedName data class MyReviewResponse( diff --git a/app/src/main/java/com/eatssu/android/data/dto/response/ReviewListResponse.kt b/app/src/main/java/com/eatssu/android/data/dto/response/ReviewListResponse.kt index 8a0c5d3a5..165b7adb1 100644 --- a/app/src/main/java/com/eatssu/android/data/dto/response/ReviewListResponse.kt +++ b/app/src/main/java/com/eatssu/android/data/dto/response/ReviewListResponse.kt @@ -1,6 +1,6 @@ package com.eatssu.android.data.dto.response -import com.eatssu.android.data.model.Review +import com.eatssu.android.domain.model.Review import com.google.gson.annotations.SerializedName data class GetReviewListResponse( diff --git a/app/src/main/java/com/eatssu/android/data/repository/FirebaseRemoteConfigRepository.kt b/app/src/main/java/com/eatssu/android/data/repository/FirebaseRemoteConfigRepository.kt index 87e2bb18b..3c6be74b9 100644 --- a/app/src/main/java/com/eatssu/android/data/repository/FirebaseRemoteConfigRepository.kt +++ b/app/src/main/java/com/eatssu/android/data/repository/FirebaseRemoteConfigRepository.kt @@ -2,7 +2,7 @@ package com.eatssu.android.data.repository import com.eatssu.android.R import com.eatssu.android.data.enums.Restaurant -import com.eatssu.android.data.model.RestaurantInfo +import com.eatssu.android.domain.model.RestaurantInfo import com.google.firebase.remoteconfig.FirebaseRemoteConfig import com.google.firebase.remoteconfig.FirebaseRemoteConfigSettings import org.json.JSONArray diff --git a/app/src/main/java/com/eatssu/android/data/repository/ImageRepository.kt b/app/src/main/java/com/eatssu/android/data/repository/ImageRepository.kt deleted file mode 100644 index 87cefe0b8..000000000 --- a/app/src/main/java/com/eatssu/android/data/repository/ImageRepository.kt +++ /dev/null @@ -1,11 +0,0 @@ -package com.eatssu.android.data.repository - - -interface ImageRepository { - -// suspend fun getImageString( -// image: MultipartBody.Part -// ): Flow - -// suspend fun login(idToken: String): Flow -} \ No newline at end of file diff --git a/app/src/main/java/com/eatssu/android/data/repository/ImageRepositoryImpl.kt b/app/src/main/java/com/eatssu/android/data/repository/ImageRepositoryImpl.kt deleted file mode 100644 index b01a0423b..000000000 --- a/app/src/main/java/com/eatssu/android/data/repository/ImageRepositoryImpl.kt +++ /dev/null @@ -1,17 +0,0 @@ -package com.eatssu.android.data.repository - -import com.eatssu.android.data.service.ImageService -import javax.inject.Inject - -class ImageRepositoryImpl @Inject constructor(private val imageService: ImageService) : - ImageRepository { - - -// override suspend fun getImageString( -// image: MultipartBody.Part -// ): Flow = flow { -// emit(imageService.getImageUrl(image)) -// } - - -} \ No newline at end of file diff --git a/app/src/main/java/com/eatssu/android/data/repository/MealRepositoryImpl.kt b/app/src/main/java/com/eatssu/android/data/repository/MealRepositoryImpl.kt new file mode 100644 index 000000000..38d861730 --- /dev/null +++ b/app/src/main/java/com/eatssu/android/data/repository/MealRepositoryImpl.kt @@ -0,0 +1,25 @@ +package com.eatssu.android.data.repository + +import com.eatssu.android.data.dto.response.BaseResponse +import com.eatssu.android.data.dto.response.MenuOfMealResponse +import com.eatssu.android.data.service.MealService +import com.eatssu.android.domain.repository.MealRepository +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.flow +import javax.inject.Inject + +class MealRepositoryImpl @Inject constructor(private val mealService: MealService) : + MealRepository { + +// override suspend fun getTodayMeal( +// date: String, +// restaurant: String, +// time: String +// ): Flow>> = +// flow { emit(mealService.getTodayMeal(date, restaurant, time)) } + + override suspend fun getMenuInfoByMealId(mealId: Long): Flow> = + flow { + emit(mealService.getMenuInfoByMealId(mealId)) + } +} diff --git a/app/src/main/java/com/eatssu/android/data/repository/OauthRepositoryImpl.kt b/app/src/main/java/com/eatssu/android/data/repository/OauthRepositoryImpl.kt index 9b080d983..262cfe97f 100644 --- a/app/src/main/java/com/eatssu/android/data/repository/OauthRepositoryImpl.kt +++ b/app/src/main/java/com/eatssu/android/data/repository/OauthRepositoryImpl.kt @@ -1,9 +1,10 @@ package com.eatssu.android.data.repository -import com.eatssu.android.base.BaseResponse import com.eatssu.android.data.dto.request.LoginWithKakaoRequest +import com.eatssu.android.data.dto.response.BaseResponse import com.eatssu.android.data.dto.response.TokenResponse import com.eatssu.android.data.service.OauthService +import com.eatssu.android.domain.repository.OauthRepository import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.flow import javax.inject.Inject diff --git a/app/src/main/java/com/eatssu/android/data/repository/ReportRepositoryImpl.kt b/app/src/main/java/com/eatssu/android/data/repository/ReportRepositoryImpl.kt index 4574b1f5f..a6fb009fd 100644 --- a/app/src/main/java/com/eatssu/android/data/repository/ReportRepositoryImpl.kt +++ b/app/src/main/java/com/eatssu/android/data/repository/ReportRepositoryImpl.kt @@ -1,8 +1,9 @@ package com.eatssu.android.data.repository -import com.eatssu.android.base.BaseResponse import com.eatssu.android.data.dto.request.ReportRequest +import com.eatssu.android.data.dto.response.BaseResponse import com.eatssu.android.data.service.ReportService +import com.eatssu.android.domain.repository.ReportRepository import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.flow import javax.inject.Inject diff --git a/app/src/main/java/com/eatssu/android/data/repository/ReviewRepository.kt b/app/src/main/java/com/eatssu/android/data/repository/ReviewRepository.kt deleted file mode 100644 index 2af1eca77..000000000 --- a/app/src/main/java/com/eatssu/android/data/repository/ReviewRepository.kt +++ /dev/null @@ -1,19 +0,0 @@ -package com.eatssu.android.data.repository - -import com.eatssu.android.data.service.ReviewService - -class ReviewRepository(private val reviewService: ReviewService) { - -// override suspend fun reissueToken( -// refreshToken: String -// ): Flow = flow { -// emit(authService.reissueToken(refreshToken)) -// } - -// suspend fun getMenuReviewInfo(menuId: Long) -// : Flow> = -// flow { -// emit(reviewService.getMenuReviewInfo(menuId)) -// } - -} \ No newline at end of file diff --git a/app/src/main/java/com/eatssu/android/data/repository/ReviewRepositoryImpl.kt b/app/src/main/java/com/eatssu/android/data/repository/ReviewRepositoryImpl.kt new file mode 100644 index 000000000..dd07d70b0 --- /dev/null +++ b/app/src/main/java/com/eatssu/android/data/repository/ReviewRepositoryImpl.kt @@ -0,0 +1,66 @@ +package com.eatssu.android.data.repository + +import com.eatssu.android.data.dto.request.ModifyReviewRequest +import com.eatssu.android.data.dto.request.WriteReviewRequest +import com.eatssu.android.data.dto.response.BaseResponse +import com.eatssu.android.data.dto.response.GetMealReviewInfoResponse +import com.eatssu.android.data.dto.response.GetMenuReviewInfoResponse +import com.eatssu.android.data.dto.response.GetReviewListResponse +import com.eatssu.android.data.dto.response.ImageResponse +import com.eatssu.android.data.service.ReviewService +import com.eatssu.android.domain.repository.ReviewRepository +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.flow +import okhttp3.MultipartBody +import javax.inject.Inject + +class ReviewRepositoryImpl @Inject constructor(private val reviewService: ReviewService) : + ReviewRepository { + + override suspend fun writeReview( + menuId: Long, + body: WriteReviewRequest, + ): Flow> = + flow { + emit(reviewService.writeReview(menuId, body)) + } + + override suspend fun deleteReview(reviewId: Long): Flow> = + flow { + emit(reviewService.deleteReview(reviewId)) + } + + override suspend fun modifyReview( + reviewId: Long, + body: ModifyReviewRequest, + ): Flow> = + flow { + emit(reviewService.modifyReview(reviewId, body)) + } + + override suspend fun getReviewList( + menuType: String, + mealId: Long?, + menuId: Long?, + ): Flow> = flow { + emit(reviewService.getReviewList(menuType, mealId, menuId)) + } + + override suspend fun getMenuReviewInfo(menuId: Long): Flow> = + flow { + emit(reviewService.getMenuReviewInfo(menuId)) + } + + override suspend fun getMealReviewInfo(mealId: Long): Flow> = + flow { + emit(reviewService.getMealReviewInfo(mealId)) + } + + override suspend fun getImageString( + image: MultipartBody.Part, + ): Flow> = + flow { + emit(reviewService.uploadImage(image)) + } + +} diff --git a/app/src/main/java/com/eatssu/android/data/repository/UserRepositoryImpl.kt b/app/src/main/java/com/eatssu/android/data/repository/UserRepositoryImpl.kt index a32e78c77..f8e1a1d67 100644 --- a/app/src/main/java/com/eatssu/android/data/repository/UserRepositoryImpl.kt +++ b/app/src/main/java/com/eatssu/android/data/repository/UserRepositoryImpl.kt @@ -1,10 +1,11 @@ package com.eatssu.android.data.repository -import com.eatssu.android.base.BaseResponse import com.eatssu.android.data.dto.request.ChangeNicknameRequest +import com.eatssu.android.data.dto.response.BaseResponse import com.eatssu.android.data.dto.response.MyInfoResponse import com.eatssu.android.data.dto.response.MyReviewResponse import com.eatssu.android.data.service.UserService +import com.eatssu.android.domain.repository.UserRepository import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.flow import javax.inject.Inject diff --git a/app/src/main/java/com/eatssu/android/data/service/ImageService.kt b/app/src/main/java/com/eatssu/android/data/service/ImageService.kt deleted file mode 100644 index 5f821b653..000000000 --- a/app/src/main/java/com/eatssu/android/data/service/ImageService.kt +++ /dev/null @@ -1,18 +0,0 @@ -package com.eatssu.android.data.service - -import com.eatssu.android.base.BaseResponse -import com.eatssu.android.data.dto.response.ImageResponse -import okhttp3.MultipartBody -import retrofit2.Call -import retrofit2.http.Multipart -import retrofit2.http.POST -import retrofit2.http.Part - -interface ImageService { - - @Multipart - @POST("/reviews/upload/image") //리뷰 이미지 μ—…λ‘œλ“œ - fun getImageUrl( - @Part image: MultipartBody.Part, - ): Call> -} \ No newline at end of file diff --git a/app/src/main/java/com/eatssu/android/data/service/MealService.kt b/app/src/main/java/com/eatssu/android/data/service/MealService.kt index b19975330..af604ecd6 100644 --- a/app/src/main/java/com/eatssu/android/data/service/MealService.kt +++ b/app/src/main/java/com/eatssu/android/data/service/MealService.kt @@ -1,6 +1,6 @@ package com.eatssu.android.data.service -import com.eatssu.android.base.BaseResponse +import com.eatssu.android.data.dto.response.BaseResponse import com.eatssu.android.data.dto.response.GetMealResponse import com.eatssu.android.data.dto.response.MenuOfMealResponse import retrofit2.Call @@ -9,16 +9,22 @@ import retrofit2.http.Path import retrofit2.http.Query interface MealService { - @GET("meals") //변동메뉴 식단 리슀트 쑰회 By 식당 + /** + * 변동메뉴 식단 리슀트 쑰회 By 식당 + */ + @GET("meals") fun getTodayMeal( @Query("date") date: String, @Query("restaurant") restaurant: String, @Query("time") time: String, ): Call>> - @GET("meals/{mealId}/menus-info") //메뉴 정보 리슀트 쑰회 - fun getMenuInfoByMealId( + /** + * 메뉴 정보 리슀트 쑰회 + */ + @GET("meals/{mealId}/menus-info") + suspend fun getMenuInfoByMealId( @Path("mealId") mealId: Long, - ): Call> + ): BaseResponse } \ No newline at end of file diff --git a/app/src/main/java/com/eatssu/android/data/service/MenuService.kt b/app/src/main/java/com/eatssu/android/data/service/MenuService.kt index e729885c3..5e17695eb 100644 --- a/app/src/main/java/com/eatssu/android/data/service/MenuService.kt +++ b/app/src/main/java/com/eatssu/android/data/service/MenuService.kt @@ -1,13 +1,17 @@ package com.eatssu.android.data.service -import com.eatssu.android.base.BaseResponse +import com.eatssu.android.data.dto.response.BaseResponse import com.eatssu.android.data.dto.response.GetFixedMenuResponse import retrofit2.Call import retrofit2.http.GET import retrofit2.http.Query interface MenuService { - @GET("menus") //κ³ μ • 메뉴 리슀트 쑰회 + + /** + * κ³ μ • 메뉴 리슀트 쑰회 + */ + @GET("menus") fun getFixMenu( @Query("restaurant") restaurant: String, ): Call> diff --git a/app/src/main/java/com/eatssu/android/data/service/OauthService.kt b/app/src/main/java/com/eatssu/android/data/service/OauthService.kt index 499f141f7..e57e7c1f0 100644 --- a/app/src/main/java/com/eatssu/android/data/service/OauthService.kt +++ b/app/src/main/java/com/eatssu/android/data/service/OauthService.kt @@ -1,7 +1,7 @@ package com.eatssu.android.data.service -import com.eatssu.android.base.BaseResponse import com.eatssu.android.data.dto.request.LoginWithKakaoRequest +import com.eatssu.android.data.dto.response.BaseResponse import com.eatssu.android.data.dto.response.TokenResponse import retrofit2.http.Body import retrofit2.http.Header diff --git a/app/src/main/java/com/eatssu/android/data/service/ReportService.kt b/app/src/main/java/com/eatssu/android/data/service/ReportService.kt index 0fd0177b2..c8309c1f6 100644 --- a/app/src/main/java/com/eatssu/android/data/service/ReportService.kt +++ b/app/src/main/java/com/eatssu/android/data/service/ReportService.kt @@ -1,7 +1,7 @@ package com.eatssu.android.data.service -import com.eatssu.android.base.BaseResponse import com.eatssu.android.data.dto.request.ReportRequest +import com.eatssu.android.data.dto.response.BaseResponse import retrofit2.http.Body import retrofit2.http.POST diff --git a/app/src/main/java/com/eatssu/android/data/service/ReviewService.kt b/app/src/main/java/com/eatssu/android/data/service/ReviewService.kt index dbdd33cd3..d33bb2204 100644 --- a/app/src/main/java/com/eatssu/android/data/service/ReviewService.kt +++ b/app/src/main/java/com/eatssu/android/data/service/ReviewService.kt @@ -1,58 +1,69 @@ package com.eatssu.android.data.service -import com.eatssu.android.base.BaseResponse import com.eatssu.android.data.dto.request.ModifyReviewRequest import com.eatssu.android.data.dto.request.WriteReviewRequest +import com.eatssu.android.data.dto.response.BaseResponse import com.eatssu.android.data.dto.response.GetMealReviewInfoResponse import com.eatssu.android.data.dto.response.GetMenuReviewInfoResponse import com.eatssu.android.data.dto.response.GetReviewListResponse -import retrofit2.Call -import retrofit2.http.* +import com.eatssu.android.data.dto.response.ImageResponse +import okhttp3.MultipartBody +import retrofit2.http.Body +import retrofit2.http.DELETE +import retrofit2.http.GET +import retrofit2.http.Multipart +import retrofit2.http.PATCH +import retrofit2.http.POST +import retrofit2.http.Part +import retrofit2.http.Path +import retrofit2.http.Query interface ReviewService { @POST("/reviews/write/{menuId}") //리뷰 μž‘μ„± - fun writeReview( + suspend fun writeReview( @Path("menuId") menuId: Long, @Body request: WriteReviewRequest, - ): Call> + ): BaseResponse @DELETE("/reviews/{reviewId}") //리뷰 μ‚­μ œ - fun deleteReview( + suspend fun deleteReview( @Path("reviewId") reviewId: Long, - ): Call> + ): BaseResponse @PATCH("/reviews/{reviewId}") //리뷰 μˆ˜μ •(κΈ€ μˆ˜μ •) - fun modifyReview( + suspend fun modifyReview( @Path("reviewId") reviewId: Long, @Body request: ModifyReviewRequest, - ): Call> + ): BaseResponse //Todo paging 라이브러리 써보기 @GET("/reviews") //리뷰 리슀트 쑰회 - fun getReviewList( + suspend fun getReviewList( @Query("menuType") menuType: String, @Query("mealId") mealId: Long?, @Query("menuId") menuId: Long?, // @Query("lastReviewId") lastReviewId: Long?, -// @Query("page") page: Int? = -// @Query("size") size: Int? = 20 -// @Query("sort") sort: List? = arrayListOf("date","DESC") - ): Call> - - // @GET("/reviews/menus/{menuId}") //κ³ μ • 메뉴 리뷰 정보 쑰회(메뉴λͺ…, 평점 λ“±λ“±) -// fun getMenuReviewInfo( -// @Path("menuId") menuId: Long, -// ): BaseResponse + @Query("page") page: Int? = 0, + @Query("size") size: Int? = 20, + @Query("sort") sort: List? = arrayListOf("date", "DESC"), + ): BaseResponse + @GET("/reviews/menus/{menuId}") //κ³ μ • 메뉴 리뷰 정보 쑰회(메뉴λͺ…, 평점 λ“±λ“±) - fun getMenuReviewInfo( + suspend fun getMenuReviewInfo( @Path("menuId") menuId: Long, - ): Call> + ): BaseResponse @GET("/reviews/meals/{mealId}") //식단(변동 메뉴) 리뷰 정보 쑰회(메뉴λͺ…, 평점 λ“±λ“±) - fun getMealReviewInfo( + suspend fun getMealReviewInfo( @Path("mealId") mealId: Long, - ): Call> + ): BaseResponse + + @Multipart + @POST("/reviews/upload/image") //리뷰 이미지 μ—…λ‘œλ“œ + suspend fun uploadImage( + @Part image: MultipartBody.Part, + ): BaseResponse } \ No newline at end of file diff --git a/app/src/main/java/com/eatssu/android/data/service/UserService.kt b/app/src/main/java/com/eatssu/android/data/service/UserService.kt index d2e106950..c24baa081 100644 --- a/app/src/main/java/com/eatssu/android/data/service/UserService.kt +++ b/app/src/main/java/com/eatssu/android/data/service/UserService.kt @@ -1,10 +1,14 @@ package com.eatssu.android.data.service -import com.eatssu.android.base.BaseResponse import com.eatssu.android.data.dto.request.ChangeNicknameRequest +import com.eatssu.android.data.dto.response.BaseResponse import com.eatssu.android.data.dto.response.MyInfoResponse import com.eatssu.android.data.dto.response.MyReviewResponse -import retrofit2.http.* +import retrofit2.http.Body +import retrofit2.http.DELETE +import retrofit2.http.GET +import retrofit2.http.PATCH +import retrofit2.http.Query interface UserService { diff --git a/app/src/main/java/com/eatssu/android/di/DataModule.kt b/app/src/main/java/com/eatssu/android/di/DataModule.kt index ee24d5f70..cceec61ad 100644 --- a/app/src/main/java/com/eatssu/android/di/DataModule.kt +++ b/app/src/main/java/com/eatssu/android/di/DataModule.kt @@ -1,16 +1,20 @@ package com.eatssu.android.di -import com.eatssu.android.data.repository.OauthRepository +import com.eatssu.android.domain.repository.MealRepository +import com.eatssu.android.data.repository.MealRepositoryImpl +import com.eatssu.android.domain.repository.OauthRepository import com.eatssu.android.data.repository.OauthRepositoryImpl -import com.eatssu.android.data.repository.ReportRepository +import com.eatssu.android.domain.repository.ReportRepository import com.eatssu.android.data.repository.ReportRepositoryImpl -import com.eatssu.android.data.repository.UserRepository +import com.eatssu.android.domain.repository.ReviewRepository +import com.eatssu.android.domain.repository.UserRepository import com.eatssu.android.data.repository.UserRepositoryImpl import dagger.Binds import dagger.Module import dagger.hilt.InstallIn import dagger.hilt.components.SingletonComponent +import com.eatssu.android.data.repository.ReviewRepositoryImpl as ReviewRepositoryImpl1 @Module @InstallIn(SingletonComponent::class) @@ -31,4 +35,13 @@ abstract class DataModule { reportRepositoryImpl: ReportRepositoryImpl, ): ReportRepository + @Binds + internal abstract fun bindsReviewRepository( + reviewRepositoryImpl: ReviewRepositoryImpl1, + ): ReviewRepository + + @Binds + internal abstract fun bindsMealRepository( + mealRepositoryImpl: MealRepositoryImpl, + ): MealRepository } \ No newline at end of file diff --git a/app/src/main/java/com/eatssu/android/di/NetworkModule.kt b/app/src/main/java/com/eatssu/android/di/NetworkModule.kt index 79e283b77..2f5138495 100644 --- a/app/src/main/java/com/eatssu/android/di/NetworkModule.kt +++ b/app/src/main/java/com/eatssu/android/di/NetworkModule.kt @@ -3,8 +3,10 @@ package com.eatssu.android.di import com.eatssu.android.BuildConfig import com.eatssu.android.BuildConfig.BASE_URL +import com.eatssu.android.data.service.MealService import com.eatssu.android.data.service.OauthService import com.eatssu.android.data.service.ReportService +import com.eatssu.android.data.service.ReviewService import com.eatssu.android.data.service.UserService import com.eatssu.android.di.network.TokenInterceptor import dagger.Module @@ -81,4 +83,17 @@ object NetworkModule { fun provideReportService(retrofit: Retrofit): ReportService { return retrofit.create(ReportService::class.java) } + + @Provides + @Singleton + fun provideReviewService(retrofit: Retrofit): ReviewService { + return retrofit.create(ReviewService::class.java) + } + + @Provides + @Singleton + fun provideMealService(retrofit: Retrofit): MealService { + return retrofit.create(MealService::class.java) + } + } \ No newline at end of file diff --git a/app/src/main/java/com/eatssu/android/di/network/TokenInterceptor.kt b/app/src/main/java/com/eatssu/android/di/network/TokenInterceptor.kt index d1583cc66..15b0b128a 100644 --- a/app/src/main/java/com/eatssu/android/di/network/TokenInterceptor.kt +++ b/app/src/main/java/com/eatssu/android/di/network/TokenInterceptor.kt @@ -7,14 +7,14 @@ import android.os.Handler import android.os.Looper import android.widget.Toast import com.eatssu.android.BuildConfig.BASE_URL -import com.eatssu.android.base.BaseResponse +import com.eatssu.android.data.dto.response.BaseResponse import com.eatssu.android.data.dto.response.TokenResponse -import com.eatssu.android.data.usecase.GetAccessTokenUseCase -import com.eatssu.android.data.usecase.GetRefreshTokenUseCase -import com.eatssu.android.data.usecase.LogoutUseCase -import com.eatssu.android.data.usecase.SetAccessTokenUseCase -import com.eatssu.android.data.usecase.SetRefreshTokenUseCase -import com.eatssu.android.ui.login.LoginActivity +import com.eatssu.android.domain.usecase.auth.GetAccessTokenUseCase +import com.eatssu.android.domain.usecase.auth.GetRefreshTokenUseCase +import com.eatssu.android.domain.usecase.auth.LogoutUseCase +import com.eatssu.android.domain.usecase.auth.SetAccessTokenUseCase +import com.eatssu.android.domain.usecase.auth.SetRefreshTokenUseCase +import com.eatssu.android.presentation.login.LoginActivity import com.google.gson.Gson import com.google.gson.reflect.TypeToken import dagger.hilt.android.qualifiers.ApplicationContext @@ -37,15 +37,19 @@ class TokenInterceptor @Inject constructor( ) : Interceptor { companion object { + const val TAG = "TokenInterceptor" + val EXCEPT_LIST = listOf( "/oauths/reissue/token", "/oauths/kakao", ) - - const val TAG = "TokenInterceptor" +// val MULTI_PART = "/reviews/upload/image" private const val CODE_TOKEN_EXPIRED = 401 private const val HEADER_AUTHORIZATION = "Authorization" + private const val HEADER_CONTENT_TYPE = "Content-Type" + private const val HEADER_ACCEPT = "accept" + private const val HEADER_ACCESS_TOKEN = "X-ACCESS-AUTH" private const val HEADER_REFRESH_TOKEN = "X-REFRESH-AUTH" } @@ -60,16 +64,23 @@ class TokenInterceptor @Inject constructor( val originalRequest = chain.request() val request = chain.request().newBuilder().apply { if (EXCEPT_LIST.none { originalRequest.url.encodedPath.endsWith(it) }) { - addHeader("accept", "application/hal+json") - addHeader("Content-Type", "application/json") + addHeader(HEADER_ACCEPT, "application/hal+json") + addHeader(HEADER_CONTENT_TYPE, "application/json") addHeader(HEADER_AUTHORIZATION, "Bearer $accessToken") } +// else if (MULTI_PART.none { originalRequest.url.encodedPath.endsWith(it) }) { +// Timber.d("λ©€ν‹°νŒŒνŠΈ μ‹œμž‘!") +// addHeader(HEADER_ACCEPT, "application/hal+json") +// removeHeader("Content-Type") +// addHeader("Content-Type", "multipart/form-data") +// addHeader(HEADER_AUTHORIZATION, "Bearer $accessToken") +// } }.build() val response = chain.proceed(request) if (response.code == 401) { - Timber.d("토큰 퉀퉀") + Timber.d("토큰 401") response.close() try { @@ -79,7 +90,7 @@ class TokenInterceptor @Inject constructor( .addHeader(HEADER_AUTHORIZATION, "Bearer $refreshToken") .build() - Timber.d("μž¬λ°œκΈ‰ 쀑") + Timber.d("토큰 μž¬λ°œκΈ‰ 쀑") val refreshTokenResponse = chain.proceed(refreshTokenRequest) Timber.d("refreshTokenResponse : $refreshTokenResponse") @@ -102,10 +113,12 @@ class TokenInterceptor @Inject constructor( val newRequest = originalRequest.newAuthBuilder().build() return chain.proceed(newRequest) } else { - /* - refreshTokenResponse : Response{protocol=http/1.1, code=401, message=, url=https://prod.eat-ssu.shop/oauths/reissue/token} - μœ„ μƒν™©μ—μ„œλ„ λ‘œκ·Έμ•„μ›ƒ - **λ¦¬ν”„λ ˆμ‰¬λ„ μƒν•œ μƒνƒœ + /** + * + * + * refreshTokenResponse : Response{protocol=http/1.1, code=401, message=, url=https://prod.eat-ssu.shop/oauths/reissue/token} + * μœ„ μƒν™©μ—μ„œλ„ λ‘œκ·Έμ•„μ›ƒ + * λ¦¬ν”„λ ˆμ‰¬λ„ μƒν•œ μƒνƒœ */ runBlocking { logoutUseCase() } Timber.e("μž¬λ°œκΈ‰μ—μ„œμ˜ 401") diff --git a/app/src/main/java/com/eatssu/android/data/model/AndroidMessage.kt b/app/src/main/java/com/eatssu/android/domain/model/AndroidMessage.kt similarity index 66% rename from app/src/main/java/com/eatssu/android/data/model/AndroidMessage.kt rename to app/src/main/java/com/eatssu/android/domain/model/AndroidMessage.kt index 813d731d3..ee458bb3a 100644 --- a/app/src/main/java/com/eatssu/android/data/model/AndroidMessage.kt +++ b/app/src/main/java/com/eatssu/android/domain/model/AndroidMessage.kt @@ -1,4 +1,4 @@ -package com.eatssu.android.data.model +package com.eatssu.android.domain.model data class AndroidMessage( val dialog: Boolean, diff --git a/app/src/main/java/com/eatssu/android/data/model/CalendarData.kt b/app/src/main/java/com/eatssu/android/domain/model/CalendarData.kt similarity index 72% rename from app/src/main/java/com/eatssu/android/data/model/CalendarData.kt rename to app/src/main/java/com/eatssu/android/domain/model/CalendarData.kt index a44e9bdf8..fe9f6e259 100644 --- a/app/src/main/java/com/eatssu/android/data/model/CalendarData.kt +++ b/app/src/main/java/com/eatssu/android/domain/model/CalendarData.kt @@ -1,4 +1,4 @@ -package com.eatssu.android.data.model +package com.eatssu.android.domain.model data class CalendarData( var cl_date: String = "", // λ‚ μ§œ diff --git a/app/src/main/java/com/eatssu/android/data/model/Menu.kt b/app/src/main/java/com/eatssu/android/domain/model/Menu.kt similarity index 71% rename from app/src/main/java/com/eatssu/android/data/model/Menu.kt rename to app/src/main/java/com/eatssu/android/domain/model/Menu.kt index 72c2d35f1..c3147cdf2 100644 --- a/app/src/main/java/com/eatssu/android/data/model/Menu.kt +++ b/app/src/main/java/com/eatssu/android/domain/model/Menu.kt @@ -1,4 +1,4 @@ -package com.eatssu.android.data.model +package com.eatssu.android.domain.model data class Menu( val id: Long, diff --git a/app/src/main/java/com/eatssu/android/data/model/MenuMini.kt b/app/src/main/java/com/eatssu/android/domain/model/MenuMini.kt similarity index 61% rename from app/src/main/java/com/eatssu/android/data/model/MenuMini.kt rename to app/src/main/java/com/eatssu/android/domain/model/MenuMini.kt index d16c8e624..b26c62b4f 100644 --- a/app/src/main/java/com/eatssu/android/data/model/MenuMini.kt +++ b/app/src/main/java/com/eatssu/android/domain/model/MenuMini.kt @@ -1,4 +1,4 @@ -package com.eatssu.android.data.model +package com.eatssu.android.domain.model data class MenuMini( val id: Long, diff --git a/app/src/main/java/com/eatssu/android/data/model/RestaurantInfo.kt b/app/src/main/java/com/eatssu/android/domain/model/RestaurantInfo.kt similarity index 84% rename from app/src/main/java/com/eatssu/android/data/model/RestaurantInfo.kt rename to app/src/main/java/com/eatssu/android/domain/model/RestaurantInfo.kt index f33d2bdb8..4280743f3 100644 --- a/app/src/main/java/com/eatssu/android/data/model/RestaurantInfo.kt +++ b/app/src/main/java/com/eatssu/android/domain/model/RestaurantInfo.kt @@ -1,4 +1,4 @@ -package com.eatssu.android.data.model +package com.eatssu.android.domain.model import com.eatssu.android.data.enums.Restaurant diff --git a/app/src/main/java/com/eatssu/android/data/model/Review.kt b/app/src/main/java/com/eatssu/android/domain/model/Review.kt similarity index 87% rename from app/src/main/java/com/eatssu/android/data/model/Review.kt rename to app/src/main/java/com/eatssu/android/domain/model/Review.kt index 5bcb93e1c..818b4c9b0 100644 --- a/app/src/main/java/com/eatssu/android/data/model/Review.kt +++ b/app/src/main/java/com/eatssu/android/domain/model/Review.kt @@ -1,4 +1,4 @@ -package com.eatssu.android.data.model +package com.eatssu.android.domain.model data class Review( val isWriter: Boolean, diff --git a/app/src/main/java/com/eatssu/android/data/model/ReviewInfo.kt b/app/src/main/java/com/eatssu/android/domain/model/ReviewInfo.kt similarity index 86% rename from app/src/main/java/com/eatssu/android/data/model/ReviewInfo.kt rename to app/src/main/java/com/eatssu/android/domain/model/ReviewInfo.kt index 779e79d18..089af51c4 100644 --- a/app/src/main/java/com/eatssu/android/data/model/ReviewInfo.kt +++ b/app/src/main/java/com/eatssu/android/domain/model/ReviewInfo.kt @@ -1,4 +1,4 @@ -package com.eatssu.android.data.model +package com.eatssu.android.domain.model data class ReviewInfo( var name: String, diff --git a/app/src/main/java/com/eatssu/android/data/model/Section.kt b/app/src/main/java/com/eatssu/android/domain/model/Section.kt similarity index 86% rename from app/src/main/java/com/eatssu/android/data/model/Section.kt rename to app/src/main/java/com/eatssu/android/domain/model/Section.kt index 9234439d9..6a051b4ec 100644 --- a/app/src/main/java/com/eatssu/android/data/model/Section.kt +++ b/app/src/main/java/com/eatssu/android/domain/model/Section.kt @@ -1,4 +1,4 @@ -package com.eatssu.android.data.model +package com.eatssu.android.domain.model import com.eatssu.android.data.enums.MenuType import com.eatssu.android.data.enums.Restaurant diff --git a/app/src/main/java/com/eatssu/android/domain/repository/MealRepository.kt b/app/src/main/java/com/eatssu/android/domain/repository/MealRepository.kt new file mode 100644 index 000000000..c6ff41846 --- /dev/null +++ b/app/src/main/java/com/eatssu/android/domain/repository/MealRepository.kt @@ -0,0 +1,17 @@ +package com.eatssu.android.domain.repository + +import com.eatssu.android.data.dto.response.BaseResponse +import com.eatssu.android.data.dto.response.MenuOfMealResponse +import kotlinx.coroutines.flow.Flow + +interface MealRepository { +// suspend fun getTodayMeal( +// date: String, +// restaurant: String, +// time: String, +// ): Flow>> + + suspend fun getMenuInfoByMealId( + mealId: Long, + ): Flow> +} \ No newline at end of file diff --git a/app/src/main/java/com/eatssu/android/data/repository/OauthRepository.kt b/app/src/main/java/com/eatssu/android/domain/repository/OauthRepository.kt similarity index 78% rename from app/src/main/java/com/eatssu/android/data/repository/OauthRepository.kt rename to app/src/main/java/com/eatssu/android/domain/repository/OauthRepository.kt index 031f47fbb..eaa20e386 100644 --- a/app/src/main/java/com/eatssu/android/data/repository/OauthRepository.kt +++ b/app/src/main/java/com/eatssu/android/domain/repository/OauthRepository.kt @@ -1,7 +1,7 @@ -package com.eatssu.android.data.repository +package com.eatssu.android.domain.repository -import com.eatssu.android.base.BaseResponse import com.eatssu.android.data.dto.request.LoginWithKakaoRequest +import com.eatssu.android.data.dto.response.BaseResponse import com.eatssu.android.data.dto.response.TokenResponse import kotlinx.coroutines.flow.Flow diff --git a/app/src/main/java/com/eatssu/android/data/repository/ReportRepository.kt b/app/src/main/java/com/eatssu/android/domain/repository/ReportRepository.kt similarity index 68% rename from app/src/main/java/com/eatssu/android/data/repository/ReportRepository.kt rename to app/src/main/java/com/eatssu/android/domain/repository/ReportRepository.kt index d41c1e37f..e1f247b14 100644 --- a/app/src/main/java/com/eatssu/android/data/repository/ReportRepository.kt +++ b/app/src/main/java/com/eatssu/android/domain/repository/ReportRepository.kt @@ -1,7 +1,7 @@ -package com.eatssu.android.data.repository +package com.eatssu.android.domain.repository -import com.eatssu.android.base.BaseResponse import com.eatssu.android.data.dto.request.ReportRequest +import com.eatssu.android.data.dto.response.BaseResponse import kotlinx.coroutines.flow.Flow interface ReportRepository { diff --git a/app/src/main/java/com/eatssu/android/domain/repository/ReviewRepository.kt b/app/src/main/java/com/eatssu/android/domain/repository/ReviewRepository.kt new file mode 100644 index 000000000..4e66037ba --- /dev/null +++ b/app/src/main/java/com/eatssu/android/domain/repository/ReviewRepository.kt @@ -0,0 +1,47 @@ +package com.eatssu.android.domain.repository + +import com.eatssu.android.data.dto.request.ModifyReviewRequest +import com.eatssu.android.data.dto.request.WriteReviewRequest +import com.eatssu.android.data.dto.response.BaseResponse +import com.eatssu.android.data.dto.response.GetMealReviewInfoResponse +import com.eatssu.android.data.dto.response.GetMenuReviewInfoResponse +import com.eatssu.android.data.dto.response.GetReviewListResponse +import com.eatssu.android.data.dto.response.ImageResponse +import kotlinx.coroutines.flow.Flow +import okhttp3.MultipartBody + +interface ReviewRepository { + + suspend fun writeReview( + menuId: Long, + body: WriteReviewRequest, + ): Flow> + + suspend fun deleteReview( + reviewId: Long, + ): Flow> + + suspend fun modifyReview( + reviewId: Long, + body: ModifyReviewRequest, + ): Flow> + + suspend fun getReviewList( + menuType: String, + mealId: Long?, + menuId: Long?, + ): Flow> + + suspend fun getMenuReviewInfo( + menuId: Long, + ): Flow> + + + suspend fun getMealReviewInfo( + mealId: Long, + ): Flow> + + suspend fun getImageString( + image: MultipartBody.Part, + ): Flow> +} \ No newline at end of file diff --git a/app/src/main/java/com/eatssu/android/data/repository/UserRepository.kt b/app/src/main/java/com/eatssu/android/domain/repository/UserRepository.kt similarity index 86% rename from app/src/main/java/com/eatssu/android/data/repository/UserRepository.kt rename to app/src/main/java/com/eatssu/android/domain/repository/UserRepository.kt index 0fd55fc60..2f53af23c 100644 --- a/app/src/main/java/com/eatssu/android/data/repository/UserRepository.kt +++ b/app/src/main/java/com/eatssu/android/domain/repository/UserRepository.kt @@ -1,7 +1,7 @@ -package com.eatssu.android.data.repository +package com.eatssu.android.domain.repository -import com.eatssu.android.base.BaseResponse import com.eatssu.android.data.dto.request.ChangeNicknameRequest +import com.eatssu.android.data.dto.response.BaseResponse import com.eatssu.android.data.dto.response.MyInfoResponse import com.eatssu.android.data.dto.response.MyReviewResponse import kotlinx.coroutines.flow.Flow diff --git a/app/src/main/java/com/eatssu/android/data/usecase/AlarmUsecase.kt b/app/src/main/java/com/eatssu/android/domain/usecase/alarm/AlarmUsecase.kt similarity index 93% rename from app/src/main/java/com/eatssu/android/data/usecase/AlarmUsecase.kt rename to app/src/main/java/com/eatssu/android/domain/usecase/alarm/AlarmUsecase.kt index 94a65105b..17bcffc2a 100644 --- a/app/src/main/java/com/eatssu/android/data/usecase/AlarmUsecase.kt +++ b/app/src/main/java/com/eatssu/android/domain/usecase/alarm/AlarmUsecase.kt @@ -1,10 +1,10 @@ -package com.eatssu.android.data.usecase +package com.eatssu.android.domain.usecase.alarm import android.app.AlarmManager import android.app.PendingIntent import android.content.Context import android.content.Intent -import com.eatssu.android.util.NotificationReceiver +import com.eatssu.android.alarm.NotificationReceiver import java.util.Calendar import javax.inject.Inject diff --git a/app/src/main/java/com/eatssu/android/data/usecase/GetDailyNotificationStatusUseCase.kt b/app/src/main/java/com/eatssu/android/domain/usecase/alarm/GetDailyNotificationStatusUseCase.kt similarity index 88% rename from app/src/main/java/com/eatssu/android/data/usecase/GetDailyNotificationStatusUseCase.kt rename to app/src/main/java/com/eatssu/android/domain/usecase/alarm/GetDailyNotificationStatusUseCase.kt index de4cd4e4d..890228666 100644 --- a/app/src/main/java/com/eatssu/android/data/usecase/GetDailyNotificationStatusUseCase.kt +++ b/app/src/main/java/com/eatssu/android/domain/usecase/alarm/GetDailyNotificationStatusUseCase.kt @@ -1,4 +1,4 @@ -package com.eatssu.android.data.usecase +package com.eatssu.android.domain.usecase.alarm import com.eatssu.android.data.repository.PreferencesRepository import kotlinx.coroutines.flow.Flow diff --git a/app/src/main/java/com/eatssu/android/data/usecase/SetDailyNotificationStatusUseCase.kt b/app/src/main/java/com/eatssu/android/domain/usecase/alarm/SetDailyNotificationStatusUseCase.kt similarity index 87% rename from app/src/main/java/com/eatssu/android/data/usecase/SetDailyNotificationStatusUseCase.kt rename to app/src/main/java/com/eatssu/android/domain/usecase/alarm/SetDailyNotificationStatusUseCase.kt index 4eba7b512..bc6801aee 100644 --- a/app/src/main/java/com/eatssu/android/data/usecase/SetDailyNotificationStatusUseCase.kt +++ b/app/src/main/java/com/eatssu/android/domain/usecase/alarm/SetDailyNotificationStatusUseCase.kt @@ -1,4 +1,4 @@ -package com.eatssu.android.data.usecase +package com.eatssu.android.domain.usecase.alarm import com.eatssu.android.data.repository.PreferencesRepository import javax.inject.Inject diff --git a/app/src/main/java/com/eatssu/android/data/usecase/GetAccessTokenUseCase.kt b/app/src/main/java/com/eatssu/android/domain/usecase/auth/GetAccessTokenUseCase.kt similarity index 77% rename from app/src/main/java/com/eatssu/android/data/usecase/GetAccessTokenUseCase.kt rename to app/src/main/java/com/eatssu/android/domain/usecase/auth/GetAccessTokenUseCase.kt index f54de06be..0649cc903 100644 --- a/app/src/main/java/com/eatssu/android/data/usecase/GetAccessTokenUseCase.kt +++ b/app/src/main/java/com/eatssu/android/domain/usecase/auth/GetAccessTokenUseCase.kt @@ -1,7 +1,7 @@ -package com.eatssu.android.data.usecase +package com.eatssu.android.domain.usecase.auth import android.content.Context -import com.eatssu.android.util.MySharedPreferences +import com.eatssu.android.data.MySharedPreferences import dagger.hilt.android.qualifiers.ApplicationContext import javax.inject.Inject diff --git a/app/src/main/java/com/eatssu/android/data/usecase/GetMyReviewsUseCase.kt b/app/src/main/java/com/eatssu/android/domain/usecase/auth/GetMyReviewsUseCase.kt similarity index 67% rename from app/src/main/java/com/eatssu/android/data/usecase/GetMyReviewsUseCase.kt rename to app/src/main/java/com/eatssu/android/domain/usecase/auth/GetMyReviewsUseCase.kt index d5ccd08ae..9a8d61155 100644 --- a/app/src/main/java/com/eatssu/android/data/usecase/GetMyReviewsUseCase.kt +++ b/app/src/main/java/com/eatssu/android/domain/usecase/auth/GetMyReviewsUseCase.kt @@ -1,8 +1,8 @@ -package com.eatssu.android.data.usecase +package com.eatssu.android.domain.usecase.auth -import com.eatssu.android.base.BaseResponse +import com.eatssu.android.data.dto.response.BaseResponse import com.eatssu.android.data.dto.response.MyReviewResponse -import com.eatssu.android.data.repository.UserRepository +import com.eatssu.android.domain.repository.UserRepository import kotlinx.coroutines.flow.Flow import javax.inject.Inject diff --git a/app/src/main/java/com/eatssu/android/data/usecase/GetRefreshTokenUseCase.kt b/app/src/main/java/com/eatssu/android/domain/usecase/auth/GetRefreshTokenUseCase.kt similarity index 80% rename from app/src/main/java/com/eatssu/android/data/usecase/GetRefreshTokenUseCase.kt rename to app/src/main/java/com/eatssu/android/domain/usecase/auth/GetRefreshTokenUseCase.kt index 635780b8d..9229e2db0 100644 --- a/app/src/main/java/com/eatssu/android/data/usecase/GetRefreshTokenUseCase.kt +++ b/app/src/main/java/com/eatssu/android/domain/usecase/auth/GetRefreshTokenUseCase.kt @@ -1,7 +1,7 @@ -package com.eatssu.android.data.usecase +package com.eatssu.android.domain.usecase.auth import android.content.Context -import com.eatssu.android.util.MySharedPreferences +import com.eatssu.android.data.MySharedPreferences import dagger.hilt.android.qualifiers.ApplicationContext import javax.inject.Inject diff --git a/app/src/main/java/com/eatssu/android/data/usecase/GetUserEmailUseCase.kt b/app/src/main/java/com/eatssu/android/domain/usecase/auth/GetUserEmailUseCase.kt similarity index 77% rename from app/src/main/java/com/eatssu/android/data/usecase/GetUserEmailUseCase.kt rename to app/src/main/java/com/eatssu/android/domain/usecase/auth/GetUserEmailUseCase.kt index 5bbabb1ce..d9698bc46 100644 --- a/app/src/main/java/com/eatssu/android/data/usecase/GetUserEmailUseCase.kt +++ b/app/src/main/java/com/eatssu/android/domain/usecase/auth/GetUserEmailUseCase.kt @@ -1,7 +1,7 @@ -package com.eatssu.android.data.usecase +package com.eatssu.android.domain.usecase.auth import android.content.Context -import com.eatssu.android.util.MySharedPreferences +import com.eatssu.android.data.MySharedPreferences import dagger.hilt.android.qualifiers.ApplicationContext import javax.inject.Inject diff --git a/app/src/main/java/com/eatssu/android/data/usecase/GetUserInfoUseCase.kt b/app/src/main/java/com/eatssu/android/domain/usecase/auth/GetUserInfoUseCase.kt similarity index 67% rename from app/src/main/java/com/eatssu/android/data/usecase/GetUserInfoUseCase.kt rename to app/src/main/java/com/eatssu/android/domain/usecase/auth/GetUserInfoUseCase.kt index 6c9e52d23..90ce32583 100644 --- a/app/src/main/java/com/eatssu/android/data/usecase/GetUserInfoUseCase.kt +++ b/app/src/main/java/com/eatssu/android/domain/usecase/auth/GetUserInfoUseCase.kt @@ -1,8 +1,8 @@ -package com.eatssu.android.data.usecase +package com.eatssu.android.domain.usecase.auth -import com.eatssu.android.base.BaseResponse +import com.eatssu.android.data.dto.response.BaseResponse import com.eatssu.android.data.dto.response.MyInfoResponse -import com.eatssu.android.data.repository.UserRepository +import com.eatssu.android.domain.repository.UserRepository import kotlinx.coroutines.flow.Flow import javax.inject.Inject diff --git a/app/src/main/java/com/eatssu/android/data/usecase/GetUserNameUseCase.kt b/app/src/main/java/com/eatssu/android/domain/usecase/auth/GetUserNameUseCase.kt similarity index 79% rename from app/src/main/java/com/eatssu/android/data/usecase/GetUserNameUseCase.kt rename to app/src/main/java/com/eatssu/android/domain/usecase/auth/GetUserNameUseCase.kt index e85a49d92..09e9a7df1 100644 --- a/app/src/main/java/com/eatssu/android/data/usecase/GetUserNameUseCase.kt +++ b/app/src/main/java/com/eatssu/android/domain/usecase/auth/GetUserNameUseCase.kt @@ -1,7 +1,7 @@ -package com.eatssu.android.data.usecase +package com.eatssu.android.domain.usecase.auth import android.content.Context -import com.eatssu.android.util.MySharedPreferences +import com.eatssu.android.data.MySharedPreferences import dagger.hilt.android.qualifiers.ApplicationContext import javax.inject.Inject diff --git a/app/src/main/java/com/eatssu/android/data/usecase/LoginUseCase.kt b/app/src/main/java/com/eatssu/android/domain/usecase/auth/LoginUseCase.kt similarity index 71% rename from app/src/main/java/com/eatssu/android/data/usecase/LoginUseCase.kt rename to app/src/main/java/com/eatssu/android/domain/usecase/auth/LoginUseCase.kt index 0436bce81..e4979ae91 100644 --- a/app/src/main/java/com/eatssu/android/data/usecase/LoginUseCase.kt +++ b/app/src/main/java/com/eatssu/android/domain/usecase/auth/LoginUseCase.kt @@ -1,9 +1,9 @@ -package com.eatssu.android.data.usecase +package com.eatssu.android.domain.usecase.auth -import com.eatssu.android.base.BaseResponse import com.eatssu.android.data.dto.request.LoginWithKakaoRequest +import com.eatssu.android.data.dto.response.BaseResponse import com.eatssu.android.data.dto.response.TokenResponse -import com.eatssu.android.data.repository.OauthRepository +import com.eatssu.android.domain.repository.OauthRepository import kotlinx.coroutines.flow.Flow import javax.inject.Inject diff --git a/app/src/main/java/com/eatssu/android/data/usecase/LogoutUseCase.kt b/app/src/main/java/com/eatssu/android/domain/usecase/auth/LogoutUseCase.kt similarity index 75% rename from app/src/main/java/com/eatssu/android/data/usecase/LogoutUseCase.kt rename to app/src/main/java/com/eatssu/android/domain/usecase/auth/LogoutUseCase.kt index 7d1e5b7fa..ab3f1db70 100644 --- a/app/src/main/java/com/eatssu/android/data/usecase/LogoutUseCase.kt +++ b/app/src/main/java/com/eatssu/android/domain/usecase/auth/LogoutUseCase.kt @@ -1,7 +1,7 @@ -package com.eatssu.android.data.usecase +package com.eatssu.android.domain.usecase.auth import android.content.Context -import com.eatssu.android.util.MySharedPreferences +import com.eatssu.android.data.MySharedPreferences import dagger.hilt.android.qualifiers.ApplicationContext import javax.inject.Inject diff --git a/app/src/main/java/com/eatssu/android/data/usecase/ReissueTokenUseCase.kt b/app/src/main/java/com/eatssu/android/domain/usecase/auth/ReissueTokenUseCase.kt similarity index 69% rename from app/src/main/java/com/eatssu/android/data/usecase/ReissueTokenUseCase.kt rename to app/src/main/java/com/eatssu/android/domain/usecase/auth/ReissueTokenUseCase.kt index 94695c4f6..e2a4bc35b 100644 --- a/app/src/main/java/com/eatssu/android/data/usecase/ReissueTokenUseCase.kt +++ b/app/src/main/java/com/eatssu/android/domain/usecase/auth/ReissueTokenUseCase.kt @@ -1,8 +1,8 @@ -package com.eatssu.android.data.usecase +package com.eatssu.android.domain.usecase.auth -import com.eatssu.android.base.BaseResponse +import com.eatssu.android.data.dto.response.BaseResponse import com.eatssu.android.data.dto.response.TokenResponse -import com.eatssu.android.data.repository.OauthRepository +import com.eatssu.android.domain.repository.OauthRepository import kotlinx.coroutines.flow.Flow import javax.inject.Inject diff --git a/app/src/main/java/com/eatssu/android/data/usecase/SetAccessTokenUseCase.kt b/app/src/main/java/com/eatssu/android/domain/usecase/auth/SetAccessTokenUseCase.kt similarity index 80% rename from app/src/main/java/com/eatssu/android/data/usecase/SetAccessTokenUseCase.kt rename to app/src/main/java/com/eatssu/android/domain/usecase/auth/SetAccessTokenUseCase.kt index 2c5e06b49..8b2b10262 100644 --- a/app/src/main/java/com/eatssu/android/data/usecase/SetAccessTokenUseCase.kt +++ b/app/src/main/java/com/eatssu/android/domain/usecase/auth/SetAccessTokenUseCase.kt @@ -1,7 +1,7 @@ -package com.eatssu.android.data.usecase +package com.eatssu.android.domain.usecase.auth import android.content.Context -import com.eatssu.android.util.MySharedPreferences +import com.eatssu.android.data.MySharedPreferences import dagger.hilt.android.qualifiers.ApplicationContext import javax.inject.Inject diff --git a/app/src/main/java/com/eatssu/android/data/usecase/SetRefreshTokenUseCase.kt b/app/src/main/java/com/eatssu/android/domain/usecase/auth/SetRefreshTokenUseCase.kt similarity index 81% rename from app/src/main/java/com/eatssu/android/data/usecase/SetRefreshTokenUseCase.kt rename to app/src/main/java/com/eatssu/android/domain/usecase/auth/SetRefreshTokenUseCase.kt index d8863c33b..fcef75eec 100644 --- a/app/src/main/java/com/eatssu/android/data/usecase/SetRefreshTokenUseCase.kt +++ b/app/src/main/java/com/eatssu/android/domain/usecase/auth/SetRefreshTokenUseCase.kt @@ -1,7 +1,7 @@ -package com.eatssu.android.data.usecase +package com.eatssu.android.domain.usecase.auth import android.content.Context -import com.eatssu.android.util.MySharedPreferences +import com.eatssu.android.data.MySharedPreferences import dagger.hilt.android.qualifiers.ApplicationContext import javax.inject.Inject diff --git a/app/src/main/java/com/eatssu/android/data/usecase/SetUserEmailUseCase.kt b/app/src/main/java/com/eatssu/android/domain/usecase/auth/SetUserEmailUseCase.kt similarity index 77% rename from app/src/main/java/com/eatssu/android/data/usecase/SetUserEmailUseCase.kt rename to app/src/main/java/com/eatssu/android/domain/usecase/auth/SetUserEmailUseCase.kt index 2e27b2aeb..d8c3ffc38 100644 --- a/app/src/main/java/com/eatssu/android/data/usecase/SetUserEmailUseCase.kt +++ b/app/src/main/java/com/eatssu/android/domain/usecase/auth/SetUserEmailUseCase.kt @@ -1,7 +1,7 @@ -package com.eatssu.android.data.usecase +package com.eatssu.android.domain.usecase.auth import android.content.Context -import com.eatssu.android.util.MySharedPreferences +import com.eatssu.android.data.MySharedPreferences import dagger.hilt.android.qualifiers.ApplicationContext import javax.inject.Inject diff --git a/app/src/main/java/com/eatssu/android/data/usecase/SetUserNameUseCase.kt b/app/src/main/java/com/eatssu/android/domain/usecase/auth/SetUserNameUseCase.kt similarity index 76% rename from app/src/main/java/com/eatssu/android/data/usecase/SetUserNameUseCase.kt rename to app/src/main/java/com/eatssu/android/domain/usecase/auth/SetUserNameUseCase.kt index 18e80ca7b..2fbe7eb5d 100644 --- a/app/src/main/java/com/eatssu/android/data/usecase/SetUserNameUseCase.kt +++ b/app/src/main/java/com/eatssu/android/domain/usecase/auth/SetUserNameUseCase.kt @@ -1,10 +1,10 @@ -package com.eatssu.android.data.usecase +package com.eatssu.android.domain.usecase.auth import android.content.Context -import com.eatssu.android.base.BaseResponse +import com.eatssu.android.data.MySharedPreferences import com.eatssu.android.data.dto.request.ChangeNicknameRequest -import com.eatssu.android.data.repository.UserRepository -import com.eatssu.android.util.MySharedPreferences +import com.eatssu.android.data.dto.response.BaseResponse +import com.eatssu.android.domain.repository.UserRepository import dagger.hilt.android.qualifiers.ApplicationContext import kotlinx.coroutines.flow.Flow import javax.inject.Inject diff --git a/app/src/main/java/com/eatssu/android/data/usecase/SignOutUseCase.kt b/app/src/main/java/com/eatssu/android/domain/usecase/auth/SignOutUseCase.kt similarity index 61% rename from app/src/main/java/com/eatssu/android/data/usecase/SignOutUseCase.kt rename to app/src/main/java/com/eatssu/android/domain/usecase/auth/SignOutUseCase.kt index 01fa506b7..744400590 100644 --- a/app/src/main/java/com/eatssu/android/data/usecase/SignOutUseCase.kt +++ b/app/src/main/java/com/eatssu/android/domain/usecase/auth/SignOutUseCase.kt @@ -1,7 +1,7 @@ -package com.eatssu.android.data.usecase +package com.eatssu.android.domain.usecase.auth -import com.eatssu.android.base.BaseResponse -import com.eatssu.android.data.repository.UserRepository +import com.eatssu.android.data.dto.response.BaseResponse +import com.eatssu.android.domain.repository.UserRepository import kotlinx.coroutines.flow.Flow import javax.inject.Inject diff --git a/app/src/main/java/com/eatssu/android/data/usecase/ValidateUserNameUseCase.kt b/app/src/main/java/com/eatssu/android/domain/usecase/auth/ValidateUserNameUseCase.kt similarity index 64% rename from app/src/main/java/com/eatssu/android/data/usecase/ValidateUserNameUseCase.kt rename to app/src/main/java/com/eatssu/android/domain/usecase/auth/ValidateUserNameUseCase.kt index b84d90633..7762576e8 100644 --- a/app/src/main/java/com/eatssu/android/data/usecase/ValidateUserNameUseCase.kt +++ b/app/src/main/java/com/eatssu/android/domain/usecase/auth/ValidateUserNameUseCase.kt @@ -1,7 +1,7 @@ -package com.eatssu.android.data.usecase +package com.eatssu.android.domain.usecase.auth -import com.eatssu.android.base.BaseResponse -import com.eatssu.android.data.repository.UserRepository +import com.eatssu.android.data.dto.response.BaseResponse +import com.eatssu.android.domain.repository.UserRepository import kotlinx.coroutines.flow.Flow import javax.inject.Inject diff --git a/app/src/main/java/com/eatssu/android/domain/usecase/menu/GetMenuNameListOfMealUseCase.kt b/app/src/main/java/com/eatssu/android/domain/usecase/menu/GetMenuNameListOfMealUseCase.kt new file mode 100644 index 000000000..694d5fae9 --- /dev/null +++ b/app/src/main/java/com/eatssu/android/domain/usecase/menu/GetMenuNameListOfMealUseCase.kt @@ -0,0 +1,14 @@ +package com.eatssu.android.domain.usecase.menu + +import com.eatssu.android.data.dto.response.BaseResponse +import com.eatssu.android.data.dto.response.MenuOfMealResponse +import com.eatssu.android.domain.repository.MealRepository +import kotlinx.coroutines.flow.Flow +import javax.inject.Inject + +class GetMenuNameListOfMealUseCase @Inject constructor( + private val mealRepository: MealRepository, +) { + suspend operator fun invoke(menuId: Long): Flow> = + mealRepository.getMenuInfoByMealId(menuId) +} \ No newline at end of file diff --git a/app/src/main/java/com/eatssu/android/domain/usecase/review/DeleteReviewUseCase.kt b/app/src/main/java/com/eatssu/android/domain/usecase/review/DeleteReviewUseCase.kt new file mode 100644 index 000000000..dc0e863a8 --- /dev/null +++ b/app/src/main/java/com/eatssu/android/domain/usecase/review/DeleteReviewUseCase.kt @@ -0,0 +1,13 @@ +package com.eatssu.android.domain.usecase.review + +import com.eatssu.android.data.dto.response.BaseResponse +import com.eatssu.android.domain.repository.ReviewRepository +import kotlinx.coroutines.flow.Flow +import javax.inject.Inject + +class DeleteReviewUseCase @Inject constructor( + private val reviewRepository: ReviewRepository, +) { + suspend operator fun invoke(reviewId: Long): Flow> = + reviewRepository.deleteReview(reviewId) +} \ No newline at end of file diff --git a/app/src/main/java/com/eatssu/android/domain/usecase/review/GetImageUrlUseCase.kt b/app/src/main/java/com/eatssu/android/domain/usecase/review/GetImageUrlUseCase.kt new file mode 100644 index 000000000..3643b417d --- /dev/null +++ b/app/src/main/java/com/eatssu/android/domain/usecase/review/GetImageUrlUseCase.kt @@ -0,0 +1,17 @@ +package com.eatssu.android.domain.usecase.review + +import com.eatssu.android.data.dto.response.BaseResponse +import com.eatssu.android.data.dto.response.ImageResponse +import com.eatssu.android.domain.repository.ReviewRepository +import kotlinx.coroutines.flow.Flow +import okhttp3.MultipartBody +import javax.inject.Inject + +class GetImageUrlUseCase @Inject constructor( + private val reviewRepository: ReviewRepository, +) { + suspend operator fun invoke( + image: MultipartBody.Part, + ): Flow> = + reviewRepository.getImageString(image) +} \ No newline at end of file diff --git a/app/src/main/java/com/eatssu/android/domain/usecase/review/GetMealReviewInfoUseCase.kt b/app/src/main/java/com/eatssu/android/domain/usecase/review/GetMealReviewInfoUseCase.kt new file mode 100644 index 000000000..9c270732f --- /dev/null +++ b/app/src/main/java/com/eatssu/android/domain/usecase/review/GetMealReviewInfoUseCase.kt @@ -0,0 +1,14 @@ +package com.eatssu.android.domain.usecase.review + +import com.eatssu.android.data.dto.response.BaseResponse +import com.eatssu.android.data.dto.response.GetMealReviewInfoResponse +import com.eatssu.android.domain.repository.ReviewRepository +import kotlinx.coroutines.flow.Flow +import javax.inject.Inject + +class GetMealReviewInfoUseCase @Inject constructor( + private val reviewRepository: ReviewRepository, +) { + suspend operator fun invoke(mealId: Long): Flow> = + reviewRepository.getMealReviewInfo(mealId) +} \ No newline at end of file diff --git a/app/src/main/java/com/eatssu/android/domain/usecase/review/GetMealReviewListUseCase.kt b/app/src/main/java/com/eatssu/android/domain/usecase/review/GetMealReviewListUseCase.kt new file mode 100644 index 000000000..157b36c6b --- /dev/null +++ b/app/src/main/java/com/eatssu/android/domain/usecase/review/GetMealReviewListUseCase.kt @@ -0,0 +1,17 @@ +package com.eatssu.android.domain.usecase.review + +import com.eatssu.android.data.dto.response.BaseResponse +import com.eatssu.android.data.dto.response.GetReviewListResponse +import com.eatssu.android.data.enums.MenuType +import com.eatssu.android.domain.repository.ReviewRepository +import kotlinx.coroutines.flow.Flow +import javax.inject.Inject + +class GetMealReviewListUseCase @Inject constructor( + private val reviewRepository: ReviewRepository, +) { + suspend operator fun invoke( + mealId: Long?, + ): Flow> = + reviewRepository.getReviewList(MenuType.VARIABLE.toString(), mealId, 0) +} \ No newline at end of file diff --git a/app/src/main/java/com/eatssu/android/domain/usecase/review/GetMenuReviewInfoUseCase.kt b/app/src/main/java/com/eatssu/android/domain/usecase/review/GetMenuReviewInfoUseCase.kt new file mode 100644 index 000000000..6664e4e7f --- /dev/null +++ b/app/src/main/java/com/eatssu/android/domain/usecase/review/GetMenuReviewInfoUseCase.kt @@ -0,0 +1,14 @@ +package com.eatssu.android.domain.usecase.review + +import com.eatssu.android.data.dto.response.BaseResponse +import com.eatssu.android.data.dto.response.GetMenuReviewInfoResponse +import com.eatssu.android.domain.repository.ReviewRepository +import kotlinx.coroutines.flow.Flow +import javax.inject.Inject + +class GetMenuReviewInfoUseCase @Inject constructor( + private val reviewRepository: ReviewRepository, +) { + suspend operator fun invoke(menuId: Long): Flow> = + reviewRepository.getMenuReviewInfo(menuId) +} \ No newline at end of file diff --git a/app/src/main/java/com/eatssu/android/domain/usecase/review/GetMenuReviewListUseCase.kt b/app/src/main/java/com/eatssu/android/domain/usecase/review/GetMenuReviewListUseCase.kt new file mode 100644 index 000000000..5ed6df593 --- /dev/null +++ b/app/src/main/java/com/eatssu/android/domain/usecase/review/GetMenuReviewListUseCase.kt @@ -0,0 +1,17 @@ +package com.eatssu.android.domain.usecase.review + +import com.eatssu.android.data.dto.response.BaseResponse +import com.eatssu.android.data.dto.response.GetReviewListResponse +import com.eatssu.android.data.enums.MenuType +import com.eatssu.android.domain.repository.ReviewRepository +import kotlinx.coroutines.flow.Flow +import javax.inject.Inject + +class GetMenuReviewListUseCase @Inject constructor( + private val reviewRepository: ReviewRepository, +) { + suspend operator fun invoke( + menuId: Long?, + ): Flow> = + reviewRepository.getReviewList(MenuType.FIXED.toString(), 0, menuId) +} \ No newline at end of file diff --git a/app/src/main/java/com/eatssu/android/domain/usecase/review/ModifyReviewUseCase.kt b/app/src/main/java/com/eatssu/android/domain/usecase/review/ModifyReviewUseCase.kt new file mode 100644 index 000000000..a6a3e3de8 --- /dev/null +++ b/app/src/main/java/com/eatssu/android/domain/usecase/review/ModifyReviewUseCase.kt @@ -0,0 +1,17 @@ +package com.eatssu.android.domain.usecase.review + +import com.eatssu.android.data.dto.request.ModifyReviewRequest +import com.eatssu.android.data.dto.response.BaseResponse +import com.eatssu.android.domain.repository.ReviewRepository +import kotlinx.coroutines.flow.Flow +import javax.inject.Inject + +class ModifyReviewUseCase @Inject constructor( + private val reviewRepository: ReviewRepository, +) { + suspend operator fun invoke( + reviewId: Long, + body: ModifyReviewRequest, + ): Flow> = + reviewRepository.modifyReview(reviewId, body) +} \ No newline at end of file diff --git a/app/src/main/java/com/eatssu/android/data/usecase/PostReportUseCase.kt b/app/src/main/java/com/eatssu/android/domain/usecase/review/PostReportUseCase.kt similarity index 67% rename from app/src/main/java/com/eatssu/android/data/usecase/PostReportUseCase.kt rename to app/src/main/java/com/eatssu/android/domain/usecase/review/PostReportUseCase.kt index 5406b461a..4ea5aabbc 100644 --- a/app/src/main/java/com/eatssu/android/data/usecase/PostReportUseCase.kt +++ b/app/src/main/java/com/eatssu/android/domain/usecase/review/PostReportUseCase.kt @@ -1,8 +1,8 @@ -package com.eatssu.android.data.usecase +package com.eatssu.android.domain.usecase.review -import com.eatssu.android.base.BaseResponse import com.eatssu.android.data.dto.request.ReportRequest -import com.eatssu.android.data.repository.ReportRepository +import com.eatssu.android.data.dto.response.BaseResponse +import com.eatssu.android.domain.repository.ReportRepository import kotlinx.coroutines.flow.Flow import javax.inject.Inject diff --git a/app/src/main/java/com/eatssu/android/domain/usecase/review/WriteReviewUseCase.kt b/app/src/main/java/com/eatssu/android/domain/usecase/review/WriteReviewUseCase.kt new file mode 100644 index 000000000..98c33ad04 --- /dev/null +++ b/app/src/main/java/com/eatssu/android/domain/usecase/review/WriteReviewUseCase.kt @@ -0,0 +1,14 @@ +package com.eatssu.android.domain.usecase.review + +import com.eatssu.android.data.dto.request.WriteReviewRequest +import com.eatssu.android.data.dto.response.BaseResponse +import com.eatssu.android.domain.repository.ReviewRepository +import kotlinx.coroutines.flow.Flow +import javax.inject.Inject + +class WriteReviewUseCase @Inject constructor( + private val reviewRepository: ReviewRepository, +) { + suspend operator fun invoke(menuId: Long, body: WriteReviewRequest): Flow> = + reviewRepository.writeReview(menuId, body) +} \ No newline at end of file diff --git a/app/src/main/java/com/eatssu/android/base/BaseActivity.kt b/app/src/main/java/com/eatssu/android/presentation/base/BaseActivity.kt similarity index 90% rename from app/src/main/java/com/eatssu/android/base/BaseActivity.kt rename to app/src/main/java/com/eatssu/android/presentation/base/BaseActivity.kt index 687db424e..466b39ca4 100644 --- a/app/src/main/java/com/eatssu/android/base/BaseActivity.kt +++ b/app/src/main/java/com/eatssu/android/presentation/base/BaseActivity.kt @@ -1,4 +1,4 @@ -package com.eatssu.android.base +package com.eatssu.android.presentation.base import android.content.Intent import android.graphics.Rect @@ -16,11 +16,11 @@ import androidx.lifecycle.ViewModelProvider import androidx.viewbinding.ViewBinding import com.eatssu.android.R import com.eatssu.android.data.repository.FirebaseRemoteConfigRepository -import com.eatssu.android.ui.common.AndroidMessageDialogActivity -import com.eatssu.android.ui.common.ForceUpdateDialogActivity -import com.eatssu.android.ui.common.VersionViewModel -import com.eatssu.android.ui.common.VersionViewModelFactory -import com.eatssu.android.util.NetworkConnection +import com.eatssu.android.presentation.common.AndroidMessageDialogActivity +import com.eatssu.android.presentation.common.ForceUpdateDialogActivity +import com.eatssu.android.presentation.common.NetworkConnection +import com.eatssu.android.presentation.common.VersionViewModel +import com.eatssu.android.presentation.common.VersionViewModelFactory import com.google.android.material.card.MaterialCardView diff --git a/app/src/main/java/com/eatssu/android/base/BaseFragment.kt b/app/src/main/java/com/eatssu/android/presentation/base/BaseFragment.kt similarity index 94% rename from app/src/main/java/com/eatssu/android/base/BaseFragment.kt rename to app/src/main/java/com/eatssu/android/presentation/base/BaseFragment.kt index 08e72b6d4..fe295088c 100644 --- a/app/src/main/java/com/eatssu/android/base/BaseFragment.kt +++ b/app/src/main/java/com/eatssu/android/presentation/base/BaseFragment.kt @@ -1,4 +1,4 @@ -package com.eatssu.android.base +package com.eatssu.android.presentation.base import android.os.Bundle import android.view.LayoutInflater diff --git a/app/src/main/java/com/eatssu/android/ui/common/AndroidMessageDialogActivity.kt b/app/src/main/java/com/eatssu/android/presentation/common/AndroidMessageDialogActivity.kt similarity index 95% rename from app/src/main/java/com/eatssu/android/ui/common/AndroidMessageDialogActivity.kt rename to app/src/main/java/com/eatssu/android/presentation/common/AndroidMessageDialogActivity.kt index c16d26f69..b76ceb6d9 100644 --- a/app/src/main/java/com/eatssu/android/ui/common/AndroidMessageDialogActivity.kt +++ b/app/src/main/java/com/eatssu/android/presentation/common/AndroidMessageDialogActivity.kt @@ -1,4 +1,4 @@ -package com.eatssu.android.ui.common +package com.eatssu.android.presentation.common import android.app.AlertDialog diff --git a/app/src/main/java/com/eatssu/android/ui/common/ForceUpdateActivity.kt b/app/src/main/java/com/eatssu/android/presentation/common/ForceUpdateActivity.kt similarity index 97% rename from app/src/main/java/com/eatssu/android/ui/common/ForceUpdateActivity.kt rename to app/src/main/java/com/eatssu/android/presentation/common/ForceUpdateActivity.kt index c26cb9870..4e241bbaa 100644 --- a/app/src/main/java/com/eatssu/android/ui/common/ForceUpdateActivity.kt +++ b/app/src/main/java/com/eatssu/android/presentation/common/ForceUpdateActivity.kt @@ -1,4 +1,4 @@ -package com.eatssu.android.ui.common +package com.eatssu.android.presentation.common import android.app.AlertDialog diff --git a/app/src/main/java/com/eatssu/android/util/NetworkConnection.kt b/app/src/main/java/com/eatssu/android/presentation/common/NetworkConnection.kt similarity index 97% rename from app/src/main/java/com/eatssu/android/util/NetworkConnection.kt rename to app/src/main/java/com/eatssu/android/presentation/common/NetworkConnection.kt index f915a5e64..522ba1f2c 100644 --- a/app/src/main/java/com/eatssu/android/util/NetworkConnection.kt +++ b/app/src/main/java/com/eatssu/android/presentation/common/NetworkConnection.kt @@ -1,4 +1,4 @@ -package com.eatssu.android.util +package com.eatssu.android.presentation.common import android.app.AlertDialog import android.content.Context diff --git a/app/src/main/java/com/eatssu/android/ui/common/VersionViewModel.kt b/app/src/main/java/com/eatssu/android/presentation/common/VersionViewModel.kt similarity index 96% rename from app/src/main/java/com/eatssu/android/ui/common/VersionViewModel.kt rename to app/src/main/java/com/eatssu/android/presentation/common/VersionViewModel.kt index 70cc73ef2..38c90fecc 100644 --- a/app/src/main/java/com/eatssu/android/ui/common/VersionViewModel.kt +++ b/app/src/main/java/com/eatssu/android/presentation/common/VersionViewModel.kt @@ -1,4 +1,4 @@ -package com.eatssu.android.ui.common +package com.eatssu.android.presentation.common import androidx.lifecycle.ViewModel import com.eatssu.android.BuildConfig.VERSION_CODE diff --git a/app/src/main/java/com/eatssu/android/ui/common/VersionViewModelFactory.kt b/app/src/main/java/com/eatssu/android/presentation/common/VersionViewModelFactory.kt similarity index 92% rename from app/src/main/java/com/eatssu/android/ui/common/VersionViewModelFactory.kt rename to app/src/main/java/com/eatssu/android/presentation/common/VersionViewModelFactory.kt index 8700c136e..d3279479d 100644 --- a/app/src/main/java/com/eatssu/android/ui/common/VersionViewModelFactory.kt +++ b/app/src/main/java/com/eatssu/android/presentation/common/VersionViewModelFactory.kt @@ -1,4 +1,4 @@ -package com.eatssu.android.ui.common +package com.eatssu.android.presentation.common import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModelProvider diff --git a/app/src/main/java/com/eatssu/android/ui/info/InfoBottomSheetFragment.kt b/app/src/main/java/com/eatssu/android/presentation/info/InfoBottomSheetFragment.kt similarity index 92% rename from app/src/main/java/com/eatssu/android/ui/info/InfoBottomSheetFragment.kt rename to app/src/main/java/com/eatssu/android/presentation/info/InfoBottomSheetFragment.kt index 9de27f41d..26aab87f0 100644 --- a/app/src/main/java/com/eatssu/android/ui/info/InfoBottomSheetFragment.kt +++ b/app/src/main/java/com/eatssu/android/presentation/info/InfoBottomSheetFragment.kt @@ -1,4 +1,4 @@ -package com.eatssu.android.ui.info +package com.eatssu.android.presentation.info import android.os.Bundle import android.view.LayoutInflater @@ -32,16 +32,14 @@ class InfoBottomSheetFragment : BottomSheetDialogFragment() { override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) - // Retrieve passed data val name = arguments?.getString("name") val restaurantType = enumValues().find { it.name == name } ?: Restaurant.HAKSIK Timber.d("onViewCreated: $name $restaurantType") binding.tvName.text = restaurantType.displayName - // Collect the infoList Flow CoroutineScope(Dispatchers.Main).launch { - infoViewModel.infoList.collect { restaurantInfoList -> + infoViewModel.infoList.collect { val restaurantInfo = infoViewModel.getRestaurantInfo(restaurantType) restaurantInfo?.let { diff --git a/app/src/main/java/com/eatssu/android/ui/info/InfoViewModel.kt b/app/src/main/java/com/eatssu/android/presentation/info/InfoViewModel.kt similarity index 75% rename from app/src/main/java/com/eatssu/android/ui/info/InfoViewModel.kt rename to app/src/main/java/com/eatssu/android/presentation/info/InfoViewModel.kt index ed3cfccb8..c71dded0c 100644 --- a/app/src/main/java/com/eatssu/android/ui/info/InfoViewModel.kt +++ b/app/src/main/java/com/eatssu/android/presentation/info/InfoViewModel.kt @@ -1,14 +1,14 @@ -package com.eatssu.android.ui.info +package com.eatssu.android.presentation.info -import android.util.Log import androidx.lifecycle.ViewModel import com.eatssu.android.data.enums.Restaurant -import com.eatssu.android.data.model.RestaurantInfo import com.eatssu.android.data.repository.FirebaseRemoteConfigRepository +import com.eatssu.android.domain.model.RestaurantInfo import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.asStateFlow +import timber.log.Timber import javax.inject.Inject @HiltViewModel @@ -16,23 +16,19 @@ class InfoViewModel @Inject constructor( private val firebaseRemoteConfigRepository: FirebaseRemoteConfigRepository ) : ViewModel() { - // StateFlow to hold restaurant info list private val _infoList = MutableStateFlow>(emptyList()) val infoList: StateFlow> = _infoList.asStateFlow() - // Map to hold restaurant info private val restaurantInfoMap: MutableMap = mutableMapOf() init { - // Load cafeteria info from repository and update the StateFlow _infoList.value = firebaseRemoteConfigRepository.getCafeteriaInfo() - Log.d("InfoViewModel", _infoList.value.toString()) + Timber.d(_infoList.value.toString()) _infoList.value.forEach { restaurantInfo -> restaurantInfoMap[restaurantInfo.enum] = restaurantInfo } } - // Helper function to get restaurant details fun getRestaurantInfo(restaurant: Restaurant): RestaurantInfo? { return restaurantInfoMap[restaurant] } diff --git a/app/src/main/java/com/eatssu/android/ui/login/IntroActivity.kt b/app/src/main/java/com/eatssu/android/presentation/login/IntroActivity.kt similarity index 91% rename from app/src/main/java/com/eatssu/android/ui/login/IntroActivity.kt rename to app/src/main/java/com/eatssu/android/presentation/login/IntroActivity.kt index 58f416834..1f2b3fdb7 100644 --- a/app/src/main/java/com/eatssu/android/ui/login/IntroActivity.kt +++ b/app/src/main/java/com/eatssu/android/presentation/login/IntroActivity.kt @@ -1,4 +1,4 @@ -package com.eatssu.android.ui.login +package com.eatssu.android.presentation.login import android.os.Bundle import android.os.Handler @@ -7,8 +7,8 @@ import androidx.activity.viewModels import androidx.appcompat.app.AppCompatActivity import androidx.lifecycle.lifecycleScope import com.eatssu.android.R -import com.eatssu.android.ui.main.MainActivity -import com.eatssu.android.util.extension.startActivity +import com.eatssu.android.presentation.main.MainActivity +import com.eatssu.android.presentation.util.startActivity import dagger.hilt.android.AndroidEntryPoint import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.launch diff --git a/app/src/main/java/com/eatssu/android/ui/login/IntroViewModel.kt b/app/src/main/java/com/eatssu/android/presentation/login/IntroViewModel.kt similarity index 90% rename from app/src/main/java/com/eatssu/android/ui/login/IntroViewModel.kt rename to app/src/main/java/com/eatssu/android/presentation/login/IntroViewModel.kt index 1556a1cdc..5dabe8a24 100644 --- a/app/src/main/java/com/eatssu/android/ui/login/IntroViewModel.kt +++ b/app/src/main/java/com/eatssu/android/presentation/login/IntroViewModel.kt @@ -1,8 +1,8 @@ -package com.eatssu.android.ui.login +package com.eatssu.android.presentation.login import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope -import com.eatssu.android.data.usecase.GetAccessTokenUseCase +import com.eatssu.android.domain.usecase.auth.GetAccessTokenUseCase import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow diff --git a/app/src/main/java/com/eatssu/android/ui/login/LoginActivity.kt b/app/src/main/java/com/eatssu/android/presentation/login/LoginActivity.kt similarity index 92% rename from app/src/main/java/com/eatssu/android/ui/login/LoginActivity.kt rename to app/src/main/java/com/eatssu/android/presentation/login/LoginActivity.kt index 82cd23937..758a6dcf7 100644 --- a/app/src/main/java/com/eatssu/android/ui/login/LoginActivity.kt +++ b/app/src/main/java/com/eatssu/android/presentation/login/LoginActivity.kt @@ -1,14 +1,14 @@ -package com.eatssu.android.ui.login +package com.eatssu.android.presentation.login import android.os.Bundle import android.view.View import androidx.activity.viewModels import androidx.lifecycle.lifecycleScope -import com.eatssu.android.base.BaseActivity import com.eatssu.android.databinding.ActivityLoginBinding -import com.eatssu.android.ui.main.MainActivity -import com.eatssu.android.util.extension.showToast -import com.eatssu.android.util.extension.startActivity +import com.eatssu.android.presentation.base.BaseActivity +import com.eatssu.android.presentation.main.MainActivity +import com.eatssu.android.presentation.util.showToast +import com.eatssu.android.presentation.util.startActivity import com.kakao.sdk.common.model.ClientError import com.kakao.sdk.common.model.ClientErrorCause import com.kakao.sdk.user.UserApiClient diff --git a/app/src/main/java/com/eatssu/android/ui/login/LoginViewModel.kt b/app/src/main/java/com/eatssu/android/presentation/login/LoginViewModel.kt similarity index 89% rename from app/src/main/java/com/eatssu/android/ui/login/LoginViewModel.kt rename to app/src/main/java/com/eatssu/android/presentation/login/LoginViewModel.kt index 435399ec9..ec701a05c 100644 --- a/app/src/main/java/com/eatssu/android/ui/login/LoginViewModel.kt +++ b/app/src/main/java/com/eatssu/android/presentation/login/LoginViewModel.kt @@ -1,14 +1,14 @@ -package com.eatssu.android.ui.login +package com.eatssu.android.presentation.login import android.content.Context import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import com.eatssu.android.R import com.eatssu.android.data.dto.request.LoginWithKakaoRequest -import com.eatssu.android.data.usecase.LoginUseCase -import com.eatssu.android.data.usecase.SetAccessTokenUseCase -import com.eatssu.android.data.usecase.SetRefreshTokenUseCase -import com.eatssu.android.data.usecase.SetUserEmailUseCase +import com.eatssu.android.domain.usecase.auth.LoginUseCase +import com.eatssu.android.domain.usecase.auth.SetAccessTokenUseCase +import com.eatssu.android.domain.usecase.auth.SetRefreshTokenUseCase +import com.eatssu.android.domain.usecase.auth.SetUserEmailUseCase import dagger.hilt.android.lifecycle.HiltViewModel import dagger.hilt.android.qualifiers.ApplicationContext import kotlinx.coroutines.flow.MutableStateFlow diff --git a/app/src/main/java/com/eatssu/android/ui/login/UserApiClient.kt b/app/src/main/java/com/eatssu/android/presentation/login/UserApiClient.kt similarity index 98% rename from app/src/main/java/com/eatssu/android/ui/login/UserApiClient.kt rename to app/src/main/java/com/eatssu/android/presentation/login/UserApiClient.kt index 9ea55ba1d..d9f0c70c1 100644 --- a/app/src/main/java/com/eatssu/android/ui/login/UserApiClient.kt +++ b/app/src/main/java/com/eatssu/android/presentation/login/UserApiClient.kt @@ -1,4 +1,4 @@ -package com.eatssu.android.ui.login +package com.eatssu.android.presentation.login import android.content.Context import com.kakao.sdk.auth.model.OAuthToken diff --git a/app/src/main/java/com/eatssu/android/ui/main/MainActivity.kt b/app/src/main/java/com/eatssu/android/presentation/main/MainActivity.kt similarity index 84% rename from app/src/main/java/com/eatssu/android/ui/main/MainActivity.kt rename to app/src/main/java/com/eatssu/android/presentation/main/MainActivity.kt index a7d1ab43c..ce8a22824 100644 --- a/app/src/main/java/com/eatssu/android/ui/main/MainActivity.kt +++ b/app/src/main/java/com/eatssu/android/presentation/main/MainActivity.kt @@ -1,4 +1,4 @@ -package com.eatssu.android.ui.main +package com.eatssu.android.presentation.main import android.annotation.SuppressLint import android.content.Intent @@ -19,19 +19,19 @@ import androidx.recyclerview.widget.GridLayoutManager import androidx.recyclerview.widget.RecyclerView import androidx.viewpager2.widget.ViewPager2 import com.eatssu.android.R -import com.eatssu.android.base.BaseActivity import com.eatssu.android.databinding.ActivityMainBinding -import com.eatssu.android.ui.main.calendar.CalendarAdapter -import com.eatssu.android.ui.main.calendar.CalendarAdapter.OnItemListener -import com.eatssu.android.ui.main.calendar.CalendarViewModel -import com.eatssu.android.ui.mypage.MyPageActivity -import com.eatssu.android.ui.mypage.MyPageViewModel -import com.eatssu.android.ui.mypage.usernamechange.UserNameChangeActivity -import com.eatssu.android.util.CalendarUtils -import com.eatssu.android.util.CalendarUtils.daysInWeekArray -import com.eatssu.android.util.CalendarUtils.monthYearFromDate -import com.eatssu.android.util.extension.showToast -import com.eatssu.android.util.extension.startActivity +import com.eatssu.android.presentation.base.BaseActivity +import com.eatssu.android.presentation.main.calendar.CalendarAdapter +import com.eatssu.android.presentation.main.calendar.CalendarAdapter.OnItemListener +import com.eatssu.android.presentation.main.calendar.CalendarViewModel +import com.eatssu.android.presentation.mypage.MyPageActivity +import com.eatssu.android.presentation.mypage.MyPageViewModel +import com.eatssu.android.presentation.mypage.usernamechange.UserNameChangeActivity +import com.eatssu.android.presentation.util.CalendarUtil +import com.eatssu.android.presentation.util.CalendarUtil.daysInWeekArray +import com.eatssu.android.presentation.util.CalendarUtil.monthYearFromDate +import com.eatssu.android.presentation.util.showToast +import com.eatssu.android.presentation.util.startActivity import com.google.android.material.tabs.TabLayout import com.google.android.material.tabs.TabLayoutMediator import dagger.hilt.android.AndroidEntryPoint @@ -106,7 +106,7 @@ class MainActivity : BaseActivity(ActivityMainBinding::infl } initWidgets() - CalendarUtils.selectedDate = LocalDate.now() + CalendarUtil.selectedDate = LocalDate.now() calendarViewModel.setData(LocalDate.now()) setWeekView() } @@ -119,8 +119,8 @@ class MainActivity : BaseActivity(ActivityMainBinding::infl @RequiresApi(Build.VERSION_CODES.O) private fun setWeekView() { - monthYearText?.setText(CalendarUtils.selectedDate?.let { monthYearFromDate(it) }) - val days: ArrayList? = CalendarUtils.selectedDate?.let { daysInWeekArray(it) } + monthYearText?.setText(CalendarUtil.selectedDate?.let { monthYearFromDate(it) }) + val days: ArrayList? = CalendarUtil.selectedDate?.let { daysInWeekArray(it) } val calendarAdapter = days?.let { CalendarAdapter(it, this) } val gridLayoutManager = GridLayoutManager(applicationContext, 7) @@ -130,21 +130,21 @@ class MainActivity : BaseActivity(ActivityMainBinding::infl @RequiresApi(Build.VERSION_CODES.O) fun previousWeekAction(view: View?) { - CalendarUtils.selectedDate = CalendarUtils.selectedDate.minusWeeks(1) - onItemClick(mainPosition, CalendarUtils.selectedDate) + CalendarUtil.selectedDate = CalendarUtil.selectedDate.minusWeeks(1) + onItemClick(mainPosition, CalendarUtil.selectedDate) setWeekView() } @RequiresApi(Build.VERSION_CODES.O) fun nextWeekAction(view: View?) { - CalendarUtils.selectedDate = CalendarUtils.selectedDate.plusWeeks(1) - onItemClick(mainPosition, CalendarUtils.selectedDate) + CalendarUtil.selectedDate = CalendarUtil.selectedDate.plusWeeks(1) + onItemClick(mainPosition, CalendarUtil.selectedDate) setWeekView() } @RequiresApi(Build.VERSION_CODES.O) override fun onItemClick(position: Int, date: LocalDate) { - CalendarUtils.selectedDate = date + CalendarUtil.selectedDate = date calendarViewModel.setData(date) mainPosition = position diff --git a/app/src/main/java/com/eatssu/android/ui/main/MainViewModel.kt b/app/src/main/java/com/eatssu/android/presentation/main/MainViewModel.kt similarity index 96% rename from app/src/main/java/com/eatssu/android/ui/main/MainViewModel.kt rename to app/src/main/java/com/eatssu/android/presentation/main/MainViewModel.kt index 07acdaadc..266448446 100644 --- a/app/src/main/java/com/eatssu/android/ui/main/MainViewModel.kt +++ b/app/src/main/java/com/eatssu/android/presentation/main/MainViewModel.kt @@ -1,10 +1,10 @@ -package com.eatssu.android.ui.main +package com.eatssu.android.presentation.main import android.content.Context import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import com.eatssu.android.R -import com.eatssu.android.data.usecase.GetUserInfoUseCase +import com.eatssu.android.domain.usecase.auth.GetUserInfoUseCase import dagger.hilt.android.lifecycle.HiltViewModel import dagger.hilt.android.qualifiers.ApplicationContext import kotlinx.coroutines.flow.MutableStateFlow diff --git a/app/src/main/java/com/eatssu/android/ui/main/ViewPager2Adapter.kt b/app/src/main/java/com/eatssu/android/presentation/main/ViewPager2Adapter.kt similarity index 94% rename from app/src/main/java/com/eatssu/android/ui/main/ViewPager2Adapter.kt rename to app/src/main/java/com/eatssu/android/presentation/main/ViewPager2Adapter.kt index 32b390b60..691b055cc 100644 --- a/app/src/main/java/com/eatssu/android/ui/main/ViewPager2Adapter.kt +++ b/app/src/main/java/com/eatssu/android/presentation/main/ViewPager2Adapter.kt @@ -1,4 +1,4 @@ -package com.eatssu.android.ui.main +package com.eatssu.android.presentation.main import android.os.Build import androidx.annotation.RequiresApi @@ -6,7 +6,7 @@ import androidx.fragment.app.Fragment import androidx.fragment.app.FragmentActivity import androidx.viewpager2.adapter.FragmentStateAdapter import com.eatssu.android.data.enums.Time -import com.eatssu.android.ui.main.menu.MenuFragment +import com.eatssu.android.presentation.main.menu.MenuFragment import java.time.LocalTime class ViewPager2Adapter(fragmentActivity: FragmentActivity) : diff --git a/app/src/main/java/com/eatssu/android/ui/main/calendar/CalendarAdapter.kt b/app/src/main/java/com/eatssu/android/presentation/main/calendar/CalendarAdapter.kt similarity index 93% rename from app/src/main/java/com/eatssu/android/ui/main/calendar/CalendarAdapter.kt rename to app/src/main/java/com/eatssu/android/presentation/main/calendar/CalendarAdapter.kt index 372ad2b64..d1bff85ce 100644 --- a/app/src/main/java/com/eatssu/android/ui/main/calendar/CalendarAdapter.kt +++ b/app/src/main/java/com/eatssu/android/presentation/main/calendar/CalendarAdapter.kt @@ -1,4 +1,4 @@ -package com.eatssu.android.ui.main.calendar +package com.eatssu.android.presentation.main.calendar import android.os.Build import android.view.LayoutInflater @@ -8,7 +8,7 @@ import androidx.core.content.ContextCompat import androidx.recyclerview.widget.RecyclerView import com.eatssu.android.R import com.eatssu.android.databinding.ItemCalendarListBinding -import com.eatssu.android.util.CalendarUtils +import com.eatssu.android.presentation.util.CalendarUtil import java.time.LocalDate import java.time.format.TextStyle import java.util.Locale @@ -47,7 +47,7 @@ internal class CalendarAdapter( * 2. 였늘 λ‚ μ§œ != μ„ νƒν•œ λ‚ μ§œ 일 κ²½μš°μ—λŠ”, 였늘 λ‚ μ§œμ˜ text 색상을 primary color ν‘œκΈ°ν•˜μ—¬, 였늘 λ‚ μ§œλ₯Ό κ°•μ‘°ν•©λ‹ˆλ‹€. */ - if (date == CalendarUtils.selectedDate) { //μ…€λ ‰νŠΈ 된 λ‚ μ§œ + if (date == CalendarUtil.selectedDate) { //μ…€λ ‰νŠΈ 된 λ‚ μ§œ holder.dayOfMonth.setBackgroundResource(R.drawable.selector_background_blue) holder.dayOfMonth.setTextColor( ContextCompat.getColor( @@ -55,7 +55,7 @@ internal class CalendarAdapter( R.color.selector_calendar_colortext ) ) - } else if (date == LocalDate.now() && date != CalendarUtils.selectedDate) { + } else if (date == LocalDate.now() && date != CalendarUtil.selectedDate) { //였늘 λ‚ μ§œκ°€ 선택 λ˜μ§€ μ•Šμ•˜μ„ λ•Œ, 였늘 λ‚  text 색 μ§€μ • holder.dayOfMonth.setTextColor( ContextCompat.getColor( diff --git a/app/src/main/java/com/eatssu/android/ui/main/calendar/CalendarViewHolder.kt b/app/src/main/java/com/eatssu/android/presentation/main/calendar/CalendarViewHolder.kt similarity index 84% rename from app/src/main/java/com/eatssu/android/ui/main/calendar/CalendarViewHolder.kt rename to app/src/main/java/com/eatssu/android/presentation/main/calendar/CalendarViewHolder.kt index d240f2f36..96efac8a6 100644 --- a/app/src/main/java/com/eatssu/android/ui/main/calendar/CalendarViewHolder.kt +++ b/app/src/main/java/com/eatssu/android/presentation/main/calendar/CalendarViewHolder.kt @@ -1,14 +1,10 @@ -package com.eatssu.android.ui.main.calendar +package com.eatssu.android.presentation.main.calendar -import android.os.Build -import com.eatssu.android.R import android.view.View import android.widget.TextView -import androidx.annotation.RequiresApi import androidx.recyclerview.widget.RecyclerView import com.eatssu.android.databinding.ItemCalendarListBinding import java.time.LocalDate -import java.time.format.DateTimeFormatter class CalendarViewHolder internal constructor( binding: ItemCalendarListBinding, diff --git a/app/src/main/java/com/eatssu/android/ui/main/calendar/CalendarViewModel.kt b/app/src/main/java/com/eatssu/android/presentation/main/calendar/CalendarViewModel.kt similarity index 89% rename from app/src/main/java/com/eatssu/android/ui/main/calendar/CalendarViewModel.kt rename to app/src/main/java/com/eatssu/android/presentation/main/calendar/CalendarViewModel.kt index cf00070c5..6d6b910a3 100644 --- a/app/src/main/java/com/eatssu/android/ui/main/calendar/CalendarViewModel.kt +++ b/app/src/main/java/com/eatssu/android/presentation/main/calendar/CalendarViewModel.kt @@ -1,4 +1,4 @@ -package com.eatssu.android.ui.main.calendar +package com.eatssu.android.presentation.main.calendar import android.util.Log import androidx.lifecycle.LiveData diff --git a/app/src/main/java/com/eatssu/android/ui/main/menu/MenuAdapter.kt b/app/src/main/java/com/eatssu/android/presentation/main/menu/MenuAdapter.kt similarity index 93% rename from app/src/main/java/com/eatssu/android/ui/main/menu/MenuAdapter.kt rename to app/src/main/java/com/eatssu/android/presentation/main/menu/MenuAdapter.kt index a7e0c34a9..b7dc4cd55 100644 --- a/app/src/main/java/com/eatssu/android/ui/main/menu/MenuAdapter.kt +++ b/app/src/main/java/com/eatssu/android/presentation/main/menu/MenuAdapter.kt @@ -1,4 +1,4 @@ -package com.eatssu.android.ui.main.menu +package com.eatssu.android.presentation.main.menu import android.util.Log import android.view.LayoutInflater @@ -8,9 +8,9 @@ import androidx.fragment.app.FragmentManager import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView import com.eatssu.android.R -import com.eatssu.android.data.model.Section import com.eatssu.android.databinding.ItemCafeteriaSectionBinding -import com.eatssu.android.ui.info.InfoBottomSheetFragment +import com.eatssu.android.domain.model.Section +import com.eatssu.android.presentation.info.InfoBottomSheetFragment class MenuAdapter( private val fragmentManager: FragmentManager, diff --git a/app/src/main/java/com/eatssu/android/ui/main/menu/MenuFragment.kt b/app/src/main/java/com/eatssu/android/presentation/main/menu/MenuFragment.kt similarity index 97% rename from app/src/main/java/com/eatssu/android/ui/main/menu/MenuFragment.kt rename to app/src/main/java/com/eatssu/android/presentation/main/menu/MenuFragment.kt index 096868883..a970a6acd 100644 --- a/app/src/main/java/com/eatssu/android/ui/main/menu/MenuFragment.kt +++ b/app/src/main/java/com/eatssu/android/presentation/main/menu/MenuFragment.kt @@ -1,4 +1,4 @@ -package com.eatssu.android.ui.main.menu +package com.eatssu.android.presentation.main.menu import android.os.Build import android.os.Bundle @@ -12,18 +12,18 @@ import androidx.fragment.app.activityViewModels import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModelProvider import androidx.recyclerview.widget.LinearLayoutManager +import com.eatssu.android.data.RetrofitImpl import com.eatssu.android.data.dto.response.mapFixedMenuResponseToMenu import com.eatssu.android.data.dto.response.mapTodayMenuResponseToMenu import com.eatssu.android.data.enums.MenuType import com.eatssu.android.data.enums.Restaurant import com.eatssu.android.data.enums.Time -import com.eatssu.android.data.model.Section import com.eatssu.android.data.service.MealService import com.eatssu.android.data.service.MenuService import com.eatssu.android.databinding.FragmentMenuBinding -import com.eatssu.android.ui.info.InfoViewModel -import com.eatssu.android.ui.main.calendar.CalendarViewModel -import com.eatssu.android.util.RetrofitImpl +import com.eatssu.android.domain.model.Section +import com.eatssu.android.presentation.info.InfoViewModel +import com.eatssu.android.presentation.main.calendar.CalendarViewModel import java.time.DayOfWeek import java.time.LocalDate import java.time.LocalDateTime diff --git a/app/src/main/java/com/eatssu/android/ui/main/menu/MenuSubAdapter.kt b/app/src/main/java/com/eatssu/android/presentation/main/menu/MenuSubAdapter.kt similarity index 93% rename from app/src/main/java/com/eatssu/android/ui/main/menu/MenuSubAdapter.kt rename to app/src/main/java/com/eatssu/android/presentation/main/menu/MenuSubAdapter.kt index fc58f6fde..c211f40ba 100644 --- a/app/src/main/java/com/eatssu/android/ui/main/menu/MenuSubAdapter.kt +++ b/app/src/main/java/com/eatssu/android/presentation/main/menu/MenuSubAdapter.kt @@ -1,4 +1,4 @@ -package com.eatssu.android.ui.main.menu +package com.eatssu.android.presentation.main.menu import android.content.Intent import android.util.Log @@ -7,9 +7,9 @@ import android.view.ViewGroup import androidx.core.content.ContextCompat import androidx.recyclerview.widget.RecyclerView import com.eatssu.android.data.enums.MenuType -import com.eatssu.android.data.model.Menu import com.eatssu.android.databinding.ItemMenuBinding -import com.eatssu.android.ui.review.list.ReviewActivity +import com.eatssu.android.domain.model.Menu +import com.eatssu.android.presentation.review.list.ReviewActivity class MenuSubAdapter( diff --git a/app/src/main/java/com/eatssu/android/ui/main/menu/MenuViewModel.kt b/app/src/main/java/com/eatssu/android/presentation/main/menu/MenuViewModel.kt similarity index 79% rename from app/src/main/java/com/eatssu/android/ui/main/menu/MenuViewModel.kt rename to app/src/main/java/com/eatssu/android/presentation/main/menu/MenuViewModel.kt index 8d2b47eb8..4117396fa 100644 --- a/app/src/main/java/com/eatssu/android/ui/main/menu/MenuViewModel.kt +++ b/app/src/main/java/com/eatssu/android/presentation/main/menu/MenuViewModel.kt @@ -1,24 +1,21 @@ -package com.eatssu.android.ui.main.menu +package com.eatssu.android.presentation.main.menu import android.util.Log import androidx.lifecycle.LiveData import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope -import com.eatssu.android.base.BaseResponse +import com.eatssu.android.data.dto.response.BaseResponse import com.eatssu.android.data.dto.response.GetFixedMenuResponse import com.eatssu.android.data.dto.response.GetMealResponse -import com.eatssu.android.data.dto.response.MenuOfMealResponse -import com.eatssu.android.data.dto.response.asMenuOfMeal import com.eatssu.android.data.enums.Restaurant import com.eatssu.android.data.enums.Time -import com.eatssu.android.data.model.MenuMini import com.eatssu.android.data.service.MealService import com.eatssu.android.data.service.MenuService +import com.eatssu.android.domain.model.MenuMini import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.asStateFlow -import kotlinx.coroutines.flow.update import kotlinx.coroutines.launch import retrofit2.Call import retrofit2.Callback @@ -134,36 +131,36 @@ class MenuViewModel( } } - fun findMenuItemByMealId(mealId: Long) { - viewModelScope.launch { - mealService.getMenuInfoByMealId(mealId) - .enqueue(object : Callback> { - override fun onResponse( - call: Call>, - response: Response>, - ) { - if (response.isSuccessful) { - val data = response.body()?.result - Log.d("post", "onResponse 성곡" + response.body()) - _uiState.update { - it.copy( - menuOfMeal = response.body()?.result?.asMenuOfMeal() - ) - } - } else { - Log.d("post", "onResponse μ‹€νŒ¨") - } - } - - override fun onFailure( - call: Call>, - t: Throwable, - ) { - Log.d("post", "onFailure μ—λŸ¬: ${t.message}") - } - }) - } - } +// fun findMenuItemByMealId(mealId: Long) { +// viewModelScope.launch { +// mealService.getMenuInfoByMealId(mealId) +// .enqueue(object : Callback> { +// override fun onResponse( +// call: Call>, +// response: Response>, +// ) { +// if (response.isSuccessful) { +// val data = response.body()?.result +// Log.d("post", "onResponse 성곡" + response.body()) +// _uiState.update { +// it.copy( +// menuOfMeal = response.body()?.result?.asMenuOfMeal() +// ) +// } +// } else { +// Log.d("post", "onResponse μ‹€νŒ¨") +// } +// } +// +// override fun onFailure( +// call: Call>, +// t: Throwable, +// ) { +// Log.d("post", "onFailure μ—λŸ¬: ${t.message}") +// } +// }) +// } +// } } data class MenuState( diff --git a/app/src/main/java/com/eatssu/android/ui/main/menu/MenuViewModelFactory.kt b/app/src/main/java/com/eatssu/android/presentation/main/menu/MenuViewModelFactory.kt similarity index 92% rename from app/src/main/java/com/eatssu/android/ui/main/menu/MenuViewModelFactory.kt rename to app/src/main/java/com/eatssu/android/presentation/main/menu/MenuViewModelFactory.kt index 81c19c8a2..7e8057b31 100644 --- a/app/src/main/java/com/eatssu/android/ui/main/menu/MenuViewModelFactory.kt +++ b/app/src/main/java/com/eatssu/android/presentation/main/menu/MenuViewModelFactory.kt @@ -1,4 +1,4 @@ -package com.eatssu.android.ui.main.menu +package com.eatssu.android.presentation.main.menu import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModelProvider diff --git a/app/src/main/java/com/eatssu/android/ui/mypage/DeveloperActivity.kt b/app/src/main/java/com/eatssu/android/presentation/mypage/DeveloperActivity.kt similarity index 82% rename from app/src/main/java/com/eatssu/android/ui/mypage/DeveloperActivity.kt rename to app/src/main/java/com/eatssu/android/presentation/mypage/DeveloperActivity.kt index 39688525c..d3474c979 100644 --- a/app/src/main/java/com/eatssu/android/ui/mypage/DeveloperActivity.kt +++ b/app/src/main/java/com/eatssu/android/presentation/mypage/DeveloperActivity.kt @@ -1,9 +1,9 @@ -package com.eatssu.android.ui.mypage +package com.eatssu.android.presentation.mypage import android.os.Bundle import com.eatssu.android.R -import com.eatssu.android.base.BaseActivity import com.eatssu.android.databinding.ActivityDeveloperBinding +import com.eatssu.android.presentation.base.BaseActivity import dagger.hilt.android.AndroidEntryPoint @AndroidEntryPoint diff --git a/app/src/main/java/com/eatssu/android/ui/mypage/MyPageActivity.kt b/app/src/main/java/com/eatssu/android/presentation/mypage/MyPageActivity.kt similarity index 93% rename from app/src/main/java/com/eatssu/android/ui/mypage/MyPageActivity.kt rename to app/src/main/java/com/eatssu/android/presentation/mypage/MyPageActivity.kt index bfff4ae00..b75675248 100644 --- a/app/src/main/java/com/eatssu/android/ui/mypage/MyPageActivity.kt +++ b/app/src/main/java/com/eatssu/android/presentation/mypage/MyPageActivity.kt @@ -1,4 +1,4 @@ -package com.eatssu.android.ui.mypage +package com.eatssu.android.presentation.mypage import android.app.Activity @@ -19,14 +19,15 @@ import androidx.lifecycle.Lifecycle import androidx.lifecycle.lifecycleScope import androidx.lifecycle.repeatOnLifecycle import com.eatssu.android.R -import com.eatssu.android.base.BaseActivity import com.eatssu.android.databinding.ActivityMyPageBinding -import com.eatssu.android.ui.login.LoginActivity -import com.eatssu.android.ui.mypage.myreview.MyReviewListActivity -import com.eatssu.android.ui.mypage.terms.WebViewActivity -import com.eatssu.android.ui.mypage.usernamechange.UserNameChangeActivity -import com.eatssu.android.util.extension.showToast -import com.eatssu.android.util.extension.startActivity +import com.eatssu.android.presentation.base.BaseActivity +import com.eatssu.android.presentation.login.LoginActivity +import com.eatssu.android.presentation.mypage.myreview.MyReviewListActivity +import com.eatssu.android.presentation.mypage.terms.WebViewActivity +import com.eatssu.android.presentation.mypage.usernamechange.UserNameChangeActivity +import com.eatssu.android.presentation.util.showToast +import com.google.android.gms.oss.licenses.OssLicensesMenuActivity +import com.eatssu.android.presentation.util.startActivity import com.google.android.material.snackbar.Snackbar import dagger.hilt.android.AndroidEntryPoint import kotlinx.coroutines.flow.collectLatest @@ -124,6 +125,10 @@ class MyPageActivity : BaseActivity(ActivityMyPageBinding startActivity() } + binding.llOss.setOnClickListener { + startActivity() + } + binding.llAppVersion.setOnClickListener { moveToPlayStore() } diff --git a/app/src/main/java/com/eatssu/android/ui/mypage/MyPageViewModel.kt b/app/src/main/java/com/eatssu/android/presentation/mypage/MyPageViewModel.kt similarity index 87% rename from app/src/main/java/com/eatssu/android/ui/mypage/MyPageViewModel.kt rename to app/src/main/java/com/eatssu/android/presentation/mypage/MyPageViewModel.kt index 923213e34..10d3d009b 100644 --- a/app/src/main/java/com/eatssu/android/ui/mypage/MyPageViewModel.kt +++ b/app/src/main/java/com/eatssu/android/presentation/mypage/MyPageViewModel.kt @@ -1,18 +1,17 @@ -package com.eatssu.android.ui.mypage +package com.eatssu.android.presentation.mypage -import android.util.Log import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import com.eatssu.android.BuildConfig import com.eatssu.android.data.repository.PreferencesRepository -import com.eatssu.android.data.usecase.AlarmUseCase -import com.eatssu.android.data.usecase.GetDailyNotificationStatusUseCase -import com.eatssu.android.data.usecase.GetUserInfoUseCase -import com.eatssu.android.data.usecase.LogoutUseCase -import com.eatssu.android.data.usecase.SetAccessTokenUseCase -import com.eatssu.android.data.usecase.SetDailyNotificationStatusUseCase -import com.eatssu.android.data.usecase.SetRefreshTokenUseCase -import com.eatssu.android.data.usecase.SignOutUseCase +import com.eatssu.android.domain.usecase.alarm.AlarmUseCase +import com.eatssu.android.domain.usecase.alarm.GetDailyNotificationStatusUseCase +import com.eatssu.android.domain.usecase.alarm.SetDailyNotificationStatusUseCase +import com.eatssu.android.domain.usecase.auth.GetUserInfoUseCase +import com.eatssu.android.domain.usecase.auth.LogoutUseCase +import com.eatssu.android.domain.usecase.auth.SetAccessTokenUseCase +import com.eatssu.android.domain.usecase.auth.SetRefreshTokenUseCase +import com.eatssu.android.domain.usecase.auth.SignOutUseCase import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow @@ -23,6 +22,7 @@ import kotlinx.coroutines.flow.onCompletion import kotlinx.coroutines.flow.onStart import kotlinx.coroutines.flow.update import kotlinx.coroutines.launch +import timber.log.Timber import javax.inject.Inject @HiltViewModel @@ -70,9 +70,9 @@ class MyPageViewModel @Inject constructor( _uiState.update { it.copy(loading = false, error = true) } }.catch { e -> _uiState.update { it.copy(error = true, toastMessage = "정보λ₯Ό 뢈러올 수 μ—†μŠ΅λ‹ˆλ‹€.") } - Log.e(TAG, e.toString()) + Timber.e(e.toString()) }.collectLatest { result -> - Log.d(TAG, result.toString()) + Timber.d(result.toString()) result.result?.apply { if (this.nickname.isNullOrBlank()) { _uiState.update { @@ -121,10 +121,9 @@ class MyPageViewModel @Inject constructor( _uiState.update { it.copy(loading = false, error = true) } }.catch { e -> _uiState.update { it.copy(error = true, toastMessage = "정보λ₯Ό 뢈러올 수 μ—†μŠ΅λ‹ˆλ‹€.") } - Log.d(TAG, e.toString()) - + Timber.e(e.toString()) }.collectLatest { result -> - Log.d(TAG, result.toString()) + Timber.d(result.toString()) if (result.result == true) { logoutUseCase() _uiState.update { diff --git a/app/src/main/java/com/eatssu/android/ui/mypage/SignOutActivity.kt b/app/src/main/java/com/eatssu/android/presentation/mypage/SignOutActivity.kt similarity index 93% rename from app/src/main/java/com/eatssu/android/ui/mypage/SignOutActivity.kt rename to app/src/main/java/com/eatssu/android/presentation/mypage/SignOutActivity.kt index 883d54cd7..1b271b3c0 100644 --- a/app/src/main/java/com/eatssu/android/ui/mypage/SignOutActivity.kt +++ b/app/src/main/java/com/eatssu/android/presentation/mypage/SignOutActivity.kt @@ -1,13 +1,13 @@ -package com.eatssu.android.ui.mypage +package com.eatssu.android.presentation.mypage import android.os.Bundle import android.text.Editable import android.text.TextWatcher import androidx.activity.viewModels import androidx.lifecycle.lifecycleScope -import com.eatssu.android.base.BaseActivity import com.eatssu.android.databinding.ActivitySignOutBinding -import com.eatssu.android.util.extension.showToast +import com.eatssu.android.presentation.base.BaseActivity +import com.eatssu.android.presentation.util.showToast import dagger.hilt.android.AndroidEntryPoint import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.launch diff --git a/app/src/main/java/com/eatssu/android/ui/mypage/SignOutViewModel.kt b/app/src/main/java/com/eatssu/android/presentation/mypage/SignOutViewModel.kt similarity index 86% rename from app/src/main/java/com/eatssu/android/ui/mypage/SignOutViewModel.kt rename to app/src/main/java/com/eatssu/android/presentation/mypage/SignOutViewModel.kt index 91c76fbeb..f3c467195 100644 --- a/app/src/main/java/com/eatssu/android/ui/mypage/SignOutViewModel.kt +++ b/app/src/main/java/com/eatssu/android/presentation/mypage/SignOutViewModel.kt @@ -1,13 +1,13 @@ -package com.eatssu.android.ui.mypage +package com.eatssu.android.presentation.mypage import android.util.Log import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope -import com.eatssu.android.data.usecase.GetUserInfoUseCase -import com.eatssu.android.data.usecase.LogoutUseCase -import com.eatssu.android.data.usecase.SetAccessTokenUseCase -import com.eatssu.android.data.usecase.SetRefreshTokenUseCase -import com.eatssu.android.data.usecase.SignOutUseCase +import com.eatssu.android.domain.usecase.auth.GetUserInfoUseCase +import com.eatssu.android.domain.usecase.auth.LogoutUseCase +import com.eatssu.android.domain.usecase.auth.SetAccessTokenUseCase +import com.eatssu.android.domain.usecase.auth.SetRefreshTokenUseCase +import com.eatssu.android.domain.usecase.auth.SignOutUseCase import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow diff --git a/app/src/main/java/com/eatssu/android/ui/mypage/myreview/MyReviewAdapter.kt b/app/src/main/java/com/eatssu/android/presentation/mypage/myreview/MyReviewAdapter.kt similarity index 82% rename from app/src/main/java/com/eatssu/android/ui/mypage/myreview/MyReviewAdapter.kt rename to app/src/main/java/com/eatssu/android/presentation/mypage/myreview/MyReviewAdapter.kt index ba10ef14e..5649cf967 100644 --- a/app/src/main/java/com/eatssu/android/ui/mypage/myreview/MyReviewAdapter.kt +++ b/app/src/main/java/com/eatssu/android/presentation/mypage/myreview/MyReviewAdapter.kt @@ -1,7 +1,6 @@ -package com.eatssu.android.ui.mypage.myreview +package com.eatssu.android.presentation.mypage.myreview import android.content.Intent -import android.util.Log import android.view.LayoutInflater import android.view.View import android.view.ViewGroup @@ -9,10 +8,11 @@ import android.widget.ImageView import androidx.core.content.ContextCompat import androidx.recyclerview.widget.RecyclerView import com.bumptech.glide.Glide -import com.eatssu.android.data.model.Review +import com.eatssu.android.data.MySharedPreferences import com.eatssu.android.databinding.ItemReviewBinding -import com.eatssu.android.ui.review.delete.MyReviewDialogActivity -import com.eatssu.android.util.MySharedPreferences +import com.eatssu.android.domain.model.Review +import com.eatssu.android.presentation.review.delete.MyReviewDialogActivity +import timber.log.Timber class MyReviewAdapter(private val dataList: List) : @@ -34,7 +34,7 @@ class MyReviewAdapter(private val dataList: List) : if (dataList[position].imgUrl?.isEmpty() == true) { imageView.visibility = View.GONE } else { - Log.d("qwer", "사진 μžˆλ‹€") + Timber.d("사진 μžˆλ‹€") Glide.with(itemView) .load(dataList[position].imgUrl?.get(0)) .into(imageView) @@ -56,10 +56,13 @@ class MyReviewAdapter(private val dataList: List) : intent.putExtra("amountGrade", dataList[position].amountGrade) intent.putExtra("tasteGrade", dataList[position].tasteGrade) - Log.d("ReviewFixedActivity", "μ „μ „:" + dataList[position].reviewId) - Log.d("ReviewFixedActivity", "μ „μ „:" + dataList[position].menu) - Log.d("ReviewFixedActivity", "μ „μ „:" + dataList[position].content) -//// + Timber.d( + "리뷰 상세 정보 - ID: %d, 메뉴: %s, λ‚΄μš©: %s", + dataList[position].reviewId, + dataList[position].menu, + dataList[position].content + ) + ContextCompat.startActivity(binding.btnDetail.context, intent, null) } } diff --git a/app/src/main/java/com/eatssu/android/ui/mypage/myreview/MyReviewListActivity.kt b/app/src/main/java/com/eatssu/android/presentation/mypage/myreview/MyReviewListActivity.kt similarity index 92% rename from app/src/main/java/com/eatssu/android/ui/mypage/myreview/MyReviewListActivity.kt rename to app/src/main/java/com/eatssu/android/presentation/mypage/myreview/MyReviewListActivity.kt index ff730a59f..2beee9a1e 100644 --- a/app/src/main/java/com/eatssu/android/ui/mypage/myreview/MyReviewListActivity.kt +++ b/app/src/main/java/com/eatssu/android/presentation/mypage/myreview/MyReviewListActivity.kt @@ -1,13 +1,13 @@ -package com.eatssu.android.ui.mypage.myreview +package com.eatssu.android.presentation.mypage.myreview import android.os.Bundle import android.view.View import androidx.activity.viewModels import androidx.lifecycle.lifecycleScope import androidx.recyclerview.widget.LinearLayoutManager -import com.eatssu.android.base.BaseActivity -import com.eatssu.android.data.model.Review import com.eatssu.android.databinding.ActivityMyReviewListBinding +import com.eatssu.android.domain.model.Review +import com.eatssu.android.presentation.base.BaseActivity import dagger.hilt.android.AndroidEntryPoint import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.launch diff --git a/app/src/main/java/com/eatssu/android/ui/mypage/myreview/MyReviewViewModel.kt b/app/src/main/java/com/eatssu/android/presentation/mypage/myreview/MyReviewViewModel.kt similarity index 85% rename from app/src/main/java/com/eatssu/android/ui/mypage/myreview/MyReviewViewModel.kt rename to app/src/main/java/com/eatssu/android/presentation/mypage/myreview/MyReviewViewModel.kt index 9f846bd73..b65be4bf0 100644 --- a/app/src/main/java/com/eatssu/android/ui/mypage/myreview/MyReviewViewModel.kt +++ b/app/src/main/java/com/eatssu/android/presentation/mypage/myreview/MyReviewViewModel.kt @@ -1,11 +1,10 @@ -package com.eatssu.android.ui.mypage.myreview +package com.eatssu.android.presentation.mypage.myreview -import android.util.Log import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import com.eatssu.android.data.dto.response.toReviewList -import com.eatssu.android.data.model.Review -import com.eatssu.android.data.usecase.GetMyReviewsUseCase +import com.eatssu.android.domain.model.Review +import com.eatssu.android.domain.usecase.auth.GetMyReviewsUseCase import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow @@ -16,6 +15,7 @@ import kotlinx.coroutines.flow.onCompletion import kotlinx.coroutines.flow.onStart import kotlinx.coroutines.flow.update import kotlinx.coroutines.launch +import timber.log.Timber import javax.inject.Inject @HiltViewModel @@ -38,9 +38,9 @@ class MyReviewViewModel @Inject constructor( _uiState.update { it.copy(loading = false, error = true) } }.catch { e -> _uiState.update { it.copy(error = true, toastMessage = "정보λ₯Ό 뢈러올 수 μ—†μŠ΅λ‹ˆλ‹€.") } - Log.e(TAG, e.toString()) + Timber.e(e.toString()) }.collectLatest { result -> - Log.d(TAG, result.toString()) + Timber.d(result.toString()) result.result?.apply { if (dataList.isEmpty()) { @@ -55,11 +55,6 @@ class MyReviewViewModel @Inject constructor( } } } - - - companion object { - val TAG = "MyReviewViewModel" - } } diff --git a/app/src/main/java/com/eatssu/android/ui/mypage/terms/WebViewActivity.kt b/app/src/main/java/com/eatssu/android/presentation/mypage/terms/WebViewActivity.kt similarity index 85% rename from app/src/main/java/com/eatssu/android/ui/mypage/terms/WebViewActivity.kt rename to app/src/main/java/com/eatssu/android/presentation/mypage/terms/WebViewActivity.kt index da3ed88ed..6459cef61 100644 --- a/app/src/main/java/com/eatssu/android/ui/mypage/terms/WebViewActivity.kt +++ b/app/src/main/java/com/eatssu/android/presentation/mypage/terms/WebViewActivity.kt @@ -1,17 +1,14 @@ -package com.eatssu.android.ui.mypage.terms +package com.eatssu.android.presentation.mypage.terms import android.os.Bundle -import android.util.Log import android.webkit.WebViewClient -import com.eatssu.android.base.BaseActivity import com.eatssu.android.databinding.ActivityWebviewBinding +import com.eatssu.android.presentation.base.BaseActivity +import timber.log.Timber class WebViewActivity : BaseActivity(ActivityWebviewBinding::inflate) { - companion object { - val TAG = "WebViewActivity" - } private var URL = "" private var TITLE = "" @@ -32,7 +29,7 @@ class WebViewActivity : BaseActivity(ActivityWebviewBind TITLE = intent.getStringExtra("TITLE") ?: "" toolbarTitle.text = TITLE - Log.d(TAG, URL + TITLE) + Timber.d(URL + TITLE) if (savedInstanceState != null) restoreState(savedInstanceState) else loadUrl(URL) diff --git a/app/src/main/java/com/eatssu/android/ui/mypage/usernamechange/UserNameChangeActivity.kt b/app/src/main/java/com/eatssu/android/presentation/mypage/usernamechange/UserNameChangeActivity.kt similarity index 96% rename from app/src/main/java/com/eatssu/android/ui/mypage/usernamechange/UserNameChangeActivity.kt rename to app/src/main/java/com/eatssu/android/presentation/mypage/usernamechange/UserNameChangeActivity.kt index 2412f989e..bc213e841 100644 --- a/app/src/main/java/com/eatssu/android/ui/mypage/usernamechange/UserNameChangeActivity.kt +++ b/app/src/main/java/com/eatssu/android/presentation/mypage/usernamechange/UserNameChangeActivity.kt @@ -1,4 +1,4 @@ -package com.eatssu.android.ui.mypage.usernamechange +package com.eatssu.android.presentation.mypage.usernamechange import android.os.Bundle import android.text.Editable @@ -6,9 +6,9 @@ import android.text.TextWatcher import androidx.activity.viewModels import androidx.lifecycle.lifecycleScope import com.eatssu.android.R -import com.eatssu.android.base.BaseActivity import com.eatssu.android.databinding.ActivityUserNameChangeBinding -import com.eatssu.android.util.extension.showToast +import com.eatssu.android.presentation.base.BaseActivity +import com.eatssu.android.presentation.util.showToast import dagger.hilt.android.AndroidEntryPoint import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.launch diff --git a/app/src/main/java/com/eatssu/android/ui/mypage/usernamechange/UserNameChangeViewModel.kt b/app/src/main/java/com/eatssu/android/presentation/mypage/usernamechange/UserNameChangeViewModel.kt similarity index 90% rename from app/src/main/java/com/eatssu/android/ui/mypage/usernamechange/UserNameChangeViewModel.kt rename to app/src/main/java/com/eatssu/android/presentation/mypage/usernamechange/UserNameChangeViewModel.kt index 9ea99a027..ce42d7e68 100644 --- a/app/src/main/java/com/eatssu/android/ui/mypage/usernamechange/UserNameChangeViewModel.kt +++ b/app/src/main/java/com/eatssu/android/presentation/mypage/usernamechange/UserNameChangeViewModel.kt @@ -1,11 +1,11 @@ -package com.eatssu.android.ui.mypage.usernamechange +package com.eatssu.android.presentation.mypage.usernamechange import android.util.Log import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope -import com.eatssu.android.data.usecase.GetUserNameUseCase -import com.eatssu.android.data.usecase.SetUserNameUseCase -import com.eatssu.android.data.usecase.ValidateUserNameUseCase +import com.eatssu.android.domain.usecase.auth.GetUserNameUseCase +import com.eatssu.android.domain.usecase.auth.SetUserNameUseCase +import com.eatssu.android.domain.usecase.auth.ValidateUserNameUseCase import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow @@ -16,6 +16,7 @@ import kotlinx.coroutines.flow.onCompletion import kotlinx.coroutines.flow.onStart import kotlinx.coroutines.flow.update import kotlinx.coroutines.launch +import timber.log.Timber import javax.inject.Inject @HiltViewModel @@ -37,7 +38,7 @@ class UserNameChangeViewModel @Inject constructor( _uiState.update { it.copy(loading = false, error = true) } }.catch { e -> _uiState.update { it.copy(error = true, toastMessage = "λ‹‰λ„€μž„ 쀑볡 확인에 μ‹€νŒ¨ν–ˆμŠ΅λ‹ˆλ‹€.") } - Log.e(TAG, e.toString()) + Timber.e(e.toString()) }.collectLatest { result -> if (result.result == true) { _uiState.update { diff --git a/app/src/main/java/com/eatssu/android/presentation/review/delete/DeleteViewModel.kt b/app/src/main/java/com/eatssu/android/presentation/review/delete/DeleteViewModel.kt new file mode 100644 index 000000000..ef9fb66dd --- /dev/null +++ b/app/src/main/java/com/eatssu/android/presentation/review/delete/DeleteViewModel.kt @@ -0,0 +1,68 @@ +package com.eatssu.android.presentation.review.delete + +import android.content.Context +import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import com.eatssu.android.R +import com.eatssu.android.domain.usecase.review.DeleteReviewUseCase +import dagger.hilt.android.lifecycle.HiltViewModel +import dagger.hilt.android.qualifiers.ApplicationContext +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.StateFlow +import kotlinx.coroutines.flow.asStateFlow +import kotlinx.coroutines.flow.catch +import kotlinx.coroutines.flow.collectLatest +import kotlinx.coroutines.flow.onCompletion +import kotlinx.coroutines.flow.onStart +import kotlinx.coroutines.flow.update +import kotlinx.coroutines.launch +import timber.log.Timber +import javax.inject.Inject + +@HiltViewModel +class DeleteViewModel @Inject constructor( + private val deleteReviewUseCase: DeleteReviewUseCase, + @ApplicationContext private val context: Context +) : ViewModel() { + + private val _uiState: MutableStateFlow = MutableStateFlow(DeleteState()) + val uiState: StateFlow = _uiState.asStateFlow() + + + fun deleteReview(reviewId: Long) { + viewModelScope.launch { + deleteReviewUseCase(reviewId).onStart { + _uiState.update { it.copy(loading = true) } + }.onCompletion { + _uiState.update { it.copy(loading = false, error = true) } + }.catch { e -> + _uiState.update { + it.copy( + error = true, + toastMessage = context.getString(R.string.delete_not) + ) + } + Timber.e(e.toString()) + }.collectLatest { result -> + Timber.d(result.toString()) + + _uiState.update { + it.copy( + isDeleted = true, + toastMessage = context.getString(R.string.delete_done) + ) + } + } + } + } +} + +data class DeleteState( + var loading: Boolean = true, + var error: Boolean = false, + + var toastMessage: String = "", + + var isDeleted: Boolean = false, + + ) \ No newline at end of file diff --git a/app/src/main/java/com/eatssu/android/ui/review/delete/MyReviewDialogActivity.kt b/app/src/main/java/com/eatssu/android/presentation/review/delete/MyReviewDialogActivity.kt similarity index 59% rename from app/src/main/java/com/eatssu/android/ui/review/delete/MyReviewDialogActivity.kt rename to app/src/main/java/com/eatssu/android/presentation/review/delete/MyReviewDialogActivity.kt index 514450da2..57313a796 100644 --- a/app/src/main/java/com/eatssu/android/ui/review/delete/MyReviewDialogActivity.kt +++ b/app/src/main/java/com/eatssu/android/presentation/review/delete/MyReviewDialogActivity.kt @@ -1,19 +1,26 @@ -package com.eatssu.android.ui.review.delete +package com.eatssu.android.presentation.review.delete import android.content.Intent import android.os.Bundle -import android.util.Log -import android.widget.Toast +import androidx.activity.viewModels import androidx.appcompat.app.AlertDialog import androidx.appcompat.app.AppCompatActivity -import androidx.lifecycle.Observer -import androidx.lifecycle.ViewModelProvider +import androidx.lifecycle.lifecycleScope +import com.eatssu.android.App +import com.eatssu.android.R import com.eatssu.android.databinding.ActivityMyReviewDialogBinding -import com.eatssu.android.ui.review.modify.ModifyReviewActivity +import com.eatssu.android.presentation.review.modify.ModifyReviewActivity +import com.eatssu.android.presentation.util.showToast +import dagger.hilt.android.AndroidEntryPoint +import kotlinx.coroutines.flow.collectLatest +import kotlinx.coroutines.launch +import timber.log.Timber +@AndroidEntryPoint class MyReviewDialogActivity : AppCompatActivity() { private lateinit var binding: ActivityMyReviewDialogBinding - private lateinit var viewModel: DeleteViewModel + + private val deleteViewModel: DeleteViewModel by viewModels() var reviewId = -1L var menu = "" @@ -28,8 +35,6 @@ class MyReviewDialogActivity : AppCompatActivity() { binding = ActivityMyReviewDialogBinding.inflate(layoutInflater) setContentView(binding.root) - viewModel = ViewModelProvider(this).get(DeleteViewModel::class.java) - reviewId = intent.getLongExtra("reviewId", -1L) menu = intent.getStringExtra("menu").toString() content = intent.getStringExtra("content").toString() @@ -37,9 +42,10 @@ class MyReviewDialogActivity : AppCompatActivity() { amountGrade = intent.getIntExtra("amountGrade", -1) tasteGrade = intent.getIntExtra("tasteGrade", -1) - Log.d("ReviewFixedActivity", "μ „:" + reviewId.toString()) - Log.d("ReviewFixedActivity", "μ „:" + menu.toString()) - Log.d("ReviewFixedActivity", "μ „:" + content.toString()) + Timber.d("μ „:" + reviewId.toString()) + Timber.d("μ „:" + menu.toString()) + Timber.d("μ „:" + content.toString()) + Timber.d(reviewId.toString()) binding.btnReviewFix.setOnClickListener { val intent = Intent(this, ModifyReviewActivity::class.java) @@ -56,29 +62,23 @@ class MyReviewDialogActivity : AppCompatActivity() { binding.btnReviewDelete.setOnClickListener { AlertDialog.Builder(this).apply { - setTitle("리뷰 μ‚­μ œ") - setMessage("μž‘μ„±ν•œ 리뷰λ₯Ό μ‚­μ œν•˜μ‹œκ² μŠ΅λ‹ˆκΉŒ?") + setTitle(R.string.delete) + setMessage(R.string.delete_description) setNegativeButton("μ·¨μ†Œ") { _, _ -> - viewModel.handleErrorResponse("μ‚­μ œλ₯Ό μ·¨μ†Œν•˜μ˜€μŠ΅λ‹ˆλ‹€.") + showToast(App.appContext.getString(R.string.delete_undo)) } setPositiveButton("μ‚­μ œ") { _, _ -> - viewModel.postData(reviewId) + deleteViewModel.deleteReview(reviewId) + lifecycleScope.launch { + deleteViewModel.uiState.collectLatest { + if (it.isDeleted) { + finish() + } + } + } } }.create().show() - observeViewModel() - } - } - - private fun observeViewModel() { - viewModel.toastMessage.observe(this, Observer { result -> - Toast.makeText(this@MyReviewDialogActivity, result, Toast.LENGTH_SHORT).show() - }) - - viewModel.isDone.observe(this) { isDone -> - if(isDone) { - finish() - } } } } \ No newline at end of file diff --git a/app/src/main/java/com/eatssu/android/ui/review/list/ReviewActivity.kt b/app/src/main/java/com/eatssu/android/presentation/review/list/ReviewActivity.kt similarity index 55% rename from app/src/main/java/com/eatssu/android/ui/review/list/ReviewActivity.kt rename to app/src/main/java/com/eatssu/android/presentation/review/list/ReviewActivity.kt index 06b0f04e1..feb396e7b 100644 --- a/app/src/main/java/com/eatssu/android/ui/review/list/ReviewActivity.kt +++ b/app/src/main/java/com/eatssu/android/presentation/review/list/ReviewActivity.kt @@ -1,39 +1,29 @@ -package com.eatssu.android.ui.review.list +package com.eatssu.android.presentation.review.list -import android.app.AlertDialog import android.content.Intent import android.os.Bundle -import android.util.Log import android.view.View -import android.widget.Toast -import androidx.lifecycle.ViewModelProvider +import androidx.activity.viewModels import androidx.lifecycle.lifecycleScope import androidx.recyclerview.widget.LinearLayoutManager -import com.eatssu.android.base.BaseActivity import com.eatssu.android.data.enums.MenuType -import com.eatssu.android.data.repository.ReviewRepository -import com.eatssu.android.data.service.ReviewService import com.eatssu.android.databinding.ActivityReviewBinding -import com.eatssu.android.ui.review.delete.DeleteViewModel -import com.eatssu.android.ui.review.write.ReviewWriteRateActivity -import com.eatssu.android.ui.review.write.menu.ReviewWriteMenuActivity -import com.eatssu.android.util.RetrofitImpl.retrofit +import com.eatssu.android.presentation.base.BaseActivity +import com.eatssu.android.presentation.review.delete.DeleteViewModel +import com.eatssu.android.presentation.review.write.ReviewWriteRateActivity +import com.eatssu.android.presentation.review.write.menu.ReviewWriteMenuActivity import dagger.hilt.android.AndroidEntryPoint import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.launch +import timber.log.Timber import kotlin.properties.Delegates @AndroidEntryPoint class ReviewActivity : BaseActivity(ActivityReviewBinding::inflate) { -// private val viewModel: ReviewViewModel by viewModels() - - private lateinit var reviewViewModel: ReviewViewModel - private lateinit var deleteViewModel: DeleteViewModel - - private lateinit var reviewService: ReviewService - private lateinit var reviewRepository: ReviewRepository + private val deleteViewModel: DeleteViewModel by viewModels() + private val reviewViewModel: ReviewViewModel by viewModels() private lateinit var menuType: String private var itemId by Delegates.notNull() @@ -46,50 +36,19 @@ class ReviewActivity : super.onCreate(savedInstanceState) toolbarTitle.text = "리뷰" // νˆ΄λ°” 제λͺ© μ„€μ • - initViewModel() getIndex() lodeData() bindData() setClickListener() - } - private fun initViewModel() { - reviewService = retrofit.create(ReviewService::class.java) -// binding = DataBindingUtil.setContentView(this, R.layout.activity_main) - - reviewRepository = ReviewRepository(reviewService) - reviewViewModel = - ViewModelProvider( - this, - ReviewViewModelFactory( - reviewService, -// reviewRepository - ) - )[ReviewViewModel::class.java] - - binding.viewModel = reviewViewModel - - deleteViewModel = ViewModelProvider(this).get(DeleteViewModel::class.java) - - } - - private fun lodeData() { - when (menuType) { - "FIXED" -> { - reviewViewModel.loadReviewList(MenuType.FIXED, 0, itemId) - reviewViewModel.loadMenuReviewInfo(itemId) - } + override fun onResume() { + super.onResume() - "VARIABLE" -> { - reviewViewModel.loadReviewList(MenuType.VARIABLE, itemId, 0) - reviewViewModel.loadMealReviewInfo(itemId) - } - else -> { - Log.d("ReviewActivity", "잘λͺ»λœ 식당 μ •λ³΄μž…λ‹ˆλ‹€.") - } - } + //todo 이거 μ•ˆν•˜λ©΄ λ°”λ‘œλ°”λ‘œ 갱신이 μ•ˆλ˜λŠ”λ”” + lodeData() + bindData() } @@ -99,59 +58,42 @@ class ReviewActivity : itemId = intent.getLongExtra("itemId", 0) itemName = intent.getStringExtra("itemName").toString().replace(Regex("[\\[\\]]"), "") - Log.d("ReviewActivity", "λ©”λ‰΄λŠ” ${itemName}") - Log.d("ReviewActivity", "λ©”λ‰΄λŠ” ${menuType} ${itemId}") + Timber.d("λ©”λ‰΄λŠ” $itemName $menuType $itemId") } - private fun setClickListener() { - when (menuType) { - "FIXED" -> { - binding.btnNextReview.setOnClickListener { - val intent = Intent(this, ReviewWriteRateActivity::class.java) // μΈν…νŠΈλ₯Ό μƒμ„±ν•΄μ€Œ, - intent.putExtra("itemId", itemId) - intent.putExtra("itemName", itemName) - intent.putExtra("menuType", menuType) - startActivity(intent) - } - } - - "VARIABLE" -> { - binding.btnNextReview.setOnClickListener { - val intent = Intent(this, ReviewWriteMenuActivity::class.java) // μΈν…νŠΈλ₯Ό μƒμ„±ν•΄μ€Œ, - intent.putExtra("itemId", itemId) - intent.putExtra("menuType", menuType) - startActivity(intent) - } - } + private fun lodeData() { + //Todo μ—¬κΈ°μ„œλŠ” 메뉴 νƒ€μž…μ΄ λ­”μ§€ λͺ°λΌλ„ 됨. 좔상화 해도 됨 - else -> { - Log.d("ReviewActivity", "잘λͺ»λœ 식당 μ •λ³΄μž…λ‹ˆλ‹€.") - } - } + reviewViewModel.loadReview(menuType, itemId) } + + private fun bindData() { lifecycleScope.launch { reviewViewModel.uiState.collectLatest { if (!it.error && !it.loading) { if (it.isEmpty) { - //리뷰 없어도 메뉴λͺ…은 있음 + Timber.d("리뷰가 μ—†μŒ") + binding.llNonReview.visibility = View.VISIBLE + binding.rvReview.visibility = View.INVISIBLE + it.reviewInfo?.apply { binding.tvMenu.text = name.replace(Regex("[\\[\\]]"), "") } - Log.d("ReviewActivity", "리뷰가 μ—†μŒ") - binding.llNonReview.visibility = View.VISIBLE - binding.rvReview.visibility = View.INVISIBLE - } else { //리뷰 μžˆλ‹€. - - Log.d("ReviewActivity", "리뷰가 있음") + Timber.d("리뷰가 있음") binding.llNonReview.visibility = View.INVISIBLE binding.rvReview.visibility = View.VISIBLE + reviewAdapter = it.reviewList?.let { review -> - ReviewAdapter(review) { reviewId -> delete(reviewId) } + ReviewAdapter(review) { reviewId -> + deleteViewModel.deleteReview( + reviewId + ) + } } binding.rvReview.apply { @@ -160,17 +102,14 @@ class ReviewActivity : setHasFixedSize(true) } - it.reviewInfo?.apply { - binding.tvMenu.text = name.replace(Regex("[\\[\\]]"), "") - Log.d("ReviewActivity", it.reviewInfo.toString()) + Timber.d(it.reviewInfo.toString()) + binding.tvMenu.text = name.replace(Regex("[\\[\\]]"), "") binding.tvReviewNumCount.text = reviewCnt.toString() - binding.tvRate.text = String.format("%.1f", mainRating) - val totalReviewCount = reviewCnt binding.progressBar1.max = totalReviewCount binding.progressBar2.max = totalReviewCount @@ -190,41 +129,30 @@ class ReviewActivity : } } - fun delete(reviewId: Long) { - - AlertDialog.Builder(this).apply { - setTitle("리뷰 μ‚­μ œ") - setMessage("μž‘μ„±ν•œ 리뷰λ₯Ό μ‚­μ œν•˜μ‹œκ² μŠ΅λ‹ˆκΉŒ?") - setNegativeButton("μ·¨μ†Œ") { _, _ -> - deleteViewModel.handleErrorResponse("μ‚­μ œλ₯Ό μ·¨μ†Œν•˜μ˜€μŠ΅λ‹ˆλ‹€.") - } - setPositiveButton("μ‚­μ œ") { _, _ -> - deleteViewModel.postData(reviewId) + private fun setClickListener() { + when (menuType) { + MenuType.FIXED.name -> { + binding.btnNextReview.setOnClickListener { + val intent = Intent(this, ReviewWriteRateActivity::class.java) + intent.putExtra("itemId", itemId) + intent.putExtra("itemName", itemName) + intent.putExtra("menuType", menuType) + startActivity(intent) + } } - }.create().show() - observeViewModel() - //TODO μ‚­μ œν•˜κ³  리뷰리슀트 λ‹€μ‹œ 뢈러였기 - - } + MenuType.VARIABLE.name -> { + binding.btnNextReview.setOnClickListener { + val intent = Intent(this, ReviewWriteMenuActivity::class.java) + intent.putExtra("itemId", itemId) + intent.putExtra("menuType", menuType) + startActivity(intent) + } + } - private fun observeViewModel() { - deleteViewModel.toastMessage.observe(this) { result -> - Toast.makeText(this, result, Toast.LENGTH_SHORT).show() + else -> { + Timber.d("잘λͺ»λœ 식당 μ •λ³΄μž…λ‹ˆλ‹€.") + } } } - - override fun onRestart() { - super.onRestart() - - lodeData() - bindData() - } - - override fun onResume() { - super.onResume() - - lodeData() - bindData() - } } diff --git a/app/src/main/java/com/eatssu/android/ui/review/list/ReviewAdapter.kt b/app/src/main/java/com/eatssu/android/presentation/review/list/ReviewAdapter.kt similarity index 95% rename from app/src/main/java/com/eatssu/android/ui/review/list/ReviewAdapter.kt rename to app/src/main/java/com/eatssu/android/presentation/review/list/ReviewAdapter.kt index 09548ac78..112b122b9 100644 --- a/app/src/main/java/com/eatssu/android/ui/review/list/ReviewAdapter.kt +++ b/app/src/main/java/com/eatssu/android/presentation/review/list/ReviewAdapter.kt @@ -1,4 +1,4 @@ -package com.eatssu.android.ui.review.list +package com.eatssu.android.presentation.review.list import android.content.Context import android.content.Intent @@ -13,10 +13,10 @@ import androidx.core.content.ContextCompat import androidx.recyclerview.widget.RecyclerView import com.bumptech.glide.Glide import com.eatssu.android.R -import com.eatssu.android.data.model.Review import com.eatssu.android.databinding.ItemReviewBinding -import com.eatssu.android.ui.review.modify.ModifyReviewActivity -import com.eatssu.android.ui.review.report.ReportActivity +import com.eatssu.android.domain.model.Review +import com.eatssu.android.presentation.review.modify.ModifyReviewActivity +import com.eatssu.android.presentation.review.report.ReportActivity class ReviewAdapter( diff --git a/app/src/main/java/com/eatssu/android/presentation/review/list/ReviewViewModel.kt b/app/src/main/java/com/eatssu/android/presentation/review/list/ReviewViewModel.kt new file mode 100644 index 000000000..b49b83bf2 --- /dev/null +++ b/app/src/main/java/com/eatssu/android/presentation/review/list/ReviewViewModel.kt @@ -0,0 +1,237 @@ +package com.eatssu.android.presentation.review.list + +import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import com.eatssu.android.data.dto.response.asReviewInfo +import com.eatssu.android.data.dto.response.toReviewList +import com.eatssu.android.data.enums.MenuType +import com.eatssu.android.domain.model.Review +import com.eatssu.android.domain.model.ReviewInfo +import com.eatssu.android.domain.usecase.review.GetMealReviewInfoUseCase +import com.eatssu.android.domain.usecase.review.GetMealReviewListUseCase +import com.eatssu.android.domain.usecase.review.GetMenuReviewInfoUseCase +import com.eatssu.android.domain.usecase.review.GetMenuReviewListUseCase +import dagger.hilt.android.lifecycle.HiltViewModel +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.StateFlow +import kotlinx.coroutines.flow.asStateFlow +import kotlinx.coroutines.flow.catch +import kotlinx.coroutines.flow.collectLatest +import kotlinx.coroutines.flow.onCompletion +import kotlinx.coroutines.flow.onStart +import kotlinx.coroutines.flow.update +import kotlinx.coroutines.launch +import timber.log.Timber +import javax.inject.Inject + + +@HiltViewModel +class ReviewViewModel @Inject constructor( + private val getMenuReviewInfoUseCase: GetMenuReviewInfoUseCase, + private val getMenuReviewListUseCase: GetMenuReviewListUseCase, + private val getMealReviewInfoUseCase: GetMealReviewInfoUseCase, + private val getMealReviewListUseCase: GetMealReviewListUseCase, +) : ViewModel() { + + private val _uiState: MutableStateFlow = MutableStateFlow(ReviewState()) + val uiState: StateFlow = _uiState.asStateFlow() + + fun loadReview( + menuType: String, + itemId: Long, + ) { + when (menuType) { + MenuType.FIXED.name -> { + callMenuReviewInfo(itemId) + callMenuReviewList(itemId) + } + + MenuType.VARIABLE.name -> { + callMealReviewInfo(itemId) + callMealReviewList(itemId) + } + + else -> { + Timber.d("잘λͺ»λœ 식당 μ •λ³΄μž…λ‹ˆλ‹€.") + + } + } + + } + + private fun callMenuReviewInfo(menuId: Long) { + viewModelScope.launch { + getMenuReviewInfoUseCase(menuId).onStart { + _uiState.update { it.copy(loading = true) } + }.onCompletion { + _uiState.update { it.copy(loading = false, error = true) } + }.catch { e -> + _uiState.update { + it.copy( + loading = false, + error = false, + ) + } + Timber.d(e.toString()) + }.collectLatest { result -> + result.result?.apply { + if (mainRating == null) { + _uiState.update { + it.copy( + loading = false, + error = false, + reviewInfo = asReviewInfo(), + isEmpty = true + ) + } + } else { + _uiState.update { + it.copy( + loading = false, + error = false, + reviewInfo = asReviewInfo(), + isEmpty = false + ) + } + Timber.d("리뷰 μžˆλ‹€") + } + } + } + } + } + + private fun callMealReviewInfo( + mealId: Long, + ) { + viewModelScope.launch { + getMealReviewInfoUseCase(mealId).onStart { + _uiState.update { it.copy(loading = true) } + }.onCompletion { + _uiState.update { it.copy(loading = false, error = true) } + }.catch { e -> + _uiState.update { + it.copy( + loading = false, + error = false, + ) + } + Timber.e(e.toString()) + }.collectLatest { result -> + result.result?.apply { + if (mainRating == null) { + _uiState.update { + it.copy( + loading = false, + error = false, + reviewInfo = asReviewInfo(), + isEmpty = true + ) + } + } else { + _uiState.update { + it.copy( + loading = false, + error = false, + reviewInfo = asReviewInfo(), + isEmpty = false + ) + } + Timber.d("리뷰 μžˆλ‹€") + } + } + } + } + } + + private fun callMenuReviewList( + itemId: Long, + ) { + viewModelScope.launch { + getMenuReviewListUseCase(itemId).onStart { + _uiState.update { it.copy(loading = true) } + }.onCompletion { + _uiState.update { it.copy(loading = false, error = true) } + }.catch { e -> + _uiState.update { + it.copy( + loading = false, + error = true, + ) + } + Timber.e(e.toString()) + }.collectLatest { result -> + result.result?.apply { + if (numberOfElements == 0) { //리뷰 μ—†μŒ + _uiState.update { + it.copy( + loading = false, + error = false, + isEmpty = true + ) + } + } else { //리뷰 있음 + _uiState.update { + it.copy( + loading = false, + error = false, + reviewList = this.toReviewList(), + isEmpty = false + ) + } + } + } + } + } + } + + private fun callMealReviewList( + itemId: Long, + ) { + viewModelScope.launch { + getMealReviewListUseCase(itemId).onStart { + _uiState.update { it.copy(loading = true) } + }.onCompletion { + _uiState.update { it.copy(loading = false, error = true) } + }.catch { e -> + _uiState.update { + it.copy( + loading = false, + error = false, + ) + } + Timber.e(e.toString()) + }.collectLatest { result -> + result.result?.apply { + if (numberOfElements == 0) { //리뷰 μ—†μŒ + _uiState.update { + it.copy( + loading = false, + error = false, + isEmpty = true + ) + } + } else { //리뷰 있음 + _uiState.update { + it.copy( + loading = false, + error = false, + reviewList = this.toReviewList(), + isEmpty = false + ) + } + } + } + } + } + } +} + +data class ReviewState( + var loading: Boolean = true, + var error: Boolean = false, + + var isEmpty: Boolean = true, //리뷰 μ—†λ‹€~ + + var reviewInfo: ReviewInfo? = null, + var reviewList: List? = null, +) \ No newline at end of file diff --git a/app/src/main/java/com/eatssu/android/ui/review/modify/ModifyReviewActivity.kt b/app/src/main/java/com/eatssu/android/presentation/review/modify/ModifyReviewActivity.kt similarity index 69% rename from app/src/main/java/com/eatssu/android/ui/review/modify/ModifyReviewActivity.kt rename to app/src/main/java/com/eatssu/android/presentation/review/modify/ModifyReviewActivity.kt index 104edc80c..127214d8c 100644 --- a/app/src/main/java/com/eatssu/android/ui/review/modify/ModifyReviewActivity.kt +++ b/app/src/main/java/com/eatssu/android/presentation/review/modify/ModifyReviewActivity.kt @@ -1,18 +1,21 @@ -package com.eatssu.android.ui.review.modify +package com.eatssu.android.presentation.review.modify import android.os.Bundle -import android.util.Log -import androidx.lifecycle.ViewModelProvider +import androidx.activity.viewModels import androidx.lifecycle.lifecycleScope -import com.eatssu.android.base.BaseActivity +import com.eatssu.android.data.dto.request.ModifyReviewRequest import com.eatssu.android.databinding.ActivityFixMenuBinding -import com.eatssu.android.util.extension.showToast +import com.eatssu.android.presentation.base.BaseActivity +import com.eatssu.android.presentation.util.showToast +import dagger.hilt.android.AndroidEntryPoint import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.launch +import timber.log.Timber +@AndroidEntryPoint class ModifyReviewActivity : BaseActivity(ActivityFixMenuBinding::inflate) { - private lateinit var viewModel: ModifyViewModel + private val modifyViewModel: ModifyViewModel by viewModels() private var reviewId = -1L private var menu = "" @@ -22,11 +25,11 @@ class ModifyReviewActivity : BaseActivity(ActivityFixMen private var main = 0 private var amount = 0 private var taste = 0 + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) toolbarTitle.text = "리뷰 μˆ˜μ •ν•˜κΈ°" // νˆ΄λ°” 제λͺ© μ„€μ • - initViewModel() getIndex() setData() setOnClickListener() @@ -39,10 +42,6 @@ class ModifyReviewActivity : BaseActivity(ActivityFixMen } } - private fun initViewModel() { - viewModel = ViewModelProvider(this)[ModifyViewModel::class.java] - - } private fun getIndex() { @@ -54,8 +53,8 @@ class ModifyReviewActivity : BaseActivity(ActivityFixMen amount = intent.getIntExtra("amountGrade", 0) taste = intent.getIntExtra("tasteGrade", 0) - Log.d("ReviewFixedActivity", reviewId.toString() + menu) - Log.d("ReviewFixedActivity", content) + Timber.tag("ReviewFixedActivity") + .d("reviewID: %s, menu: %s, content: %s", reviewId.toString(), menu, content) } private fun setData() { @@ -72,23 +71,27 @@ class ModifyReviewActivity : BaseActivity(ActivityFixMen val amountGrade = binding.rbAmount.rating.toInt() val tasteGrade = binding.rbTaste.rating.toInt() - viewModel.modifyMyReview(reviewId, comment, mainGrade, amountGrade, tasteGrade) + modifyViewModel.modifyMyReview( + reviewId, + ModifyReviewRequest(mainGrade, amountGrade, tasteGrade, comment) + ) } private fun observeViewModel() { lifecycleScope.launch { - viewModel.uiState.collectLatest { - if (!it.error && !it.loading) { - if (it.isDone) { - showToast(it.toastMessage) - finish() - } + modifyViewModel.uiState.collectLatest { + if (it.isDone) { + showToast(it.toastMessage) + finish() } + if (it.error) { showToast(it.toastMessage) } } } } + + //Todo μ“°λ‹€ λ’€λ‘œ 갔을 λ•Œ undo } \ No newline at end of file diff --git a/app/src/main/java/com/eatssu/android/presentation/review/modify/ModifyViewModel.kt b/app/src/main/java/com/eatssu/android/presentation/review/modify/ModifyViewModel.kt new file mode 100644 index 000000000..3861fafa8 --- /dev/null +++ b/app/src/main/java/com/eatssu/android/presentation/review/modify/ModifyViewModel.kt @@ -0,0 +1,71 @@ +package com.eatssu.android.presentation.review.modify + +import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import com.eatssu.android.App +import com.eatssu.android.R +import com.eatssu.android.data.dto.request.ModifyReviewRequest +import com.eatssu.android.domain.usecase.review.ModifyReviewUseCase +import dagger.hilt.android.lifecycle.HiltViewModel +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.StateFlow +import kotlinx.coroutines.flow.asStateFlow +import kotlinx.coroutines.flow.catch +import kotlinx.coroutines.flow.collectLatest +import kotlinx.coroutines.flow.onCompletion +import kotlinx.coroutines.flow.onStart +import kotlinx.coroutines.flow.update +import kotlinx.coroutines.launch +import timber.log.Timber +import javax.inject.Inject + +@HiltViewModel +class ModifyViewModel @Inject constructor( + private val modifyReviewUseCase: ModifyReviewUseCase, +) : ViewModel() { + + private val _uiState: MutableStateFlow = MutableStateFlow(ModifyState()) + val uiState: StateFlow = _uiState.asStateFlow() + + fun modifyMyReview( + reviewId: Long, + body: ModifyReviewRequest, + ) { + viewModelScope.launch { + modifyReviewUseCase(reviewId, body).onStart { + _uiState.update { it.copy(loading = true) } + }.onCompletion { + _uiState.update { it.copy(loading = false, error = true) } + }.catch { e -> + _uiState.update { + it.copy( + loading = false, + error = false, + isDone = true, + toastMessage = App.appContext.getString(R.string.modify_not) + ) + } + Timber.e(e.toString()) + }.collectLatest { result -> + Timber.d(result.toString()) + _uiState.update { + it.copy( + loading = false, + error = false, + isDone = true, + toastMessage = App.appContext.getString(R.string.modify_done) + ) + } + } + } + } +} + +data class ModifyState( + var loading: Boolean = true, + var error: Boolean = false, + var toastMessage: String = "", + + var isDone: Boolean = false, + + ) \ No newline at end of file diff --git a/app/src/main/java/com/eatssu/android/ui/review/report/OthersReviewDialogActivity.kt b/app/src/main/java/com/eatssu/android/presentation/review/report/OthersReviewDialogActivity.kt similarity index 88% rename from app/src/main/java/com/eatssu/android/ui/review/report/OthersReviewDialogActivity.kt rename to app/src/main/java/com/eatssu/android/presentation/review/report/OthersReviewDialogActivity.kt index a9e15406b..88b4609f0 100644 --- a/app/src/main/java/com/eatssu/android/ui/review/report/OthersReviewDialogActivity.kt +++ b/app/src/main/java/com/eatssu/android/presentation/review/report/OthersReviewDialogActivity.kt @@ -1,10 +1,10 @@ -package com.eatssu.android.ui.review.report +package com.eatssu.android.presentation.review.report import android.content.Intent import android.os.Bundle -import android.util.Log import androidx.appcompat.app.AppCompatActivity import com.eatssu.android.databinding.ActivityOthersReviewDialogBinding +import timber.log.Timber class OthersReviewDialogActivity : AppCompatActivity() { @@ -29,7 +29,7 @@ class OthersReviewDialogActivity : AppCompatActivity() { intent.putExtra( "reviewId", reviewId ) - Log.d("dialogid", reviewId.toString()) + Timber.d("reviewId $reviewId") startActivity(intent) finish() } diff --git a/app/src/main/java/com/eatssu/android/ui/review/report/ReportActivity.kt b/app/src/main/java/com/eatssu/android/presentation/review/report/ReportActivity.kt similarity index 94% rename from app/src/main/java/com/eatssu/android/ui/review/report/ReportActivity.kt rename to app/src/main/java/com/eatssu/android/presentation/review/report/ReportActivity.kt index 94b278cdf..27f4e30d1 100644 --- a/app/src/main/java/com/eatssu/android/ui/review/report/ReportActivity.kt +++ b/app/src/main/java/com/eatssu/android/presentation/review/report/ReportActivity.kt @@ -1,14 +1,14 @@ -package com.eatssu.android.ui.review.report +package com.eatssu.android.presentation.review.report import android.os.Bundle import android.text.Editable import android.text.TextWatcher import androidx.activity.viewModels import androidx.lifecycle.lifecycleScope -import com.eatssu.android.base.BaseActivity import com.eatssu.android.data.enums.ReportType import com.eatssu.android.databinding.ActivityReportBinding -import com.eatssu.android.util.extension.showToast +import com.eatssu.android.presentation.base.BaseActivity +import com.eatssu.android.presentation.util.showToast import dagger.hilt.android.AndroidEntryPoint import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.launch diff --git a/app/src/main/java/com/eatssu/android/ui/review/report/ReportViewModel.kt b/app/src/main/java/com/eatssu/android/presentation/review/report/ReportViewModel.kt similarity index 89% rename from app/src/main/java/com/eatssu/android/ui/review/report/ReportViewModel.kt rename to app/src/main/java/com/eatssu/android/presentation/review/report/ReportViewModel.kt index 870395b1a..1e98e91e8 100644 --- a/app/src/main/java/com/eatssu/android/ui/review/report/ReportViewModel.kt +++ b/app/src/main/java/com/eatssu/android/presentation/review/report/ReportViewModel.kt @@ -1,11 +1,11 @@ -package com.eatssu.android.ui.review.report +package com.eatssu.android.presentation.review.report import android.util.Log import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import com.eatssu.android.data.dto.request.ReportRequest -import com.eatssu.android.data.usecase.PostReportUseCase -import com.eatssu.android.ui.mypage.usernamechange.UserNameChangeViewModel.Companion.TAG +import com.eatssu.android.domain.usecase.review.PostReportUseCase +import com.eatssu.android.presentation.mypage.usernamechange.UserNameChangeViewModel.Companion.TAG import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow diff --git a/app/src/main/java/com/eatssu/android/presentation/review/write/ImageViewModel.kt b/app/src/main/java/com/eatssu/android/presentation/review/write/ImageViewModel.kt new file mode 100644 index 000000000..c485934c3 --- /dev/null +++ b/app/src/main/java/com/eatssu/android/presentation/review/write/ImageViewModel.kt @@ -0,0 +1,95 @@ +package com.eatssu.android.presentation.review.write + +import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import com.eatssu.android.domain.usecase.review.GetImageUrlUseCase +import dagger.hilt.android.lifecycle.HiltViewModel +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.StateFlow +import kotlinx.coroutines.flow.asStateFlow +import kotlinx.coroutines.flow.catch +import kotlinx.coroutines.flow.collectLatest +import kotlinx.coroutines.flow.onCompletion +import kotlinx.coroutines.flow.onStart +import kotlinx.coroutines.flow.update +import kotlinx.coroutines.launch +import okhttp3.MediaType.Companion.toMediaTypeOrNull +import okhttp3.MultipartBody +import okhttp3.RequestBody.Companion.asRequestBody +import timber.log.Timber +import java.io.File +import javax.inject.Inject + +@HiltViewModel +class ImageViewModel +@Inject constructor( + private val getImageUrlUseCase: GetImageUrlUseCase, +) : ViewModel() { + + private val _imageUrl: MutableStateFlow = MutableStateFlow("") + val imageUrl: StateFlow get() = _imageUrl + + private var _imageFile: MutableStateFlow = MutableStateFlow(null) + val imageFile: StateFlow get() = _imageFile + + private val _uiState: MutableStateFlow = MutableStateFlow(ImageState()) + val uiState: StateFlow = _uiState.asStateFlow() + + + fun setImageFile(imageFile: File) { + _imageFile.value = imageFile + } + + fun deleteFile() { + _imageFile.value?.delete() + _imageUrl.value = "" + } + + + fun saveS3() { + if (imageFile.value?.exists() == true) { + val requestFile = imageFile.value?.asRequestBody("image/*".toMediaTypeOrNull()) + val multipart = requestFile?.let { + MultipartBody.Part.createFormData( + "image", + imageFile.value?.name, + it + ) + } + viewModelScope.launch { + if (multipart != null) { + getImageUrlUseCase(multipart).onStart { + _uiState.update { it.copy(loading = true) } + }.onCompletion { + _uiState.update { it.copy(loading = false, error = true) } + }.catch { e -> + _uiState.update { it.copy(error = true, toastMessage = "이미지 λ³€ν™˜μ— μ‹€νŒ¨ν•˜μ˜€μŠ΅λ‹ˆλ‹€.") } + Timber.e(e.toString()) + }.collectLatest { result -> + Timber.d(result.toString()) + result.result?.apply { + _uiState.update { + it.copy( + loading = false, + error = false, + isImageUploadDone = true, + imgUrl = url.toString() + ) + } + } + } + } + } + } + } +} + + +data class ImageState( + var loading: Boolean = true, + var error: Boolean = false, + var toastMessage: String = "", + + var imgUrl: String = "", + var isImageUploadDone: Boolean = false, +) \ No newline at end of file diff --git a/app/src/main/java/com/eatssu/android/ui/review/write/ReviewWriteRateActivity.kt b/app/src/main/java/com/eatssu/android/presentation/review/write/ReviewWriteRateActivity.kt similarity index 74% rename from app/src/main/java/com/eatssu/android/ui/review/write/ReviewWriteRateActivity.kt rename to app/src/main/java/com/eatssu/android/presentation/review/write/ReviewWriteRateActivity.kt index ef5899cf3..e310528f7 100644 --- a/app/src/main/java/com/eatssu/android/ui/review/write/ReviewWriteRateActivity.kt +++ b/app/src/main/java/com/eatssu/android/presentation/review/write/ReviewWriteRateActivity.kt @@ -1,4 +1,4 @@ -package com.eatssu.android.ui.review.write +package com.eatssu.android.presentation.review.write import android.Manifest import android.content.Intent @@ -9,57 +9,49 @@ import android.os.Bundle import android.provider.MediaStore import android.text.Editable import android.text.TextWatcher -import android.util.Log import android.view.View import android.widget.Toast import androidx.activity.result.contract.ActivityResultContracts +import androidx.activity.viewModels import androidx.core.app.ActivityCompat import androidx.core.content.ContextCompat -import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.lifecycleScope import com.bumptech.glide.Glide import com.bumptech.glide.request.RequestOptions -import com.eatssu.android.base.BaseActivity -import com.eatssu.android.data.service.ImageService -import com.eatssu.android.data.service.ReviewService import com.eatssu.android.databinding.ActivityReviewWriteRateBinding -import com.eatssu.android.util.RetrofitImpl.mRetrofit -import com.eatssu.android.util.RetrofitImpl.retrofit -import com.eatssu.android.util.extension.showToast +import com.eatssu.android.presentation.base.BaseActivity +import com.eatssu.android.presentation.util.showToast +import dagger.hilt.android.AndroidEntryPoint import id.zelory.compressor.Compressor import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.launch +import timber.log.Timber import java.io.File import java.text.DecimalFormat import kotlin.math.log10 import kotlin.math.pow +@AndroidEntryPoint class ReviewWriteRateActivity : BaseActivity(ActivityReviewWriteRateBinding::inflate) { - private lateinit var uploadReviewViewModel: UploadReviewViewModel - private lateinit var imageviewModel: ImageViewModel - - private lateinit var reviewService: ReviewService - private lateinit var imageService: ImageService - - private val PERMISSION_REQUEST_CODE = 1 + private val viewModel: UploadReviewViewModel by viewModels() + private val imageviewModel: ImageViewModel by viewModels() private var itemId: Long = 0 private lateinit var itemName: String private var comment: String? = "" - private var imageFile: File? = null private var compressedImage: File? = null - override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) toolbarTitle.text = "리뷰 남기기" // νˆ΄λ°” 제λͺ© μ„€μ • + binding.viewModel = viewModel itemName = intent.getStringExtra("itemName").toString() - Log.d("post", "고정메뉴${itemName}") + Timber.d("고정메뉴 $itemName") itemId = intent.getLongExtra("itemId", -1) @@ -73,49 +65,31 @@ class ReviewWriteRateActivity : setupTextReviewInput() setOnClickListener() - - - imageService = mRetrofit.create(ImageService::class.java) - reviewService = retrofit.create(ReviewService::class.java) - - - uploadReviewViewModel = ViewModelProvider( - this, - ReviewWriteViewModelFactory(reviewService) - )[UploadReviewViewModel::class.java] - imageviewModel = - ViewModelProvider(this, ImageViewModelFactory(imageService))[ImageViewModel::class.java] - - binding.viewModel = uploadReviewViewModel - } fun setOnClickListener() { // 이미지 μΆ”κ°€ λ²„νŠΌ 클릭 λ¦¬μŠ€λ„ˆ μ„€μ • binding.ibAddPic.setOnClickListener { - Log.d("ReviewWriteRateActivity", "클릭") + Timber.d("클릭") checkPermission() } binding.btnNextReview2.setOnClickListener { if (binding.rbMain.rating.toInt() == 0 || binding.rbAmount.rating.toInt() == 0 || binding.rbTaste.rating.toInt() == 0) { - Toast.makeText(this, "별점을 λ“±λ‘ν•΄μ£Όμ„Έμš”", Toast.LENGTH_SHORT).show() - return@setOnClickListener + showToast("별점을 λ“±λ‘ν•΄μ£Όμ„Έμš”") } if ((comment?.trim()?.length ?: 0) < 3) { - Toast.makeText(this, "3자 이상 μž…λ ₯ν•΄μ£Όμ„Έμš”", Toast.LENGTH_SHORT).show() - return@setOnClickListener + showToast("3자 이상 μž…λ ₯ν•΄μ£Όμ„Έμš”") } - //파일 μ—…λ‘œλ“œκ°€ λλ‚¬κ±°λ‚˜, νŒŒμΌμ„ μ²¨λΆ€ν•˜μ§€ μ•Šκ±°λ‚˜ if (imageFile?.exists() == true) { showToast("리뷰 μ—…λ‘œλ“œ 쀑") compressImage() - Log.d("ImageViewMdoel", "s3 μ‹œμž‘") + Timber.d("s3 μ‹œμž‘") } else { postReview() @@ -133,7 +107,7 @@ class ReviewWriteRateActivity : lifecycleScope.launch { // Default compression compressedImage = Compressor.compress(this@ReviewWriteRateActivity, imageFile) - Log.d("ImageViewModel", "μ••μΆ• 됨+" + (compressedImage?.length()?.div(1024)).toString()) + Timber.d("μ••μΆ• 된 μ‚¬μ΄μ¦ˆ+" + (compressedImage?.length()?.div(1024)).toString()) setCompressedImage() } } ?: showError("Please choose an image!") @@ -144,17 +118,17 @@ class ReviewWriteRateActivity : } private fun setCompressedImage() { - compressedImage?.let { + compressedImage?.let { it -> imageviewModel.setImageFile(it) imageviewModel.saveS3() //이미지 url λ°˜ν™˜ api 호좜 lifecycleScope.launch { imageviewModel.uiState.collectLatest { - if (it.isDone) { + if (it.isImageUploadDone) { postReview() } } } - Log.d("Compressor", "Compressed image save in " + getReadableFileSize(it.length())) + Timber.d("Compressed image save in " + getReadableFileSize(it.length())) } } @@ -212,7 +186,7 @@ class ReviewWriteRateActivity : val result = cursor.getString(columnIndex) cursor.close() - Log.d("ReviewWriteRateActivity", result) + Timber.d("realPath: $result") return result } @@ -231,9 +205,9 @@ class ReviewWriteRateActivity : ActivityCompat.requestPermissions( this, arrayOf( Manifest.permission.READ_MEDIA_IMAGES, - ), REQ_GALLERY + ), PERMISSION_REQUEST_CODE ) - Log.d("ReviewWriteRateActivity", "κΆŒν•œ μ—†μŒ") + Timber.e("κΆŒν•œ μ—†μŒ") } else { openGallery() @@ -257,9 +231,9 @@ class ReviewWriteRateActivity : this, arrayOf( Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE - ), REQ_GALLERY + ), PERMISSION_REQUEST_CODE ) - Log.d("ReviewWriteRateActivity", "κΆŒν•œ μ—†μŒ") + Timber.e("κΆŒν•œ μ—†μŒ") } else { openGallery() @@ -280,11 +254,11 @@ class ReviewWriteRateActivity : } private fun requestStoragePermission() { - if (checkSelfPermission(android.Manifest.permission.WRITE_EXTERNAL_STORAGE) != + if (checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED ) { requestPermissions( - arrayOf(android.Manifest.permission.WRITE_EXTERNAL_STORAGE), + arrayOf(Manifest.permission.WRITE_EXTERNAL_STORAGE), PERMISSION_REQUEST_CODE ) } @@ -303,6 +277,7 @@ class ReviewWriteRateActivity : }) } + @Deprecated("This method has been deprecated in favor of using the\n {@link OnBackPressedDispatcher} via {@link #getOnBackPressedDispatcher()}.\n The OnBackPressedDispatcher controls how back button events are dispatched\n to one or more {@link OnBackPressedCallback} objects.") override fun onBackPressed() { super.onBackPressed() if (imageFile?.exists() == true) { @@ -316,9 +291,9 @@ class ReviewWriteRateActivity : private fun deleteImage() { - Log.d("ReviewWriteRateActivity", imageFile.toString()) + Timber.d("imageFile: " + imageFile.toString()) if (imageFile?.exists() == true) { - Toast.makeText(this, "이미지가 μ‚­μ œλ˜μ—ˆμŠ΅λ‹ˆλ‹€.", Toast.LENGTH_SHORT).show() + showToast("이미지가 μ‚­μ œλ˜μ—ˆμŠ΅λ‹ˆλ‹€.") binding.ivImage.setImageDrawable(null) imageFile!!.delete() //file을 λ‚ λ¦°λ‹€. compressedImage?.delete() //file을 λ‚ λ¦°λ‹€. @@ -329,14 +304,14 @@ class ReviewWriteRateActivity : imageviewModel.deleteFile() } else { - Toast.makeText(this, "이미지λ₯Ό μ‚­μ œν•  수 μ—†μŠ΅λ‹ˆλ‹€.", Toast.LENGTH_SHORT).show() + showToast("이미지λ₯Ό μ‚­μ œν•  수 μ—†μŠ΅λ‹ˆλ‹€.") } } private fun postReview() { //Todo imageurl을 μ²΄ν¬ν•΄μ•Όν•˜λŠ” 이유? - uploadReviewViewModel.setReviewData( + viewModel.setReviewData( itemId, binding.rbMain.rating.toInt(), binding.rbAmount.rating.toInt(), @@ -345,36 +320,29 @@ class ReviewWriteRateActivity : imageviewModel.imageUrl.value ?: "" ) - uploadReviewViewModel.postReview() - Log.d("ReviewWriteRateActivity", "리뷰 전솑") + viewModel.postReview() + Timber.d("리뷰 전솑") lifecycleScope.launch { - uploadReviewViewModel.uiState.collectLatest { + viewModel.uiState.collectLatest { if (it.error) { - showToast(uploadReviewViewModel.uiState.value.toastMessage) + showToast(viewModel.uiState.value.toastMessage) } if (!it.error && !it.loading && it.isUpload) { - showToast(uploadReviewViewModel.uiState.value.toastMessage) - Log.d("ReviewWriteRateActivity", "리뷰 μž‘μ„± 성곡") + showToast(viewModel.uiState.value.toastMessage) + Timber.d("리뷰 μž‘μ„± 성곡") finish() } } } - - } companion object { + const val REVIEW_MIN_LENGTH = 10 // 가러리 κΆŒν•œ μš”μ²­ - const val REQ_GALLERY = 1 - - // API ν˜ΈμΆœμ‹œ Parameter keyκ°’ - const val PARAM_KEY_IMAGE = "image" - const val PARAM_KEY_PRODUCT_ID = "product_id" - const val PARAM_KEY_REVIEW = "review_content" - const val PARAM_KEY_RATING = "rating" + const val PERMISSION_REQUEST_CODE = 1 } } \ No newline at end of file diff --git a/app/src/main/java/com/eatssu/android/presentation/review/write/ReviewWriteViewModel.kt b/app/src/main/java/com/eatssu/android/presentation/review/write/ReviewWriteViewModel.kt new file mode 100644 index 000000000..0438797e1 --- /dev/null +++ b/app/src/main/java/com/eatssu/android/presentation/review/write/ReviewWriteViewModel.kt @@ -0,0 +1,89 @@ +package com.eatssu.android.presentation.review.write + +import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import com.eatssu.android.data.dto.request.WriteReviewRequest +import com.eatssu.android.domain.usecase.review.WriteReviewUseCase +import dagger.hilt.android.lifecycle.HiltViewModel +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.StateFlow +import kotlinx.coroutines.flow.asStateFlow +import kotlinx.coroutines.flow.catch +import kotlinx.coroutines.flow.collectLatest +import kotlinx.coroutines.flow.onCompletion +import kotlinx.coroutines.flow.onStart +import kotlinx.coroutines.flow.update +import kotlinx.coroutines.launch +import timber.log.Timber +import javax.inject.Inject + + +@HiltViewModel +class UploadReviewViewModel @Inject constructor( + private val writeReviewUseCase: WriteReviewUseCase, +) : ViewModel() { + + private val _uiState: MutableStateFlow = + MutableStateFlow(UploadReviewState()) + val uiState: StateFlow = _uiState.asStateFlow() + + private val _reviewData: MutableStateFlow = + MutableStateFlow(WriteReviewRequest()) + val reviewData: StateFlow = _reviewData.asStateFlow() + + private val _menuId: MutableStateFlow = MutableStateFlow(-1) + val menuId: StateFlow = _menuId.asStateFlow() + + fun setReviewData( + menuId: Long, + mainRating: Int, + amountRating: Int, + tasteRating: Int, + comment: String, + imageUrl: String, + ) { + _menuId.value = menuId + _reviewData.value = + WriteReviewRequest(mainRating, amountRating, tasteRating, comment, imageUrl) + } + + + fun postReview() { + viewModelScope.launch { + writeReviewUseCase( + menuId.value, reviewData.value + ).onStart { + _uiState.update { it.copy(loading = true) } + }.onCompletion { + _uiState.update { it.copy(loading = false, error = true) } + }.catch { e -> + _uiState.update { + it.copy( + loading = false, + error = true, + toastMessage = "리뷰 μž‘μ„±μ— μ‹€νŒ¨ν•˜μ˜€μŠ΅λ‹ˆλ‹€.", + isUpload = false, + ) + } + Timber.d(e.toString()) + }.collectLatest { result -> + Timber.d(result.toString()) + _uiState.update { + it.copy( + loading = false, + error = false, + toastMessage = "리뷰가 μž‘μ„±λ˜μ—ˆμŠ΅λ‹ˆλ‹€.", + isUpload = true, + ) + } + } + } + } +} + +data class UploadReviewState( + var toastMessage: String = "", + var loading: Boolean = true, + var error: Boolean = false, + var isUpload: Boolean = false, +) \ No newline at end of file diff --git a/app/src/main/java/com/eatssu/android/ui/review/write/menu/ReviewWriteMenuActivity.kt b/app/src/main/java/com/eatssu/android/presentation/review/write/menu/ReviewWriteMenuActivity.kt similarity index 69% rename from app/src/main/java/com/eatssu/android/ui/review/write/menu/ReviewWriteMenuActivity.kt rename to app/src/main/java/com/eatssu/android/presentation/review/write/menu/ReviewWriteMenuActivity.kt index 74b50dac2..b6e305da3 100644 --- a/app/src/main/java/com/eatssu/android/ui/review/write/menu/ReviewWriteMenuActivity.kt +++ b/app/src/main/java/com/eatssu/android/presentation/review/write/menu/ReviewWriteMenuActivity.kt @@ -1,56 +1,53 @@ -package com.eatssu.android.ui.review.write.menu +package com.eatssu.android.presentation.review.write.menu import android.content.Intent import android.os.Build import android.os.Bundle -import android.util.Log +import androidx.activity.viewModels import androidx.annotation.RequiresApi -import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.lifecycleScope import androidx.recyclerview.widget.LinearLayoutManager -import com.eatssu.android.base.BaseActivity -import com.eatssu.android.data.service.MealService import com.eatssu.android.databinding.ActivityReviewWriteMenuBinding -import com.eatssu.android.ui.review.write.ReviewWriteRateActivity -import com.eatssu.android.util.RetrofitImpl.retrofit +import com.eatssu.android.presentation.base.BaseActivity +import com.eatssu.android.presentation.review.write.ReviewWriteRateActivity +import dagger.hilt.android.AndroidEntryPoint import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.launch +import timber.log.Timber +@AndroidEntryPoint class ReviewWriteMenuActivity : BaseActivity(ActivityReviewWriteMenuBinding::inflate) { + private val viewModel: VariableMenuViewModel by viewModels() + private var mealId: Long = -1 + private lateinit var variableMenuPickAdapter: VariableMenuPickAdapter - private lateinit var viewModel: VariableMenuViewModel - private lateinit var mealService: MealService @RequiresApi(Build.VERSION_CODES.O) override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) toolbarTitle.text = "리뷰 남기기" // νˆ΄λ°” 제λͺ© μ„€μ • - val mealId = intent.getLongExtra("itemId", -1) - - initViewModel() - bindData(mealId) + getIndex() + lodeData() + bindData() setClickListener() } - - private fun initViewModel() { - mealService = retrofit.create(MealService::class.java) - viewModel = ViewModelProvider( - this, - VariableMenuModelFactory(mealService) - )[VariableMenuViewModel::class.java] + fun getIndex() { + mealId = intent.getLongExtra("itemId", -1) } - private fun bindData(mealId: Long) { + fun lodeData() { viewModel.findMenuItemByMealId(mealId) + } + private fun bindData() { lifecycleScope.launch { viewModel.uiState.collectLatest { if (!it.error && !it.loading) { - Log.d("ReviewWriteMenuActivity", "!!!받은" + it.menuOfMeal.toString()) + Timber.d("받은" + it.menuOfMeal.toString()) variableMenuPickAdapter = VariableMenuPickAdapter(it.menuOfMeal!!) binding.rvMenuPicker.apply { @@ -58,6 +55,8 @@ class ReviewWriteMenuActivity : layoutManager = LinearLayoutManager(this@ReviewWriteMenuActivity) setHasFixedSize(true) } + // 데이터 바인딩이 μ™„λ£Œλœ ν›„ 클릭 λ¦¬μŠ€λ„ˆ μ„€μ • +// setClickListener() } } } @@ -71,7 +70,7 @@ class ReviewWriteMenuActivity : private fun sendNextItem(items: ArrayList>) { for (i in 0 until items.size) { - Log.d("sendNextItem", items.size.toString()) + Timber.d("sendNextItem: " + items.size.toString()) // ν˜„μž¬ μ•„μ΄ν…œμ„ κ°€μ Έμ˜΄ val currentItem = items[i] diff --git a/app/src/main/java/com/eatssu/android/ui/review/write/menu/VariableMenuPickAdapter.kt b/app/src/main/java/com/eatssu/android/presentation/review/write/menu/VariableMenuPickAdapter.kt similarity index 73% rename from app/src/main/java/com/eatssu/android/ui/review/write/menu/VariableMenuPickAdapter.kt rename to app/src/main/java/com/eatssu/android/presentation/review/write/menu/VariableMenuPickAdapter.kt index 93eb93092..e10b2b307 100644 --- a/app/src/main/java/com/eatssu/android/ui/review/write/menu/VariableMenuPickAdapter.kt +++ b/app/src/main/java/com/eatssu/android/presentation/review/write/menu/VariableMenuPickAdapter.kt @@ -1,12 +1,12 @@ -package com.eatssu.android.ui.review.write.menu +package com.eatssu.android.presentation.review.write.menu import android.view.LayoutInflater import android.view.ViewGroup import androidx.recyclerview.widget.RecyclerView -import com.eatssu.android.data.model.MenuMini import com.eatssu.android.databinding.ItemMenuPickBinding +import com.eatssu.android.domain.model.MenuMini -class VariableMenuPickAdapter(private val menuList: List) : +class VariableMenuPickAdapter(private val menuList: List?) : RecyclerView.Adapter() { private val checkedItems: ArrayList> = ArrayList() @@ -15,9 +15,9 @@ class VariableMenuPickAdapter(private val menuList: List) : RecyclerView.ViewHolder(binding.root) { fun bind(position: Int) { - val menuItem = menuList[position] + val menuItem = menuList?.get(position) with(binding) { - tvMenuName.text = menuItem.name + tvMenuName.text = menuItem?.name checkBox.isChecked = checkedItems.contains(getItem(position)) checkBox.setOnClickListener { onCheckBoxClick(position) } } @@ -34,11 +34,11 @@ class VariableMenuPickAdapter(private val menuList: List) : holder.bind(position) } - override fun getItemCount(): Int = menuList.size + override fun getItemCount(): Int = menuList?.size ?: 0 - private fun getItem(position: Int): Pair { - val menuItem = menuList[position] - return Pair(menuItem.name, menuItem.id) + private fun getItem(position: Int): Pair { + val menuItem = menuList?.get(position) + return Pair(menuItem?.name, menuItem?.id) } private fun onCheckBoxClick(position: Int) { @@ -46,7 +46,7 @@ class VariableMenuPickAdapter(private val menuList: List) : if (checkedItems.contains(item)) { checkedItems.remove(item) } else { - checkedItems.add(item) + checkedItems.add(item as Pair) } } diff --git a/app/src/main/java/com/eatssu/android/presentation/review/write/menu/VariableMenuViewModel.kt b/app/src/main/java/com/eatssu/android/presentation/review/write/menu/VariableMenuViewModel.kt new file mode 100644 index 000000000..516cdb10e --- /dev/null +++ b/app/src/main/java/com/eatssu/android/presentation/review/write/menu/VariableMenuViewModel.kt @@ -0,0 +1,71 @@ +package com.eatssu.android.presentation.review.write.menu + + +import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import com.eatssu.android.data.dto.response.toMenuMiniList +import com.eatssu.android.domain.model.MenuMini +import com.eatssu.android.domain.usecase.menu.GetMenuNameListOfMealUseCase +import dagger.hilt.android.lifecycle.HiltViewModel +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.StateFlow +import kotlinx.coroutines.flow.asStateFlow +import kotlinx.coroutines.flow.catch +import kotlinx.coroutines.flow.collectLatest +import kotlinx.coroutines.flow.onCompletion +import kotlinx.coroutines.flow.onStart +import kotlinx.coroutines.flow.update +import kotlinx.coroutines.launch +import timber.log.Timber +import javax.inject.Inject + + +@HiltViewModel +class VariableMenuViewModel @Inject constructor( + private val getMenuNameListUseCase: GetMenuNameListOfMealUseCase, +) : ViewModel() { + + private val _uiState: MutableStateFlow = MutableStateFlow(MenuState()) + val uiState: StateFlow = _uiState.asStateFlow() + + fun findMenuItemByMealId(mealId: Long) { + Timber.d("findMenuItemByMealId: $mealId") + viewModelScope.launch { + getMenuNameListUseCase( + mealId + ).onStart { + Timber.d("findMenuItemByMealId: onStart") + + _uiState.update { it.copy(loading = true) } + }.onCompletion { + Timber.d("findMenuItemByMealId: onCompletion") + + _uiState.update { it.copy(loading = false, error = true) } + }.catch { e -> + Timber.d("findMenuItemByMealId: catch $e") + + _uiState.update { + it.copy( + loading = false, + error = true, + ) + } + }.collectLatest { result -> + Timber.d("findMenuItemByMealId: ${result.toString()}") + _uiState.update { + it.copy( + loading = false, + error = false, + menuOfMeal = result.result?.toMenuMiniList() + ) + } + } + } + } +} + +data class MenuState( + var loading: Boolean = true, + var error: Boolean = false, + var menuOfMeal: List? = null, +) \ No newline at end of file diff --git a/app/src/main/java/com/eatssu/android/util/extension/ActivityExt.kt b/app/src/main/java/com/eatssu/android/presentation/util/ActivityUtil.kt similarity index 85% rename from app/src/main/java/com/eatssu/android/util/extension/ActivityExt.kt rename to app/src/main/java/com/eatssu/android/presentation/util/ActivityUtil.kt index 726874d2f..b40d27a41 100644 --- a/app/src/main/java/com/eatssu/android/util/extension/ActivityExt.kt +++ b/app/src/main/java/com/eatssu/android/presentation/util/ActivityUtil.kt @@ -1,4 +1,4 @@ -package com.eatssu.android.util.extension +package com.eatssu.android.presentation.util import android.app.Activity import android.content.Intent diff --git a/app/src/main/java/com/eatssu/android/util/CalendarUtils.kt b/app/src/main/java/com/eatssu/android/presentation/util/CalendarUtil.kt similarity index 94% rename from app/src/main/java/com/eatssu/android/util/CalendarUtils.kt rename to app/src/main/java/com/eatssu/android/presentation/util/CalendarUtil.kt index 7471b5931..b1215ba68 100644 --- a/app/src/main/java/com/eatssu/android/util/CalendarUtils.kt +++ b/app/src/main/java/com/eatssu/android/presentation/util/CalendarUtil.kt @@ -1,4 +1,4 @@ -package com.eatssu.android.util +package com.eatssu.android.presentation.util import android.os.Build import androidx.annotation.RequiresApi @@ -7,7 +7,7 @@ import java.time.LocalDate import java.time.format.DateTimeFormatter -object CalendarUtils { +object CalendarUtil { lateinit var selectedDate: LocalDate @RequiresApi(Build.VERSION_CODES.O) diff --git a/app/src/main/java/com/eatssu/android/util/extension/ContextExt.kt b/app/src/main/java/com/eatssu/android/presentation/util/ContextUtil.kt similarity index 85% rename from app/src/main/java/com/eatssu/android/util/extension/ContextExt.kt rename to app/src/main/java/com/eatssu/android/presentation/util/ContextUtil.kt index 18ca672d4..60ec7845b 100644 --- a/app/src/main/java/com/eatssu/android/util/extension/ContextExt.kt +++ b/app/src/main/java/com/eatssu/android/presentation/util/ContextUtil.kt @@ -1,4 +1,4 @@ -package com.eatssu.android.util.extension +package com.eatssu.android.presentation.util import android.content.Context import android.widget.Toast diff --git a/app/src/main/java/com/eatssu/android/ui/review/delete/DeleteViewModel.kt b/app/src/main/java/com/eatssu/android/ui/review/delete/DeleteViewModel.kt deleted file mode 100644 index 140585e5b..000000000 --- a/app/src/main/java/com/eatssu/android/ui/review/delete/DeleteViewModel.kt +++ /dev/null @@ -1,62 +0,0 @@ -package com.eatssu.android.ui.review.delete - -import androidx.lifecycle.LiveData -import androidx.lifecycle.MutableLiveData -import androidx.lifecycle.ViewModel -import androidx.lifecycle.viewModelScope -import com.eatssu.android.base.BaseResponse -import com.eatssu.android.data.service.ReviewService -import com.eatssu.android.util.RetrofitImpl -import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.launch -import retrofit2.Call -import retrofit2.Callback -import retrofit2.Response - -class DeleteViewModel : ViewModel() { - private val _isDone = MutableLiveData() - val isDone: LiveData get() = _isDone - - private val _toastMessage = MutableLiveData() - val toastMessage: LiveData get() = _toastMessage - - fun postData(reviewId: Long) { - val service = RetrofitImpl.retrofit.create(ReviewService::class.java) - - viewModelScope.launch(Dispatchers.IO) { - service.deleteReview(reviewId).enqueue(object : Callback> { - override fun onResponse( - call: Call>, - response: Response>, - ) { - if (response.isSuccessful) { - if (response.code() == 200) { - handleSuccessResponse("μ‚­μ œκ°€ μ™„λ£Œλ˜μ—ˆμŠ΅λ‹ˆλ‹€.") - } else { - handleErrorResponse("μ‚­μ œκ°€ μ‹€νŒ¨ν•˜μ˜€μŠ΅λ‹ˆλ‹€.") - } - } - } - - override fun onFailure(call: Call>, t: Throwable) { - handleErrorResponse("μ‚­μ œκ°€ μ‹€νŒ¨ν•˜μ˜€μŠ΅λ‹ˆλ‹€.") - } - }) - } - } - - fun handleSuccessResponse(message: String) { - viewModelScope.launch(Dispatchers.Main) { - _toastMessage.value = message - _isDone.value = true - - } - } - - fun handleErrorResponse(message: String) { - viewModelScope.launch(Dispatchers.Main) { - _toastMessage.value = message - _isDone.value = false - } - } -} \ No newline at end of file diff --git a/app/src/main/java/com/eatssu/android/ui/review/list/ReviewViewModel.kt b/app/src/main/java/com/eatssu/android/ui/review/list/ReviewViewModel.kt deleted file mode 100644 index 36a4d80d4..000000000 --- a/app/src/main/java/com/eatssu/android/ui/review/list/ReviewViewModel.kt +++ /dev/null @@ -1,221 +0,0 @@ -package com.eatssu.android.ui.review.list - -import android.util.Log -import androidx.lifecycle.ViewModel -import androidx.lifecycle.viewModelScope -import com.eatssu.android.base.BaseResponse -import com.eatssu.android.data.dto.response.GetMealReviewInfoResponse -import com.eatssu.android.data.dto.response.GetMenuReviewInfoResponse -import com.eatssu.android.data.dto.response.GetReviewListResponse -import com.eatssu.android.data.dto.response.asReviewInfo -import com.eatssu.android.data.dto.response.toReviewList -import com.eatssu.android.data.enums.MenuType -import com.eatssu.android.data.model.Review -import com.eatssu.android.data.model.ReviewInfo -import com.eatssu.android.data.service.ReviewService -import kotlinx.coroutines.flow.MutableStateFlow -import kotlinx.coroutines.flow.StateFlow -import kotlinx.coroutines.flow.asStateFlow -import kotlinx.coroutines.flow.update -import kotlinx.coroutines.launch -import retrofit2.Call -import retrofit2.Callback -import retrofit2.Response - - -//@HiltViewModel -class ReviewViewModel( -//@Inject constructor( - private val reviewService: ReviewService, -// private val reviewRepository: ReviewRepository, -) : ViewModel() { - -// var menuType: MenuType, -// var itemId: Long? = 0, - -// private val _itemState: MutableStateFlow = -// MutableStateFlow(ItemState(MenuType.FIXED, 0)) -// val ItemState: StateFlow = _itemState.asStateFlow() - - private val _uiState: MutableStateFlow = MutableStateFlow(ReviewState()) - val uiState: StateFlow = _uiState.asStateFlow() - - - fun loadMenuReviewInfo( - menuId: Long, - ) { - viewModelScope.launch { -// reviewRepository.getMenuReviewInfo(menuId) -// .catch { -// _uiState.value.error = true -// } -// .collect { -// _uiState.value.reviewInfo = it.result?.asReviewInfo() -// Log.d("it.result?.asReviewInfo()",it.result.toString()) -// } - - - reviewService.getMenuReviewInfo(menuId) - .enqueue(object : Callback> { - override fun onResponse( - call: Call>, - response: Response>, - ) { - if (response.isSuccessful) { - val data = response.body()?.result!! - - // μ •μƒμ μœΌλ‘œ 톡신이 μ„±κ³΅λœ 경우 - Log.d("ReviewViewModel", "onResponse 성곡: " + response.body().toString()) - - if (data.mainRating == null) { - _uiState.update { - it.copy( - loading = false, - error = false, - reviewInfo = data.asReviewInfo(), - isEmpty = true - ) - } - } else { - _uiState.update { - it.copy( - loading = false, - error = false, - reviewInfo = data.asReviewInfo(), - isEmpty = false - ) - } - Log.d("ReviewViewModel", "리뷰 μžˆλ‹€κ³ ") - } - - } else { - // 톡신이 μ‹€νŒ¨ν•œ 경우(μ‘λ‹΅μ½”λ“œ 3xx, 4xx λ“±) - Log.d("ReviewViewModel", "onResponse μ‹€νŒ¨") - } - } - - override fun onFailure( - call: Call>, - t: Throwable, - ) { - // 톡신 μ‹€νŒ¨ (인터넷 λŠν‚΄, μ˜ˆμ™Έ λ°œμƒ λ“± μ‹œμŠ€ν…œμ μΈ 이유) - Log.d("ReviewViewModel", "onFailure μ—λŸ¬: " + t.message.toString()) - } - }) - - } - } - - fun loadMealReviewInfo( - mealId: Long, - ) { - viewModelScope.launch { - reviewService.getMealReviewInfo(mealId) - .enqueue(object : Callback> { - override fun onResponse( - call: Call>, - response: Response>, - ) { - if (response.isSuccessful) { - - val data = response.body()?.result!! - // μ •μƒμ μœΌλ‘œ 톡신이 μ„±κ³΅λœ 경우 - Log.d("post", "onResponse 성곡: " + response.body().toString()) - _uiState.update { - it.copy( - loading = false, - error = false, - reviewInfo = data.asReviewInfo() - ) - } - } else { - // 톡신이 μ‹€νŒ¨ν•œ 경우(μ‘λ‹΅μ½”λ“œ 3xx, 4xx λ“±) - Log.d("post", "onResponse μ‹€νŒ¨") - } - } - - override fun onFailure( - call: Call>, - t: Throwable, - ) { - // 톡신 μ‹€νŒ¨ (인터넷 λŠν‚΄, μ˜ˆμ™Έ λ°œμƒ λ“± μ‹œμŠ€ν…œμ μΈ 이유) - Log.d("post", "onFailure μ—λŸ¬: " + t.message.toString()) - } - }) - } - } - - fun loadReviewList( - menuType: MenuType, - mealId: Long?, - menuId: Long?, -// lastReviewId: Long?, -// page: Int?, -// size: Int?, - ) { - viewModelScope.launch { - - reviewService.getReviewList(menuType.toString(), mealId, menuId) - .enqueue(object : Callback> { - override fun onResponse( - call: Call>, - response: Response>, - ) { - if (response.isSuccessful) { - Log.d("post", "onResponse 성곡: " + response.body().toString()) - - val data = response.body()?.result!! - - if (data.numberOfElements == 0) { //리뷰 μ—†μ–΄ μ‹œλ°© - _uiState.update { - it.copy( - loading = false, - error = false, - isEmpty = true - ) - } - } else { //리뷰 있음 - _uiState.update { - it.copy( - loading = false, - error = false, - reviewList = data.toReviewList(), - isEmpty = false - ) - } - } - // μ •μƒμ μœΌλ‘œ 톡신이 μ„±κ³΅λœ 경우 - - - } else { - // 톡신이 μ‹€νŒ¨ν•œ 경우(μ‘λ‹΅μ½”λ“œ 3xx, 4xx λ“±) - Log.d("post", "onResponse μ‹€νŒ¨") - } - } - - override fun onFailure( - call: Call>, - t: Throwable, - ) { - // 톡신 μ‹€νŒ¨ (인터넷 λŠν‚΄, μ˜ˆμ™Έ λ°œμƒ λ“± μ‹œμŠ€ν…œμ μΈ 이유) - Log.d("post", "onFailure μ—λŸ¬: " + t.message.toString()) - } - }) - } - } -} - -//data class ItemState( -// var menuType: MenuType, -// var itemid: Long, -//) - -data class ReviewState( - var loading: Boolean = true, - var error: Boolean = false, - - var isEmpty: Boolean = true, //리뷰 μ—†λ‹€~ - - var reviewInfo: ReviewInfo? = null, - var reviewList: List? = null, -) \ No newline at end of file diff --git a/app/src/main/java/com/eatssu/android/ui/review/list/ReviewViewModelFactory.kt b/app/src/main/java/com/eatssu/android/ui/review/list/ReviewViewModelFactory.kt deleted file mode 100644 index 9f2544def..000000000 --- a/app/src/main/java/com/eatssu/android/ui/review/list/ReviewViewModelFactory.kt +++ /dev/null @@ -1,21 +0,0 @@ -package com.eatssu.android.ui.review.list - -import androidx.lifecycle.ViewModel -import androidx.lifecycle.ViewModelProvider -import com.eatssu.android.data.service.ReviewService - -class ReviewViewModelFactory( - private val reviewService: ReviewService, -// private val repository: ReviewRepository -) : - ViewModelProvider.Factory { - - override fun create(modelClass: Class): T { - if (modelClass.isAssignableFrom(ReviewViewModel::class.java)) { - @Suppress("UNCHECKED_CAST") - return ReviewViewModel(reviewService) as T - } - throw IllegalArgumentException("Unknown ViewModel class") - } -} - diff --git a/app/src/main/java/com/eatssu/android/ui/review/modify/ModifyViewModel.kt b/app/src/main/java/com/eatssu/android/ui/review/modify/ModifyViewModel.kt deleted file mode 100644 index 9ed7c85ec..000000000 --- a/app/src/main/java/com/eatssu/android/ui/review/modify/ModifyViewModel.kt +++ /dev/null @@ -1,87 +0,0 @@ -package com.eatssu.android.ui.review.modify - -import androidx.lifecycle.ViewModel -import androidx.lifecycle.viewModelScope -import com.eatssu.android.base.BaseResponse -import com.eatssu.android.data.dto.request.ModifyReviewRequest -import com.eatssu.android.data.service.ReviewService -import com.eatssu.android.util.RetrofitImpl -import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.flow.MutableStateFlow -import kotlinx.coroutines.flow.StateFlow -import kotlinx.coroutines.flow.asStateFlow -import kotlinx.coroutines.flow.update -import kotlinx.coroutines.launch -import retrofit2.Call -import retrofit2.Callback -import retrofit2.Response - -class ModifyViewModel : ViewModel() { - - private val _uiState: MutableStateFlow = MutableStateFlow(ModifyState()) - val uiState: StateFlow = _uiState.asStateFlow() - - fun modifyMyReview( - reviewId: Long, - comment: String, - mainGrade: Int, - amountGrade: Int, - tasteGrade: Int, - ) { - val service = RetrofitImpl.retrofit.create(ReviewService::class.java) - - val reviewData = ModifyReviewRequest(mainGrade, amountGrade, tasteGrade, comment) - - viewModelScope.launch(Dispatchers.IO) { - service.modifyReview(reviewId, reviewData) - .enqueue(object : Callback> { - override fun onResponse( - call: Call>, - response: Response>, - ) { - if (response.isSuccessful) { - if (response.code() == 200) { - _uiState.update { - it.copy( - loading = false, - error = false, - isDone = true, - toastMessage = "μˆ˜μ •μ΄ μ™„λ£Œλ˜μ—ˆμŠ΅λ‹ˆλ‹€." - ) - } - } else { - _uiState.update { - it.copy( - loading = false, - error = false, - isDone = true, - toastMessage = "μˆ˜μ •μ΄ μ‹€νŒ¨ν•˜μ˜€μŠ΅λ‹ˆλ‹€." - ) - } - } - } - } - - override fun onFailure(call: Call>, t: Throwable) { - _uiState.update { - it.copy( - loading = false, - error = false, - isDone = true, - toastMessage = "μˆ˜μ •μ΄ μ‹€νŒ¨ν•˜μ˜€μŠ΅λ‹ˆλ‹€." - ) - } - } - }) - } - } -} - -data class ModifyState( - var loading: Boolean = true, - var error: Boolean = false, - var toastMessage: String = "", - - var isDone: Boolean = false, - - ) \ No newline at end of file diff --git a/app/src/main/java/com/eatssu/android/ui/review/write/ImageViewModel.kt b/app/src/main/java/com/eatssu/android/ui/review/write/ImageViewModel.kt deleted file mode 100644 index 2f1ccf9ec..000000000 --- a/app/src/main/java/com/eatssu/android/ui/review/write/ImageViewModel.kt +++ /dev/null @@ -1,120 +0,0 @@ -package com.eatssu.android.ui.review.write - -import android.util.Log -import androidx.lifecycle.LiveData -import androidx.lifecycle.MutableLiveData -import androidx.lifecycle.ViewModel -import com.eatssu.android.base.BaseResponse -import com.eatssu.android.data.dto.response.ImageResponse -import com.eatssu.android.data.service.ImageService -import kotlinx.coroutines.flow.MutableStateFlow -import kotlinx.coroutines.flow.StateFlow -import kotlinx.coroutines.flow.asStateFlow -import kotlinx.coroutines.flow.update -import okhttp3.MediaType.Companion.toMediaTypeOrNull -import okhttp3.MultipartBody -import okhttp3.RequestBody.Companion.asRequestBody -import retrofit2.Call -import retrofit2.Callback -import retrofit2.Response -import java.io.File - -class ImageViewModel( - private val imageService: ImageService, -) : ViewModel() { - - private val _imageUrl = MutableLiveData() - val imageUrl: LiveData get() = _imageUrl - - private var _imageFile = MutableLiveData() - val imageFile: LiveData get() = _imageFile - - private val _uiState: MutableStateFlow = MutableStateFlow(ImageState()) - val uiState: StateFlow = _uiState.asStateFlow() - - - fun setImageFile(imageFile: File) { - _imageFile.value = imageFile - } - - fun deleteFile() { - _imageFile.value?.delete() - _imageUrl.value = "" - } - - - fun saveS3() { -// val compressImageString = imageFile.value?.let { compressImage(it) } - - if (imageFile.value?.exists() == true) { - val requestFile = imageFile.value!!.asRequestBody("image/*".toMediaTypeOrNull()) - val multipart = MultipartBody.Part.createFormData( - "image", - imageFile.value!!.name, - requestFile - ) - - imageService.getImageUrl(multipart).enqueue( - object : Callback> { - override fun onResponse( - call: Call>, - response: Response>, - ) { - if (response.isSuccessful) { - // μ •μƒμ μœΌλ‘œ 톡신이 μ„±κ³΅λœ 경우 - _imageUrl.value = response.body()?.result?.url.toString() - Log.d("ImageViewModel", "이미지 λ³€ν™˜ μ™„λ£Œ") - _uiState.update { - it.copy( - loading = false, - error = false, - isDone = true, - imgUrl = response.body()?.result?.url.toString() - ) - } - } else { - // 톡신이 μ‹€νŒ¨ν•œ 경우(μ‘λ‹΅μ½”λ“œ 3xx, 4xx λ“±) - _uiState.update { - it.copy( - loading = false, - error = true, - isDone = false - ) - } - Log.d( - "ImageViewModel", - "이미지 λ³€ν™˜ μ‹€νŒ¨" + response.body()?.code + response.body()?.message - ) - } - } - - override fun onFailure( - call: Call>, - t: Throwable, - ) { - // 톡신 μ‹€νŒ¨ (인터넷 λŠν‚΄, μ˜ˆμ™Έ λ°œμƒ λ“± μ‹œμŠ€ν…œμ μΈ 이유) - Log.d( - "ImageViewModel", - "onFailure μ—λŸ¬: " + t.message.toString() - ) - _uiState.update { - it.copy( - loading = false, - error = true, - isDone = false - ) - } - } - }) - } - } -} - - -data class ImageState( - var loading: Boolean = true, - var error: Boolean = false, - - var imgUrl: String = "", - var isDone: Boolean = false, -) \ No newline at end of file diff --git a/app/src/main/java/com/eatssu/android/ui/review/write/ImageViewModelFactory.kt b/app/src/main/java/com/eatssu/android/ui/review/write/ImageViewModelFactory.kt deleted file mode 100644 index 38e7c67c7..000000000 --- a/app/src/main/java/com/eatssu/android/ui/review/write/ImageViewModelFactory.kt +++ /dev/null @@ -1,18 +0,0 @@ -package com.eatssu.android.ui.review.write - -import androidx.lifecycle.ViewModel -import androidx.lifecycle.ViewModelProvider -import com.eatssu.android.data.service.ImageService - -class ImageViewModelFactory(private val imageService: ImageService) : - ViewModelProvider.Factory { - - override fun create(modelClass: Class): T { - if (modelClass.isAssignableFrom(ImageViewModel::class.java)) { - @Suppress("UNCHECKED_CAST") - return ImageViewModel(imageService) as T - } - throw IllegalArgumentException("Unknown ViewModel class") - } -} - diff --git a/app/src/main/java/com/eatssu/android/ui/review/write/ReviewWriteViewModel.kt b/app/src/main/java/com/eatssu/android/ui/review/write/ReviewWriteViewModel.kt deleted file mode 100644 index eb619c591..000000000 --- a/app/src/main/java/com/eatssu/android/ui/review/write/ReviewWriteViewModel.kt +++ /dev/null @@ -1,110 +0,0 @@ -package com.eatssu.android.ui.review.write - -import android.util.Log -import androidx.lifecycle.ViewModel -import androidx.lifecycle.viewModelScope -import com.eatssu.android.base.BaseResponse -import com.eatssu.android.data.dto.request.WriteReviewRequest -import com.eatssu.android.data.service.ReviewService -import kotlinx.coroutines.flow.MutableStateFlow -import kotlinx.coroutines.flow.StateFlow -import kotlinx.coroutines.flow.asStateFlow -import kotlinx.coroutines.flow.update -import kotlinx.coroutines.launch -import retrofit2.Call -import retrofit2.Callback -import retrofit2.Response - - -class UploadReviewViewModel(private val reviewService: ReviewService) : ViewModel() { - - private val _uiState: MutableStateFlow = - MutableStateFlow(UploadReviewState()) - val uiState: StateFlow = _uiState.asStateFlow() - - private val _reviewData: MutableStateFlow = - MutableStateFlow(WriteReviewRequest()) - val reviewData: StateFlow = _reviewData.asStateFlow() - - private val _menuId: MutableStateFlow = MutableStateFlow(-1) - val menuId: StateFlow = _menuId.asStateFlow() - - fun setReviewData( - menuId: Long, - mainRating: Int, - amountRating: Int, - tasteRating: Int, - comment: String, - imageUrl: String, - ) { - _menuId.value = menuId - _reviewData.value = - WriteReviewRequest(mainRating, amountRating, tasteRating, comment, imageUrl) - } - - - fun postReview() { - viewModelScope.launch { - reviewService.writeReview( - menuId.value, reviewData.value - ).enqueue(object : Callback> { - override fun onResponse( - call: Call>, - response: Response>, - ) { - if (response.isSuccessful) { - if (response.body()?.isSuccess == true) { - - _uiState.update { - it.copy( - loading = false, - error = false, - toastMessage = "리뷰가 μž‘μ„±λ˜μ—ˆμŠ΅λ‹ˆλ‹€.", - isUpload = true, - ) - } - - Log.d( - "UploadReviewViewModel", - "onResponse 리뷰 μž‘μ„± 성곡: " + response.body().toString() - ) - - } - } else { - // 톡신이 μ‹€νŒ¨ν•œ 경우(μ‘λ‹΅μ½”λ“œ 3xx, 4xx λ“±) - _uiState.update { - it.copy( - loading = false, - error = true, - toastMessage = "리뷰 μž‘μ„±μ— μ‹€νŒ¨ν•˜μ˜€μŠ΅λ‹ˆλ‹€.", - isUpload = false, - ) - } - Log.d("UploadReviewViewModel", "onResponse 리뷰 μž‘μ„± μ‹€νŒ¨") - } - } - - override fun onFailure(call: Call>, t: Throwable) { - // 톡신 μ‹€νŒ¨ (인터넷 λŠν‚΄, μ˜ˆμ™Έ λ°œμƒ λ“± μ‹œμŠ€ν…œμ μΈ 이유) - _uiState.update { - it.copy( - loading = false, - error = true, - toastMessage = "리뷰 μž‘μ„±μ— μ‹€νŒ¨ν•˜μ˜€μŠ΅λ‹ˆλ‹€.", - isUpload = false, - ) - } - - Log.d("UploadReviewViewModel", "onFailure μ—λŸ¬: " + t.message.toString()) - } - }) - } - } -} - -data class UploadReviewState( - var toastMessage: String = "", - var loading: Boolean = true, - var error: Boolean = false, - var isUpload: Boolean = false, -) \ No newline at end of file diff --git a/app/src/main/java/com/eatssu/android/ui/review/write/ReviewWriteViewModelFactory.kt b/app/src/main/java/com/eatssu/android/ui/review/write/ReviewWriteViewModelFactory.kt deleted file mode 100644 index 40a55abc2..000000000 --- a/app/src/main/java/com/eatssu/android/ui/review/write/ReviewWriteViewModelFactory.kt +++ /dev/null @@ -1,18 +0,0 @@ -package com.eatssu.android.ui.review.write - -import androidx.lifecycle.ViewModel -import androidx.lifecycle.ViewModelProvider -import com.eatssu.android.data.service.ReviewService - -class ReviewWriteViewModelFactory(private val reviewService: ReviewService) : - ViewModelProvider.Factory { - - override fun create(modelClass: Class): T { - if (modelClass.isAssignableFrom(UploadReviewViewModel::class.java)) { - @Suppress("UNCHECKED_CAST") - return UploadReviewViewModel(reviewService) as T - } - throw IllegalArgumentException("Unknown ViewModel class") - } -} - diff --git a/app/src/main/java/com/eatssu/android/ui/review/write/menu/VariableMenuModelFactory.kt b/app/src/main/java/com/eatssu/android/ui/review/write/menu/VariableMenuModelFactory.kt deleted file mode 100644 index b07242495..000000000 --- a/app/src/main/java/com/eatssu/android/ui/review/write/menu/VariableMenuModelFactory.kt +++ /dev/null @@ -1,18 +0,0 @@ -package com.eatssu.android.ui.review.write.menu - -import androidx.lifecycle.ViewModel -import androidx.lifecycle.ViewModelProvider -import com.eatssu.android.data.service.MealService - -class VariableMenuModelFactory(private val mealService: MealService) : - ViewModelProvider.Factory { - - override fun create(modelClass: Class): T { - if (modelClass.isAssignableFrom(VariableMenuViewModel::class.java)) { - @Suppress("UNCHECKED_CAST") - return VariableMenuViewModel(mealService) as T - } - throw IllegalArgumentException("Unknown ViewModel class") - } -} - diff --git a/app/src/main/java/com/eatssu/android/ui/review/write/menu/VariableMenuViewModel.kt b/app/src/main/java/com/eatssu/android/ui/review/write/menu/VariableMenuViewModel.kt deleted file mode 100644 index d13842d00..000000000 --- a/app/src/main/java/com/eatssu/android/ui/review/write/menu/VariableMenuViewModel.kt +++ /dev/null @@ -1,69 +0,0 @@ -package com.eatssu.android.ui.review.write.menu - - -import android.util.Log -import androidx.lifecycle.ViewModel -import androidx.lifecycle.viewModelScope -import com.eatssu.android.base.BaseResponse -import com.eatssu.android.data.dto.response.MenuOfMealResponse -import com.eatssu.android.data.dto.response.asMenuOfMeal -import com.eatssu.android.data.model.MenuMini -import com.eatssu.android.data.service.MealService -import kotlinx.coroutines.flow.MutableStateFlow -import kotlinx.coroutines.flow.StateFlow -import kotlinx.coroutines.flow.asStateFlow -import kotlinx.coroutines.flow.update -import kotlinx.coroutines.launch -import retrofit2.Call -import retrofit2.Callback -import retrofit2.Response - - -class VariableMenuViewModel( - private val mealService: MealService, -) : - ViewModel() { - - private val _uiState: MutableStateFlow = MutableStateFlow(MenuState()) - val uiState: StateFlow = _uiState.asStateFlow() - - - fun findMenuItemByMealId(mealId: Long) { - viewModelScope.launch { - mealService.getMenuInfoByMealId(mealId) - .enqueue(object : Callback> { - override fun onResponse( - call: Call>, - response: Response>, - ) { - if (response.isSuccessful) { - val data = response.body()?.result - Log.d("post", "onResponse 성곡" + response.body()) - _uiState.update { - it.copy( - loading = false, - error = false, - menuOfMeal = response.body()?.result?.asMenuOfMeal() - ) - } - } else { - Log.d("post", "onResponse μ‹€νŒ¨") - } - } - - override fun onFailure( - call: Call>, - t: Throwable, - ) { - Log.d("post", "onFailure μ—λŸ¬: ${t.message}") - } - }) - } - } -} - -data class MenuState( - var loading: Boolean = true, - var error: Boolean = false, - var menuOfMeal: List? = null, -) \ No newline at end of file diff --git a/app/src/main/res/drawable/img_backgroud_snow.png b/app/src/main/res/drawable/img_backgroud_snow.png new file mode 100644 index 000000000..840c6439d Binary files /dev/null and b/app/src/main/res/drawable/img_backgroud_snow.png differ diff --git a/app/src/main/res/drawable/img_logo_christmas.png b/app/src/main/res/drawable/img_logo_christmas.png index 2ff616f5e..6b3540360 100644 Binary files a/app/src/main/res/drawable/img_logo_christmas.png and b/app/src/main/res/drawable/img_logo_christmas.png differ diff --git a/app/src/main/res/drawable/img_logo_snow.png b/app/src/main/res/drawable/img_logo_snow.png new file mode 100644 index 000000000..76ef5c054 Binary files /dev/null and b/app/src/main/res/drawable/img_logo_snow.png differ diff --git a/app/src/main/res/layout/activity_developer.xml b/app/src/main/res/layout/activity_developer.xml index 06a7e6eba..362d871a0 100644 --- a/app/src/main/res/layout/activity_developer.xml +++ b/app/src/main/res/layout/activity_developer.xml @@ -5,7 +5,7 @@ android:id="@+id/main" android:layout_width="match_parent" android:layout_height="match_parent" - tools:context=".ui.mypage.DeveloperActivity"> + tools:context=".presentation.mypage.DeveloperActivity"> + tools:context=".presentation.review.modify.ModifyReviewActivity"> + tools:context=".presentation.info.InfoActivity"> + tools:context=".presentation.login.IntroActivity"> + + + tools:context=".presentation.login.LoginActivity"> + tools:context=".presentation.main.MainActivity"> + tools:context=".presentation.mypage.MyPageActivity"> + + + + + + + + + + + tools:context=".presentation.review.delete.MyReviewDialogActivity"> + android:text="@string/modify" /> + tools:context=".presentation.review.list.ReviewActivity"> + tools:context=".presentation.review.report.OthersReviewDialogActivity"> + tools:context=".presentation.review.report.ReportActivity"> + type="com.eatssu.android.presentation.review.list.ReviewViewModel" /> + tools:context=".presentation.review.list.ReviewActivity"> + tools:context=".presentation.review.write.menu.ReviewWriteMenuActivity"> + type="com.eatssu.android.presentation.review.write.UploadReviewViewModel" /> + tools:context=".presentation.review.write.ReviewWriteRateActivity"> + tools:context=".presentation.mypage.SignOutActivity"> + tools:context=".presentation.mypage.usernamechange.UserNameChangeActivity"> + tools:context=".presentation.mypage.terms.WebViewActivity"> + android:title="@string/modify" /> diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 233c03acc..03f65dc6b 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -70,8 +70,19 @@ λ§› μ–‘ μ‹ κ³  - μˆ˜μ •ν•˜κΈ° - μ‚­μ œν•˜κΈ° + + μˆ˜μ •ν•˜κΈ° + 리뷰λ₯Ό μˆ˜μ •ν•˜μ‹œκ² μŠ΅λ‹ˆκΉŒ? + 리뷰가 μˆ˜μ •λ˜μ—ˆμŠ΅λ‹ˆλ‹€. + 리뷰 μˆ˜μ •μ΄ μ‹€νŒ¨ν•˜μ˜€μŠ΅λ‹ˆλ‹€. + 리뷰 μˆ˜μ •μ„ μ·¨μ†Œν•˜μ‹œκ² μŠ΅λ‹ˆκΉŒ? + + λ¦¬λ·°μ‚­μ œ + 리뷰λ₯Ό μ‚­μ œν•˜μ‹œκ² μŠ΅λ‹ˆκΉŒ? + 리뷰가 μ‚­μ œ λ˜μ—ˆμŠ΅λ‹ˆλ‹€. + 리뷰 μ‚­μ œκ°€ μ‹€νŒ¨ ν•˜μ˜€μŠ΅λ‹ˆλ‹€. + 리뷰 μ‚­μ œλ₯Ό μ·¨μ†Œν•˜μ‹œκ² μŠ΅λ‹ˆκΉŒ? + μž‘μ„±ν•œ 리뷰 아직 μž‘μ„±ν•œ 리뷰가 μ—†μ–΄μš” 첫 리뷰λ₯Ό 남겨 μ£Όμ„Έμš”! @@ -156,4 +167,6 @@ https://github.com/EAT-SSU/Docs/wiki/EAT%E2%80%90SSU-%EA%B0%9C%EC%9D%B8%EC%A0%95%EB%B3%B4%EC%B2%98%EB%A6%AC%EB%B0%A9%EC%B9%A8 https://github.com/EAT-SSU/Docs/wiki/EAT%E2%80%90SSU-%EC%84%9C%EB%B9%84%EC%8A%A4-%EC%9D%B4%EC%9A%A9%EC%95%BD%EA%B4%80 http://pf.kakao.com/_ZlVAn + + μ˜€ν”ˆμ†ŒμŠ€ 라이브러리 \ No newline at end of file diff --git a/build.gradle.kts b/build.gradle.kts index e74bee41e..b28a406f7 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -7,3 +7,9 @@ plugins { alias(libs.plugins.firebase.crashlytics) apply false alias(libs.plugins.hilt.android) apply false } + +buildscript { + dependencies { + classpath(libs.oss.licenses.plugin) + } +} \ No newline at end of file diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 85a4d813f..99cd7f58d 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,5 +1,5 @@ [versions] -android = "8.2.2" +android = "8.6.1" androidx-core = "1.7.0" androidx-appcompat = "1.6.1" material = "1.8.0" @@ -33,7 +33,8 @@ firebase-crashlytics = "2.9.9" timber = "5.0.1" google-services = "4.4.2" kotlin-android = "1.8.10" -activity-version = "1.9.1" +ossLicenses = "17.1.0" +ossLicensesPlugin = "0.10.4" [libraries] androidx-core-ktx = { group = "androidx.core", name = "core-ktx", version.ref = "androidx-core" } @@ -82,7 +83,9 @@ firebase-analytics = { module = "com.google.firebase:firebase-analytics" } firebase-crashlytics = { module = "com.google.firebase:firebase-crashlytics" } timber = { group = "com.jakewharton.timber", name = "timber", version.ref = "timber" } -androidx-activity = { group = "androidx.activity", name = "activity", version.ref = "activity-version" } +oss-licenses = { group = "com.google.android.gms", name = "play-services-oss-licenses", version.ref = "ossLicenses" } +oss-licenses-plugin = { group = "com.google.android.gms", name = "oss-licenses-plugin", version.ref = "ossLicensesPlugin" } + @@ -92,4 +95,4 @@ android-library = { id = "com.android.library", version.ref = "android" } kotlin-android = { id = "org.jetbrains.kotlin.android", version.ref = "kotlin-android" } google-services = { id = "com.google.gms.google-services", version.ref = "google-services" } firebase-crashlytics = { id = "com.google.firebase.crashlytics", version.ref = "firebase-crashlytics" } -hilt-android = { id = "com.google.dagger.hilt.android", version.ref = "hilt" } +hilt-android = { id = "com.google.dagger.hilt.android", version.ref = "hilt" } \ No newline at end of file diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index a739b533e..00064a0bc 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ #Fri Feb 17 11:26:14 KST 2023 distributionBase=GRADLE_USER_HOME -distributionUrl=https\://services.gradle.org/distributions/gradle-8.2-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.7-bin.zip distributionPath=wrapper/dists zipStorePath=wrapper/dists zipStoreBase=GRADLE_USER_HOME diff --git a/settings.gradle b/settings.gradle index 62f126503..ab65a43c1 100644 --- a/settings.gradle +++ b/settings.gradle @@ -4,8 +4,6 @@ pluginManagement { google() mavenCentral() maven { url='https://jitpack.io'} -// maven { url 'https://devrepo.kakao.com/nexus/content/groups/public/' } - } } dependencyResolutionManagement {