Skip to content

feat: 마이페이지 공동 카테고리 초대 관리 #803 #867

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 163 commits into from
Jun 6, 2025
Merged
Show file tree
Hide file tree
Changes from 123 commits
Commits
Show all changes
163 commits
Select commit Hold shift + click to select a range
dea693d
ui: Divider(구분선) xml 스타일 변경
Junyoung-WON May 6, 2025
f494e38
ui: 카테고리 초대 관리 버튼 UI 추가
Junyoung-WON May 6, 2025
6aca548
Merge branch 'develop' into feature/#803-mypage-managing-invitation
Junyoung-WON May 6, 2025
01ef90d
chore: 컴포즈 ktlint 설정 추가
Junyoung-WON May 6, 2025
6425a89
build: 컴포즈 ViewModel 의존성 추가
Junyoung-WON May 6, 2025
08e3410
feat: Divider 컴포저블 작성
Junyoung-WON May 6, 2025
38a9678
feat: MiddleDivider 컴포저블 작성
Junyoung-WON May 6, 2025
7555563
feat: MiddleDivider 컴포저블 적용
Junyoung-WON May 6, 2025
879494f
feat: MenuButton 컴포저블 작성
Junyoung-WON May 8, 2025
a09f9de
feat: MenuButton 컴포저블 적용
Junyoung-WON May 8, 2025
d38fc63
Merge branch 'develop' into feature/#803-mypage-managing-invitation
Junyoung-WON May 8, 2025
d1ecda3
chore: MenuButton 컴포저블 색상 관련 예정 작업 명시
Junyoung-WON May 8, 2025
eeef09a
feat: 공통 상단 바 DefaultNavigationTopBar 추가
Junyoung-WON May 14, 2025
31c2a28
feat: 카테고리 초대 관리 화면의 메뉴를 Enum으로 구성
Junyoung-WON May 14, 2025
93e341f
refactor: 공통 Divider 컴포저블 이름 및 파일명 변경
Junyoung-WON May 15, 2025
156297a
refactor: 마이페이지 메뉴 버튼 컴포넌트 파일 이동 및 분리
Junyoung-WON May 15, 2025
5b27c2d
refactor: TopBar 파일명 변경 및 Preview 접근제한 변경
Junyoung-WON May 15, 2025
77b3827
build: Compose ConstraintLayout 의존성 추가
Junyoung-WON May 15, 2025
aa1b9ac
ui: drawable 아이콘 추가
Junyoung-WON May 15, 2025
7ab8a74
feat: 공통 Composable 추가
Junyoung-WON May 15, 2025
9452c1d
feat: 카테고리 초대 관리 Activity 생성
Junyoung-WON May 15, 2025
99b9bc1
refactor: MenuButton 구성 변경
Junyoung-WON May 17, 2025
f0c6af6
refactor: DefaultNavigationTopBar 구성 변경
Junyoung-WON May 17, 2025
131edb4
refactor: InvitationMenuItems 이름 변경
Junyoung-WON May 17, 2025
30cf0be
feat: 기본 텍스트 버튼 컴포넌트 작성
Junyoung-WON May 17, 2025
9e7defb
feat: 보낸 초대 / 받은 초대 선택 메뉴 구현
Junyoung-WON May 17, 2025
e5c25a9
feat: 초대 목록 아이템에 사용할 컴포넌트 작성
Junyoung-WON May 17, 2025
df18c1a
feat: 초대 목록 아이템에 적용될 InvitationUiModel
Junyoung-WON May 17, 2025
f443300
feat: 받은 초대 목록 아이템 구현
Junyoung-WON May 17, 2025
f38dd4f
feat: 보낸 초대 목록 아이템 구현
Junyoung-WON May 17, 2025
65aa51c
feat: 받은 초대 목록 화면 구현
Junyoung-WON May 17, 2025
0175099
feat: 보낸 초대 목록 화면 구현
Junyoung-WON May 17, 2025
a2b7e59
feat: 초대 목록 화면을 구성한 InvitationManagementScreen
Junyoung-WON May 17, 2025
fe90eb3
feat: InvitationManagementScreen을 Activity에 적용
Junyoung-WON May 17, 2025
c46ebe6
feat: 카테고리 초대 관리 버튼 동작 설정
Junyoung-WON May 17, 2025
d68f346
ui: 기본 구분선 색상 변경
Junyoung-WON May 17, 2025
a9b32fc
feat: 보낸 초대 목록 아이템에 활용할 UI 모델 작성
Junyoung-WON May 21, 2025
c162df1
refactor: 보낸 초대 목록에서 사용하는 UI 모델 변경
Junyoung-WON May 21, 2025
c10b9a3
refactor: InvitationUiModel 수정
Junyoung-WON May 21, 2025
27ebfdf
ui: DefaultTextButton의 내부 여백 조정
Junyoung-WON May 22, 2025
01145e3
ui: 초대 관리 화면의 카테고리 제목 수정
Junyoung-WON May 22, 2025
0797e28
ui: 초대 관리 화면의 닉네임 텍스트 수정
Junyoung-WON May 22, 2025
28c4497
refactor: 보낸 초대와 받은 초대 더미 UI 모델 수정
Junyoung-WON May 22, 2025
ecd3f7e
refactor: 보낸 초대 목록 아이템의 Preview 데이터 변경
Junyoung-WON May 22, 2025
b4f1f85
refactor: 보낸 초대 아이템 컴포넌트 수정
Junyoung-WON May 22, 2025
3140de7
refactor: 받은 초대 아이템 컴포넌트 수정
Junyoung-WON May 23, 2025
6e19ea7
feat: 초대 도메인 모델 작성
Junyoung-WON May 23, 2025
c484c1e
feat: 초대 목록을 가져오는 Repository 작성
Junyoung-WON May 23, 2025
3ab74b3
feat: 임시 초대 목록을 저장하는 InvitationTempRepository
Junyoung-WON May 23, 2025
c80fda6
feat: 초대 도메인 모델을 UI 모델로 변환하는 Mapper
Junyoung-WON May 23, 2025
011fdcc
feat: InvitationViewModel 작성
Junyoung-WON May 23, 2025
21957be
feat: InvitationManagementScreen에 ViewModel 연결
Junyoung-WON May 23, 2025
8bb0c02
feat: InvitationManagement 컴포저블 분리
Junyoung-WON May 23, 2025
48f9ec9
feat: InvitationManagement 컴포저블 분리
Junyoung-WON May 23, 2025
f214bcb
refactor: 보낸 초대 UI 모델 더미 데이터 추가 및 중복코드 제거
Junyoung-WON May 23, 2025
f304be5
feat: InvitationRepository Hilt 적용
Junyoung-WON May 23, 2025
a35373d
feat: InvitationViewModel Hilt 의존성 주입 적용
Junyoung-WON May 23, 2025
66111a0
feat: InvitationManagementActivity Hilt 의존성 주입 적용
Junyoung-WON May 23, 2025
c1da332
feat: 생명주기를 따르는 collect 적용
Junyoung-WON May 23, 2025
808bfa4
feat: 초대 목록 아이템에 invitationId 추가
Junyoung-WON May 23, 2025
8ce5e9d
feat: 받은 초대 DTO 작성
Junyoung-WON May 26, 2025
b19a287
feat: 보낸 초대 DTO 작성
Junyoung-WON May 26, 2025
26097e9
feat: 받은 초대 응답 DTO 작성
Junyoung-WON May 26, 2025
a622ca4
feat: 보낸 초대 응답 DTO 작성
Junyoung-WON May 26, 2025
aa95718
feat: 초대 목록 DTO를 도메인으로 변환시키는 Mapper 작성
Junyoung-WON May 26, 2025
e8e2e57
feat: 카테고리 초대 관련 API Service 작성
Junyoung-WON May 26, 2025
921624c
feat: InvitationApiService 생성, 주입 메서드 작성
Junyoung-WON May 26, 2025
9d9973f
refactor: Provides 메서드에 provide 추가
Junyoung-WON May 26, 2025
204b331
feat: InvitationDataSource 작성
Junyoung-WON May 26, 2025
1973653
feat: InvitationRemoteDataSource 작성
Junyoung-WON May 26, 2025
9fd575f
feat: InvitationDataSource 의존성 주입 메서드 작성
Junyoung-WON May 26, 2025
718176c
feat: InvitationRepository에 초대 수락, 거절, 취소 기능 추가
Junyoung-WON May 26, 2025
d3b7018
feat: DataSource를 사용하는 InvitationDefaultRepository
Junyoung-WON May 26, 2025
afa43f7
feat: InvitationDefaultRepository를 주입하도록 변경
Junyoung-WON May 26, 2025
0cfb9f9
fix: 누락된 suspend 키워드 추가
Junyoung-WON May 26, 2025
113767b
refactor: 프로필 이미지 원형 처리
Junyoung-WON May 26, 2025
8ba5adb
refactor: init에서 보낸 초대 목록은 불러오지 않도록 변경
Junyoung-WON May 26, 2025
a5c57cb
refactor: 보낸 초대, 받은 초대 목록을 업데이트하는 로직 메서드 분리
Junyoung-WON May 26, 2025
78ac85e
feat: 보낸 초대를 취소하는 cancelInvitation 작성
Junyoung-WON May 26, 2025
2c751cb
feat: 보낸 초대를 취소하는 기능 적용
Junyoung-WON May 26, 2025
5985a2d
feat: 받은 초대를 수락 및 거절하는 기능 구현
Junyoung-WON May 26, 2025
e5b3777
refactor: 수락, 거절 버튼 컴포넌트 파일 분리
Junyoung-WON May 26, 2025
603b38f
refactor: 취소 버튼 컴포넌트 파일 분리
Junyoung-WON May 26, 2025
6bb94f4
refactor: 카테고리 제목 레이아웃 컴포넌트 파일 분리
Junyoung-WON May 26, 2025
56c9e4b
refactor: 안내 문구 PX 너비 변수명 수정
Junyoung-WON May 26, 2025
a028b54
refactor: 기본 텍스트 버튼의 Padding 조정
Junyoung-WON May 26, 2025
bd7150c
refactor: CategoryTitleLayout 구현 변경
Junyoung-WON May 26, 2025
b499286
refactor: Constraint Chain 설정으로 변경
Junyoung-WON May 26, 2025
717bf14
feat: 테스트용 더미 데이터 추가
Junyoung-WON May 26, 2025
883c5ea
refactor: 초대 메뉴 컴포저블 리팩터링
Junyoung-WON May 26, 2025
d414ac1
feat: 기본 Dialog 추가
Junyoung-WON May 29, 2025
a8f8259
refactor: DefaultDialog 인자 변경
Junyoung-WON May 31, 2025
ab3e3e2
chore: DefaultAlertDialog Preview 컴포저블 이름 변경
Junyoung-WON May 31, 2025
5eee24f
feat: 초대 관리 화면의 Dialog 상태 정의
Junyoung-WON May 31, 2025
4947e8d
feat: 초대 관리 화면의 Dialog 컴포저블 작성
Junyoung-WON Jun 1, 2025
dec2bbd
feat: 초대 관리 화면 Dialog 구현
Junyoung-WON Jun 1, 2025
f1d232f
style: ktlint 적용
Junyoung-WON Jun 2, 2025
81db274
refactor: InvitationDataSource 제거
Junyoung-WON Jun 3, 2025
54d0db6
fix: develop 브랜치 병합 및 merge conflict 해결
Junyoung-WON Jun 3, 2025
5f9431f
ui: 초대 관리 메뉴 버튼 문자열 리소스 활용
Junyoung-WON Jun 3, 2025
fee67bc
refactor: MenuButton -> MyPageMenuButton으로 이름 변경
Junyoung-WON Jun 3, 2025
33468e3
refactor: AcceptButtonPreview 구성 변경
Junyoung-WON Jun 3, 2025
571b2d6
ui: 받은 초대 관리 수락 버튼 문자열 리소스 적용
Junyoung-WON Jun 3, 2025
870414d
ui: 받은 초대 관리 거절 버튼 문자열 리소스 적용
Junyoung-WON Jun 3, 2025
e384330
refactor: 사용하지 않는 InvitationTempRepository 제거
Junyoung-WON Jun 3, 2025
fb32dcf
refactor: 받은 초대 아이템의 가이드 문구 문자열 리소스 적용
Junyoung-WON Jun 3, 2025
d7d1a94
refactor: 보낸 초대 관리 취소 버튼 문구 문자열 리소스 적용
Junyoung-WON Jun 3, 2025
de1d056
refactor: 보낸 초대 아이템의 가이드 문구 문자열 리소스 적용
Junyoung-WON Jun 3, 2025
219f0ec
refactor: 초대 관리 메뉴 아이템 문자열 리소스 적용
Junyoung-WON Jun 3, 2025
155bbe1
feat: DefaultEmptyView 구현
Junyoung-WON Jun 3, 2025
1bd53cd
feat: 받은/보낸 초대 목록이 비어있는 경우 EmptyView 를 나타내도록 변경
Junyoung-WON Jun 3, 2025
c6afb9b
refactor: 초대 관리 화면 TopBar 분리
Junyoung-WON Jun 3, 2025
f108fac
feat: 토스트 메시지 상태를 나타내는 ToastMessage 작성
Junyoung-WON Jun 3, 2025
08fc924
feat: 토스트 메세지 상태 관리와 예외 처리 적용
Junyoung-WON Jun 3, 2025
64c5e0a
feat: 토스트 메세지를 띄우는 기능 적용
Junyoung-WON Jun 3, 2025
5efc2ea
style: ktlint 적용
Junyoung-WON Jun 3, 2025
15bb2f4
feat: DefaultTextButton 매개변수에 PaddingValue 추가
Junyoung-WON Jun 4, 2025
4d18369
refactor: DefaultTextButton Preview 세분화
Junyoung-WON Jun 4, 2025
cb2acce
refactor: invitation 패키지 내 파일 정리
Junyoung-WON Jun 4, 2025
f4831fb
refactor: 받은 초대 아이템의 Preview 추가 및 분리
Junyoung-WON Jun 4, 2025
485d03b
refactor: 보낸 초대 아이템의 Preview 추가 및 분리
Junyoung-WON Jun 4, 2025
8ce7987
refactor: Hilt가 적용되도록 hiltViewModel() 메서드 사용
Junyoung-WON Jun 4, 2025
6a58b14
refactor: DefaultAlertDialog.kt 제거
Junyoung-WON Jun 4, 2025
bd7047a
fix: merge conflicts 해결
Junyoung-WON Jun 5, 2025
005b777
chore: 코멘트 삭제의 문자열 리소스 이름 수정
Junyoung-WON Jun 5, 2025
a8d03dc
fix: merge conflicts 해결
Junyoung-WON Jun 5, 2025
be39442
feat: 알림 존재 확인 요청에 따른 응답 객체 추가
Junyoung-WON Jun 5, 2025
f6ad67b
feat: 알림 존재 여부를 담고있는 도메인 모델 추가
Junyoung-WON Jun 5, 2025
05185b6
feat: NotificationApiService 작성
Junyoung-WON Jun 5, 2025
8c55205
feat: NotificationRepository 작성
Junyoung-WON Jun 5, 2025
6b05215
feat: NotificationMapper 작성
Junyoung-WON Jun 5, 2025
8fa5870
feat: 기본 NotificationRepository 추가
Junyoung-WON Jun 5, 2025
800da3a
feat: NotificationApiService 주입 추가
Junyoung-WON Jun 5, 2025
7ddce20
feat: NotificationRepository 주입 추가
Junyoung-WON Jun 5, 2025
bb39737
chore: 제거된 RetrofitModule.kt 반영
Junyoung-WON Jun 5, 2025
984195b
feat: 카테고리 초대 존재 여부를 가져오는 기능 구현
Junyoung-WON Jun 5, 2025
0570dda
feat: 카테고리 초대 존재 여부를 가져와 알림을 띄우는 기능 적용
Junyoung-WON Jun 5, 2025
b79dea4
refactor: getSnackBarWithAction 사용하도록 수정
Junyoung-WON Jun 5, 2025
4ae7cdc
refactor: 변경된 문자열 리소스 ID 적용
Junyoung-WON Jun 5, 2025
64865ff
ui: 불필요한 Preview 배경 설정 제거
Junyoung-WON Jun 5, 2025
df39221
chore: Preview 이름을 Composable과 동일하게 수정
Junyoung-WON Jun 5, 2025
b250ddd
ui: Preview 배경색 설정 변경
Junyoung-WON Jun 5, 2025
079e5ba
chore: Preview 배경 색상의 불필요한 타입 변환 연산자 제거
Junyoung-WON Jun 5, 2025
0e7d862
refactor: DefaultTextButton의 border 기본 인자 값 변경
Junyoung-WON Jun 5, 2025
ccaf06e
refactor: 제목이 없는 TopBar 구현
Junyoung-WON Jun 5, 2025
5e87f9a
refactor: 불필요한 padding 속성 제거
Junyoung-WON Jun 5, 2025
74b9768
refactor: Named Arguments 명시
Junyoung-WON Jun 5, 2025
50dcbbd
refactor: InvitationSelectionMenuUiModel 이름 변경
Junyoung-WON Jun 5, 2025
bf77523
refactor: 네이밍 컨벤션에 따라 데이터 조회 메서드 수정
Junyoung-WON Jun 5, 2025
50461af
refactor: ViewModel 초기화 시 보낸 초대 목록도 함께 불러오도록 변경
Junyoung-WON Jun 5, 2025
0c07e36
refactor: 과도한 컴포저블 분리 제거 - MiddleDivider
Junyoung-WON Jun 5, 2025
9227eff
refactor: 불필요한 Constrain margin 제거
Junyoung-WON Jun 5, 2025
738ddb6
refactor: 컴포저블 내 문자열 리소스화
Junyoung-WON Jun 5, 2025
eed411f
chore: MenuTabPreview 세분화
Junyoung-WON Jun 5, 2025
aa9d7ec
ui: MenuTab의 내부 간격 조정
Junyoung-WON Jun 5, 2025
6c052df
ui: 초대 메뉴 탭의 간격과 아이콘 수정
Junyoung-WON Jun 5, 2025
7afb351
style: ktlint 적용
Junyoung-WON Jun 5, 2025
35637f5
Merge branch 'develop' into feature/#803-mypage-managing-invitation
Junyoung-WON Jun 5, 2025
91b6d25
ui: 다크모드 설정 해제
Junyoung-WON Jun 6, 2025
6b8f71b
fix: merge conflicts 해결
Junyoung-WON Jun 6, 2025
6cce255
refactor: 다이얼로그에 설명란이 없어도 사용할 수 있도록 변경
Junyoung-WON Jun 6, 2025
fab2a0e
ui: 카테고리 거절/취소 다이얼로그 문구 수정
Junyoung-WON Jun 6, 2025
8cc3e4f
ui: 거절/취소 다이얼로그를 변경된 문구로 적용
Junyoung-WON Jun 6, 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 android/Staccato_AN/.editorconfig
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
[*.{kt,kts}]
ktlint_function_naming_ignore_when_annotated_with=Composable
ktlint_function_naming_ignore_when_annotated_with=Composable
8 changes: 7 additions & 1 deletion android/Staccato_AN/app/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -237,13 +237,19 @@ dependencies {
implementation(libs.hilt.navigation.compose)
implementation(libs.androidx.navigation.compose)

// coil
// Compose Coil
implementation(libs.coil.compose)

// Compose UI Test
androidTestImplementation(platform(libs.androidx.compose.bom))
androidTestImplementation(libs.androidx.ui.test.junit4)
debugImplementation(libs.androidx.ui.test.manifest)

// Compose ViewModel
implementation(libs.lifecycle.viewmodel.compose)

// Compose ConstraintLayout
implementation(libs.androidx.constraintlayout.compose)
}

secrets {
Expand Down
14 changes: 10 additions & 4 deletions android/Staccato_AN/app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
@@ -1,13 +1,14 @@
<?xml version="1.0" encoding="utf-8"?>

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">

<queries>
<intent>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="https" android:host="www.instagram.com" />
<data
android:scheme="https"
android:host="www.instagram.com" />
</intent>
</queries>

Expand Down Expand Up @@ -66,8 +67,8 @@
<activity
android:name=".presentation.main.MainActivity"
android:exported="true"
android:windowSoftInputMode="adjustPan"
android:screenOrientation="portrait" />
android:screenOrientation="portrait"
android:windowSoftInputMode="adjustPan" />

<activity
android:name=".presentation.staccatoupdate.StaccatoUpdateActivity"
Expand All @@ -94,6 +95,11 @@
android:exported="false"
android:screenOrientation="portrait" />

<activity
android:name=".presentation.invitation.InvitationManagementActivity"
android:exported="false"
android:screenOrientation="portrait" />

<activity
android:name=".presentation.webview.WebViewActivity"
android:exported="false"
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package com.on.staccato.data.dto.invitation

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

@Serializable
data class ReceivedInvitationDto(
@SerialName("invitationId") val invitationId: Long,
@SerialName("inviterId") val inviterId: Long,
@SerialName("inviterNickname") val inviterNickname: String,
@SerialName("inviterProfileImageUrl") val inviterProfile: String? = null,
@SerialName("categoryId") val categoryId: Long,
@SerialName("categoryTitle") val categoryTitle: String,
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package com.on.staccato.data.dto.invitation

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

@Serializable
data class ReceivedInvitationsResponse(
@SerialName("invitations") val invitations: List<ReceivedInvitationDto>,
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package com.on.staccato.data.dto.invitation

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

@Serializable
data class SentInvitationDto(
@SerialName("invitationId") val invitationId: Long,
@SerialName("inviteeId") val inviteeId: Long,
@SerialName("inviteeNickname") val inviteeNickname: String,
@SerialName("inviteeProfileImageUrl") val inviteeProfileImageUrl: String? = null,
@SerialName("categoryId") val categoryId: Long,
@SerialName("categoryTitle") val categoryTitle: String,
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package com.on.staccato.data.dto.invitation

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

@Serializable
data class SentInvitationsResponse(
@SerialName("invitations") val invitations: List<SentInvitationDto>,
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
package com.on.staccato.data.dto.mapper

import com.on.staccato.data.dto.invitation.ReceivedInvitationDto
import com.on.staccato.data.dto.invitation.ReceivedInvitationsResponse
import com.on.staccato.data.dto.invitation.SentInvitationDto
import com.on.staccato.data.dto.invitation.SentInvitationsResponse
import com.on.staccato.domain.model.Member
import com.on.staccato.domain.model.invitation.ReceivedInvitation
import com.on.staccato.domain.model.invitation.SentInvitation

fun ReceivedInvitationsResponse.toDomain(): List<ReceivedInvitation> = invitations.map { it.toDomain() }

fun ReceivedInvitationDto.toDomain(): ReceivedInvitation =
ReceivedInvitation(
invitationId = invitationId,
inviter =
Member(
memberId = inviterId,
nickname = inviterNickname,
memberImage = inviterProfile,
),
categoryId = categoryId,
categoryTitle = categoryTitle,
)

fun SentInvitationsResponse.toDomain(): List<SentInvitation> = invitations.map { it.toDomain() }

fun SentInvitationDto.toDomain(): SentInvitation =
SentInvitation(
invitationId = invitationId,
invitee =
Member(
memberId = inviteeId,
nickname = inviteeNickname,
memberImage = inviteeProfileImageUrl,
),
categoryId = categoryId,
categoryTitle = categoryTitle,
)
Original file line number Diff line number Diff line change
Expand Up @@ -2,17 +2,49 @@ package com.on.staccato.data.invitation

import com.on.staccato.data.dto.invitation.InvitationRequest
import com.on.staccato.data.dto.invitation.InvitationResponse
import com.on.staccato.data.dto.invitation.ReceivedInvitationsResponse
import com.on.staccato.data.dto.invitation.SentInvitationsResponse
import com.on.staccato.data.network.ApiResult
import retrofit2.http.Body
import retrofit2.http.GET
import retrofit2.http.POST
import retrofit2.http.Path

interface InvitationApiService {
@POST(INVITATION_PATH)
suspend fun postInvitation(
@Body invitation: InvitationRequest,
): ApiResult<InvitationResponse>

@GET(RECEIVED_INVITATION_PATH)
suspend fun getReceivedInvitations(): ApiResult<ReceivedInvitationsResponse>

@POST(INVITATION_ACCEPT_PATH)
suspend fun postInvitationAccept(
@Path(INVITATION_ID) invitationId: Long,
): ApiResult<Unit>

@POST(INVITATION_REJECT_PATH)
suspend fun postInvitationReject(
@Path(INVITATION_ID) invitationId: Long,
): ApiResult<Unit>

@GET(SENT_INVITATION_PATH)
suspend fun getSentInvitations(): ApiResult<SentInvitationsResponse>

@POST(INVITATION_CANCEL_PATH)
suspend fun postInvitationCancel(
@Path(INVITATION_ID) invitationId: Long,
): ApiResult<Unit>

companion object {
const val INVITATION_PATH = "/invitations"
private const val INVITATION_ID = "invitationId"
private const val RECEIVED_INVITATION_PATH = "$INVITATION_PATH/received"
private const val SENT_INVITATION_PATH = "$INVITATION_PATH/sent"
private const val INVITATION_PATH_WITH_ID = "$INVITATION_PATH/{$INVITATION_ID}"
private const val INVITATION_ACCEPT_PATH = "$INVITATION_PATH_WITH_ID/accept"
private const val INVITATION_REJECT_PATH = "$INVITATION_PATH_WITH_ID/reject"
private const val INVITATION_CANCEL_PATH = "$INVITATION_PATH_WITH_ID/cancel"
}
}
Original file line number Diff line number Diff line change
@@ -1,8 +1,11 @@
package com.on.staccato.data.invitation

import com.on.staccato.data.dto.invitation.InvitationRequest
import com.on.staccato.data.dto.mapper.toDomain
import com.on.staccato.data.network.ApiResult
import com.on.staccato.data.network.handle
import com.on.staccato.domain.model.invitation.ReceivedInvitation
import com.on.staccato.domain.model.invitation.SentInvitation
import com.on.staccato.domain.repository.InvitationRepository
import javax.inject.Inject

Expand All @@ -17,4 +20,19 @@ class InvitationDefaultRepository
): ApiResult<List<Long>> =
invitationApiService.postInvitation(InvitationRequest(categoryId, inviteeIds))
.handle { it.invitationIds }

override suspend fun getReceivedInvitations(): ApiResult<List<ReceivedInvitation>> =
invitationApiService.getReceivedInvitations().handle { it.toDomain() }

override suspend fun acceptInvitation(invitationId: Long): ApiResult<Unit> =
invitationApiService.postInvitationAccept(invitationId = invitationId).handle()

override suspend fun rejectInvitation(invitationId: Long): ApiResult<Unit> =
invitationApiService.postInvitationReject(invitationId = invitationId).handle()

override suspend fun getSentInvitations(): ApiResult<List<SentInvitation>> =
invitationApiService.getSentInvitations().handle { it.toDomain() }

override suspend fun cancelInvitation(invitationId: Long): ApiResult<Unit> =
invitationApiService.postInvitationCancel(invitationId = invitationId).handle()
Comment on lines +23 to +37
Copy link
Contributor

Choose a reason for hiding this comment

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

카테고리 초대 관리 화면은 전부 Compose로 구성되어 있어서, Repository 반환값을 Flow<ApiResult>로 변경해보시는 것도 좋을 것 같습니다. 시간 되실 때 한 번 시도해보세요!

Copy link
Contributor Author

Choose a reason for hiding this comment

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

일용할 딥다이브 양식을 주셔서 감사해요 😇

}
Original file line number Diff line number Diff line change
Expand Up @@ -45,13 +45,13 @@ object RetrofitModule {

@Singleton
@Provides
fun memberApiService(): MemberApiService = retrofit.create(MemberApiService::class.java)
fun provideMemberApiService(): MemberApiService = retrofit.create(MemberApiService::class.java)

@Singleton
@Provides
fun myPageApiService(): MyPageApiService = retrofit.create(MyPageApiService::class.java)
fun provideMyPageApiService(): MyPageApiService = retrofit.create(MyPageApiService::class.java)

@Singleton
@Provides
fun invitationApiService(): InvitationApiService = retrofit.create(InvitationApiService::class.java)
fun provideInvitationApiService(): InvitationApiService = retrofit.create(InvitationApiService::class.java)
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package com.on.staccato.domain.model.invitation

import com.on.staccato.domain.model.Member

data class ReceivedInvitation(
val invitationId: Long,
val inviter: Member,
val categoryId: Long,
val categoryTitle: String,
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package com.on.staccato.domain.model.invitation

import com.on.staccato.domain.model.Member

data class SentInvitation(
val invitationId: Long,
val invitee: Member,
val categoryId: Long,
val categoryTitle: String,
)
Original file line number Diff line number Diff line change
@@ -1,10 +1,22 @@
package com.on.staccato.domain.repository

import com.on.staccato.data.network.ApiResult
import com.on.staccato.domain.model.invitation.ReceivedInvitation
import com.on.staccato.domain.model.invitation.SentInvitation

interface InvitationRepository {
suspend fun invite(
categoryId: Long,
inviteeIds: List<Long>,
): ApiResult<List<Long>>

suspend fun getReceivedInvitations(): ApiResult<List<ReceivedInvitation>>

suspend fun acceptInvitation(invitationId: Long): ApiResult<Unit>

suspend fun rejectInvitation(invitationId: Long): ApiResult<Unit>

suspend fun getSentInvitations(): ApiResult<List<SentInvitation>>

suspend fun cancelInvitation(invitationId: Long): ApiResult<Unit>
}
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ import androidx.compose.ui.Modifier

@Composable
fun Modifier.clickableWithoutRipple(onClick: () -> Unit): Modifier =
this.clickable(
clickable(
indication = null,
interactionSource = remember { MutableInteractionSource() },
onClick = onClick,
Expand Down
Loading