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

[Feat] #259 - 개인 코스 공유 기능을 추가 하였습니다. #261

Merged

Conversation

thingineeer
Copy link
Collaborator

@thingineeer thingineeer commented Mar 11, 2024

🌱 작업한 내용

  • Scene 분기 처리
  • 공유 함수 extension으로 분기 (for Reusable)
  • 개인 코스 공유(firebase 기반)기능 추가

🌱 PR Point

🔥 이제 개인 코스도 타인에게 코스 공유를 할 수 있습니다.

🍀 privateCourse에 공유 기능을 추가 하여 보관함에 있는 코스도 공유할 수 있게 하였습니다.

  • SceneDelegate로 분기 추가
    공유 코스인지, 아닌지 판별하기 위해 CourseType을 나눠주었습니다.
enum CourseType {
    case publicCourse, privateCourse
}

switch courseType {
case .publicCourse:
    let courseDetailVC = CourseDetailVC()
    courseDetailVC.getUploadedCourseDetail(courseId: courseId) // 공유 코스
    navigationController.pushViewController(courseDetailVC, animated: false)
case .privateCourse:
    let privateCourseDetailVC = RunningWaitingVC()
    privateCourseDetailVC.setData(courseId: courseId, publicCourseId: nil) // 개인 코스
    navigationController.pushViewController(privateCourseDetailVC, animated: false)
}

🍀 공유 기능 extension으로 분리 (shareCourse 함수)

문서화하였기 때문에, 추후에 읽고 가져다 사용만 하시면 됩니다.

image

아래 RunningWaitingVC 구현 부 에서 확인해서 사용하시면 됩니다.

🍀 RunningWaitingVC() 에 공유 버튼 로직 추가

@objc private func shareButtonDidTap() {
    guard let model = self.courseModel else {
        return
    }
    analyze(buttonName: GAEvent.Button.clickShare)
    
    self.shareCourse(
        courseTitle: model.title,
        courseId: model.id,
        courseImageURL: model.image,
        minimumAppVersion: "2.0.1",
        descriptionText: "이 코스는 링크로만 들어올 수 있어요!",
        parameter: "privateCourseId"
    )
}

📸 스크린샷

공유 코스가 내 코스 인 경우 공유 코스가 타인 코스 인 경우
image image
카카오톡 공유 링크 카카오톡 공유 링크 상세
image image

📮 관련 이슈

- 같은 코드들이 반복되어 재사용 가능한 함수를 구현하였습니다. 확장성을 고려하여 앞으로 코스 관련 공유 기능이 생긴다면 아래 "shareCourse" 함수만 사용하면 됩니다.
@thingineeer thingineeer added Feat 새로운 기능 구현 Refactor 전면 수정 명진😼 labels Mar 11, 2024
@thingineeer thingineeer requested a review from 513sojin March 11, 2024 07:54
@thingineeer thingineeer self-assigned this Mar 11, 2024
Copy link
Collaborator

@513sojin 513sojin left a comment

Choose a reason for hiding this comment

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

공유 기능 익스텐션으로 빼서 재사용성 무한대로 높여버리는 이명진 만만세요 그냥 ~ 너무 수고하셨습니다 !!!!

Comment on lines +107 to +114
func shareCourse(
courseTitle: String,
courseId: Int,
courseImageURL: String,
minimumAppVersion: String,
descriptionText: String? = nil,
parameter: String
) {
Copy link
Collaborator

Choose a reason for hiding this comment

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

익스텐션으로 따로 빼두는게 좋을 것 같다는 생각을 했는데 역시 명진쌤,,,,, 👍🏻

@@ -106,17 +113,26 @@ class SceneDelegate: UIResponder, UIWindowSceneDelegate {
// to restore the scene back to its current state.
}

func handleDynamicLink(_ dynamicLink: DynamicLink?) -> String? {
func handleDynamicLink(_ dynamicLink: DynamicLink?) -> (courseType: CourseType, courseId: Int)? {
Copy link
Collaborator

Choose a reason for hiding this comment

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

guard let link = URL(string: "\(dynamicLinksDomainURIPrefix)/?\(courseParameter)=\(courseId)")
이 부분에서 courseParameter를 지정해준거에 따라 추출해서 courseType을 결정해주는 것으로 이해했는데 맞을까용 ?

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

맞습니다. 아래와 같은 코드로 URL Scheme에 해당하는 요소를 빼고 어떤 건지 구별하여 타입을 구분하여 리턴을 하도록 만들었습니다.

item.name == "courseId", item.name == "privateCourseId"

Comment on lines 122 to 129
private func isMyCourse() {
guard let isMyCourse = courseModel?.isNowUser else { return }

// 자기 코스가 아니라면 <공유, 더보기 버튼> 히든 처리
if !isMyCourse {
self.shareButton.isHidden = true
self.moreButton.isHidden = true
}
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 103 to 104
self.courseTitle = courseModel.title
self.naviBar.setTitle(self.courseTitle ?? "Test Code")
Copy link
Collaborator

Choose a reason for hiding this comment

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

setData 함수 내에서 처리하던 부분을 여기에서 설정하게 된 이유가 있나요 ?! 단순 궁금증입니닷

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

이렇게 하면 Scene에서도 타이틀 관리를 할 수 있기 때문입니다~!
setData()를 통해 데이터를 넣어주면 title까지 모델에서 받아 올 수 있어요!

바꾸기 전에서는 Scene에서 타이틀을 어떻게 넣어줘야 할지 고민을 했었는데, 이렇게 바꿔줌으로써 해결을 할 수 있었습니다.

Comment on lines +15 to +17
enum CourseType {
case publicCourse, privateCourse
}
Copy link
Collaborator

Choose a reason for hiding this comment

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

sceneDelegate의 역할이 scene의 라이프 사이클을 관리하는 거라서 이 파일 내부에서 CourseType에 대한 정의를 하는게 저희를 제외한 외부한테는 조금 이해하기 어려울 수 있겠다는 생각이 들엇습니다... 장황하게 말하긴 했지만 위치를 옮기거나(근데 옮길 곳이 없는듯..?) 주석을 다는게 어떨까용?!

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

주석을 추가 하도록 하겠습니다!

Copy link
Collaborator Author

@thingineeer thingineeer left a comment

Choose a reason for hiding this comment

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

  • 필요 없는 주석 제거
  • 필요한 주석 추가

Comment on lines 103 to 104
self.courseTitle = courseModel.title
self.naviBar.setTitle(self.courseTitle ?? "Test Code")
Copy link
Collaborator Author

Choose a reason for hiding this comment

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

이렇게 하면 Scene에서도 타이틀 관리를 할 수 있기 때문입니다~!
setData()를 통해 데이터를 넣어주면 title까지 모델에서 받아 올 수 있어요!

바꾸기 전에서는 Scene에서 타이틀을 어떻게 넣어줘야 할지 고민을 했었는데, 이렇게 바꿔줌으로써 해결을 할 수 있었습니다.

@@ -106,17 +113,26 @@ class SceneDelegate: UIResponder, UIWindowSceneDelegate {
// to restore the scene back to its current state.
}

func handleDynamicLink(_ dynamicLink: DynamicLink?) -> String? {
func handleDynamicLink(_ dynamicLink: DynamicLink?) -> (courseType: CourseType, courseId: Int)? {
Copy link
Collaborator Author

Choose a reason for hiding this comment

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

맞습니다. 아래와 같은 코드로 URL Scheme에 해당하는 요소를 빼고 어떤 건지 구별하여 타입을 구분하여 리턴을 하도록 만들었습니다.

item.name == "courseId", item.name == "privateCourseId"

Comment on lines +15 to +17
enum CourseType {
case publicCourse, privateCourse
}
Copy link
Collaborator Author

Choose a reason for hiding this comment

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

주석을 추가 하도록 하겠습니다!

@thingineeer thingineeer force-pushed the #259---개인코스공유기능 branch from 54fb20c to 9d3a764 Compare March 11, 2024 15:46
@thingineeer thingineeer merged commit 80707e5 into Runnect:develop Mar 11, 2024
1 check passed
@thingineeer thingineeer deleted the #259---개인코스공유기능 branch March 11, 2024 15:47
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Feat 새로운 기능 구현 Refactor 전면 수정 명진😼
Projects
None yet
Development

Successfully merging this pull request may close these issues.

[Feat] #259 - 개인 코스 공유 기능 추가
2 participants