Skip to content
Merged
Show file tree
Hide file tree
Changes from 11 commits
Commits
Show all changes
59 commits
Select commit Hold shift + click to select a range
86dc37c
Feat: 리플효과 제거 modifier 확장함수 정의
wjdrjs00 Jul 26, 2025
db583bf
Feat: 색상 추가 및 수정
wjdrjs00 Jul 27, 2025
55cd8e5
Feat: 리플효과 제거 modifier 확장함수 정의
wjdrjs00 Jul 26, 2025
b1ded46
Feat: 색상 추가 및 수정
wjdrjs00 Jul 27, 2025
bedd17e
Feat: BitnagilTextButton 공통 컴포넌트 추가
wjdrjs00 Jul 27, 2025
02e78eb
Feat: BitnagilSelectButton 공통 컴포넌트 추가
wjdrjs00 Jul 27, 2025
840f903
Feat: BitnagilIcon 공통 컴포넌트 추가
wjdrjs00 Jul 27, 2025
5db6ea8
Feat: BitnagilProgressBar 공통 컴포넌트 구현
wjdrjs00 Jul 27, 2025
f312261
Feat: BitnagilProgressTopBar 공통 컴포넌트 구현
wjdrjs00 Jul 27, 2025
c1b5fe9
Ui: 온보딩화면 공통컴포넌트 적용 및 ui 고도화
wjdrjs00 Jul 27, 2025
8047a3a
Ui: 아이콘 에셋 추가
wjdrjs00 Jul 27, 2025
4d1cbfe
Feat: BitnagilCheckBox 컴포넌트 추가
wjdrjs00 Jul 27, 2025
f06fbef
Merge branch 'ui/#45-common-component' of https://github.com/YAPP-Git…
wjdrjs00 Jul 27, 2025
d99c5e8
Feat: BitnagilOptionButton 공통 컴포넌트 추가
wjdrjs00 Jul 27, 2025
1ef8328
Ui: 마이페이지 및 설정 BitnagilOptionButton 컴포넌트 적용
wjdrjs00 Jul 27, 2025
906ea0e
Add: 해상도별 감정구슬 추가
wjdrjs00 Jul 27, 2025
be44f99
Feat: 감정 선택 화면 퍼브리싱 및 감정 아이콘 적용
wjdrjs00 Jul 27, 2025
dc53e98
Refactor: BitnagilIcon 컴포넌트 onClick 로직 제거
wjdrjs00 Jul 27, 2025
675f25c
Feat: 루틴 등록 화면 퍼블리싱
wjdrjs00 Jul 28, 2025
5df4bc0
Feat: BitnagilTopBar 공통 컴포넌트 추가
wjdrjs00 Jul 28, 2025
c965421
Feat: 약관동의 화면 퍼블리싱
wjdrjs00 Jul 28, 2025
c3b45c3
Feat: 추천루틴 화면 퍼블리싱
wjdrjs00 Jul 28, 2025
433f801
Feat: BitnagilFloatingButton 컴포넌트 추가
wjdrjs00 Jul 28, 2025
3044a5e
Feat: 쉐도우가 있는 감정구슬 컴포넌트 구현
wjdrjs00 Jul 28, 2025
33e01d6
Feat: 홈 화면 퍼블리싱
wjdrjs00 Jul 28, 2025
f5c77c8
Chore: ktlintFormat 적용
wjdrjs00 Jul 28, 2025
c5aea0f
Chore: clickable을 clickableWithoutRipple로 변경
wjdrjs00 Jul 28, 2025
ed0893d
Refactor: BitnagilOptionButton 컴포넌트 패딩 위치 변경
wjdrjs00 Jul 28, 2025
538e738
Chore: ktlintFormat 적용
wjdrjs00 Jul 28, 2025
30982d0
Feat: 추천 루틴 관련 응답 dto 모델 정의
wjdrjs00 Jul 29, 2025
c3c6f6c
Feat: 인트로 화면 캐릭터 그래픽 추가
wjdrjs00 Jul 29, 2025
9b61c0a
Feat: 온보딩 화면 캐릭터 그래픽 추가
wjdrjs00 Jul 29, 2025
f2900eb
Feat: BitnagilCheckBox 컴포저블 기능 추가
wjdrjs00 Jul 29, 2025
f3f1f14
Feat: BitnagilIconButton 컴포넌트 추가
wjdrjs00 Jul 29, 2025
78758dc
Feat: 추천 루틴 도메인 모델 정의
wjdrjs00 Jul 29, 2025
268ae06
Feat: dto -> domain 매핑 로직 추가
wjdrjs00 Jul 29, 2025
92b5515
Feat: 추천 루틴 조회 API 연동
wjdrjs00 Jul 29, 2025
902f368
Feat: 추천 루틴 UI 모델 및 매퍼 추가
wjdrjs00 Jul 29, 2025
e3771b7
Refactor: 추천루틴 도메인 모델 적용 및 관련 UI 로직 수정
wjdrjs00 Jul 29, 2025
9dac88f
Refactor: 추천 루틴 API 연동 및 ViewModel 로직 수정
wjdrjs00 Jul 29, 2025
11ecdba
Chore: ktlintFormat 적용
wjdrjs00 Jul 29, 2025
d2b73a4
Chore: 추천 루틴 설명 한 줄 초과 시 Ellipsis 처리
wjdrjs00 Jul 29, 2025
97cd2cb
Merge pull request #48 from YAPP-Github/ui/#45-common-component
wjdrjs00 Jul 29, 2025
b8dbc2c
Chore: ktlintFormat 적용
wjdrjs00 Jul 29, 2025
77a5a60
Fix: 추천 루틴 등록 시 루틴 id 타입 변경
wjdrjs00 Jul 29, 2025
01c02b6
Feat: 추천 루틴 관련 응답 dto 모델 정의
wjdrjs00 Jul 29, 2025
5751d46
Feat: 추천 루틴 도메인 모델 정의
wjdrjs00 Jul 29, 2025
31c555d
Feat: dto -> domain 매핑 로직 추가
wjdrjs00 Jul 29, 2025
378fa6b
Feat: 추천 루틴 조회 API 연동
wjdrjs00 Jul 29, 2025
f39cdd3
Feat: 추천 루틴 UI 모델 및 매퍼 추가
wjdrjs00 Jul 29, 2025
26b55d2
Refactor: 추천루틴 도메인 모델 적용 및 관련 UI 로직 수정
wjdrjs00 Jul 29, 2025
a15cdce
Refactor: 추천 루틴 API 연동 및 ViewModel 로직 수정
wjdrjs00 Jul 29, 2025
0e7a982
Chore: ktlintFormat 적용
wjdrjs00 Jul 29, 2025
3b8223b
Chore: 추천 루틴 설명 한 줄 초과 시 Ellipsis 처리
wjdrjs00 Jul 29, 2025
d8872c2
Chore: ktlintFormat 적용
wjdrjs00 Jul 29, 2025
443b720
Fix: 추천 루틴 등록 시 루틴 id 타입 변경
wjdrjs00 Jul 29, 2025
4d773ea
Chore: ktlintFormat 적용
wjdrjs00 Jul 29, 2025
1ed24bf
Merge branch 'feature/#50-recommend-routine-api' of https://github.co…
wjdrjs00 Jul 29, 2025
7d0f361
Chore: import문 제거
wjdrjs00 Jul 29, 2025
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
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@ import com.threegap.bitnagil.data.emotion.datasource.EmotionDataSource
import com.threegap.bitnagil.data.emotion.datasourceImpl.EmotionDataSourceImpl
import com.threegap.bitnagil.data.onboarding.datasource.OnBoardingDataSource
import com.threegap.bitnagil.data.onboarding.datasourceImpl.OnBoardingDataSourceImpl
import com.threegap.bitnagil.data.recommendroutine.datasource.RecommendRoutineDataSource
import com.threegap.bitnagil.data.recommendroutine.datasourceImpl.RecommendRoutineDataSourceImpl
import com.threegap.bitnagil.data.routine.datasource.RoutineRemoteDataSource
import com.threegap.bitnagil.data.routine.datasourceImpl.RoutineRemoteDataSourceImpl
import com.threegap.bitnagil.data.writeroutine.datasource.WriteRoutineDataSource
Expand Down Expand Up @@ -45,4 +47,8 @@ abstract class DataSourceModule {
@Binds
@Singleton
abstract fun bindWriteRoutineDataSource(writeRoutineDataSourceImpl: WriteRoutineDataSourceImpl): WriteRoutineDataSource

@Binds
@Singleton
abstract fun bindRecommendRoutineDataSource(recommendRoutineDataSourceImpl: RecommendRoutineDataSourceImpl): RecommendRoutineDataSource
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,13 @@ package com.threegap.bitnagil.di.data
import com.threegap.bitnagil.data.auth.repositoryimpl.AuthRepositoryImpl
import com.threegap.bitnagil.data.emotion.repositoryImpl.EmotionRepositoryImpl
import com.threegap.bitnagil.data.onboarding.repositoryImpl.OnBoardingRepositoryImpl
import com.threegap.bitnagil.data.recommendroutine.repositoryImpl.RecommendRoutineRepositoryImpl
import com.threegap.bitnagil.data.routine.repositoryImpl.RoutineRepositoryImpl
import com.threegap.bitnagil.data.writeroutine.repositoryImpl.WriteRoutineRepositoryImpl
import com.threegap.bitnagil.domain.auth.repository.AuthRepository
import com.threegap.bitnagil.domain.emotion.repository.EmotionRepository
import com.threegap.bitnagil.domain.onboarding.repository.OnBoardingRepository
import com.threegap.bitnagil.domain.recommendroutine.repository.RecommendRoutineRepository
import com.threegap.bitnagil.domain.routine.repository.RoutineRepository
import com.threegap.bitnagil.domain.writeroutine.repository.WriteRoutineRepository
import dagger.Binds
Expand Down Expand Up @@ -39,4 +41,8 @@ abstract class RepositoryModule {
@Binds
@Singleton
abstract fun bindWriteRoutineRepository(writeRoutineRepositoryImpl: WriteRoutineRepositoryImpl): WriteRoutineRepository

@Binds
@Singleton
abstract fun bindRecommendRoutineRepository(recommendRoutineRepositoryImpl: RecommendRoutineRepositoryImpl): RecommendRoutineRepository
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package com.threegap.bitnagil.di.data
import com.threegap.bitnagil.data.auth.service.AuthService
import com.threegap.bitnagil.data.emotion.service.EmotionService
import com.threegap.bitnagil.data.onboarding.service.OnBoardingService
import com.threegap.bitnagil.data.recommendroutine.service.RecommendRoutineService
import com.threegap.bitnagil.data.routine.service.RoutineService
import com.threegap.bitnagil.data.writeroutine.service.WriteRoutineService
import com.threegap.bitnagil.di.core.Auth
Expand Down Expand Up @@ -48,4 +49,9 @@ object ServiceModule {
@Singleton
fun provideReissueService(@NoneAuth retrofit: Retrofit): ReissueService =
retrofit.create(ReissueService::class.java)

@Provides
@Singleton
fun provideRecommendRoutineService(@Auth retrofit: Retrofit): RecommendRoutineService =
retrofit.create(RecommendRoutineService::class.java)
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package com.threegap.bitnagil.data.recommendroutine.datasource

import com.threegap.bitnagil.data.recommendroutine.model.response.RecommendRoutinesDto

interface RecommendRoutineDataSource {
suspend fun fetchRecommendRoutines(): Result<RecommendRoutinesDto>
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package com.threegap.bitnagil.data.recommendroutine.datasourceImpl

import com.threegap.bitnagil.data.common.safeApiCall
import com.threegap.bitnagil.data.recommendroutine.datasource.RecommendRoutineDataSource
import com.threegap.bitnagil.data.recommendroutine.model.response.RecommendRoutinesDto
import com.threegap.bitnagil.data.recommendroutine.service.RecommendRoutineService
import javax.inject.Inject

class RecommendRoutineDataSourceImpl @Inject constructor(
private val recommendRoutineService: RecommendRoutineService,
) : RecommendRoutineDataSource {

override suspend fun fetchRecommendRoutines(): Result<RecommendRoutinesDto> =
safeApiCall {
recommendRoutineService.fetchRecommendRoutines()
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package com.threegap.bitnagil.data.recommendroutine.model.response

import com.threegap.bitnagil.domain.recommendroutine.model.EmotionMarbleType
import com.threegap.bitnagil.domain.recommendroutine.model.RecommendCategory
import com.threegap.bitnagil.domain.recommendroutine.model.RecommendRoutines
import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable

@Serializable
data class RecommendRoutinesDto(
@SerialName("recommendedRoutines")
val recommendedRoutinesByCategory: Map<String, List<RecommendedRoutineDto>>,
@SerialName("emotionMarbleType")
val emotionMarbleType: String?,
)

fun RecommendRoutinesDto.toDomain(): RecommendRoutines =
RecommendRoutines(
recommendRoutinesByCategory = this.recommendedRoutinesByCategory.map { (categoryString, routines) ->
RecommendCategory.fromString(categoryString) to routines.map { it.toDomain() }
}.toMap(),
emotionMarbleType = this.emotionMarbleType?.let { EmotionMarbleType.valueOf(it) },
)
Comment thread
wjdrjs00 marked this conversation as resolved.
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
package com.threegap.bitnagil.data.recommendroutine.model.response

import com.threegap.bitnagil.domain.recommendroutine.model.RecommendLevel
import com.threegap.bitnagil.domain.recommendroutine.model.RecommendRoutine
import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable

@Serializable
data class RecommendedRoutineDto(
@SerialName("recommendedRoutineId")
val recommendedRoutineId: Int,
@SerialName("recommendedRoutineName")
val recommendedRoutineName: String,
@SerialName("recommendedRoutineDescription")
val recommendedRoutineDescription: String,
@SerialName("recommendedRoutineLevel")
val recommendedRoutineLevel: String,
@SerialName("executionTime")
val executionTime: String,
@SerialName("recommendedSubRoutineSearchResult")
val recommendedSubRoutineSearchResult: List<RecommendedSubRoutineDto>,
)

fun RecommendedRoutineDto.toDomain(): RecommendRoutine =
RecommendRoutine(
id = recommendedRoutineId,
name = recommendedRoutineName,
description = recommendedRoutineDescription,
level = RecommendLevel.fromString(recommendedRoutineLevel),
executionTime = executionTime,
recommendSubRoutines = recommendedSubRoutineSearchResult.map { it.toDomain() },
)
Comment thread
wjdrjs00 marked this conversation as resolved.
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package com.threegap.bitnagil.data.recommendroutine.model.response

import com.threegap.bitnagil.domain.recommendroutine.model.RecommendSubRoutine
import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable

@Serializable
data class RecommendedSubRoutineDto(
@SerialName("recommendedSubRoutineId")
val recommendedSubRoutineId: Int,
@SerialName("recommendedSubRoutineName")
val recommendedSubRoutineName: String,
)

fun RecommendedSubRoutineDto.toDomain(): RecommendSubRoutine =
RecommendSubRoutine(
id = recommendedSubRoutineId,
name = recommendedSubRoutineName,
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package com.threegap.bitnagil.data.recommendroutine.repositoryImpl

import com.threegap.bitnagil.data.recommendroutine.datasource.RecommendRoutineDataSource
import com.threegap.bitnagil.data.recommendroutine.model.response.toDomain
import com.threegap.bitnagil.domain.recommendroutine.model.RecommendRoutines
import com.threegap.bitnagil.domain.recommendroutine.repository.RecommendRoutineRepository
import javax.inject.Inject

class RecommendRoutineRepositoryImpl @Inject constructor(
private val recommendRoutineDataSource: RecommendRoutineDataSource,
) : RecommendRoutineRepository {
override suspend fun fetchRecommendRoutines(): Result<RecommendRoutines> =
recommendRoutineDataSource.fetchRecommendRoutines()
.map { it.toDomain() }
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package com.threegap.bitnagil.data.recommendroutine.service

import com.threegap.bitnagil.data.recommendroutine.model.response.RecommendRoutinesDto
import com.threegap.bitnagil.network.model.BaseResponse
import retrofit2.http.GET

interface RecommendRoutineService {
@GET("/api/v1/recommend-routines")
suspend fun fetchRecommendRoutines(): BaseResponse<RecommendRoutinesDto>
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package com.threegap.bitnagil.domain.recommendroutine.model

enum class EmotionMarbleType {
CALM,
VITALITY,
LETHARGY,
ANXIETY,
SATISFACTION,
FATIGUE,
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package com.threegap.bitnagil.domain.recommendroutine.model

enum class RecommendCategory(
val categoryName: String,
val displayName: String,
val isVisible: Boolean = true,
) {
PERSONALIZED("PERSONALIZED", "맞춤 추천"),
OUTING("OUTING", "나가봐요"),
WAKE_UP("WAKE_UP", "일어나요"),
CONNECT("CONNECT", "연결해요"),
REST("REST", "쉬어가요"),
GROW("GROW", "성장해요"),
OUTING_REPORT("OUTING_REPORT", "신고", isVisible = false),
UNKNOWN("UNKNOWN", "알 수 없음", isVisible = false),
;

companion object {
fun fromString(categoryName: String): RecommendCategory =
entries.find { it.categoryName == categoryName } ?: UNKNOWN
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package com.threegap.bitnagil.domain.recommendroutine.model

enum class RecommendLevel(
val level: String,
val displayName: String,
) {
LEVEL1("LEVEL1", "가볍게 할 수 있어요"),
LEVEL2("LEVEL2", "조금 신경써서 할 수 있어요"),
LEVEL3("LEVEL3", "의지를 다 잡고 할 수 있어요"),
;

companion object {
fun fromString(levelName: String): RecommendLevel =
entries.find { it.level == levelName } ?: LEVEL1
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package com.threegap.bitnagil.domain.recommendroutine.model

data class RecommendRoutine(
val id: Int,
val name: String,
val description: String,
val level: RecommendLevel,
val executionTime: String,
val recommendSubRoutines: List<RecommendSubRoutine>,
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package com.threegap.bitnagil.domain.recommendroutine.model

data class RecommendRoutines(
val recommendRoutinesByCategory: Map<RecommendCategory, List<RecommendRoutine>>,
val emotionMarbleType: EmotionMarbleType?,
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package com.threegap.bitnagil.domain.recommendroutine.model

data class RecommendSubRoutine(
val id: Int,
val name: String,
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package com.threegap.bitnagil.domain.recommendroutine.repository

import com.threegap.bitnagil.domain.recommendroutine.model.RecommendRoutines

interface RecommendRoutineRepository {
suspend fun fetchRecommendRoutines(): Result<RecommendRoutines>
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package com.threegap.bitnagil.domain.recommendroutine.usecase

import com.threegap.bitnagil.domain.recommendroutine.model.RecommendRoutines
import com.threegap.bitnagil.domain.recommendroutine.repository.RecommendRoutineRepository
import javax.inject.Inject

class FetchRecommendRoutinesUseCase @Inject constructor(
private val recommendRoutineRepository: RecommendRoutineRepository,
) {
suspend operator fun invoke(): Result<RecommendRoutines> =
recommendRoutineRepository.fetchRecommendRoutines()
}
Loading