-
Notifications
You must be signed in to change notification settings - Fork 0
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: 1.0.6 버전 업데이트에 따른 기능 추가 및 수정 #166
Conversation
고생많으셨습니다 천천히 살펴볼게요~! |
if state != .memo(isReadOnly: true) && | ||
state != .memo(isReadOnly: false) { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
요건 무슨조건인가요? state가 memo가 아닐 때 맞나요??
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
넵 맞습니다! 디자인 보면 메모 표시할 땐 텍스트 카운트가 없어서 넣었습니다
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
아하 그렇다면 요렇게 표현할 수도 있을 것 같아요
연관값이 반드시 필요한 것은 아니라고 느껴서 끄적여봤습니다 😃
/// - `memo`일 때 제외하고 `textCount`를 보여줌
if case .memo = state { }
else { textCount.pokitBlurReplaceTransition(.pokitDissolve) }
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
오 넵 알겠습니다!
} | ||
.padding(.top, 4) | ||
} | ||
|
||
private var textCount: some View { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
네이밍이 Int Type같아요
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
음.. 한번 고민해보겠습니다
if let id = state.domain.contentId { | ||
return .send(.async(.컨텐츠_상세_조회_API(id: id))) | ||
} else if let content = state.domain.content { | ||
state.memo = content.memo | ||
return .none | ||
} else { | ||
return .none | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
case .뷰가_나타났을때:
if let id = state.domain.contentId {
return .send(.async(.컨텐츠_상세_조회_API(id: id)))
}
if let content = state.domain.content {
state.memo = content.memo
return .none
}
return .none
요렇게 바꿔도 좋을 것 같아요 가독성이 글쎄
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
넵!
PokitListButton( | ||
title: "즐겨찾기", | ||
type: .bottomSheet( | ||
icon: favorites | ||
? .icon(.starFill) | ||
: .icon(.star), | ||
iconColor: favorites | ||
? .pokit(.icon(.brand)) | ||
: .pokit(.icon(.primary)) | ||
), | ||
action: { send(.즐겨찾기_버튼_눌렀을때) } | ||
) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
제가 느낀 디자인시스템은 모든곳에서 사용하기 위해서 많이(광적으로..?) 추상화되어있다고 생각이 들어요
이런부분에서는 구체화해서 내부로 숨겨버리는게 더 깔끔하지 않나 하는 제 의견입니다..
디쟌시스템 관련해서 길게 생각해보시져 같이!
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
넵! 좋습니다...!!
|
||
return isEdit | ||
? .send(.async(.컨텐츠_수정_API)) | ||
: .send(.async(.컨텐츠_추가_API)) | ||
case .포킷추가_버튼_눌렀을때: | ||
guard state.domain.categoryTotalCount < 30 else { | ||
/// 🚨 Error Case [1]: 포킷 갯수가 30개 이상일 경우 | ||
state.showMaxCategoryPopup = true | ||
state.linkPopup = .text(title: "최대 30개의 포킷을 생성할 수 있습니다.\n포킷을 삭제한 뒤에 추가해주세요.") |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
요런 타이틀들 Constants로 묶어서 관리하는게 유지보수하기 편해보여요
String extension이나 이런저런 많은 방법이 있을듯!
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
오.. 반영해보겠습니다!
state.linkImageURL = imageURL | ||
let contentTitle = state.title.isEmpty ? "제목을 입력해주세요" : state.title | ||
state.linkTitle = title ?? contentTitle | ||
state.linkImageURL = imageURL ?? "https://pokit-storage.s3.ap-northeast-2.amazonaws.com/logo/pokit.png" |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
요것두 url 따로 관리
} catch: { error, send in | ||
guard let errorResponse = error as? ErrorResponse else { return } | ||
await send( | ||
.inner(.링크팝업_활성화(.error(title: errorResponse.message))), | ||
animation: .pokitSpring | ||
) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
catch문보다가 문득 든 생각이 요런것두 액션으로 받아서 한번에 처리하는거 어떠신가요??
enum InnerAction {
case error(Error) // or ErrorResponse
}
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
오 좋아여
if store.state.showMaxCategoryPopup { | ||
if store.linkPopup != nil { | ||
PokitLinkPopup( | ||
"최대 30개의 포킷을 생성할 수 있습니다. \n포킷을 삭제한 뒤에 추가해주세요.", | ||
isPresented: $store.showMaxCategoryPopup, | ||
type: .text | ||
) | ||
.animation(.pokitSpring, value: store.showMaxCategoryPopup) | ||
} else if store.state.showDetectedURLPopup { | ||
PokitLinkPopup( | ||
"복사한 링크 저장하기", | ||
isPresented: $store.showDetectedURLPopup, | ||
type: .link(url: store.link ?? ""), | ||
action: { send(.링크복사_버튼_눌렀을때, animation: .pokitSpring) } | ||
type: $store.linkPopup, | ||
action: { send(.링크팝업_버튼_눌렀을때, animation: .pokitSpring) } |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
PokitLinkPopup 내부에서도 type에 대해 optional unwrapping을 하는 것으로 보이는데 내부적 처리로는 동작을 제대로 하지 못해서 외부에서도 nil 여부를 한번더 체크하는건가요??
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
.onReceive(timer) { _ in
guard second < 2 && type != nil else {
closedPopup()
return
}
second += 1
}
혹시 내부적 처리라는게 이걸 뜻하는건가요? 저 type != nil
은 기존 코드에서 무작정 바꾸다 보니 저도 모르게 썼던거 같아요.. 없애겠습니다
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
.onReceive(timer) { _ in guard second < 2 && type != nil else { closedPopup() return } second += 1 }혹시 내부적 처리라는게 이걸 뜻하는건가요? 저
type != nil
은 기존 코드에서 무작정 바꾸다 보니 저도 모르게 썼던거 같아요.. 없애겠습니다
넵 onReceive도 그렇고 64번째줄, 72번째줄도 type이 쓰이더라구여! 그거 관련해서 물어봤습니다
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
불필요한건 지우도록 하겠습니당
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
.onReceive(timer) { _ in guard second < 2 && type != nil else { closedPopup() return } second += 1 }혹시 내부적 처리라는게 이걸 뜻하는건가요? 저
type != nil
은 기존 코드에서 무작정 바꾸다 보니 저도 모르게 썼던거 같아요.. 없애겠습니다넵 onReceive도 그렇고 64번째줄, 72번째줄도 type이 쓰이더라구여! 그거 관련해서 물어봤습니다
64번째 줄은 팝업이 link
타입일 경우 url을 표시하기 위함이고, 72번째 줄은 success
타입일 경우 체크마크를 표시하기 위함입니다!
title: store.linkTitle == "제목을 입력해주세요" | ||
? store.title.isEmpty ? "제목을 입력해주세요" : store.title |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
위에서 말했던 Constants를 사용해 하드코딩된 String값을 비교하면 실수가 덜 할 것 같아요
guard let url = URL(string: content.data) else { | ||
return .none | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
한줄
/// - 링크에 대한 `공유` / `수정` / `삭제` delegate | ||
switch action { | ||
case .bottomSheet(let delegate, let content): | ||
switch delegate { | ||
case .deleteCellButtonTapped: | ||
state.alertItem = content | ||
return .none | ||
case .editCellButtonTapped: | ||
return .send(.delegate(.링크수정(id: content.id))) | ||
case .favoriteCellButtonTapped: | ||
return .none | ||
case .shareCellButtonTapped: | ||
state.shareSheetItem = content | ||
return .none | ||
} | ||
} | ||
return .none |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
않이 주석도 지워주세요
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
아...!!! 지울게여 ㅎㅎ..;;;
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
지울 코드도 엄청많았고 디자인시스템 꾸려서 적용하는게 쉽지는 않았을텐데 고생 너무 많았습니다..!! 짱짱
이것저것 소소하게 고칠 것들이나 궁금한 것들 남겨뒀습니다 😃
View Extension과 같은 경우에는 내부적으로 정해야 할 것 같아요 이것도 하루 날 잡고 모듈 별로 위치해야 할 것들 정리가 필요해보입니다! 일단은 그 위치에 놔두는 것 괜찮습니다
#️⃣연관된 이슈
📝작업 내용
PokitIconLInput
,PokitIconRInput
을PokitTextInput
으로 통일PokitLinkPopup
변경PokitListButton
추가ContentDetail
기능 변경사항 반영PokitTextArea
에 메모 상태 추가dismissKeyboard
modifer
추가ContentCard
에 즐겨찾기 수정 기능 추가Lazy
한 뷰에서Store Scope
시 발생하는 스레드 안정성 문제 수정스크린샷 (선택)
💬리뷰 요구사항(선택)
PokitIconLInput
,PokitIconRInput
을PokitTextInput
으로 통일하였습니다기존
PokitIconL/RInput
이PokitTextInput
과 상당히 달랐고, 지우기 버튼 하나 넣는데에 코드를 좀 바꿨어야 했습니다. 그래서PokitTextInput
으로 통일했습니다.PokitLinkPopup
변경PokitLinkPopup
도 위와 같은 이유로 좀 더 유연하게 바꿨습니다.PokitListButton
컴포넌트를 새로 추가하였습니다.PokitListButton
은 피그마 컴포넌트 페이지에 있는list_ver2
컴포넌트 인데요, 이것 역시 기존PokitBottomSheet
가 너무 유연하지 않다는 생각이 들어 새로 추가하였습니다.PokitBottomSheet
는 디자이너들도 컴포넌트에 잘못 만들었다고 해주셔서 점차PokitListButton
으로 대체하겠습니다.dismissKeyboard
modifer
추가하였습니다.Modifier
이긴 하나, 디자인적 요소보단 기능적 요소에 가까운것 같아Util
에 구현하였습니다. 의견 있으시면 말씀해주세여재파싱한 썸네일 url 업데이트 API 적용하였습니다.
하지만, 우리 서버에 새로 파싱한 썸네일 url을 보내지 않고 내부적으로만 사용하다 보니 서버의 썸네일 url과 새로 파싱한 썸네일 url이 달라 이미지 캐싱 적용이 되지않는다는 문제가 있었습니다.
그래서 서버에 썸네일 업데이트 API를 요청하여 적용하였습니다.
Lazy
한 뷰에서Store Scope
시 발생하는 스레드 안정성 문제 수정하였습니다.ContentCardFeature
를 새로 추가하면서Lazy
한 뷰에Store
를 사용할 일이 발생하였는데, 아래와 같은 경고를 마주쳤습니다.코드
close #157