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

[PI-36] Firebase, Kakao sdk를 추가하고 카톡으로 공유할 수 있도록 합니다. #53

Open
wants to merge 16 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
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
6 changes: 6 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,3 +1,9 @@
## xcconfig hide
*.xcconfig

## Firebase
GoogleService-Info.plist

## User settings
xcuserdata/

Expand Down
22 changes: 18 additions & 4 deletions AppPackage/Package.swift
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ let package = Package(
name: "AppPackage",
targets: [
"TimeTableFeature",
"Share",
"ShareFeature",
"MakePromise",
"PromiseManagement",
"LoginFeature",
Expand Down Expand Up @@ -48,7 +48,8 @@ let package = Package(
.package(url: "https://github.com/siteline/SwiftUI-Introspect.git", from: "0.1.4"),
.package(url: "https://github.com/devxoul/Then.git", from: "3.0.0"),
.package(url: "https://github.com/kakao/kakao-ios-sdk.git", from: "2.14.0"),
.package(url: "https://github.com/Team-Planz/Planz-iOS-Secrets.git", branch: "main")
.package(url: "https://github.com/Team-Planz/Planz-iOS-Secrets.git", branch: "main"),
.package(url: "https://github.com/firebase/firebase-ios-sdk", from: "8.10.0")
],
targets: [
.target(
Expand Down Expand Up @@ -107,10 +108,13 @@ let package = Package(
]
),
.target(
name: "Share",
name: "ShareFeature",
dependencies: [
"DesignSystem",
.product(name: "ComposableArchitecture", package: "swift-composable-architecture")
"Repository",
.product(name: "ComposableArchitecture", package: "swift-composable-architecture"),
"APIClient",
.product(name: "Planz-iOS-Secrets", package: "Planz-iOS-Secrets")
]
),
.target(
Expand Down Expand Up @@ -183,6 +187,16 @@ let package = Package(
dependencies: [
"Entity"
]
),
.target(
name: "Repository",
dependencies: [
.product(name: "FirebaseAuth", package: "firebase-ios-sdk"),
.product(name: "FirebaseFirestore", package: "firebase-ios-sdk"),
.product(name: "FirebaseDynamicLinks", package: "firebase-ios-sdk"),
.product(name: "KakaoSDK", package: "kakao-ios-sdk"),
.product(name: "Planz-iOS-Secrets", package: "Planz-iOS-Secrets")
]
)
]
)
37 changes: 37 additions & 0 deletions AppPackage/Sources/Repository/FirebaseRepository.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
//
// File.swift
//
//
// Created by 한상준 on 2023/04/10.
//

import FirebaseAuth
import FirebaseCore
import FirebaseDynamicLinks
import FirebaseFirestore
import Foundation
import Planz_iOS_Secrets
public protocol FirebaseRepository {
func getDynamicLink(id: Int?) -> URL?
}

public class FirebaseRepositoryImpl: FirebaseRepository {
public init() {}

private func getDeepLink(id: Int?) -> URL? {
if let id {
return URL(string: "\(Secrets.Firebase.domain.value)/?plandId=\(id)")
} else {
return URL(string: Secrets.Firebase.domain.value)
}
}

public func getDynamicLink(id: Int? = nil) -> URL? {
guard let link = getDeepLink(id: id) else { return nil }
let dynamicLinksDomainURIPrefix = Secrets.Firebase.prefix.value
let linkBuilder = DynamicLinkComponents(link: link, domainURIPrefix: dynamicLinksDomainURIPrefix)
linkBuilder?.iOSParameters = DynamicLinkIOSParameters(bundleID: Secrets.App.iosBundleId.value)
linkBuilder?.androidParameters = DynamicLinkAndroidParameters(packageName: Secrets.App.androidBundleId.value)
return linkBuilder?.url
}
}
39 changes: 39 additions & 0 deletions AppPackage/Sources/Repository/KakaoRepository.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
//
// File.swift
//
//
// Created by 한상준 on 2023/04/10.
//

import KakaoSDKShare
import KakaoSDKTemplate
import Planz_iOS_Secrets

public protocol KakaoRepository {
func getKakaoTalkSharingResult(url: String) async -> Result<SharingResult, Error>
}

public enum KakaoError: Error {
case kakaoTalkSharingInAvailable
}

public class KakaoRepositoryImpl: KakaoRepository {
public init() {}
public func getKakaoTalkSharingResult(url _: String) async -> Result<SharingResult, Error> {
if ShareApi.isKakaoTalkSharingAvailable() {
// TODO: 이전 화면에서 전달해주는 id 값에 맞춰서 공유 링크의 파라미터로 추가하도록 수정 필요
return await withCheckedContinuation { continuation in
ShareApi.shared.shareCustom(templateId: Int64(Secrets.Kakao.templateId.value)!, templateArgs: ["": ""]) { linkResult, error in
if let error = error {
continuation.resume(returning: .failure(error))
} else {
guard let linkResult = linkResult else { return }
continuation.resume(returning: .success(linkResult))
}
}
}
} else {
return .failure(KakaoError.kakaoTalkSharingInAvailable)
}
}
}
28 changes: 0 additions & 28 deletions AppPackage/Sources/Share/ShareLinkCopyView.swift

This file was deleted.

74 changes: 0 additions & 74 deletions AppPackage/Sources/Share/ShareView.swift

This file was deleted.

39 changes: 39 additions & 0 deletions AppPackage/Sources/ShareFeature/ShareLinkCopyView.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
//
// ShareLinkCopyView.swift
//
//
// Created by 한상준 on 2023/02/12.
//

import ComposableArchitecture
import DesignSystem
import SwiftUI

struct ShareLinkCopyView: View {
public let store: StoreOf<SharePromiseFeature>
public init(store: StoreOf<SharePromiseFeature>) {
self.store = store
}

public var body: some View {
WithViewStore(self.store) { viewStore in
HStack {
HStack {
Text(viewStore.linkForShare)
.lineLimit(1)
Spacer()
Button("복사") {
viewStore.send(.copyLinkTapped)
}
.font(.system(size: 14))
.foregroundColor(PDS.COLOR.purple9.scale)
}
.padding(EdgeInsets(top: 16, leading: 20, bottom: 16, trailing: 20))
.background(PDS.COLOR.white3.scale)
.border(PDS.COLOR.gray2.scale, width: 1)
.cornerRadius(10)
}
.padding(EdgeInsets(top: 0, leading: 20, bottom: 0, trailing: 20))
}
}
}
70 changes: 70 additions & 0 deletions AppPackage/Sources/ShareFeature/SharePromiseStore.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
//
// File.swift
//
//
// Created by 한상준 on 2023/04/01.
//

import APIClient
import ComposableArchitecture
import Foundation
import Planz_iOS_Secrets
import Repository
import UIKit

public struct SharePromiseFeature: ReducerProtocol {
let firebaseRepository: FirebaseRepository
let kakaoRepository: KakaoRepository
public init(
firebaseRepository: FirebaseRepository = FirebaseRepositoryImpl(),
kakaoRepository: KakaoRepository = KakaoRepositoryImpl()
) {
self.firebaseRepository = firebaseRepository
self.kakaoRepository = kakaoRepository
}

public struct State: Equatable {
var linkForShare = ""
var id: Int
public init(id: Int) {
self.id = id
}
}

public enum Action: Equatable {
case viewDidAppear
case copyLinkTapped
case shareAsKakaoTapped
}

func shareViaKakao(link: String) {
Task {
let sharingResult = await self.kakaoRepository.getKakaoTalkSharingResult(url: link)
do {
let url = try sharingResult.get().url
await UIApplication.shared.open(url)
} catch {
// TODO: 공유 에러 팝업 노출
print(error)
}
}
}

public var body: some ReducerProtocol<State, Action> {
Reduce { state, action in
switch action {
case .viewDidAppear:
if let link = self.firebaseRepository.getDynamicLink(id: state.id) {
state.linkForShare = link.absoluteString
}
return .none
case .copyLinkTapped:
UIPasteboard.general.string = state.linkForShare
Copy link
Contributor

Choose a reason for hiding this comment

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

해당 부분도 디펜던시로 분리시켜주시면 감사하겠습니다.

return .none
case .shareAsKakaoTapped:
shareViaKakao(link: state.linkForShare)
return .none
}
}
}
}
Loading