Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 18 additions & 0 deletions app/src/main/java/com/threegap/bitnagil/MainNavHost.kt
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ import com.threegap.bitnagil.presentation.onboarding.OnBoardingScreenContainer
import com.threegap.bitnagil.presentation.onboarding.OnBoardingViewModel
import com.threegap.bitnagil.presentation.onboarding.model.navarg.OnBoardingScreenArg
import com.threegap.bitnagil.presentation.report.ReportScreenContainer
import com.threegap.bitnagil.presentation.reporthistory.ReportHistoryScreenContainer
import com.threegap.bitnagil.presentation.routinelist.RoutineListScreenContainer
import com.threegap.bitnagil.presentation.setting.SettingScreenContainer
import com.threegap.bitnagil.presentation.splash.SplashScreenContainer
Expand Down Expand Up @@ -140,6 +141,11 @@ fun MainNavHost(
launchSingleTop = true
}
},
navigateToReportHistory = {
navigator.navController.navigate(Route.ReportHistory) {
launchSingleTop = true
}
},
)
}

Expand Down Expand Up @@ -305,5 +311,17 @@ fun MainNavHost(
},
)
}

composable<Route.ReportHistory> {
ReportHistoryScreenContainer(
navigateToBack = {
if (navigator.navController.previousBackStackEntry != null) {
navigator.navController.popBackStack()
}
},
navigateToReportDetail = {
},
)
}
}
}
3 changes: 3 additions & 0 deletions app/src/main/java/com/threegap/bitnagil/Route.kt
Original file line number Diff line number Diff line change
Expand Up @@ -51,4 +51,7 @@ sealed interface Route {

@Serializable
data object Report : Route

@Serializable
data object ReportHistory : Route
}
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,7 @@ fun HomeNavHost(
navigateToEmotion: () -> Unit,
navigateToRoutineList: (String) -> Unit,
navigateToReport: () -> Unit,
navigateToReportHistory: () -> Unit,
) {
val navigator = rememberHomeNavigator()
var showFloatingOverlay by remember { mutableStateOf(false) }
Expand Down Expand Up @@ -89,6 +90,7 @@ fun HomeNavHost(
navigateToOnBoarding = navigateToOnBoarding,
navigateToNotice = navigateToNotice,
navigateToQnA = navigateToQnA,
navigateToReportHistory = navigateToReportHistory,
)
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,10 @@ data class BitnagilColors(
val error: Color = Error,
val error10: Color = Error10,
val skyBlue10: Color = SkyBlue10,
val blue300: Color = Blue300,
val purple10: Color = Purple10,
val green10: Color = Green10,
val green300: Color = Green300,
val pink10: Color = Pink10,
val yellow10: Color = Yellow10,
val progressBarGradientStartColor: Color = ProgressBarGradientStartColor,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,10 @@ val Kakao = Color(0xFFFEE500)
val Error = Color(0xFFFF6868)
val Error10 = Color(0xFFFF5858)
val SkyBlue10 = Color(0xFFDBF1FF)
val Blue300 = Color(0xFF0093F5)
val Purple10 = Color(0xFFE6E2FF)
val Green10 = Color(0xFFE6F5C6)
val Green300 = Color(0xFF3FAF00)
val Pink10 = Color(0xFFFEE3E9)
val Yellow10 = Color(0xFFFFF5C7)
val ProgressBarGradientStartColor = Color(0xFFA9CFFF)
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
package com.threegap.bitnagil.designsystem.component.atom

import androidx.compose.foundation.background
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import com.threegap.bitnagil.designsystem.BitnagilTheme
import com.threegap.bitnagil.designsystem.modifier.clickableWithoutRipple

@Composable
fun BitnagilChip(
title: String,
isSelected: Boolean,
onCategorySelected: () -> Unit,
modifier: Modifier = Modifier,
) {
Box(
contentAlignment = Alignment.Center,
modifier = modifier
.background(
color = if (!isSelected) BitnagilTheme.colors.white else BitnagilTheme.colors.coolGray10,
shape = RoundedCornerShape(20.dp),
)
.height(36.dp)
.clickableWithoutRipple(onClick = onCategorySelected)
.padding(
vertical = 6.dp,
horizontal = 14.dp,
),
) {
Text(
text = title,
color = if (!isSelected) BitnagilTheme.colors.coolGray60 else BitnagilTheme.colors.white,
style = if (!isSelected) BitnagilTheme.typography.caption1Medium else BitnagilTheme.typography.caption1SemiBold,
)
}
}

@Preview
@Composable
private fun RecommendCategoryChipStatesPreview() {
Column(
verticalArrangement = Arrangement.spacedBy(8.dp),
) {
BitnagilChip(
title = "맞춤 추천",
isSelected = true,
onCategorySelected = {},
)
}
}
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
package com.threegap.bitnagil.data.report.datasource

import com.threegap.bitnagil.data.report.model.request.ReportRequestDto
import com.threegap.bitnagil.data.report.model.response.ReportHistoriesPerDateDto

interface ReportDataSource {
suspend fun submitReport(reportRequestDto: ReportRequestDto): Result<Long>
suspend fun getReports(): Result<ReportHistoriesPerDateDto>
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package com.threegap.bitnagil.data.report.datasourceImpl
import com.threegap.bitnagil.data.common.safeApiCall
import com.threegap.bitnagil.data.report.datasource.ReportDataSource
import com.threegap.bitnagil.data.report.model.request.ReportRequestDto
import com.threegap.bitnagil.data.report.model.response.ReportHistoriesPerDateDto
import com.threegap.bitnagil.data.report.service.ReportService
import javax.inject.Inject

Expand All @@ -12,4 +13,8 @@ class ReportDataSourceImpl @Inject constructor(
override suspend fun submitReport(reportRequestDto: ReportRequestDto): Result<Long> {
return safeApiCall { reportService.submitReport(reportRequestDto) }
}

override suspend fun getReports(): Result<ReportHistoriesPerDateDto> {
return safeApiCall { reportService.getReports() }
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package com.threegap.bitnagil.data.report.model.response

import com.threegap.bitnagil.domain.report.model.ReportItem
import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable
import java.time.LocalDate

@Serializable
data class ReportHistoriesPerDateDto(
@SerialName("reportInfos")
val reportInfos: Map<String, List<ReportItemDto>>,
)

fun ReportHistoriesPerDateDto.toDomainMap(): Map<LocalDate, List<ReportItem>> =
this.reportInfos
.mapKeys { LocalDate.parse(it.key) }
.mapValues { entry ->
entry.value.map { it.toDomain() }
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
package com.threegap.bitnagil.data.report.model.response

import com.threegap.bitnagil.domain.report.model.ReportCategory
import com.threegap.bitnagil.domain.report.model.ReportItem
import com.threegap.bitnagil.domain.report.model.ReportStatus
import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable

@Serializable
data class ReportItemDto(
@SerialName("reportId")
val reportId: Int,
@SerialName("reportStatus")
val reportStatus: String,
@SerialName("reportTitle")
val reportTitle: String,
@SerialName("reportCategory")
val reportCategory: String,
@SerialName("reportLocation")
val reportLocation: String,
@SerialName("reportImageUrl")
val reportImageUrl: String,
)

fun ReportItemDto.toDomain(): ReportItem =
ReportItem(
id = this.reportId,
status = ReportStatus.fromString(this.reportStatus),
title = this.reportTitle,
category = ReportCategory.fromString(this.reportCategory),
address = this.reportLocation,
imageUrl = this.reportImageUrl,
)
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,11 @@ package com.threegap.bitnagil.data.report.repositoryImpl

import com.threegap.bitnagil.data.report.datasource.ReportDataSource
import com.threegap.bitnagil.data.report.model.request.toDto
import com.threegap.bitnagil.data.report.model.response.toDomainMap
import com.threegap.bitnagil.domain.report.model.Report
import com.threegap.bitnagil.domain.report.model.ReportItem
import com.threegap.bitnagil.domain.report.repository.ReportRepository
import java.time.LocalDate
import javax.inject.Inject

class ReportRepositoryImpl @Inject constructor(
Expand All @@ -12,4 +15,8 @@ class ReportRepositoryImpl @Inject constructor(
override suspend fun submitReport(report: Report): Result<Long> {
return reportDataSource.submitReport(report.toDto())
}

override suspend fun getReportHistories(): Result<Map<LocalDate, List<ReportItem>>> {
return reportDataSource.getReports().map { it.toDomainMap() }
}
}
Original file line number Diff line number Diff line change
@@ -1,13 +1,18 @@
package com.threegap.bitnagil.data.report.service

import com.threegap.bitnagil.data.report.model.request.ReportRequestDto
import com.threegap.bitnagil.data.report.model.response.ReportHistoriesPerDateDto
import com.threegap.bitnagil.network.model.BaseResponse
import retrofit2.http.Body
import retrofit2.http.GET
import retrofit2.http.POST

interface ReportService {
@POST("/api/v2/reports")
suspend fun submitReport(
@Body reportRequestDto: ReportRequestDto,
): BaseResponse<Long>

@GET("/api/v2/reports")
suspend fun getReports(): BaseResponse<ReportHistoriesPerDateDto>
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package com.threegap.bitnagil.domain.report.model

data class ReportItem(
val id: Int,
val title: String,
val category: ReportCategory,
val status: ReportStatus,
val imageUrl: String,
val address: String,
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package com.threegap.bitnagil.domain.report.model

enum class ReportStatus {
Pending,
InProgress,
Completed,
;

companion object {
fun fromString(value: String): ReportStatus {
return when (value) {
"PENDING" -> Pending
"IN_PROGRESS" -> InProgress
"COMPLETED" -> Completed
else -> throw IllegalArgumentException("Invalid ReportStatus value: $value")
}
}

fun toString(value: ReportStatus): String {
return when (value) {
Pending -> "PENDING"
InProgress -> "IN_PROGRESS"
Completed -> "COMPLETED"
}
}
}
}
Original file line number Diff line number Diff line change
@@ -1,7 +1,10 @@
package com.threegap.bitnagil.domain.report.repository

import com.threegap.bitnagil.domain.report.model.Report
import com.threegap.bitnagil.domain.report.model.ReportItem
import java.time.LocalDate

interface ReportRepository {
suspend fun submitReport(report: Report): Result<Long>
suspend fun getReportHistories(): Result<Map<LocalDate, List<ReportItem>>>
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package com.threegap.bitnagil.domain.report.usecase

import com.threegap.bitnagil.domain.report.model.ReportItem
import com.threegap.bitnagil.domain.report.repository.ReportRepository
import java.time.LocalDate
import javax.inject.Inject

class GetReportHistoriesUseCase @Inject constructor(
private val reportRepository: ReportRepository,
) {
suspend operator fun invoke(): Result<Map<LocalDate, List<ReportItem>>> {
return reportRepository.getReportHistories()
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@ fun MyPageScreenContainer(
navigateToNotice: () -> Unit,
navigateToQnA: () -> Unit,
navigateToOnBoarding: () -> Unit,
navigateToReportHistory: () -> Unit,
) {
val state by myPageViewModel.stateFlow.collectAsState()

Expand All @@ -47,6 +48,7 @@ fun MyPageScreenContainer(
onClickNotice = navigateToNotice,
onClickResetOnBoarding = navigateToOnBoarding,
onClickQnA = navigateToQnA,
onClickReportHistory = navigateToReportHistory,
)
}

Expand All @@ -57,6 +59,7 @@ private fun MyPageScreen(
onClickNotice: () -> Unit,
onClickResetOnBoarding: () -> Unit,
onClickQnA: () -> Unit,
onClickReportHistory: () -> Unit,
) {
Column(
modifier = Modifier
Expand Down Expand Up @@ -100,6 +103,11 @@ private fun MyPageScreen(

Spacer(modifier = Modifier.height(16.dp))

BitnagilOptionButton(
title = "내 제보 기록",
onClick = onClickReportHistory,
)

BitnagilOptionButton(
title = "내 목표 재설정",
onClick = onClickResetOnBoarding,
Expand Down Expand Up @@ -127,6 +135,7 @@ fun MyPageScreenPreview() {
onClickNotice = { },
onClickResetOnBoarding = { },
onClickQnA = { },
onClickReportHistory = { },
)
}
}
Loading