Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
51 commits
Select commit Hold shift + click to select a range
ca07ccf
🐛 Fix: conflict 해결
dogmania Feb 9, 2026
a395374
♻️ Refactor: ktlint 적용
dogmania Feb 9, 2026
2719d81
♻️ Refactor: 네이밍 변경
dogmania Feb 9, 2026
4d5543b
♻️ Refactor: 네이밍 변경
dogmania Feb 9, 2026
441554e
✨ Feat: UpdateGoalParam -> UpdateGoalRequest Mapper 구현
dogmania Feb 9, 2026
faad6c2
✨ Feat: 목표 수정 요청 DTO 구현
dogmania Feb 9, 2026
6bb8b07
✨ Feat: 목표 수정 Domain Param 구현
dogmania Feb 9, 2026
bd7fe6a
🍱 Chore: string 리소스 추가
dogmania Feb 9, 2026
ea45cf5
♻️ Refactor: 네이밍 변경
dogmania Feb 9, 2026
4dcde0f
✨ Feat: 목표 수정 API 통신 로직 구현
dogmania Feb 9, 2026
f86be53
♻️ Refactor: Save Intent에 id 파라미터 추가
dogmania Feb 9, 2026
aa001af
♻️ Refactor: Save Intent에 id 파라미터 추가
dogmania Feb 9, 2026
dedee73
✨ Feat: 목표 수정 비즈니스 로직 연결
dogmania Feb 9, 2026
e9b34f7
♻️ Refactor: HorizontalDivider 위치 변경
dogmania Feb 9, 2026
662dffe
✨ Feat: 목표 상세 조회 API 통신 로직 구현
dogmania Feb 9, 2026
2d9d81b
✨ Feat: 목표 상세 조회 비즈니스 로직 연결
dogmania Feb 9, 2026
57b9d0d
🐛 Fix: conflict 해결
dogmania Feb 9, 2026
5efa27e
✨ Feat: ShowToast SideEffect 정의
dogmania Feb 9, 2026
e51acba
🍱 Chore: string 리소스 추가
dogmania Feb 9, 2026
d260d8f
✨ Feat: 목표 삭제 API 통신 로직 구현
dogmania Feb 9, 2026
1a4fed2
✨ Feat: SideEffect 핸들링 로직 구현
dogmania Feb 9, 2026
9687a03
✨ Feat: 목표 삭제 비즈니스 로직 구현
dogmania Feb 9, 2026
0882bbd
✨ Feat: DialogState 정의
dogmania Feb 9, 2026
b14d33b
✨ Feat: 삭제된 목표 상태 정의
dogmania Feb 9, 2026
c491b59
🍱 Chore: string 리소스 추가
dogmania Feb 9, 2026
b4644ae
✨ Feat: 목표 끝내기 API 통신 로직 구현
dogmania Feb 9, 2026
9fd57bb
✨ Feat: UI 제어 Intent 정의
dogmania Feb 9, 2026
7514269
♻️ Refactor: 다이얼로그 렌더링 로직을 ID 기반으로 개선
dogmania Feb 9, 2026
bf20b1e
✨ Feat: 목표 상세 리스트 조회 api 통신 로직 구현
dogmania Feb 9, 2026
c3138d8
✨ Feat: GoalSummaryListResponse DTO 구현
dogmania Feb 9, 2026
ee46d30
✨ Feat: GoalSummaryResponse 구현
dogmania Feb 9, 2026
3c5a998
✨ Feat: GoalSummaryListResponse -> List<GoalSummary> Mapper 구현
dogmania Feb 9, 2026
37b3450
✨ Feat: 목표 상세 리스트 조회 비즈니스 로직 연결
dogmania Feb 9, 2026
4bc6dc8
🍱 Chore: 리소스 추가
dogmania Feb 9, 2026
78cdd78
♻️ Refactor: 아이콘 변경
dogmania Feb 9, 2026
01facf0
♻️ Refactor: ktlint 적용
dogmania Feb 9, 2026
2fc3b76
♻️ Refactor: PUT -> PATCH로 변경
dogmania Feb 9, 2026
997b513
✨ Feat: GoalRefreshBus 이벤트 방출
dogmania Feb 9, 2026
b309e8b
♻️ Refactor: 목표 수정 로직 Intent 기반으로 변경
dogmania Feb 10, 2026
b13dea1
🍱 Chore: string 리소스 추가
dogmania Feb 10, 2026
4b5485a
✨ Feat: 목표 미입력 시 토스트 렌더링
dogmania Feb 10, 2026
1cacb7f
♻️ Refactor: 키보드 감지를 통해서 목표명 commit
dogmania Feb 10, 2026
c0b6d4c
♻️ Refactor: EmptyGoalGuide 공통 컴포넌트로 변경
dogmania Feb 10, 2026
df9db8d
🍱 Chore: string 리소스 추가
dogmania Feb 10, 2026
74dc8db
✨ Feat: 리스트가 비어있는 경우 EmptyGoalGuide 렌더링
dogmania Feb 10, 2026
df64bcb
♻️ Refactor: 컴포넌트 위치 변경
dogmania Feb 10, 2026
094acbe
🐛 Fix: conflict 해결
dogmania Feb 11, 2026
615e04d
♻️ Refactor: 서버 응답 필드 변경
dogmania Feb 11, 2026
eb70798
♻️ Refactor: 필드명 변경
dogmania Feb 11, 2026
d451302
✨ Feat: 목표 편집 화면 전용 리프레쉬 이벤트 추가
dogmania Feb 11, 2026
b572e97
♻️ Refactor: ktlint 적용
dogmania Feb 11, 2026
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
@@ -1,4 +1,4 @@
package com.twix.home.component
package com.twix.designsystem.components.goal

import androidx.compose.foundation.Image
import androidx.compose.foundation.layout.Arrangement
Expand All @@ -7,7 +7,6 @@ import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.offset
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size
import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment
Expand All @@ -21,7 +20,11 @@ import com.twix.designsystem.theme.GrayColor
import com.twix.domain.model.enums.AppTextStyle

@Composable
fun EmptyGoalGuide(modifier: Modifier = Modifier) {
fun EmptyGoalGuide(
modifier: Modifier = Modifier,
text: String,
isDetail: Boolean = false,
) {
Column(
modifier =
modifier
Expand All @@ -30,30 +33,39 @@ fun EmptyGoalGuide(modifier: Modifier = Modifier) {
verticalArrangement = Arrangement.Center,
) {
Image(
painter = painterResource(R.drawable.ic_empty_face),
painter = painterResource(R.drawable.ic_empty_goal_home),
contentDescription = "empty face",
modifier =
Modifier
.padding(horizontal = 9.dp, vertical = 6.dp)
.size(width = 34.dp, height = 40.dp),
.size(width = 181.dp, height = 111.dp),
)

Spacer(Modifier.height(10.dp))
Spacer(Modifier.height(22.dp))

AppText(
text = stringResource(R.string.home_empty_goal_guide),
text = text,
style = AppTextStyle.T2,
color = GrayColor.C200,
color = GrayColor.C400,
)

Spacer(Modifier.height(12.dp))
if (!isDetail) {
Spacer(Modifier.height(5.dp))

Image(
painter = painterResource(R.drawable.ic_empty_goal_arrow),
contentDescription = "empty goal arrow",
modifier =
Modifier
.offset(x = 32.dp),
)
AppText(
text = stringResource(R.string.home_empty_goal_content),
style = AppTextStyle.C1,
color = GrayColor.C300,
)

Spacer(Modifier.height(50.dp))

Image(
painter = painterResource(R.drawable.ic_empty_goal_arrow),
contentDescription = "empty goal arrow",
modifier =
Modifier
.offset(x = 60.dp),
)
}
}
}
28 changes: 21 additions & 7 deletions core/design-system/src/main/res/drawable/ic_empty_goal_arrow.xml
Original file line number Diff line number Diff line change
@@ -1,9 +1,23 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="65dp"
android:height="125dp"
android:viewportWidth="65"
android:viewportHeight="125">
<path
android:pathData="M64.28,120.95C64.79,120.73 65.02,120.14 64.81,119.64L61.26,111.36C61.04,110.86 60.45,110.62 59.95,110.84C59.44,111.06 59.2,111.64 59.42,112.15L62.57,119.5L55.22,122.65C54.71,122.87 54.48,123.46 54.69,123.97C54.91,124.48 55.5,124.71 56.01,124.49L64.28,120.95ZM1.39,0.08L0.39,-0C-0.9,15.44 0.7,39.96 9.69,63.48C18.69,87 35.11,109.6 63.51,120.96L63.89,120.03L64.26,119.1C36.52,108 20.42,85.94 11.56,62.76C2.69,39.57 1.11,15.35 2.38,0.17L1.39,0.08Z"
android:fillColor="#C6C6C6"/>
android:width="120dp"
android:height="120dp"
android:viewportWidth="120"
android:viewportHeight="120">
<group>
<clip-path
android:pathData="M0,0h120v120h-120z"/>
<path
android:pathData="M95.25,113.64C33.1,89.38 44.38,45.14 62.11,36.93C82.27,29.11 87.54,62.13 54.29,58.14C15.69,50.83 26.92,2.63 26.92,2.63"
android:strokeWidth="1.8"
android:fillColor="#00000000"
android:strokeColor="#C6C6C6"
android:strokeLineCap="round"/>
<path
android:pathData="M91.43,101.55L95.63,113.55L84.54,119.49"
android:strokeLineJoin="round"
android:strokeWidth="1.8"
android:fillColor="#00000000"
android:strokeColor="#C6C6C6"
android:strokeLineCap="round"/>
</group>
</vector>
176 changes: 176 additions & 0 deletions core/design-system/src/main/res/drawable/ic_empty_goal_home.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,176 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="181dp"
android:height="111dp"
android:viewportWidth="181"
android:viewportHeight="111">
<group>
<clip-path
android:pathData="M0,0h181v111h-181z"/>
<path
android:pathData="M158.27,93.65C158.27,93.65 159.39,101.93 167.53,102.18C176.91,102.47 182.68,87.58 169.12,79.98"
android:fillColor="#ffffff"/>
<path
android:pathData="M158.27,93.65C158.27,93.65 159.39,101.93 167.53,102.18C176.91,102.47 182.68,87.58 169.12,79.98"
android:strokeLineJoin="round"
android:strokeWidth="1.4"
android:fillColor="#00000000"
android:strokeColor="#858585"
android:strokeLineCap="round"/>
<path
android:pathData="M141.99,27.4C141.99,27.4 151.18,16.36 145.94,10.37C144.77,9.03 142.87,8.44 141.28,9.27C140.34,9.77 137.62,12.3 140.01,14.86"
android:strokeLineJoin="round"
android:strokeWidth="1.4"
android:fillColor="#00000000"
android:strokeColor="#858585"
android:strokeLineCap="round"/>
<path
android:pathData="M179.24,72.57C173.39,95.82 149.63,110.13 126.17,104.54C102.71,98.96 88.44,75.59 94.29,52.35C100.14,29.11 123.91,14.8 147.36,20.38C170.82,25.97 185.1,49.34 179.24,72.57Z"
android:strokeLineJoin="round"
android:strokeWidth="1.4"
android:fillColor="#ffffff"
android:strokeColor="#858585"
android:strokeLineCap="round"/>
<path
android:pathData="M167.77,66.97C169.03,63.47 166.68,59.42 162.54,57.93C158.39,56.44 154.02,58.07 152.77,61.57C151.51,65.07 153.86,69.11 158.01,70.6C162.15,72.1 166.52,70.47 167.77,66.97Z"
android:fillColor="#ECECEC"/>
<path
android:pathData="M128.96,59.88C132.26,57.97 133.1,53.23 130.84,49.29C128.57,45.35 124.06,43.71 120.75,45.62C117.45,47.54 116.61,52.28 118.87,56.22C121.14,60.16 125.65,61.8 128.96,59.88Z"
android:fillColor="#ECECEC"/>
<path
android:pathData="M79.04,64.31C79.04,64.31 94.17,58.67 103.17,63.08C106.75,64.84 105.82,69.5 100.9,69.3C106.12,78.55 95.07,87.2 83.81,80.95"
android:fillColor="#ffffff"/>
<path
android:pathData="M79.04,64.31C79.04,64.31 94.17,58.67 103.17,63.08C106.75,64.84 105.82,69.5 100.9,69.3C106.12,78.55 95.07,87.2 83.81,80.95"
android:strokeLineJoin="round"
android:strokeWidth="1.4"
android:fillColor="#00000000"
android:strokeColor="#858585"
android:strokeLineCap="round"/>
<path
android:pathData="M41.34,31.25C41.34,31.25 47.28,18.16 40.65,13.77C39.17,12.79 37.19,12.72 35.86,13.95C35.08,14.68 33.12,17.84 36.1,19.67"
android:strokeLineJoin="round"
android:strokeWidth="1.4"
android:fillColor="#00000000"
android:strokeColor="#858585"
android:strokeLineCap="round"/>
<path
android:pathData="M89.18,65.26C89.67,89.41 70.2,109.67 45.7,110.53C21.2,111.39 0.95,92.5 0.45,68.35C-0.04,44.21 19.43,23.94 43.93,23.07C68.43,22.22 88.69,41.09 89.18,65.25V65.26Z"
android:strokeLineJoin="round"
android:strokeWidth="1.4"
android:fillColor="#ffffff"
android:strokeColor="#858585"
android:strokeLineCap="round"/>
<path
android:pathData="M75.82,63.19C76.1,59.49 72.24,56.17 67.19,55.78C62.15,55.39 57.83,58.08 57.54,61.79C57.26,65.5 61.12,68.82 66.17,69.21C71.21,69.59 75.53,66.9 75.82,63.19Z"
android:fillColor="#ECECEC"/>
<path
android:pathData="M29.71,67.1C34.77,66.81 38.7,63.58 38.5,59.87C38.29,56.16 34.02,53.38 28.96,53.67C23.9,53.95 19.96,57.19 20.17,60.89C20.37,64.6 24.64,67.38 29.71,67.1Z"
android:fillColor="#ECECEC"/>
<path
android:pathData="M57.12,65.43C51.7,69.92 45.23,69.26 40.38,63.89"
android:strokeLineJoin="round"
android:strokeWidth="1.4"
android:fillColor="#00000000"
android:strokeColor="#858585"
android:strokeLineCap="round"/>
<path
android:pathData="M22.6,96.07C22.6,96.07 35.7,101.29 42.94,92.73C50.18,84.16 41.76,70.47 23.48,74.75"
android:fillColor="#ffffff"/>
<path
android:pathData="M22.6,96.07C22.6,96.07 35.7,101.29 42.94,92.73C50.18,84.16 41.76,70.47 23.48,74.75"
android:strokeLineJoin="round"
android:strokeWidth="1.4"
android:fillColor="#00000000"
android:strokeColor="#858585"
android:strokeLineCap="round"/>
<path
android:pathData="M131.08,49.67C132.04,49.67 132.82,48.69 132.82,47.48C132.82,46.27 132.04,45.29 131.08,45.29C130.12,45.29 129.34,46.27 129.34,47.48C129.34,48.69 130.12,49.67 131.08,49.67Z"
android:fillColor="#858585"/>
<path
android:pathData="M160.29,59.75C161.49,59.75 162.47,58.77 162.47,57.56C162.47,56.35 161.49,55.37 160.29,55.37C159.08,55.37 158.1,56.35 158.1,57.56C158.1,58.77 159.08,59.75 160.29,59.75Z"
android:fillColor="#858585"/>
<path
android:pathData="M163.44,43.58C163.44,43.58 161.26,49.74 165.72,49.67C165.72,49.67 169,49.62 166.92,44.63"
android:strokeLineJoin="round"
android:strokeWidth="1.4"
android:fillColor="#00000000"
android:strokeColor="#858585"
android:strokeLineCap="round"/>
<path
android:pathData="M170.06,53.14C170.06,53.14 167.31,59.13 171.76,59.07C171.76,59.07 175.51,58.95 172.37,52.82"
android:strokeLineJoin="round"
android:strokeWidth="1.4"
android:fillColor="#00000000"
android:strokeColor="#858585"
android:strokeLineCap="round"/>
<path
android:pathData="M124.99,85.45C124.99,85.45 126.47,93.96 135.07,94.5C144.97,95.12 150.54,80.1 135.95,71.86"
android:fillColor="#ffffff"/>
<path
android:pathData="M124.99,85.45C124.99,85.45 126.47,93.96 135.07,94.5C144.97,95.12 150.54,80.1 135.95,71.86"
android:strokeLineJoin="round"
android:strokeWidth="1.4"
android:fillColor="#00000000"
android:strokeColor="#858585"
android:strokeLineCap="round"/>
<path
android:pathData="M110.96,49.54C110.96,49.54 123.72,52.47 125.4,66.41C126.12,72.34 125.14,80.84 116.13,85.86"
android:fillColor="#ffffff"/>
<path
android:pathData="M110.96,49.54C110.96,49.54 123.72,52.47 125.4,66.41C126.12,72.34 125.14,80.84 116.13,85.86"
android:strokeLineJoin="round"
android:strokeWidth="1.4"
android:fillColor="#00000000"
android:strokeColor="#858585"
android:strokeLineCap="round"/>
<path
android:pathData="M74.6,15.16V2.85C74.6,2.85 78.98,3.29 84.61,0.45V12.76"
android:strokeLineJoin="round"
android:strokeWidth="1.4"
android:fillColor="#00000000"
android:strokeColor="#858585"
android:strokeLineCap="round"/>
<path
android:pathData="M71.2,18.42C73.07,18.42 74.6,17.14 74.6,15.56C74.6,13.98 73.07,12.71 71.2,12.71C69.32,12.71 67.8,13.98 67.8,15.56C67.8,17.14 69.32,18.42 71.2,18.42Z"
android:strokeLineJoin="round"
android:strokeWidth="1.4"
android:fillColor="#ECECEC"
android:strokeColor="#858585"
android:strokeLineCap="round"/>
<path
android:pathData="M81.2,16.12C83.08,16.12 84.6,14.84 84.6,13.26C84.6,11.68 83.08,10.41 81.2,10.41C79.32,10.41 77.8,11.68 77.8,13.26C77.8,14.84 79.32,16.12 81.2,16.12Z"
android:strokeLineJoin="round"
android:strokeWidth="1.4"
android:fillColor="#ECECEC"
android:strokeColor="#858585"
android:strokeLineCap="round"/>
<path
android:pathData="M74.71,6.81C74.71,6.81 80.1,7.03 84.53,4.73"
android:strokeLineJoin="round"
android:strokeWidth="1.4"
android:fillColor="#00000000"
android:strokeColor="#858585"
android:strokeLineCap="round"/>
<path
android:pathData="M70.5,51.82L61.75,54.27L70.36,57.74"
android:strokeLineJoin="round"
android:strokeWidth="1.4"
android:fillColor="#00000000"
android:strokeColor="#858585"
android:strokeLineCap="round"/>
<path
android:pathData="M28.37,49.61L36.64,53.84L27.17,55.42"
android:strokeLineJoin="round"
android:strokeWidth="1.4"
android:fillColor="#00000000"
android:strokeColor="#858585"
android:strokeLineCap="round"/>
<path
android:pathData="M139.09,56.78C139.18,60.93 142.64,62.38 146.41,59.54C146.41,59.54 147.9,66.86 153.76,62.12"
android:strokeLineJoin="round"
android:strokeWidth="1.4"
android:fillColor="#00000000"
android:strokeColor="#858585"
android:strokeLineCap="round"/>
</group>
</vector>
8 changes: 7 additions & 1 deletion core/design-system/src/main/res/values/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@
<!-- 홈 화면 -->
<string name="home_today_goal">오늘 우리 목표</string>
<string name="home_empty_goal_guide">첫 목표를 세워볼까요?</string>
<string name="home_empty_goal_content">+ 버튼을 눌러 목표를 추가해보세요</string>

<!-- 코멘트 입력 -->
<string name="comment_text_field_placeholder">코멘트추가</string>
Expand All @@ -60,15 +61,20 @@
<string name="goal_list_title_today">오늘 우리 목표</string>
<string name="goal_list_title_next">다음 우리 목표</string>
<string name="date_year_month_day">%s년 %02d월 %02d일</string>
<string name="goal_detail_empty_goal_guide">아직 목표가 없어요!</string>

<!-- 설정 화면 -->
<string name="settings_privacy_policy">개인정보 처리방침</string>
<string name="settings_my_app_version">나의 버전</string>

<!-- 토스트 메시지 -->
<string name="toast_end_date_before_start_date">종료 날짜가 시작 날짜보다 이전입니다.</string>
<string name="toast_goal_fetch_failed">목표 조회에 실패했습니다.</string>
<string name="toast_create_goal_failed">목표 생성에 실패했습니다.</string>
<string name="toast_update_goal_failed">목표 수정에 실패했습니다.</string>
<string name="toast_delete_goal_failed">목표 삭제에 실패했습니다.</string>
<string name="toast_complete_goal_failed">목표 완료에 실패했습니다.</string>
<string name="toast_input_goal_title">목표를 입력해주세요.</string>
<string name="toast_logout_completed">로그아웃되었습니다.</string>
<string name="toast_logout_failed">로그아웃에 실패했습니다.</string>
<string name="toast_account_deleted">계정이 삭제되었습니다.</string>
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
package com.twix.network.model.request.goal.mapper

import com.twix.domain.model.goal.CreateGoalParam
import com.twix.domain.model.goal.UpdateGoalParam
import com.twix.network.model.request.goal.model.CreateGoalRequest
import com.twix.network.model.request.goal.model.UpdateGoalRequest

fun CreateGoalParam.toRequest(): CreateGoalRequest =
CreateGoalRequest(
Expand All @@ -12,3 +14,12 @@ fun CreateGoalParam.toRequest(): CreateGoalRequest =
startDate = startDate.toString(),
endDate = endDate?.toString(),
)

fun UpdateGoalParam.toRequest(): UpdateGoalRequest =
UpdateGoalRequest(
name = name,
icon = icon.toApi(),
repeatCycle = repeatCycle.toApi(),
repeatCount = repeatCount,
endDate = endDate?.toString(),
)
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import kotlinx.serialization.Serializable

@Serializable
data class CreateGoalRequest(
@SerialName("name") val name: String,
@SerialName("goalName") val name: String,
@SerialName("icon") val icon: String,
@SerialName("repeatCycle") val repeatCycle: String,
@SerialName("repeatCount") val repeatCount: Int,
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package com.twix.network.model.request.goal.model

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

@Serializable
data class UpdateGoalRequest(
@SerialName("goalName") val name: String,
@SerialName("icon") val icon: String,
@SerialName("repeatCycle") val repeatCycle: String,
@SerialName("repeatCount") val repeatCount: Int,
@SerialName("endDate") val endDate: String? = null,
)
Loading