Skip to content

Commit

Permalink
[FEAT] #7 - make page detail
Browse files Browse the repository at this point in the history
  • Loading branch information
daehwan2da committed May 27, 2023
1 parent d107c6d commit f35f354
Show file tree
Hide file tree
Showing 15 changed files with 469 additions and 15 deletions.
3 changes: 3 additions & 0 deletions app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,9 @@
android:exported="true" />
<activity
android:name=".presentation.page.PageActivity"
android:exported="false" />
<activity
android:name=".presentation.home.HomeActivity"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
Expand Down
4 changes: 4 additions & 0 deletions app/src/main/java/com/sopt/carrot/data/ApiPool.kt
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
package com.sopt.carrot.data

import com.sopt.carrot.BuildConfig.API_SERVER_URL
import com.sopt.carrot.data.home.FullListService
import com.sopt.carrot.data.home.RecommendService
import com.sopt.carrot.data.page.PageService
import com.sopt.carrot.data.profile.ProfileService
import com.sopt.carrot.data.review.ReviewService
Expand All @@ -14,6 +16,8 @@ object ApiPool {
val pageService = RetrofitPool.toApiServer.create(PageService::class.java)
val reviewService = RetrofitPool.toApiServer.create(ReviewService::class.java)
val profileService = RetrofitPool.toApiServer.create(ProfileService::class.java)
val fullListService = RetrofitPool.toApiServer.create(FullListService::class.java)
val recommendService = RetrofitPool.toApiServer.create(RecommendService::class.java)
}

object RetrofitPool {
Expand Down
33 changes: 33 additions & 0 deletions app/src/main/java/com/sopt/carrot/data/page/AlbaResponse.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
package com.sopt.carrot.data.page

import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable

@kotlinx.serialization.Serializable
data class AlbaResponse(
@SerialName("status")
val status: Integer,
@SerialName("success")
val success: Boolean,
@SerialName("message")
val message: String,
@SerialName("status")
val data: Detail
) {
@kotlinx.serialization.Serializable
data class Detail(
@SerialName("posts")
val posts: List<Post>
) {
@Serializable
data class Post(
@SerialName("title")
val title: String,
@SerialName("image")
val image: String,
@SerialName("hourlyWage")
val hourlyWage: Int
)

}
}
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ data class PageResponse(
) {
@Serializable
data class Detail(
val userId: Long,
val image: String,
val categories: List<String>,
val title: String,
Expand Down
8 changes: 8 additions & 0 deletions app/src/main/java/com/sopt/carrot/data/page/PageService.kt
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,20 @@ package com.sopt.carrot.data.page

import retrofit2.Call
import retrofit2.http.GET
import retrofit2.http.Header
import retrofit2.http.Path
import retrofit2.http.Query

interface PageService {
@GET("/posts/{postId}")
fun getPage(
@Header("Authorization") Authorization: Int,
@Path(value = "postId") postId: Long
): Call<PageResponse>

@GET("/posts/list")
fun getAlba(
@Header("Authorization") Authorization: Int,
@Query("size") size: Long
): Call<AlbaResponse>
}
60 changes: 60 additions & 0 deletions app/src/main/java/com/sopt/carrot/presentation/page/AlbaAdaptor.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
package com.sopt.carrot.presentation.page

import android.view.LayoutInflater
import android.view.ViewGroup
import androidx.recyclerview.widget.DiffUtil
import androidx.recyclerview.widget.ListAdapter
import androidx.recyclerview.widget.RecyclerView
import coil.load
import com.sopt.carrot.data.page.AlbaResponse
import com.sopt.carrot.databinding.ItemHomeFullJobBinding

class AlbaAdaptor() :
ListAdapter<AlbaResponse.Detail.Post, AlbaAdaptor.JobAdapterViewHolder>(diffUtil) {

class JobAdapterViewHolder(private val binding: ItemHomeFullJobBinding) :
RecyclerView.ViewHolder(binding.root) {

fun onBind(data: AlbaResponse.Detail.Post) {
with(binding) {
ivItemHomeFullJobImg.load(data.image)
tvItemHomeFullJobTitle.text = data.title
tvItemHomeFullJobSalary.text = "시급 " + data.hourlyWage.toString() + "만원"
}
}
}

companion object {
val diffUtil = object : DiffUtil.ItemCallback<AlbaResponse.Detail.Post>() {
override fun areItemsTheSame(
oldItem: AlbaResponse.Detail.Post,
newItem: AlbaResponse.Detail.Post
): Boolean {
return oldItem.title == newItem.title
}

override fun areContentsTheSame(
oldItem: AlbaResponse.Detail.Post,
newItem: AlbaResponse.Detail.Post
): Boolean {
return oldItem == newItem
}

}
}

override fun getItemCount(): Int = 3

override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): JobAdapterViewHolder {
val binding = ItemHomeFullJobBinding.inflate(
LayoutInflater.from(parent.context),
parent,
false
)
return JobAdapterViewHolder(binding)
}

override fun onBindViewHolder(holder: JobAdapterViewHolder, position: Int) {
holder.onBind(getItem(position) as AlbaResponse.Detail.Post)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,10 +6,13 @@ import androidx.activity.viewModels
import androidx.appcompat.app.AppCompatActivity
import coil.load
import com.sopt.carrot.databinding.ActivityPageBinding
import com.sopt.carrot.presentation.review.adapter.ReviewAdapter

class PageActivity : AppCompatActivity() {
lateinit var binding: ActivityPageBinding
private val viewModel: PageViewModel by viewModels()
lateinit var reviewAdaptor: ReviewAdapter
lateinit var albaAdaptor: AlbaAdaptor

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
Expand All @@ -27,8 +30,19 @@ class PageActivity : AppCompatActivity() {
"error ${str}",
Toast.LENGTH_SHORT
).show()
})

reviewAdaptor = ReviewAdapter()
binding.rcPageReviews.adapter = reviewAdaptor
viewModel.getReviews { str ->
Toast.makeText(
this,
"error ${str}",
Toast.LENGTH_SHORT
).show()
}
)

viewModel.getAlba(binding.rcPageAlbas)
}

private fun observe() {
Expand All @@ -39,6 +53,13 @@ class PageActivity : AppCompatActivity() {
binding.tvPageBodyContent.text = response.data.content
binding.tvPageMapDetail.text = response.data.address
}
viewModel.reviews.observe(this) { response ->
if (response.size > 3) {
reviewAdaptor.updateList(response.slice(0..2))
} else {
reviewAdaptor.updateList(response)
}
}
}

private fun getPageIdFromHome(): Long {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,34 +1,72 @@
package com.sopt.carrot.presentation.page

import android.widget.Toast
import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel
import androidx.recyclerview.widget.RecyclerView
import com.sopt.carrot.data.ApiPool
import com.sopt.carrot.data.page.AlbaResponse
import com.sopt.carrot.data.page.PageResponse
import com.sopt.carrot.data.review.ResponseReviewDto
import com.sopt.carrot.util.enqueueUtil
import retrofit2.Call
import retrofit2.Callback
import retrofit2.Response

class PageViewModel : ViewModel() {
private val _pageResponse: MutableLiveData<PageResponse> = MutableLiveData()
val pageResponse: LiveData<PageResponse> = _pageResponse

fun getPageDetail(pageId: Long, logging: (String) -> Unit ) {
ApiPool.pageService.getPage(pageId).enqueue(object : retrofit2.Callback<PageResponse> {
private val _reviews: MutableLiveData<List<ResponseReviewDto.Data.Review>> = MutableLiveData()
val reviews: LiveData<List<ResponseReviewDto.Data.Review>> get() = _reviews

private val _alba: MutableLiveData<AlbaResponse> = MutableLiveData()
val alba: LiveData<AlbaResponse> get() = _alba

internal fun getPageDetail(pageId: Long, logging: (String) -> Unit) {
ApiPool.pageService.getPage(1, pageId).enqueue(object : retrofit2.Callback<PageResponse> {
override fun onResponse(call: Call<PageResponse>, response: Response<PageResponse>) {
if (response.isSuccessful) { // 200
_pageResponse.value = response.body()
}
else {
} else {
logging.invoke("response error")
}
}

override fun onFailure(call: Call<PageResponse>, t: Throwable) {

logging.invoke("network error")
}
})
}

internal fun getReviews(logging: (String) -> Unit) {
ApiPool.reviewService.getReviewList(getUserId())
.enqueue(object : Callback<ResponseReviewDto> {
override fun onResponse(
call: Call<ResponseReviewDto>,
response: Response<ResponseReviewDto>
) {
if (response.isSuccessful) {
_reviews.value = response.body()?.data?.reviews
} else {
logging.invoke("리뷰 조회 실패")
}
}

override fun onFailure(call: Call<ResponseReviewDto>, t: Throwable) {
logging.invoke("network error")
}
})
}

internal fun getAlba(rc: RecyclerView) {
ApiPool.pageService.getAlba(1, 3).enqueueUtil(
onSuccess = {
_alba.value = it
rc.adapter = AlbaAdaptor().apply { submitList(it.data.posts) }
}
)
}

internal fun getUserId() = 1L
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import coil.load
import coil.transform.CircleCropTransformation
import com.sopt.carrot.data.review.ResponseReviewDto
import com.sopt.carrot.databinding.ItemReviewBinding
import com.sopt.carrot.util.StringUtils

class ReviewAdapter : RecyclerView.Adapter<RecyclerView.ViewHolder>() {
private var itemList: List<ResponseReviewDto.Data.Review> = listOf()
Expand Down
20 changes: 20 additions & 0 deletions app/src/main/java/com/sopt/carrot/util/StringUtils.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package com.sopt.carrot.util

object StringUtils {
fun lineHandle(comment: String): String {
var newString = ""
var index = 0

while (index < comment.length) {
if (index > 0) {
newString += "\n" + comment.slice(index..getSmall(comment.length - 1, index + 26))
} else {
newString += comment.slice(index..getSmall(comment.length - 1, index + 26))
}
index += 27
}
return newString
}

fun getSmall(a: Int, b: Int) = if (a <= b) a else b
}
5 changes: 5 additions & 0 deletions app/src/main/res/drawable/rectangle_gray7_radius_7.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle">
<solid android:color="@color/color_sub_gray7"/>
<corners android:radius="6dp"/>
</shape>
Loading

0 comments on commit f35f354

Please sign in to comment.