Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
98 commits
Select commit Hold shift + click to select a range
97e2c5d
feat: 이번달 챙길사람 전체보기 화면 네비게이션 추가
stopstone Oct 31, 2025
525fc6b
feat: 월별 리마인더 친구 카드 컴포저블 추가
stopstone Oct 31, 2025
2daa449
feat: 월별 리마인더 화면 빈 상태 컴포저블 추가
stopstone Oct 31, 2025
1bc2ad3
feat: 월별 리마인더 완료 목록 아이템 컴포저블 추가
stopstone Oct 31, 2025
7dc900c
refactor: 월별 리마인더 전체보기 화면 파일 이동 및 ViewModel 연결
stopstone Nov 1, 2025
19cf75d
feat: 이번달 챙길 사람 전체보기 화면 구현
stopstone Nov 1, 2025
eb7cf4c
feat: 이달의 챙김 친구 카드 UI 모델 적용
stopstone Nov 1, 2025
d85077a
feat: iewModel 및 UI State 구현
stopstone Nov 1, 2025
7f86285
feat: 이달의 챙김 완료 친구 목록 조회 API 추가
stopstone Nov 1, 2025
1bf63ed
chore: MonthlyReminderFriendCard 패딩 삭제
stopstone Nov 1, 2025
05ac850
feat: 챙김 완료 목록 아이템 UI 구현
stopstone Nov 1, 2025
5b178df
feat: 챙김 완료 목록 추가
stopstone Nov 1, 2025
767fe0c
feat: 연락 기록 성공 다이얼로그 추가
stopstone Nov 1, 2025
761cdaf
refactor: 챙김 친구 완료 시 UI 즉시 업데이트
stopstone Nov 1, 2025
7a7334d
refactor: 월별 리마인더 없음 화면 UI 수정
stopstone Nov 1, 2025
39c7efc
refactor: 이번달 챙길 사람 화면 문자열 리소스 적용
stopstone Nov 1, 2025
b7146ad
refactor: 이번달 챙길 사람 화면 챙김 완료 상단 패딩 수정
stopstone Nov 3, 2025
6e8b124
refactor: 연락 완료 여부 확인 로직을 uiState로 관리
stopstone Nov 3, 2025
02ef857
refactor: 연락처에서 불러오기 그림자 효과 수치값 수정
stopstone Nov 4, 2025
4479c49
refactor: CycleSettingBottomSheet 주기설정 공백 추가
stopstone Nov 4, 2025
119e70c
feat: 주기 설정 바텀 시트 텍스트 동적 변경
stopstone Nov 4, 2025
00e427c
refactor: 연락 주기 설정 화면 '다음 주기' 텍스트 strings.xml 관리
stopstone Nov 4, 2025
3160c32
refactor: 연락 주기 화면 UI 패딩값 수정
stopstone Nov 4, 2025
5d6b6dd
refactor: 검색 아이콘 색상 변경
stopstone Nov 4, 2025
a48bbe4
refactor: 연락처 불러오기 기본 이미지 변경
stopstone Nov 4, 2025
8409fed
refactor: 이번달 챙길 사람 화면 간격 추가
stopstone Nov 5, 2025
3b8db78
feat: 이번달 챙길 사람 리스트 정렬
stopstone Nov 5, 2025
2e25c7e
feat: shimmer modifier 확장자 추가
rhkrwngud445 Nov 5, 2025
ccf39de
fix: 가로 shimmer로 수정
rhkrwngud445 Nov 5, 2025
c338a9b
refactor: shimmer 적용 및 home uiState로 상태 단일 관리
rhkrwngud445 Nov 5, 2025
b334b28
fix: 이번 달 챙길 사람 우측 패딩 삭제
rhkrwngud445 Nov 5, 2025
b82da4d
chore: home preview 데이터 수정
rhkrwngud445 Nov 5, 2025
3c61c80
refactor: 월별 리마인더 데이터 로딩 로직 개선
stopstone Nov 7, 2025
3cd540b
refactor: 홈 화면 "전체 보기" 텍스트를 문자열 리소스로 분리
stopstone Nov 7, 2025
0f0ec16
refactor: 에러 처리 방식 개선
stopstone Nov 7, 2025
de9c02c
refactor: Flow 에러 처리 로직 공통화
stopstone Nov 7, 2025
42fabc6
refactor: 기록 완료 다이얼로그 색상 수정
stopstone Nov 7, 2025
61d61ac
chore: MonthlyReminderFriendCard.kt 코드 스타일 수정
stopstone Nov 7, 2025
31a0e66
refactor: 이번달 챙길사람 하단 패딩 수정
stopstone Nov 7, 2025
1672ffa
chore: "D-day"를 "D-DAY"로 수정
stopstone Nov 7, 2025
c9c4326
feat: 연락일이 오늘일 경우 D-day 스타일 적용 및 중복 데이터 제거
stopstone Nov 7, 2025
be85484
refactor: MonthlyReminderAllScreen의 불필요한 launch 제거
stopstone Nov 10, 2025
186e13b
refactor: MonthlyReminderAllViewModel 내 불필요한 private backing property 제거
stopstone Nov 10, 2025
49e421e
refactor: updateUIState 함수의 이름 변경
stopstone Nov 10, 2025
2cffb56
fix: inset 패딩 적용 및 작은 높이 화면 대응
rhkrwngud445 Nov 10, 2025
a0d5ed0
fix: login 이미지, 텍스트 이미지 간격 수정
rhkrwngud445 Nov 10, 2025
29bf984
fix: 연락처 검색 버튼 색상 수정
rhkrwngud445 Nov 10, 2025
0182de2
fix: home 디바이스 긴 경우 중간 마진 추가
rhkrwngud445 Nov 11, 2025
f50748b
fix: My 로그아웃 버튼 패딩 수정
rhkrwngud445 Nov 11, 2025
d6cece2
fix(NearOutlinedTextField): 에러시 container 색상이 변하지 않도록 수정
rhkrwngud445 Nov 11, 2025
1e1b2e9
fix(Friend): DateTime 계산 로직을 Data 레이어에서 수행하도록 수정
rhkrwngud445 Nov 11, 2025
18745a3
fix: FriendProfile 스크롤 범위 수정
rhkrwngud445 Nov 11, 2025
59c9ebc
feat: 챙김 기록하기 버튼 그라데이션 배경 적용
rhkrwngud445 Nov 11, 2025
9b28065
fix: 친구 프로필 수정 메모와 BasicText간 간격 수정
rhkrwngud445 Nov 11, 2025
7edaef9
fix: UI 표시되는 날짜 포맷 수정
rhkrwngud445 Nov 11, 2025
dd873cb
fix: 제한 글자 수 수정
rhkrwngud445 Nov 11, 2025
cfe415c
fix: 홈 lazyRow 키 값 변경
rhkrwngud445 Nov 11, 2025
477cf7a
fix: 친구 정보 수정시 생일 포맷 변경
rhkrwngud445 Nov 12, 2025
ffda528
fix: 친구 삭제시 이번달 챙길 사람도 제외되도록 수정
rhkrwngud445 Nov 12, 2025
6cc3111
feat: 그리팅 텍스트 정렬 위치 수정
rhkrwngud445 Nov 12, 2025
6657de6
feat: 공용 바텀시트 컴포넌트 추가
stopstone Nov 12, 2025
a376cf8
refactor: `CycleSettingBottomSheet`을 공통 컴포넌트로 리팩토링
stopstone Nov 12, 2025
576da85
refactor: 주기 설정 BottomSheet 공용 컴포넌트로 분리 및 개선
stopstone Nov 12, 2025
53cc221
fix: 다음 연락 주기 텍스트의 공백 추가
stopstone Nov 12, 2025
72ac684
feat: `NearBottomSheet` 미리보기 추가
stopstone Nov 12, 2025
1162e18
chore: 바텀시트 핸들러 코너 값 수정
stopstone Nov 12, 2025
4e36099
refactor: 주기 설정 BottomSheet 공용 컴포넌트로 분리
stopstone Nov 12, 2025
add9b61
refactor: NearBottomSheet의 content 타입을 ColumnScope로 변경
stopstone Nov 12, 2025
b83ad29
feat: monthlyFriend키 주석처리
rhkrwngud445 Nov 17, 2025
ad3cfe9
fix: 챙김 기록이 적용안되는 문제 수정
rhkrwngud445 Nov 17, 2025
1f4474b
fix: 리플 색상 변경
rhkrwngud445 Nov 17, 2025
79651e1
Merge pull request #59 from near-Contact-Reminder/feat/#56-monthly-re…
rhkrwngud445 Nov 18, 2025
c7ed1aa
Merge pull request #61 from near-Contact-Reminder/qa/#57-feature-cont…
rhkrwngud445 Nov 18, 2025
8040d8f
feat: shimmer modifier 확장자 추가
rhkrwngud445 Nov 5, 2025
576bc85
fix: 가로 shimmer로 수정
rhkrwngud445 Nov 5, 2025
01267f0
refactor: shimmer 적용 및 home uiState로 상태 단일 관리
rhkrwngud445 Nov 5, 2025
0044d87
fix: 이번 달 챙길 사람 우측 패딩 삭제
rhkrwngud445 Nov 5, 2025
3a7bed5
chore: home preview 데이터 수정
rhkrwngud445 Nov 5, 2025
ca872a8
fix: inset 패딩 적용 및 작은 높이 화면 대응
rhkrwngud445 Nov 10, 2025
17a5d87
fix: login 이미지, 텍스트 이미지 간격 수정
rhkrwngud445 Nov 10, 2025
6d99aa7
fix: 연락처 검색 버튼 색상 수정
rhkrwngud445 Nov 10, 2025
9501700
fix: My 로그아웃 버튼 패딩 수정
rhkrwngud445 Nov 11, 2025
d091842
fix(NearOutlinedTextField): 에러시 container 색상이 변하지 않도록 수정
rhkrwngud445 Nov 11, 2025
97e3727
fix(Friend): DateTime 계산 로직을 Data 레이어에서 수행하도록 수정
rhkrwngud445 Nov 11, 2025
d8b4276
fix: FriendProfile 스크롤 범위 수정
rhkrwngud445 Nov 11, 2025
5890721
feat: 챙김 기록하기 버튼 그라데이션 배경 적용
rhkrwngud445 Nov 11, 2025
cf86fcd
fix: 친구 프로필 수정 메모와 BasicText간 간격 수정
rhkrwngud445 Nov 11, 2025
01694c5
fix: UI 표시되는 날짜 포맷 수정
rhkrwngud445 Nov 11, 2025
c9ef039
fix: 제한 글자 수 수정
rhkrwngud445 Nov 11, 2025
8e9316a
fix: 홈 lazyRow 키 값 변경
rhkrwngud445 Nov 11, 2025
c14476a
fix: 친구 정보 수정시 생일 포맷 변경
rhkrwngud445 Nov 12, 2025
5571518
fix: 친구 삭제시 이번달 챙길 사람도 제외되도록 수정
rhkrwngud445 Nov 12, 2025
ccdd668
feat: 그리팅 텍스트 정렬 위치 수정
rhkrwngud445 Nov 12, 2025
7fcf4f5
feat: monthlyFriend키 주석처리
rhkrwngud445 Nov 17, 2025
24d275f
fix: 챙김 기록이 적용안되는 문제 수정
rhkrwngud445 Nov 17, 2025
c02630c
fix: 리플 색상 변경
rhkrwngud445 Nov 17, 2025
854d4ac
Merge remote-tracking branch 'origin/qa/#58-qa_except_contact' into q…
rhkrwngud445 Nov 18, 2025
baebe46
chore: 버전 업
rhkrwngud445 Nov 18, 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
2 changes: 1 addition & 1 deletion Near/app/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ android {
applicationId = "com.alarmy.near"
minSdk = 27
targetSdk = 35
versionCode = 3
versionCode = 4
versionName = "1.0"

testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,9 @@ import com.alarmy.near.network.response.AnniversaryEntity
import com.alarmy.near.network.response.ContactFrequencyEntity
import com.alarmy.near.network.response.FriendEntity
import com.alarmy.near.utils.logger.NearLog
import java.time.LocalDate
import java.time.format.DateTimeFormatter
import java.util.Locale

fun FriendEntity.toModel(): Friend =
Friend(
Expand All @@ -26,8 +29,25 @@ fun FriendEntity.toModel(): Friend =
memo = memo,
phone = phone,
lastContactAt = lastContactAt,
isContactToday = lastContactAt?.isToday() ?: false,
lastContactFormat = lastContactAt?.contactFormat(),
)

fun String.contactFormat(): String {
val inputFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd")
val outputFormatter = DateTimeFormatter.ofPattern("M월 d일")

val date = LocalDate.parse(this, inputFormatter)
return date.format(outputFormatter)
}

private fun String.isToday(): Boolean {
val formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd", Locale.KOREA)
val targetDate = LocalDate.parse(this, formatter)
val today = LocalDate.now()
return targetDate == today
}
Comment on lines +36 to +49

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

DateTimeFormatter 인스턴스를 함수가 호출될 때마다 생성하고 있습니다. 이는 불필요한 객체 생성을 유발하여 성능에 미미한 영향을 줄 수 있습니다. 포매터 인스턴스를 파일 최상단에 private const val로 선언하여 재사용하는 것을 권장합니다.

private val INPUT_DATE_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd")
private val OUTPUT_DATE_FORMATTER = DateTimeFormatter.ofPattern("M월 d일")

fun String.contactFormat(): String {
    val date = LocalDate.parse(this, INPUT_DATE_FORMATTER)
    return date.format(OUTPUT_DATE_FORMATTER)
}

private fun String.isToday(): Boolean {
    val targetDate = LocalDate.parse(this, INPUT_DATE_FORMATTER)
    val today = LocalDate.now()
    return targetDate == today
}


fun ContactFrequencyEntity.toModel(): ContactFrequency =
ContactFrequency(
reminderInterval = contactWeek.toReminderInterval(),
Expand All @@ -46,7 +66,7 @@ fun Friend.toRequest(): FriendRequest =
name = name,
relation = relation.toString(),
contactFrequency = contactFrequency.toRequest(),
birthday = birthday,
birthday = birthday?.replace(".", "-"),
anniversaryList = anniversaryList.map { it.toRequest() },
memo = memo,
phone = phone,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,11 @@ class DefaultFriendRepository
)
}

override fun fetchMonthlyCompleteFriends(): Flow<List<MonthlyFriend>> =
apiCallFlow {
friendService.fetchMonthlyCompleteFriends().map { it.toModel() }
}

override fun fetchFriendById(friendId: String): Flow<Friend> =
flow {
emit(friendService.fetchFriendById(friendId).toModel())
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,9 @@ package com.alarmy.near.data.repository

import com.alarmy.near.model.Friend
import com.alarmy.near.model.FriendRecord
import com.alarmy.near.network.response.FriendInitItemEntity
import com.alarmy.near.model.friendsummary.FriendSummary
import com.alarmy.near.model.monthly.MonthlyFriend
import com.alarmy.near.network.response.FriendInitItemEntity
import com.alarmy.near.presentation.feature.friendcontactcycle.model.FriendContactUIModel
import kotlinx.coroutines.flow.Flow

Expand All @@ -13,6 +13,8 @@ interface FriendRepository {

fun fetchMonthlyFriends(): Flow<List<MonthlyFriend>>

fun fetchMonthlyCompleteFriends(): Flow<List<MonthlyFriend>>

fun fetchFriendById(friendId: String): Flow<Friend>

fun updateFriend(
Expand All @@ -26,5 +28,8 @@ interface FriendRepository {

fun recordContact(friendId: String): Flow<String>

fun initFriends(contacts: List<FriendContactUIModel>, providerType: String): Flow<List<FriendInitItemEntity>>
fun initFriends(
contacts: List<FriendContactUIModel>,
providerType: String,
): Flow<List<FriendInitItemEntity>>
}
14 changes: 3 additions & 11 deletions Near/app/src/main/java/com/alarmy/near/model/Friend.kt
Original file line number Diff line number Diff line change
Expand Up @@ -22,17 +22,9 @@ data class Friend(
val memo: String?,
val phone: String?,
val lastContactAt: String?, // "2025-07-16"
) : Parcelable {
val isContactedToday: Boolean
get() = lastContactAt?.isToday() ?: false

private fun String.isToday(): Boolean {
val formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd", Locale.KOREA)
val targetDate = LocalDate.parse(this, formatter)
val today = LocalDate.now()
return targetDate == today
}
}
val lastContactFormat: String? = null, // 친구 상세에 쓰이는 포맷 TODO 추후 UI 모델 분리
val isContactToday: Boolean? = null, // 친구 상세에 쓰이는 포맷 TODO 추후 UI 모델 분리
) : Parcelable

@Serializable
@Parcelize
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ data class MonthlyFriend(
fun daysUntilNextContact(today: LocalDate): String {
val daysBetween = getDaysBetween(today)
return when {
daysBetween == 0L -> "D-day"
daysBetween == 0L -> "D-DAY"
daysBetween > 0L -> "D-$daysBetween"
else -> "D+${-daysBetween}" // 과거 날짜
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,9 @@ interface FriendService {
@GET("/friend/monthly")
suspend fun fetchMonthlyFriends(): List<MonthlyFriendEntity>

@GET("/friend/monthly/complete")
suspend fun fetchMonthlyCompleteFriends(): List<MonthlyFriendEntity>

@GET("/friend/{friendId}")
suspend fun fetchFriendById(
@Path("friendId") friendId: String,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ import androidx.compose.ui.unit.dp
import com.alarmy.near.R
import com.alarmy.near.model.ReminderInterval
import com.alarmy.near.presentation.feature.friendcontactcycle.model.FriendContactUIModel
import com.alarmy.near.presentation.ui.component.bottomsheet.CycleSettingBottomSheet
import com.alarmy.near.presentation.ui.component.checkbox.NearBackgroundCheckbox
import com.alarmy.near.presentation.ui.extension.onNoRippleClick
import com.alarmy.near.presentation.ui.theme.NearTheme
Expand Down Expand Up @@ -64,10 +65,10 @@ fun ColumnScope.ContactCycleContent(
)
}

Spacer(modifier = Modifier.size(14.dp))

// 한번에 설정이 활성화되었을 때만 표시
if (isBulkSettingEnabled) {
Spacer(modifier = Modifier.size(12.dp))

Row(
modifier =
Modifier
Expand All @@ -85,7 +86,9 @@ fun ColumnScope.ContactCycleContent(
verticalAlignment = Alignment.CenterVertically,
) {
Text(
text = selectedCycle?.let { DateExtension.getCycleText(it) } ?: stringResource(R.string.friend_contact_cycle_weekly_format, DateExtension.getTodayDayOfWeekInKorean()),
text =
selectedCycle?.let { DateExtension.getCycleText(it) }
?: stringResource(R.string.friend_contact_cycle_weekly_format, DateExtension.getTodayDayOfWeekInKorean()),
style = NearTheme.typography.B2_14_MEDIUM,
color = NearTheme.colors.BLACK_1A1A1A,
)
Expand All @@ -101,7 +104,7 @@ fun ColumnScope.ContactCycleContent(

// 리스트가 있을 때만 밑에 리스트 표시
if (contacts.isNotEmpty()) {
Spacer(modifier = Modifier.size(16.dp))
Spacer(modifier = Modifier.size(24.dp))

LazyColumn(
modifier = Modifier.weight(1f),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -117,7 +117,7 @@ fun FriendListItem(
modifier = Modifier.weight(1f),
) {
Image(
painter = painterResource(R.drawable.img_100_character_default),
painter = painterResource(R.drawable.img_64_user_gray),
contentDescription = null,
modifier = Modifier.size(24.dp),
)
Expand Down
Loading