Skip to content
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

프로필 뷰와 알림 화면을 구현해요 #757

Merged
merged 12 commits into from
Mar 5, 2025

Conversation

akrudal
Copy link
Collaborator

@akrudal akrudal commented Feb 27, 2025

😽개요

🛠️프로필 뷰를 만들어요

앞으로는 프로필 뷰를 만들때는 BBProfile을 사용해주세요.
(홈화면, 프로필 화면, 댓글 등 모두 공동으로 사용해주세요. -> 없는 기능은 추가하면 됩니다.)

  • BBProfileView: 텍스트를 포함한 프로필 뷰입니다.
  • BBProfileImageView: 텍스트 없는 이미지를 위한 프로필 뷰입니다.

해당 view에는 view를 구성하기위한 configure 구조체가 있습니다. 이에 맞는 데이터를 profileview.rx.configure로 넘겨주세요.
다음처럼 넘겨주면 됩니다.

//   var profile: BBProfileImage.Configure

    reactor.state.map { $0.profile }
            .bind(to: profileView.rx.configure)
            .disposed(by: disposeBag)

🛠️ 딥링크를 구현해요

딥링크와 라우팅은 차이를 두려고합니다.

딥링크는 단순히 링크에 따른 화면 하나를 띄우는 기능을합니다.
라우팅은 그 화면까지 들어가는 모든 화면을 스택을 쌓아서 넘어가게 하려고 합니다. (캘린더의 특정 포스트라면, 홈->캘린더->포스트)

현재 딥링크는 알림(FCM 푸시알림 아니고) 과 관련된 프로필, 포스트, 스토어, 홈 정도만 구현되어있습니다.
라우팅은 구현되어 있지 않습니다.
그리고 푸시알림 같은 경우에도, 서버팀에서 링크를 수정하지 않을 예정이라고 해서 변경해두지 않았습니다. -> 추후에 변경된다면 이번에 만든 딥링크 핸들러 사용하면 될 것 같습니다.

  • DeepLink Manager -> 푸시알림 전용
  • DeepLinkHandler -> 이번에 만든 통합용 딥링크입니다.

🛠️ 알림 화면을 구현해요

위 두가지 기능을 포함한 알림 화면을 구성해두었습니다! *프로필이미지가 없는건 서버에서 없는 이미지를 보내서 그렇습니다.

🟡차후 계획 (Optional)

  • 라우팅 부분을 조금 고쳐봐야할 것 같아요
  • 딥링크가 조금 더 원활하게 되려면, 포스트디테일 부분을 고쳐봐야할 것 같습니다.

return PostReactor(postId: postId)
}

return .init(postId: "null")
Copy link
Collaborator

Choose a reason for hiding this comment

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

podtId 초기값으로 null은 왜 있는 건가요?

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

postId를 넣거나

postlist와 postselectedindex를 넣어야하는데

이 두가지에 해당하지 않는 경우를 고민하다가 그렇게 임시로 해두었습니다. 해당사항 수정하였습니다.

}
}

func doDeepLink() {
Copy link
Collaborator

Choose a reason for hiding this comment

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

DeepLinkHandler에 선언된doDeepLink 메서드랑 DeepLinkProtocol에 선언된 doDeepLink 랑 네이밍이 겹쳐서 나중에 찾기 힘들 것 같은데 다르게 선언하는 건 어떤가요?

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

둘이 똑같아 보이게 하려고 의도했던거였는데,
deeplinkhandler에 메서드명을 execute로 수정하도록하겠습니다

}

private func openMission() {
popToMain()
Copy link
Collaborator

Choose a reason for hiding this comment

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

요기 openMission 인데 popToMain이라 되어 있는거는 조금 헷갈릴 것 같은데 pushToMission 으로 하는 건 어떤가요?

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

openMission을 pushTomission으로 하시라는말씀이신가여?

Copy link
Collaborator

Choose a reason for hiding this comment

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

아니요 popToMain pushToMain이나 pushToMission으로여

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

앗 근데 push아니고 pop하는건데욥?
지금 있는 화면에서 main까지 차례대로 돌아가게하는 메서드입니다

pathComponents: [String]
) {
if pathComponents.first == "profile",
let memberId = pathComponents[safe: 1] {
Copy link
Collaborator

Choose a reason for hiding this comment

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

요기 index Out Bounds ㄱㅊ?

  • 어떻게 오는지 자세히 모르겠지만 (.firstIndex(where: $0. == "" )) 해서 인덱스 조회 해서 하는거 어떤가용?

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

애초에 그 profiledeeplink 인스턴스를 만들때 index out of range처리해두었습니다. count가 1보다 클 경우에만 실행되게요!


private let style: Style

public var rx: Reactive<BBProfile> {
Copy link
Collaborator

Choose a reason for hiding this comment

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

rx는 어디에 쓰이는 건가용??

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

오우 해당사항 삭제했습니다!

extension Reactive where Base: BBProfile {
var configure: Binder<BBProfile.Configure> {
return Binder(base) { view, config in
view.imageView.rx.configure
Copy link
Collaborator

Choose a reason for hiding this comment

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

👍👍

@akrudal akrudal changed the title Feat/#726 profile view 프로필 뷰와 알림 화면을 구현해요 Mar 4, 2025
self.navigationController = navigationController
}

func toPost() {
Copy link
Collaborator

Choose a reason for hiding this comment

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

toPost , toMission , toPostComment 메서드는 사용 안 하면 지워도 될 것 같은데

}

private func openMission() {
popToMain()
Copy link
Collaborator

Choose a reason for hiding this comment

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

아니요 popToMain pushToMain이나 pushToMission으로여

func toPostComment(postId: String)
}

final class RoutingManager: RoutingProtocol {
Copy link
Collaborator

Choose a reason for hiding this comment

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

toHome , toPost , toPostComment 도 제거해도 될 것 같네요

}

private func openCalendarPost(_ postId: String) {

Copy link
Collaborator

Choose a reason for hiding this comment

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

요기도 사용 안하는 것 같은데 제거 해도 될 것 같아요

Comment on lines 17 to 19
private let leftLine: UIView = UIView()
private let label: BBLabel = .init(.caption, textColor: .gray500)
private let rightLine: UIView = UIView()
Copy link
Collaborator

Choose a reason for hiding this comment

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

Suggested change
private let leftLine: UIView = UIView()
private let label: BBLabel = .init(.caption, textColor: .gray500)
private let rightLine: UIView = UIView()
private let leftLineView: UIView = UIView()
private let labelView: BBLabel = .init(.caption, textColor: .gray500)
private let rightLineView: UIView = UIView()

이렇게 View를 붙이는건 어떤가요?

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

final class NotificationViewController: BBNavigationViewController<NotificationReactor> {
private typealias RxDataSource = RxTableViewSectionedReloadDataSource<NotificationSectionModel>

private let divider: UIView = UIView()
Copy link
Collaborator

Choose a reason for hiding this comment

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

Suggested change
private let divider: UIView = UIView()
private let dividerView: UIView = UIView()

요기도 dividerView로 하면 좋을 것 같아용. :)

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

Comment on lines 232 to 237
// rightBarButton.snp.makeConstraints {
// $0.trailing.equalTo(0)
// $0.centerY.equalTo(self.snp.centerY)
// $0.width.height.equalTo(52)
// }

Copy link
Collaborator

Choose a reason for hiding this comment

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

Suggested change
// rightBarButton.snp.makeConstraints {
// $0.trailing.equalTo(0)
// $0.centerY.equalTo(self.snp.centerY)
// $0.width.height.equalTo(52)
// }

이 부분 제거해도 될 것 같아여

Copy link
Collaborator

Choose a reason for hiding this comment

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

해당 파일 사용 안하면 제거 해도 될 것 같은데

Do-hyun-Kim
Do-hyun-Kim previously approved these changes Mar 5, 2025
@akrudal akrudal merged commit 548c29b into develop Mar 5, 2025
1 check passed
akrudal added a commit that referenced this pull request Mar 11, 2025
* Revert "fix: Core Module Simulator Build시 Core Module에 의존된 Firebase Crashlytics Crash issue 발생 해결 (#733)" (#746)

This reverts commit 558ff15.

* feat: 음성 댓글 API Worker를 추가해요  (#742)

* feat: 음성 댓글 관련 APIs, APIWorker 추가
- 음성 댓글 관련 Entities 추가

* feat: VoiceRepository, VoiceRepositoryProtocol 추가 및 내부 메서드 구현

* feat: Equalizer View를 구현해요 (#747)

* feat: BBRecorderCore, BBRecorderManger, BBRecorderOption AVAudioRecorder, AVAudioPlayer를 사용하기 위한 클래스들 추상화

* fix: mp4 FileName 수정
- AVRecorder 데시벨 데이터 생성 활성화 하도록 수정

* fix: BBRecorderManger RxControlEvent 추가
- AVAudioRecorderDelegateProxy 추가

* CommentTextFiledView RecordButton, Container 추가
- BBRecorderManger requestMicrophonePermission 옵저버블 Property 추가
- CommentViewController ViewController 진입 시 접근 권한 팝업 및 Record Session 초기 세팅 로직 추가

* feat: Tuist Project Info.plist 마이크 접근 권한 문구 추가

* feat: CommentTextFiledView 녹음 관련 로직 추가
- BBEqualizerView Wave 파형 및 dot UI 구현
- BBRecorderCore  DocumentsPath AVRecorder, AVPlayer와 불 일치 이슈 수정
- BBRecorderManger AVRecorder Decibles 가져오는 메서드 추가
- BBRecorder Reactive+Extensions Observable 타입 Decibles 가져오는 타입 추가
- 녹음 UI 관련 image Assets 추가

* feat: CommentTextFiledView CurrentTime에따라 ConfirmButton Enabled 처리 로직 추가
- CommentTextFiledView  BBEqualizerView Decibels Bind 처리 로직 추가
- CommentTextFiledView  CurrentTime Bind 처리 로직 추가
-  Reactive+Ext  requestCurrentTime 옵저버블 추가
-  requestRecordDecibels Method 제거 및 AVInputNode를 사용하여 실시간 오디오 데이터 처리 로직 추가

* feat: BBRecorderManager 블루투스 입력장치 허용 옵션 추가
- Reactive+Extensions 데시벨 요청 옵저버블 로직 수정
- CommentTextFieldView EqualizerView 바인딩 처리 로직 수정

* fix: Github Action Google Service Info  관련 실행 명령어 제거

* feat: 음성 댓글 비즈니스 로직 및 �CommentCell 스크롤 버벅임 현상 수정해요 (#749)

* feat: CreateVoiceCommentUseCase 비즈니스 로직 추가
- CommentDIContainer CreateVoiceCommentUseCase 의존성 주입

* feat: CommentDIContainer VoiceCommentPresignedURLUseCase 의존성 주입 코드 추가
- CommentTextFieldReactor 녹음 데이터 CommentViewReactor로 전달하는 코드 추가
- CommentViewReactor 음성 댓글 업로드, PresignedURL 발급, 추가 비즈니스 로직 코드 추가
- CommentService Global State 코드 추가
- PostCommentResponseDTO CommentType 필드 값 추가
- VoiceAPIWorker MediaFile 업로드 메서드 추가
- VoiceCommentPresignedURLUseCase 비즈니스 로직 코드 추가

* feat: BBDiskCacheStroageError Type 정의 및 ErrorDescription 문구 선언
- BBDiskCacheStroage Class 내부 기능 구현
- DesignSystem 녹음 기능 관련 image Assets 추가

* fix: CommentTextFieldReactor, CommentTextFieldView 취소 버튼 클릭 시 음성 댓글 추가하는 이슈 수정
- CommentViewReactor mp4 확장자명 m4a로 변경

* fix: BBEqualizerView BackgroundColor 설정 코드 추가
- BBRecorderCore m4a 확장자로 수정

* fix: CommentTextFieldView 이벤트 중복 발생 이슈 수정
- CommentTextFieldViewReactor 로직 수정
- CommentRepository 음성 녹음 URL FileManager 저장 로직 추가
- VoiceRepository 음성 녹음 API 생성 시 FileManager 저장 로직 추가

* fix: BBRecorderManager updateDecibels, normalizeDecibel 메서드 제거
- AVAudioPCMBuffer Extensions 파일 추가 및 Decibels 정규화 메서드 추가
- Reactive+Ext requestAudioFileDecibels Observable Type 추가

* fix: BBEqualizerState inital, record case로 분류
- BBEqualizerConfig inital State에 따라 UI 구성
- BBEqualizerView BBEqualizerState 상태 값에 따라 context Color, width, Point Y, X 값 설정
- BBRecorderCore, Manager AVAudioPlayer 관련 인스턴스 및 메서드 제거
- Reactive+Ext requestAudioCurrentTime ObservableType 추가

* feat: CommentCell 내부 BBEqualizerView Spacing 값 수정
- BBEqualizerView 상태 값에 따라 UIImage 변경 코드 추가
- Assets Catalog 일시정지 이미지 리소스 추가

* feat: CommentCellReactor setPlayAudioId Mutation 추가
- CommentCell playerManager Property 추가 및 재생 관련 기능 추가
- Reactive+Ext AVError를 통한 오류 처리 핸들링 로직 추가
- BBRecorderManager 재생 관련 메서드 추가

* fix: BBDiskCacheStorage async Method로 수정
- CommentRepository, VoiceRepository Blocking 발생 코드 수정

* fix: VoiceRepository Blocking 발생 코드 수정

* fix: CommentCellReactor equalizerState Pulse 로 변경
- CommentCell 재생 및 중지 관련 메서드 기능 추가
- CommentCell 재생 시 남은 시간 Binding 로직 추가
- BBEqualizerView deinit 구문 추가
- Reactive+Ext willChangedAudioTime ObservableType 추가

* fix: BBEqualizerView prepareForReuse 호출 시 invalid Layout Update 되는 이슈 수정
- CommentCellReactor comment Pulse로 변경
- Reactive+Ext willChangedAudioTime Observable inital Type 일때 방출 안되는 이슈 수정

* feat: CommentCellReactor prepareForReuse 호출 시 이전 설정된 UI State 값 초기화
- CommentCell prepareForReuse 메서드 내부 녹화 중일 시 AVAudioPlayer 중지 메서드 추가
- Reactive+Ext 로그 제거

* fix: BBUploadResponseSerializer 내부 강제 언래핑 제거 및 BBUploadError로 throw

* chore: debug 구문 제거

* fix: CommentCell 스크롤 버벅임 이슈 수정

* chore: CommentTextFieldReactor, CommentCell, CommentTextFieldView 출력 구문 제거 및 RxScheduler로 변경

* feat: 네트워크 통신 시 타임아웃이 일어나면 재요청 하도록 로직을 추가해요  (#754)

* fix: BBNetworkInterceptor Timeout 발생 시 Retry 할 수 있도록 로직 추가 RefreshToken Retry 코드 분기 처리

* fix: CreatePresignedURLUseCase 내부 책임 분리
- CreateImageUploadUseCase 이미지 업로드 로직 추가
- CameraDisplayViewReactor PresignedURL 및 Image Upload 완료 될때까지 로딩 인디케이터 띄우도록 로직 수정

* chore: BBNetworkInterceptor 로그용 출력구문 제거

* feat: 음성 댓글 삭제 API 및 오류 핸들링 로직을 추가해요 (#752)

* feat: 앱 리뷰 팝업 창을 띄우도록 기능을 추가해요  (#755)

* feat: MyDIContainer FetchUserCreateAtInfoUseCase 의존성 주입 코드 추가
- Tuist 음성 권한 팝업 문구 수정
- UserDefaultsKey 최신버전, 리뷰 카운트, 마지막 업데이트 날짜 저장 Key 등록
- MyRepository 최신버전, 리뷰 카운트, 마지막 업데이트 날짜 Update, Fetch 메서드 정의
- MyUserDefaults 내부 최신버전, 리뷰 카운트, 업데이트 날짜 저장 메서드 추가
- FetchUserCreateAtInfoUseCase 리뷰 팝업 정책에 따른 로직 추가

* fix: MainNavigator Alert 사라지지 않는 이슈 수정
- MainViewController 초기 NoEmptyView 안뜨는 이슈 수정

* feat: Extensions 폴더 내부 SKStoreReviewController+Ext 파일 및 리뷰 팝업 메서드 추가

* feat: MainViewReactor 별점 팝업 관련 State, UseCase 추가
- MainViewController isShowRatingAlert State에따라 팝업 띄우는 로직 추가
- ProfileViewReactor 테스트 코드 제거
- UserDefaultsKey isLatestVersion Key 추가, latestVersion 제거
- MyRepository fetchIsLatestVersion 메서드 추가, fetchLatestVersion 메서드 제거
- MeAPIWorker latest 필드 값 저장 로직 추가
- fetchUserCreateAtInfoUseCase 로직 수정

* fix: CameraDisplayViewReactor Survival 피드 업로드 이후 RatingUseCase 로직 실행 구문 추가
- MainViewControllerWrapper isRatingAlertHidden Flag 값 추가
- CameraDisplayNavigator isRatingHidden Parameter 추가
- AccountResingViewReactor FCMToken 제거 API 추가 및 Keychain Storage FCM Token 제거 로직 추가
- MeAPIWorker FCMToken Local Storage에 저장하는 로직 추가

* chore: github Action Push braches Event 실행 하도록 추가
- Xcode 16.2 환경으로 실행 하도록 수정

* fix: FetchUserCreatedAtInfoUseCase로 네이밍 수정
- MyRepository 내부 fetchFamilyCreateAt 메서드 네이밍 CreatedAt 메서드로 네이밍 수정
- MyDIContainer FetchUserCreatedAtInfoUseCaseProtocol 및 makeFetchUserCreatedAtInfoUseCase로 네이밍 수정

* 프로필 뷰와 알림 화면을 구현해요 (#757)

* feat: add profile view

* feat: add profileview

* feat: add notification view

* feat: add profile

* feat: add deeplink manager

* feat: add depp links

* feat: add review

* feat: add post deeplink

* feat: add notifi data

* feat: add review

* feat: remove file

* fix: 음성 댓글 리스트 추가 된 필드 값 반영해요 (#758)

* feat: DailyCalendarViewController FireLottieView 추가
- swift.yml refactor 브런치 workflow 실행하도록 수정 및 if 구문 제거
- Fastlane destination iOS 17.0 으로 설정

* feat: Fastlane build_app Timeout 시간 및 retry 횟수 변경
- build_app xcargs 값 추가

* feat: CI 환경 내에 사용 가능한 시뮬레이터 장치 출력 구문 추가

* fix: CI 환경에 설치되어 있는 시뮬레이터로 Build 하도록 수정

* fix: Xcode Version 16.2로 변경

* fix: generic destination으로 build 하도록 수정

* fix: runner mac-os15 로 변경

* fix: Tuist AppVersion 1.3.0 으로 수정
-  AppKey 1.3.0 버전으로 변경

* feat: 음성 댓글 생성, 조회 API 내부 voiceURL 필드 값 추가
- comment 필드 값 옵셔널 처리 추가

* chore: github Action STG 배포 파이프 라인 수정

* 네비게이션 바 이미지 스케일을 수정합니다

---------

Co-authored-by: 김도현 <[email protected]>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants