Skip to content

Commit

Permalink
Merge pull request #299 from Nexters/feature/Boolti-298
Browse files Browse the repository at this point in the history
Feature/boolti 298 공연 상세 UI 변경 (출연진 탭 추가)
  • Loading branch information
mangbaam authored Oct 1, 2024
2 parents fb1275f + aa5734d commit c006cfe
Show file tree
Hide file tree
Showing 14 changed files with 442 additions and 98 deletions.
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package com.nexters.boolti.data.datasource

import com.nexters.boolti.data.network.api.ShowService
import com.nexters.boolti.data.network.response.CastTeamsDto
import com.nexters.boolti.data.network.response.ShowDetailResponse
import com.nexters.boolti.data.network.response.ShowResponse
import javax.inject.Inject
Expand All @@ -15,4 +16,8 @@ internal class ShowDataSource @Inject constructor(
suspend fun findShowById(id: String): Result<ShowDetailResponse> = runCatching {
showService.findShowById(id)
}

suspend fun requestCastTeams(id: String): Result<List<CastTeamsDto>> = runCatching {
showService.requestCastTeams(id)
}
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package com.nexters.boolti.data.network.api

import com.nexters.boolti.data.network.response.CastTeamsDto
import com.nexters.boolti.data.network.response.ShowDetailResponse
import com.nexters.boolti.data.network.response.ShowResponse
import retrofit2.http.GET
Expand All @@ -12,4 +13,7 @@ internal interface ShowService {

@GET("/app/papi/v1/show/{id}")
suspend fun findShowById(@Path("id") id: String): ShowDetailResponse

@GET("/app/papi/v1/shows/{showId}/cast-teams")
suspend fun requestCastTeams(@Path("showId") id: String): List<CastTeamsDto>
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
package com.nexters.boolti.data.network.response

import com.nexters.boolti.domain.model.Cast
import com.nexters.boolti.domain.model.CastTeams
import kotlinx.serialization.Serializable
import java.time.LocalDateTime
import java.time.format.DateTimeFormatter

@Serializable
data class CastTeamsDto(
val id: String = "",
val name: String = "",
val members: List<CastDto> = emptyList(),
) {
fun toDomain(): CastTeams = CastTeams(
id = id,
teamName = name,
members = members.map(CastDto::toDomain),
)

@Serializable
data class CastDto(
val id: String = "",
val userCode: String = "",
val userImgPath: String? = null,
val userNickname: String = "",
val roleName: String = "",
val createdAt: String = LocalDateTime.MIN.format(DateTimeFormatter.ISO_LOCAL_DATE_TIME),
val modifiedAt: String?,
) {
fun toDomain(): Cast = Cast(
id = id,
userCode = userCode,
photo = userImgPath,
nickname = userNickname,
roleName = roleName,
)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package com.nexters.boolti.data.repository

import com.nexters.boolti.data.datasource.ShowDataSource
import com.nexters.boolti.data.network.response.toDomains
import com.nexters.boolti.domain.model.CastTeams
import com.nexters.boolti.domain.model.Show
import com.nexters.boolti.domain.model.ShowDetail
import com.nexters.boolti.domain.repository.ShowRepository
Expand All @@ -21,4 +22,37 @@ internal class ShowRepositoryImpl @Inject constructor(
it.toDomain()
}
}

override suspend fun requestCastTeams(id: String): Result<List<CastTeams>> {
/*return Result.success(
listOf(
CastTeams(
teamName = "Salty&Sweet",
members = listOf(
Cast(nickname = "김불티", roleName = "보컬"),
Cast(nickname = "박불티", roleName = "기타"),
Cast(nickname = "이불티", roleName = "기타"),
Cast(nickname = "송불티", roleName = "키보드"),
Cast(nickname = "장불티", roleName = "베이스"),
Cast(nickname = "최불티", roleName = "드럼"),
),
),
CastTeams(
teamName = "0v0",
members = listOf(
Cast(nickname = "이불티", roleName = "보컬 & 키보드"),
Cast(nickname = "송불티", roleName = "보컬 & 키보드 & 드럼 & 베이스"),
Cast(nickname = "장불티", roleName = "베이스"),
Cast(nickname = "최불티", roleName = "드럼"),
),
),
CastTeams(
teamName = "125",
)
)
)*/
return showDateSource.requestCastTeams(id).map {
it.map { it.toDomain() }
}
}
}
15 changes: 15 additions & 0 deletions domain/src/main/java/com/nexters/boolti/domain/model/Cast.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package com.nexters.boolti.domain.model

data class CastTeams(
val id: String = "",
val teamName: String = "",
val members: List<Cast> = emptyList(),
)

data class Cast(
val id: String = "",
val userCode: String = "",
val photo: String? = null,
val nickname: String = "",
val roleName: String = "",
)
Original file line number Diff line number Diff line change
@@ -1,9 +1,11 @@
package com.nexters.boolti.domain.repository

import com.nexters.boolti.domain.model.CastTeams
import com.nexters.boolti.domain.model.Show
import com.nexters.boolti.domain.model.ShowDetail

interface ShowRepository {
suspend fun search(keyword: String): Result<List<Show>>
suspend fun searchById(id: String): Result<ShowDetail>
}
suspend fun requestCastTeams(showId: String): Result<List<CastTeams>>
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
package com.nexters.boolti.presentation.component

import androidx.compose.foundation.border
import androidx.compose.foundation.layout.size
import androidx.compose.foundation.shape.CircleShape
import androidx.compose.material3.MaterialTheme
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.clip
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.layout.ContentScale
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.unit.Dp
import androidx.compose.ui.unit.dp
import coil.compose.AsyncImage
import com.nexters.boolti.presentation.R

@Composable
fun UserThumbnail(
size: Dp,
model: Any?,
modifier: Modifier = Modifier,
defaultImage: Int = R.drawable.ic_fallback_profile,
outlineColor: Color = MaterialTheme.colorScheme.outline,
contentDescription: String? = null,
) {
AsyncImage(
modifier = modifier
.size(size)
.clip(shape = CircleShape)
.border(
width = 1.dp,
color = outlineColor,
shape = CircleShape,
),
model = model,
contentDescription = contentDescription,
placeholder = painterResource(id = defaultImage),
fallback = painterResource(id = defaultImage),
contentScale = ContentScale.Crop,
)
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@ package com.nexters.boolti.presentation.screen.my

import androidx.annotation.DrawableRes
import androidx.compose.foundation.background
import androidx.compose.foundation.border
import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Column
Expand All @@ -13,7 +12,6 @@ import androidx.compose.foundation.layout.offset
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size
import androidx.compose.foundation.rememberScrollState
import androidx.compose.foundation.shape.CircleShape
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.foundation.verticalScroll
import androidx.compose.material3.HorizontalDivider
Expand All @@ -28,9 +26,7 @@ import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.clip
import androidx.compose.ui.graphics.vector.ImageVector
import androidx.compose.ui.layout.ContentScale
import androidx.compose.ui.platform.LocalUriHandler
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.res.vectorResource
import androidx.compose.ui.semantics.Role
Expand All @@ -41,11 +37,11 @@ import androidx.compose.ui.unit.dp
import androidx.compose.ui.zIndex
import androidx.hilt.navigation.compose.hiltViewModel
import androidx.lifecycle.compose.collectAsStateWithLifecycle
import coil.compose.AsyncImage
import com.nexters.boolti.domain.model.User
import com.nexters.boolti.presentation.BuildConfig
import com.nexters.boolti.presentation.R
import com.nexters.boolti.presentation.component.SmallButton
import com.nexters.boolti.presentation.component.UserThumbnail
import com.nexters.boolti.presentation.theme.BooltiTheme
import com.nexters.boolti.presentation.theme.Grey30
import com.nexters.boolti.presentation.theme.Grey80
Expand Down Expand Up @@ -125,7 +121,10 @@ fun MyScreen(
)

HorizontalDivider(
modifier = Modifier.padding(vertical = 32.dp, horizontal = marginHorizontal),
modifier = Modifier.padding(
vertical = 32.dp,
horizontal = marginHorizontal,
),
color = MaterialTheme.colorScheme.surfaceTint,
)

Expand Down Expand Up @@ -193,21 +192,10 @@ private fun MyHeader(
verticalAlignment = Alignment.CenterVertically,
) {
user?.let {
AsyncImage(
modifier = Modifier
.padding(end = 12.dp)
.size(36.dp)
.clip(shape = CircleShape)
.border(
width = 1.dp,
color = MaterialTheme.colorScheme.outline,
shape = CircleShape,
),
UserThumbnail(
modifier = Modifier.padding(end = 12.dp),
size = 36.dp,
model = user.photo,
contentDescription = null,
placeholder = painterResource(id = R.drawable.ic_fallback_profile),
fallback = painterResource(id = R.drawable.ic_fallback_profile),
contentScale = ContentScale.Crop,
)
}
Text(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@ package com.nexters.boolti.presentation.screen.profile

import android.content.ActivityNotFoundException
import androidx.compose.foundation.background
import androidx.compose.foundation.border
import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row
Expand All @@ -11,7 +10,6 @@ import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size
import androidx.compose.foundation.layout.wrapContentHeight
import androidx.compose.foundation.rememberScrollState
import androidx.compose.foundation.shape.CircleShape
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.foundation.verticalScroll
import androidx.compose.material3.Icon
Expand All @@ -24,23 +22,21 @@ import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.clip
import androidx.compose.ui.graphics.vector.ImageVector
import androidx.compose.ui.layout.ContentScale
import androidx.compose.ui.platform.LocalUriHandler
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.res.vectorResource
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.unit.dp
import androidx.hilt.navigation.compose.hiltViewModel
import androidx.lifecycle.compose.collectAsStateWithLifecycle
import coil.compose.AsyncImage
import com.nexters.boolti.domain.model.Link
import com.nexters.boolti.domain.model.User
import com.nexters.boolti.presentation.R
import com.nexters.boolti.presentation.component.BtAppBarDefaults
import com.nexters.boolti.presentation.component.BtBackAppBar
import com.nexters.boolti.presentation.component.SmallButton
import com.nexters.boolti.presentation.component.UserThumbnail
import com.nexters.boolti.presentation.extension.toValidUrlString
import com.nexters.boolti.presentation.screen.LocalSnackbarController
import com.nexters.boolti.presentation.theme.Grey30
Expand Down Expand Up @@ -148,21 +144,10 @@ private fun ProfileHeader(
.padding(horizontal = marginHorizontal)
.padding(bottom = 32.dp),
) {
AsyncImage(
modifier = Modifier
.padding(top = 40.dp)
.size(70.dp)
.clip(shape = CircleShape)
.border(
width = 1.dp,
color = MaterialTheme.colorScheme.outline,
shape = CircleShape,
),
UserThumbnail(
modifier = Modifier.padding(top = 40.dp),
size = 70.dp,
model = user.photo,
contentDescription = null,
placeholder = painterResource(id = R.drawable.ic_fallback_profile),
fallback = painterResource(id = R.drawable.ic_fallback_profile),
contentScale = ContentScale.Crop,
)
Text(
modifier = Modifier.padding(top = 20.dp),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,6 @@ import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.clip
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.vector.ImageVector
import androidx.compose.ui.layout.ContentScale
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.res.vectorResource
Expand All @@ -51,14 +50,14 @@ import androidx.compose.ui.unit.dp
import androidx.constraintlayout.compose.ConstraintLayout
import androidx.hilt.navigation.compose.hiltViewModel
import androidx.lifecycle.compose.collectAsStateWithLifecycle
import coil.compose.AsyncImage
import com.nexters.boolti.domain.model.Link
import com.nexters.boolti.presentation.R
import com.nexters.boolti.presentation.component.BTDialog
import com.nexters.boolti.presentation.component.BTTextField
import com.nexters.boolti.presentation.component.BtAppBar
import com.nexters.boolti.presentation.component.BtAppBarDefaults
import com.nexters.boolti.presentation.component.BtCircularProgressIndicator
import com.nexters.boolti.presentation.component.UserThumbnail
import com.nexters.boolti.presentation.extension.takeForUnicode
import com.nexters.boolti.presentation.screen.LocalSnackbarController
import com.nexters.boolti.presentation.theme.Grey15
Expand Down Expand Up @@ -222,16 +221,10 @@ fun ProfileEditScreen(
.height(180.dp),
) {
val (thumbnailImg, cameraIcon) = createRefs()
AsyncImage(
modifier = Modifier
.constrainAs(thumbnailImg) {
centerTo(parent)
}
.size(100.dp)
.clip(CircleShape)
.border(1.dp, MaterialTheme.colorScheme.outline, CircleShape),
UserThumbnail(
modifier = Modifier.constrainAs(thumbnailImg) { centerTo(parent) },
size = 100.dp,
model = selectedImage ?: thumbnail,
contentScale = ContentScale.Crop,
contentDescription = stringResource(R.string.description_user_thumbnail),
)
Surface(
Expand Down
Loading

0 comments on commit c006cfe

Please sign in to comment.