Skip to content

Commit

Permalink
fix: 정말 여러가지 버그 수정
Browse files Browse the repository at this point in the history
  • Loading branch information
enebin committed Sep 14, 2023
1 parent c7090dd commit 209d291
Show file tree
Hide file tree
Showing 30 changed files with 631 additions and 164 deletions.
2 changes: 1 addition & 1 deletion Encrypted/XCConfig/App/PROD.xcconfig.encrypted
Original file line number Diff line number Diff line change
@@ -1 +1 @@
�d��BJؠ���LH�8�v2c�����mH �"?^F1Xn�o^� |�т�2x>�SFgtmz \���Ԍ����uQ&=O��pV��fa�zuc)�!����wW�0+SXl>7{�mD@���Z�]��增�o�_{�Z���Ex�6 l}�5`������W����.?��h��o>Hˈ4��: SѢ����C^7L�
�d��BJؠ���LH�8�v2c�����mH �"?^F1Xn�o^� |�т�2x>�SFgtmz \���Ԍ����uQ&=O��pV��fa�zuc)�!����wW�0+SXl>7{�mD@��F5�oaP�`9�#{�4A�W��[i K�W5���\@Ѭm6����C՗ԅ������*\�6�i�5L��rX=(E<���w��o�CXa�:��Q[�92��4ۂ���G*�pK�Y��[
Expand Down
4 changes: 3 additions & 1 deletion Plugins/EnvPlugin/ProjectDescriptionHelpers/InfoPlist.swift
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ public extension Project {
],
"API_BASE_URL": "$(API_BASE_URL)",
"KAKAO_API_KEY": "$(KAKAO_API_KEY)",
"BITLY_API_KEY": "$(BITLY_API_KEY)",
"UIUserInterfaceStyle": "Light",
"NSAppTransportSecurity": [
"NSExceptionDomains": [
Expand All @@ -33,7 +34,8 @@ public extension Project {
],
]
],
"LSApplicationQueriesSchemes": ["kakaokompassauth", "kakaolink"]
"LSApplicationQueriesSchemes": ["kakaokompassauth", "kakaolink"],
"NSPhotoLibraryAddUsageDescription": "스크린샷을 저장하기 위해서 앨범 접근 권한이 필요합니다"
]

static let baseUrlInfoPlist: [String: InfoPlist.Value] = [
Expand Down
33 changes: 33 additions & 0 deletions Projects/Core/Sources/Utility/Function/ImageSaver.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
//
// ImageSaver.swift
// Core
//
// Created by Young Bin on 2023/09/10.
// Copyright © 2023 team.humanwave. All rights reserved.
//

import SwiftUI
import Photos

public class ImageSaver: NSObject {
private var completion: ((Error?) -> Void)?

public func save(_ image: UIImage, completion: @escaping (Error?) -> Void) {
UIImageWriteToSavedPhotosAlbum(image, self, #selector(saveError), nil)
self.completion = completion
}

@objc private func saveError(
_ image: UIImage,
didFinishSavingWithError error: Error?,
contextInfo: UnsafeRawPointer
) {
DispatchQueue.main.async {
if let error {
self.completion?(error)
} else {
self.completion?(nil)
}
}
}
}
26 changes: 26 additions & 0 deletions Projects/Core/Sources/Utility/UI/ReverseMask.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
//
// ReverseMask.swift
// Core
//
// Created by Young Bin on 2023/09/10.
// Copyright © 2023 team.humanwave. All rights reserved.
//

import SwiftUI

public extension View {
@inlinable func reverseMask<Mask: View>(
alignment: Alignment = .center,
@ViewBuilder _ mask: () -> Mask
) -> some View {
self.mask(
ZStack(alignment: .center) {
Rectangle()

mask()
.blendMode(.destinationOut)
}
.compositingGroup()
)
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
{
"images" : [
{
"filename" : "mypage_empty.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "[email protected]",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "[email protected]",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
2 changes: 1 addition & 1 deletion Projects/Domain/Sources/Model/KeymeWebModel.swift
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,6 @@ import Foundation

public struct KeymeWebViewModel: Codable, Equatable {
public let matchRate: Float
public let resultCode: String
public let resultCode: String?
public let testResultId: Int
}
24 changes: 17 additions & 7 deletions Projects/Features/Sources/Home/StartTest/StartTestFeature.swift
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,8 @@ import ComposableArchitecture
import Domain

public struct StartTestFeature: Reducer {
enum CancelID { case startAnimation }

public struct State: Equatable {
public let nickname: String
public let testData: KeymeTestsModel
Expand All @@ -32,6 +34,7 @@ public struct StartTestFeature: Reducer {
case onAppear
case onDisappear
case startAnimation([IconModel])
case stopAnimation
case setIcon(IconModel)
case startButtonDidTap
case keymeTests(PresentationAction<KeymeTestsFeature.Action>)
Expand All @@ -58,17 +61,24 @@ public struct StartTestFeature: Reducer {
return .cancel(id: CancelID.startTest)

case .startAnimation(let icons):

return .run { send in
repeat {
for icon in icons {
await send(.toggleAnimation(icon))
try await self.clock.sleep(for: .seconds(0.85))
}
} while true
try await withTaskCancellation(
id: CancelID.startAnimation,
cancelInFlight: true
) {
repeat {
for icon in icons {
await send(.toggleAnimation(icon))
try await self.clock.sleep(for: .seconds(0.85))
}
} while true
}
}
.cancellable(id: CancelID.startTest)

case .stopAnimation:
return .cancel(id: CancelID.startAnimation)

case let .setIcon(icon):
state.icon = icon

Expand Down
3 changes: 3 additions & 0 deletions Projects/Features/Sources/Home/StartTest/StartTestView.swift
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,9 @@ public struct StartTestView: View {
.onDisappear {
store.send(.onDisappear)
}
.onDisappear {
store.send(.stopAnimation)
}
}
}

Expand Down
10 changes: 10 additions & 0 deletions Projects/Features/Sources/KeymeTests/KeymeTestsFeature.swift
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,8 @@ public struct KeymeTestsFeature: Reducer {
case view(View)
case alert(PresentationAction<Alert>)

case showErrorAlert(message: String)

public enum View: Equatable {
case showResult(data: KeymeWebViewModel)
case closeButtonTapped
Expand Down Expand Up @@ -78,6 +80,11 @@ public struct KeymeTestsFeature: Reducer {

case .view(.showResult(let data)):
return .run { [resultCode = data.resultCode] send in
guard let resultCode else {
await send(.showErrorAlert(message: "데이터 조회 중 오류가 발생했어요. 잠시 후 다시 시도해주세요."))
return
}

await send(.postResult(
TaskResult { try await
self.keymeTestsClient.postTestResult(resultCode)
Expand All @@ -91,6 +98,9 @@ public struct KeymeTestsFeature: Reducer {
case .submit:
return .none

case .showErrorAlert(let message):
state.alertState = AlertState(title: TextState("오류가 발생했어요"), message: TextState(message))

case .alert(.presented(.closeTest)):
return .send(.close)

Expand Down
1 change: 1 addition & 0 deletions Projects/Features/Sources/KeymeTests/KeymeTestsView.swift
Original file line number Diff line number Diff line change
Expand Up @@ -36,5 +36,6 @@ public struct KeymeTestsView: View {
}
.frame(maxWidth: .infinity, maxHeight: .infinity)
}
.alert(store: store.scope(state: \.$alertState, action: KeymeTestsFeature.Action.alert))
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,8 @@ import Network

public struct TestResultView: View {
@State var sharedURL: ActivityViewController.SharedURL?

@Dependency(\.shortUrlAPIManager) private var shortURLManager

private let store: StoreOf<TestResultFeature>

public init(store: StoreOf<TestResultFeature>) {
Expand Down Expand Up @@ -120,7 +121,7 @@ public struct TestResultView: View {
// TODO: url 주석단거로 바꾸기
let url = "https://keyme-frontend.vercel.app/test/\(17)"
// let url = "https://keyme-frontend.vercel.app/test/5"
let shortURL = try await ShortUrlAPIManager.shared.request(
let shortURL = try await shortURLManager.request(
.shortenURL(longURL: url),
object: BitlyResponse.self).link

Expand Down
3 changes: 2 additions & 1 deletion Projects/Features/Sources/MainPage/MainPageFeature.swift
Original file line number Diff line number Diff line change
Expand Up @@ -19,8 +19,9 @@ public struct MainPageFeature: Reducer {
enum View: Equatable { case none }

public init(userId: Int, nickname: String) {
// TODO: 테스트 아이디를 더 위에서 조회해서 내려줘야 될 듯
self._home = .init(.init(nickname: nickname))
self._myPage = .init(.init(userId: userId, nickname: nickname))
self._myPage = .init(.init(userId: userId, nickname: nickname, testId: 17))
}
}

Expand Down
55 changes: 52 additions & 3 deletions Projects/Features/Sources/MyPage/MyPageFeature.swift
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ import Network

public struct MyPageFeature: Reducer {
@Dependency(\.keymeAPIManager) private var network
@Dependency(\.shortUrlAPIManager) private var shortURLManager

public struct State: Equatable {
var view: View
Expand All @@ -30,22 +31,30 @@ public struct MyPageFeature: Reducer {
view.imageExportMode = imageExportModeState == nil ? false : true
}
}
@PresentationState var shareSheetState: ShareSheetFeature.State?
@PresentationState var alertState: AlertState<Action.Alert>?

struct View: Equatable {
let userId: Int
let nickname: String
let testId: Int
var testURL: String { "https://keyme-frontend.vercel.app/test/\(testId)" }

var imageExportMode = false
var rotationAngle: Double = 45

var circleShown = false
var selectedSegment: MyPageSegment = .similar
var shownFirstTime = true
var shownCircleDatalist: [CircleData] = []

var nowFetching: TargetData?
enum TargetData {
case circleData
}
}

init(userId: Int, nickname: String) {
self.view = View(userId: userId, nickname: nickname)
init(userId: Int, nickname: String, testId: Int) {
self.view = View(userId: userId, nickname: nickname, testId: testId)
self._scoreListState = .init(.init())
}
}
Expand All @@ -55,9 +64,13 @@ public struct MyPageFeature: Reducer {
case showCircle(MyPageSegment)
case requestCircle(MatchRate)
case view(View)
case showAlert(message: String)
case showShareSheet(URL)

case scoreListAction(ScoreListFeature.Action)
case setting(PresentationAction<SettingFeature.Action>)
case shareSheet(PresentationAction<ShareSheetFeature.Action>)
case alert(PresentationAction<Action.Alert>)
case imageExportModeAction(ImageExportOverlayFeature.Action)

public enum View: Equatable {
Expand All @@ -67,7 +80,11 @@ public struct MyPageFeature: Reducer {
case prepareSettingView
case selectSegement(MyPageSegment)
case enableImageExportMode
case captureImage
case requestTestURL
}

public enum Alert: Equatable {}
}

// 마이페이지를 사용할 수 없는 케이스
Expand Down Expand Up @@ -124,6 +141,12 @@ public struct MyPageFeature: Reducer {
}
return .none

case .showShareSheet(let url):
state.shareSheetState = ShareSheetFeature.State(url: url)

case .showAlert(let message):
state.alertState = AlertState(title: TextState("오류가 발생했어요"), message: TextState(message))

// MARK: - View actions
case .view(.selectSegement(let segment)):
state.view.selectedSegment = segment
Expand Down Expand Up @@ -154,6 +177,26 @@ public struct MyPageFeature: Reducer {

return .none

case .view(.requestTestURL):
return .run { [testURL = state.view.testURL] send in
do {

let shortURL = try await shortURLManager.request(
.shortenURL(longURL: testURL),
object: BitlyResponse.self).link

guard let url = URL(string: shortURL) else {
await send(.showAlert(message: "링크 생성 중 오류가 발생했습니다. 잠시 후 다시 시도해주세요."))
return
}

await send(.showShareSheet(url))
} catch {
await send(.showAlert(
message: "링크 생성 중 오류가 발생했습니다. 잠시 후 다시 시도해주세요.\n\(error.localizedDescription)"))
}
}

// MARK: - Child actions
case .scoreListAction:
print("score")
Expand All @@ -162,6 +205,12 @@ public struct MyPageFeature: Reducer {
case .imageExportModeAction(.dismissImageExportMode):
state.imageExportModeState = nil

case .imageExportModeAction(.captureImage):
break

case .shareSheet(.dismiss):
state.shareSheetState = nil

default:
return .none
}
Expand Down
Loading

0 comments on commit 209d291

Please sign in to comment.