diff --git a/.gitignore b/.gitignore
index cab8e3b..01e8943 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,7 +1,8 @@
# 특정 환경에 따라 추가
./private/
-
+# 인텔리제이꺼
+*.idea
# Xcode 관련
# 사용자별 설정 파일
diff --git a/AcaMate.xcodeproj/project.pbxproj b/AcaMate.xcodeproj/project.pbxproj
index 66ecf0f..4b689cc 100644
--- a/AcaMate.xcodeproj/project.pbxproj
+++ b/AcaMate.xcodeproj/project.pbxproj
@@ -7,6 +7,9 @@
objects = {
/* Begin PBXBuildFile section */
+ A73892212D526A9D00659A62 /* FirebaseAnalytics in Frameworks */ = {isa = PBXBuildFile; productRef = A73892202D526A9D00659A62 /* FirebaseAnalytics */; };
+ A73892232D526A9D00659A62 /* FirebaseAppCheck in Frameworks */ = {isa = PBXBuildFile; productRef = A73892222D526A9D00659A62 /* FirebaseAppCheck */; };
+ A73892252D526A9D00659A62 /* FirebaseCrashlytics in Frameworks */ = {isa = PBXBuildFile; productRef = A73892242D526A9D00659A62 /* FirebaseCrashlytics */; };
A771FFF22CFB70D100367DA6 /* KakaoSDK in Frameworks */ = {isa = PBXBuildFile; productRef = A771FFF12CFB70D100367DA6 /* KakaoSDK */; };
A78774722CF586AF002FE2EE /* Alamofire in Frameworks */ = {isa = PBXBuildFile; productRef = A78774712CF586AF002FE2EE /* Alamofire */; };
A7A518CF2CF555E200822D0D /* README.md in Resources */ = {isa = PBXBuildFile; fileRef = A7A518CE2CF555E200822D0D /* README.md */; };
@@ -45,8 +48,11 @@
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
+ A73892232D526A9D00659A62 /* FirebaseAppCheck in Frameworks */,
A78774722CF586AF002FE2EE /* Alamofire in Frameworks */,
+ A73892252D526A9D00659A62 /* FirebaseCrashlytics in Frameworks */,
A771FFF22CFB70D100367DA6 /* KakaoSDK in Frameworks */,
+ A73892212D526A9D00659A62 /* FirebaseAnalytics in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@@ -93,6 +99,9 @@
packageProductDependencies = (
A78774712CF586AF002FE2EE /* Alamofire */,
A771FFF12CFB70D100367DA6 /* KakaoSDK */,
+ A73892202D526A9D00659A62 /* FirebaseAnalytics */,
+ A73892222D526A9D00659A62 /* FirebaseAppCheck */,
+ A73892242D526A9D00659A62 /* FirebaseCrashlytics */,
);
productName = AcaMate;
productReference = A7A518BB2CF5558B00822D0D /* AcaMate.app */;
@@ -125,6 +134,7 @@
packageReferences = (
A78774702CF586AF002FE2EE /* XCRemoteSwiftPackageReference "Alamofire" */,
A771FFF02CFB70D100367DA6 /* XCRemoteSwiftPackageReference "kakao-ios-sdk" */,
+ A738921F2D526A9D00659A62 /* XCRemoteSwiftPackageReference "firebase-ios-sdk" */,
);
preferredProjectObjectVersion = 77;
productRefGroup = A7A518BC2CF5558B00822D0D /* Products */;
@@ -378,6 +388,14 @@
/* End XCConfigurationList section */
/* Begin XCRemoteSwiftPackageReference section */
+ A738921F2D526A9D00659A62 /* XCRemoteSwiftPackageReference "firebase-ios-sdk" */ = {
+ isa = XCRemoteSwiftPackageReference;
+ repositoryURL = "https://github.com/firebase/firebase-ios-sdk";
+ requirement = {
+ kind = upToNextMajorVersion;
+ minimumVersion = 11.8.0;
+ };
+ };
A771FFF02CFB70D100367DA6 /* XCRemoteSwiftPackageReference "kakao-ios-sdk" */ = {
isa = XCRemoteSwiftPackageReference;
repositoryURL = "https://github.com/kakao/kakao-ios-sdk";
@@ -397,6 +415,21 @@
/* End XCRemoteSwiftPackageReference section */
/* Begin XCSwiftPackageProductDependency section */
+ A73892202D526A9D00659A62 /* FirebaseAnalytics */ = {
+ isa = XCSwiftPackageProductDependency;
+ package = A738921F2D526A9D00659A62 /* XCRemoteSwiftPackageReference "firebase-ios-sdk" */;
+ productName = FirebaseAnalytics;
+ };
+ A73892222D526A9D00659A62 /* FirebaseAppCheck */ = {
+ isa = XCSwiftPackageProductDependency;
+ package = A738921F2D526A9D00659A62 /* XCRemoteSwiftPackageReference "firebase-ios-sdk" */;
+ productName = FirebaseAppCheck;
+ };
+ A73892242D526A9D00659A62 /* FirebaseCrashlytics */ = {
+ isa = XCSwiftPackageProductDependency;
+ package = A738921F2D526A9D00659A62 /* XCRemoteSwiftPackageReference "firebase-ios-sdk" */;
+ productName = FirebaseCrashlytics;
+ };
A771FFF12CFB70D100367DA6 /* KakaoSDK */ = {
isa = XCSwiftPackageProductDependency;
package = A771FFF02CFB70D100367DA6 /* XCRemoteSwiftPackageReference "kakao-ios-sdk" */;
diff --git a/AcaMate.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved b/AcaMate.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved
index cc84473..c602ae4 100644
--- a/AcaMate.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved
+++ b/AcaMate.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved
@@ -1,6 +1,15 @@
{
- "originHash" : "48d44fe9560aaa48bc97ae34cdb596f62fa2d739be3dafd4261b95db8f8c86ab",
+ "originHash" : "3b609245b8d633048f6670834279f82d0601cc0879a2d8c9c86fa0dd25734ea3",
"pins" : [
+ {
+ "identity" : "abseil-cpp-binary",
+ "kind" : "remoteSourceControl",
+ "location" : "https://github.com/google/abseil-cpp-binary.git",
+ "state" : {
+ "revision" : "194a6706acbd25e4ef639bcaddea16e8758a3e27",
+ "version" : "1.2024011602.0"
+ }
+ },
{
"identity" : "alamofire",
"kind" : "remoteSourceControl",
@@ -10,6 +19,78 @@
"version" : "5.10.2"
}
},
+ {
+ "identity" : "app-check",
+ "kind" : "remoteSourceControl",
+ "location" : "https://github.com/google/app-check.git",
+ "state" : {
+ "revision" : "61b85103a1aeed8218f17c794687781505fbbef5",
+ "version" : "11.2.0"
+ }
+ },
+ {
+ "identity" : "firebase-ios-sdk",
+ "kind" : "remoteSourceControl",
+ "location" : "https://github.com/firebase/firebase-ios-sdk",
+ "state" : {
+ "revision" : "075679d6b25b28f4cb167f1d7769b58fb556fb30",
+ "version" : "11.8.0"
+ }
+ },
+ {
+ "identity" : "googleappmeasurement",
+ "kind" : "remoteSourceControl",
+ "location" : "https://github.com/google/GoogleAppMeasurement.git",
+ "state" : {
+ "revision" : "be0881ff728eca210ccb628092af400c086abda3",
+ "version" : "11.7.0"
+ }
+ },
+ {
+ "identity" : "googledatatransport",
+ "kind" : "remoteSourceControl",
+ "location" : "https://github.com/google/GoogleDataTransport.git",
+ "state" : {
+ "revision" : "617af071af9aa1d6a091d59a202910ac482128f9",
+ "version" : "10.1.0"
+ }
+ },
+ {
+ "identity" : "googleutilities",
+ "kind" : "remoteSourceControl",
+ "location" : "https://github.com/google/GoogleUtilities.git",
+ "state" : {
+ "revision" : "53156c7ec267db846e6b64c9f4c4e31ba4cf75eb",
+ "version" : "8.0.2"
+ }
+ },
+ {
+ "identity" : "grpc-binary",
+ "kind" : "remoteSourceControl",
+ "location" : "https://github.com/google/grpc-binary.git",
+ "state" : {
+ "revision" : "f56d8fc3162de9a498377c7b6cea43431f4f5083",
+ "version" : "1.65.1"
+ }
+ },
+ {
+ "identity" : "gtm-session-fetcher",
+ "kind" : "remoteSourceControl",
+ "location" : "https://github.com/google/gtm-session-fetcher.git",
+ "state" : {
+ "revision" : "3cdb78efb79b4a5383c3911488d8025bfc545b5e",
+ "version" : "4.3.0"
+ }
+ },
+ {
+ "identity" : "interop-ios-for-google-sdks",
+ "kind" : "remoteSourceControl",
+ "location" : "https://github.com/google/interop-ios-for-google-sdks.git",
+ "state" : {
+ "revision" : "2d12673670417654f08f5f90fdd62926dc3a2648",
+ "version" : "100.0.0"
+ }
+ },
{
"identity" : "kakao-ios-sdk",
"kind" : "remoteSourceControl",
@@ -18,6 +99,42 @@
"branch" : "master",
"revision" : "ab4309c1950550add307046ad1e08024c7514603"
}
+ },
+ {
+ "identity" : "leveldb",
+ "kind" : "remoteSourceControl",
+ "location" : "https://github.com/firebase/leveldb.git",
+ "state" : {
+ "revision" : "a0bc79961d7be727d258d33d5a6b2f1023270ba1",
+ "version" : "1.22.5"
+ }
+ },
+ {
+ "identity" : "nanopb",
+ "kind" : "remoteSourceControl",
+ "location" : "https://github.com/firebase/nanopb.git",
+ "state" : {
+ "revision" : "b7e1104502eca3a213b46303391ca4d3bc8ddec1",
+ "version" : "2.30910.0"
+ }
+ },
+ {
+ "identity" : "promises",
+ "kind" : "remoteSourceControl",
+ "location" : "https://github.com/google/promises.git",
+ "state" : {
+ "revision" : "540318ecedd63d883069ae7f1ed811a2df00b6ac",
+ "version" : "2.4.0"
+ }
+ },
+ {
+ "identity" : "swift-protobuf",
+ "kind" : "remoteSourceControl",
+ "location" : "https://github.com/apple/swift-protobuf.git",
+ "state" : {
+ "revision" : "ebc7251dd5b37f627c93698e4374084d98409633",
+ "version" : "1.28.2"
+ }
}
],
"version" : 3
diff --git a/AcaMate.xcodeproj/project.xcworkspace/xcuserdata/seankim.xcuserdatad/UserInterfaceState.xcuserstate b/AcaMate.xcodeproj/project.xcworkspace/xcuserdata/seankim.xcuserdatad/UserInterfaceState.xcuserstate
index 8165c44..fb308b4 100644
Binary files a/AcaMate.xcodeproj/project.xcworkspace/xcuserdata/seankim.xcuserdatad/UserInterfaceState.xcuserstate and b/AcaMate.xcodeproj/project.xcworkspace/xcuserdata/seankim.xcuserdatad/UserInterfaceState.xcuserstate differ
diff --git a/AcaMate.xcodeproj/project.xcworkspace/xcuserdata/tanine.xcuserdatad/UserInterfaceState.xcuserstate b/AcaMate.xcodeproj/project.xcworkspace/xcuserdata/tanine.xcuserdatad/UserInterfaceState.xcuserstate
new file mode 100644
index 0000000..eee7cfb
Binary files /dev/null and b/AcaMate.xcodeproj/project.xcworkspace/xcuserdata/tanine.xcuserdatad/UserInterfaceState.xcuserstate differ
diff --git a/AcaMate.xcodeproj/xcuserdata/tanine.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist b/AcaMate.xcodeproj/xcuserdata/tanine.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist
new file mode 100644
index 0000000..1bf677d
--- /dev/null
+++ b/AcaMate.xcodeproj/xcuserdata/tanine.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist
@@ -0,0 +1,6 @@
+
+
+
diff --git a/AcaMate/0. Setup/AppDelegate.swift b/AcaMate/0. Setup/AppDelegate.swift
index 961b9d4..98eb458 100644
--- a/AcaMate/0. Setup/AppDelegate.swift
+++ b/AcaMate/0. Setup/AppDelegate.swift
@@ -12,10 +12,11 @@ import UserNotifications
import KakaoSDKCommon
import KakaoSDKAuth
+import FirebaseCore
-class AppDelegate: NSObject, UIApplicationDelegate, UNUserNotificationCenterDelegate {
+class AppDelegate: NSObject, UIApplicationDelegate {
@@ -28,6 +29,7 @@ class AppDelegate: NSObject, UIApplicationDelegate, UNUserNotificationCenterDele
}
//MARK: - Set Notification
+
let center = UNUserNotificationCenter.current()
let authOptions: UNAuthorizationOptions = [.alert, .badge, .sound]
center.requestAuthorization(options: authOptions) { granted, error in
@@ -47,6 +49,9 @@ class AppDelegate: NSObject, UIApplicationDelegate, UNUserNotificationCenterDele
//MARK: - 네트워크 모니터 초기화
_ = NetworkMonitor.shared
+ //MARK: - FIREBASE 초기화
+ FirebaseApp.configure()
+
printLog("End Set AppDelegate")
return true
}
@@ -60,6 +65,12 @@ class AppDelegate: NSObject, UIApplicationDelegate, UNUserNotificationCenterDele
}
+
+}
+
+extension AppDelegate: UNUserNotificationCenterDelegate {
+
+ //
func registerForRemoteNotifications() {
UNUserNotificationCenter.current().requestAuthorization(options: [.alert, .sound, .badge]) { granted, error in
print("Permission granted: \(granted)")
@@ -86,7 +97,7 @@ class AppDelegate: NSObject, UIApplicationDelegate, UNUserNotificationCenterDele
printLog("APNs 등록 실패: \(error)")
}
- // 앱 켜져있을때 알럿 받으면 (오는게 확인되면 바로 뜨는 곳)
+ // 앱 켜져있을때 알럿 받으면 직접 로컬로 알림 띄워주는 곳
func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification) async -> UNNotificationPresentationOptions {
let userInfo = notification.request.content.userInfo
@@ -107,7 +118,7 @@ class AppDelegate: NSObject, UIApplicationDelegate, UNUserNotificationCenterDele
}
}
- // 수신 받은 Notification을 터치해 앱으로 진입했을 때 호출
+ // 수신 받은 Noti를 터치해 앱으로 진입했을 때 호출 (앱 상태 여부 무관)
func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) {
let userInfo = response.notification.request.content.userInfo
if let apsData = userInfo["aps"] as? [AnyHashable: Any] {
@@ -117,9 +128,7 @@ class AppDelegate: NSObject, UIApplicationDelegate, UNUserNotificationCenterDele
if let param = alert["parameter"] {
printLog(param as? String)
}
-// viewModel.setBadge()
}
}
}
-
}
diff --git a/AcaMate/2. Common/SwiftUI_Prefix.swift b/AcaMate/0. Setup/SwiftUI_Prefix.swift
similarity index 95%
rename from AcaMate/2. Common/SwiftUI_Prefix.swift
rename to AcaMate/0. Setup/SwiftUI_Prefix.swift
index b84cff5..08b2fb3 100644
--- a/AcaMate/2. Common/SwiftUI_Prefix.swift
+++ b/AcaMate/0. Setup/SwiftUI_Prefix.swift
@@ -6,7 +6,10 @@
//
import SwiftUI
// MARK: - ACAMATE
-#if DEV
+// APPSTORE_URL : https://apps.apple.com/us/app/%EC%95%84%EC%B9%B4%EB%8D%B0%EB%AF%B8%EB%A9%94%EC%9D%B4%ED%8A%B8/id6739448113
+#if DEV && LOCAL
+public let API_URL: String = "http://localhost:5144"
+#elseif DEV
public let API_URL: String = "https://devacamate.ipstein.myds.me"
#else
public let API_URL: String = "https://acamate.ipstein.myds.me"
@@ -122,6 +125,19 @@ public func jsonToDict(_ input: String) -> [String: Any] {
return [:]
}
+/// JSON 배열의 형태를 Swift의 배열 형태로 변환한다.
+public func jsonToSwift(_ input: String) -> T? {
+ if let data = input.data(using: .utf8) {
+ do {
+ let jsonObject = try JSONDecoder().decode(T.self, from: data)
+ return jsonObject
+ } catch let error {
+ printLog("JSON ERROR: \(error))")
+ }
+ }
+ return nil
+}
+
func versionChange(ver: String) -> [Int] {
return ver.components(separatedBy: ["."]).map {Int($0) ?? 0}
}
diff --git a/AcaMate/1. View/1. Intro & Login/LoginView.swift b/AcaMate/1. View/1. Intro & Login/LoginView.swift
deleted file mode 100644
index 96535fa..0000000
--- a/AcaMate/1. View/1. Intro & Login/LoginView.swift
+++ /dev/null
@@ -1,57 +0,0 @@
-//
-// LoginView.swift
-// AcaMate
-//
-// Created by Sean Kim on 12/1/24.
-//
-
-import SwiftUI
-
-struct LoginView: View {
- @EnvironmentObject var alertController: AlertController
- @Binding var naviState : NaviState
-
- var body: some View {
- VStack(spacing: 0) {
- Image("Team_Icon")
- .resizable()
- .frame(width: 200, height: 200)
- .background(.white)
- .border(.black)
- .padding(.bottom, 84)
- Button {
-
- } label: {
- HStack(spacing: 12) {
- Image("Kakao_Icon")
- .resizable()
- .frame(width: 32, height: 32)
- Text("카카오 계정으로 시작하기")
- .font(.nps(font: .regular, size: 16))
- .foregroundStyle(Color(.Text.black))
- }
- .padding(12)
- .background {
- RoundedRectangle(cornerRadius: 12)
- .foregroundStyle(Color(.Other.yellow))
- }
- }
-
- Button {
- alertController.alertData = SetAlertData().setTest()
- alertController.showAlert.toggle()
-// naviState.set(act: .MOVE,path: .Intro)
-
- } label: {
- Text("111111111")
- }
- .padding()
- }
- .fullView(.Normal.normal)
-
- }
-}
-
-//#Preview {
-// LoginView()
-//}
diff --git a/AcaMate/1. View/0. Common/NavigationView.swift b/AcaMate/1. View/10. Common/NavigationView.swift
similarity index 79%
rename from AcaMate/1. View/0. Common/NavigationView.swift
rename to AcaMate/1. View/10. Common/NavigationView.swift
index 9024bc6..59435df 100644
--- a/AcaMate/1. View/0. Common/NavigationView.swift
+++ b/AcaMate/1. View/10. Common/NavigationView.swift
@@ -9,8 +9,10 @@ import SwiftUI
import Combine
-
+/// 이거 위에 다른 뷰들이 위젯 느낌으로 계속 갈아 끼워지는거
struct NavigationView: View {
+ @EnvironmentObject var appVM: AppViewModel
+
@State private var naviState : NaviState = .init(act: .NONE, path: .Intro)
@State private var history: [PathName] = [.Intro]
@@ -25,7 +27,7 @@ struct NavigationView: View {
case .Login :
LoginView(naviState: $naviState)
case .Main:
- EmptyView()
+ MainView(naviState: $naviState)
}
}
.onChange(of: naviState) { old, new in
@@ -41,30 +43,37 @@ struct NavigationView: View {
case .MOVE:
moveHistory(path: new.path)
}
-
// LOG
printLog("\(old.path) => \(new.path)")
showHistory()
}
- .fullView(.Normal.normal)
+ .onTapGesture {
+ endTextEditing()
+ }
+ .fullDrawView(.Normal.normal)
.setAlert()
.setNetwork()
+ .loadingView(isLoading: $appVM.isLoading)
}
+ /// 경로에 한 단계 추가
private func addHistory(path: PathName) {
history.append(path)
}
+ /// 가장 가까운 경로 삭제
private func popHistory() {
history.removeLast()
naviState.set(act: .NONE, path: history.last ?? .NONE)
}
+ /// 경로 기록 전체 삭제
private func resetHistory(path: PathName) {
history.removeAll()
addHistory(path: path)
}
+ /// 경로의 최상단 지우고, 새로 이동하는 경로로 설정
private func moveHistory(path: PathName) {
if path == .NONE {
naviState.set(act: .RESET, path: history.first ?? .Main)
diff --git a/AcaMate/1. View/11. Intro & Login/AccountLoginView.swift b/AcaMate/1. View/11. Intro & Login/AccountLoginView.swift
new file mode 100644
index 0000000..2a45045
--- /dev/null
+++ b/AcaMate/1. View/11. Intro & Login/AccountLoginView.swift
@@ -0,0 +1,117 @@
+//
+// AccountLoginView.swift
+// AcaMate
+//
+// Created by Sean Kim on 12/14/24.
+//
+
+import SwiftUI
+
+struct AccountLoginView: View {
+ @ObservedObject var viewModel: LoginViewModel
+ @Binding var userId: String
+ @Binding var password: String
+ @Binding var isSecure: Bool
+ @Binding var isSave: Bool
+ var body: some View {
+ VStack(spacing: 0) {
+ ZStack(alignment: .leading) {
+ if userId.isEmpty {
+ Text("아이디를 입력하세요.")
+ .font(.nps(font: .regular, size: 16))
+ .foregroundStyle(Color(.Text.border))
+ .padding(EdgeInsets(top: 12, leading: 24, bottom: 12, trailing: 24))
+ }
+ CustomTextField(placeholder: "", text: $userId)
+ .frame(maxWidth: .infinity,maxHeight: 24)
+ .padding(EdgeInsets(top: 12, leading: 24, bottom: 12, trailing: 24))
+ }
+ .background {
+ RoundedRectangle(cornerRadius: 24)
+ .foregroundStyle(.white)
+ }
+ .padding(EdgeInsets(top: 0, leading: 12, bottom: 8, trailing: 12))
+
+ ZStack(alignment: .leading) {
+ if password.isEmpty {
+ Text("비밀번호를 입력하세요.")
+ .font(.nps(font: .regular, size: 16))
+ .foregroundStyle(Color(.Text.border))
+ .padding(EdgeInsets(top: 12, leading: 24, bottom: 12, trailing: 24))
+ }
+ CustomTextField(placeholder: "", text: $password, isSecure: $isSecure)
+ .frame(maxWidth: .infinity,maxHeight: 24)
+ .padding(EdgeInsets(top: 12, leading: 24, bottom: 12, trailing: 24))
+
+ HStack {
+ Spacer()
+ Button {
+ isSecure.toggle()
+ } label: {
+ if password.isEmpty {
+ Rectangle()
+ .frame(width: 16, height: 2)
+ .foregroundStyle(Color(.Text.border))
+ .padding(.trailing,24)
+ }
+ else {
+ if isSecure {
+ Image(systemName: "eye")
+ .frame(width: 16, height: 16)
+ .foregroundStyle(Color(.Text.detail))
+ .padding(.trailing,24)
+ }
+ else {
+ Image(systemName: "eye.slash")
+ .frame(width: 16, height: 16)
+ .foregroundStyle(Color(.Text.detail))
+ .padding(.trailing,24)
+
+ }
+ }
+ }
+ }
+ }
+ .background {
+ RoundedRectangle(cornerRadius: 24)
+ .foregroundStyle(.white)
+ }
+ .padding(EdgeInsets(top: 0, leading: 12, bottom: 8, trailing: 12))
+
+ Button {
+ isSave.toggle()
+ } label: {
+ HStack(alignment: .center, spacing: 4) {
+ Spacer(minLength: 1)
+ if isSave {
+ Image(systemName: "checkmark.square")
+ .foregroundStyle(Color(.Second.normal))
+ .frame(width: 24, height: 24)
+ } else {
+ Image(systemName: "square")
+ .foregroundStyle(Color(.Second.normal))
+ .frame(width: 24, height: 24)
+ }
+
+ Text("로그인 정보 저장")
+ .font(.nps(font: .regular, size: 16))
+ .foregroundStyle(Color(.Text.detail))
+ }
+ }
+ .padding(EdgeInsets(top: 0, leading: 0, bottom: 24, trailing: 12))
+
+ Button {
+ viewModel.loginAction.send(true)
+ } label: {
+ Text("로그인")
+ .font(.nps(font: .bold, size: 24))
+ .foregroundStyle(Color(.Text.white))
+ .padding(EdgeInsets(top: 8, leading: 48, bottom: 8, trailing: 48))
+ .background{
+ RoundedRectangle(cornerRadius: 12)
+ .foregroundStyle(Color(.Second.normal))
+ }
+ }
+ }
+ }
+}
diff --git a/AcaMate/1. View/1. Intro & Login/IntroView.swift b/AcaMate/1. View/11. Intro & Login/IntroView.swift
similarity index 84%
rename from AcaMate/1. View/1. Intro & Login/IntroView.swift
rename to AcaMate/1. View/11. Intro & Login/IntroView.swift
index 4d21e43..f475baf 100644
--- a/AcaMate/1. View/1. Intro & Login/IntroView.swift
+++ b/AcaMate/1. View/11. Intro & Login/IntroView.swift
@@ -9,7 +9,8 @@ import SwiftUI
import Combine
struct IntroView: View {
- @EnvironmentObject var alertController: AlertController
+ @EnvironmentObject var appVM: AppViewModel
+
@State var cancellables: Set = []
@Binding var naviState : NaviState
@@ -17,15 +18,12 @@ struct IntroView: View {
VStack(spacing: 0) {
Spacer()
.frame(height: 100)
- Image("Team_Icon")
+ Image(.Icon.appIcon)
.resizable()
.frame(width: 200, height: 200)
- .background(.white)
- .border(.black)
- .padding()
Spacer()
HStack(spacing: 4) {
- Image("Team_Icon")
+ Image(.Icon.teamIcon)
.resizable()
.frame(width: 24, height: 24)
Text("STEIN")
@@ -52,16 +50,17 @@ struct IntroView: View {
} receiveValue: { version in
let compareForce = compareVersion(version.force_ver, currentVersion())
let compareChoice = compareVersion(version.final_ver, currentVersion())
+
if compareForce == .bigger {
- alertController.alertData = SetAlertData().setForceUpdate(
- action: alertController.alertAction
+ appVM.alertData = SetAlertData().setForceUpdate(
+ action: appVM.alertAction
)
- alertController.showAlert.toggle()
+ appVM.showAlert.toggle()
} else if compareChoice == .bigger && version.choice_update_yn {
- alertController.alertData = SetAlertData().setSelectUpdate(
- action: alertController.alertAction
+ appVM.alertData = SetAlertData().setSelectUpdate(
+ action: appVM.alertAction
)
- alertController.showAlert.toggle()
+ appVM.showAlert.toggle()
} else {
naviState.set(act: .RESET, path: .Login)
}
@@ -73,7 +72,7 @@ struct IntroView: View {
}
private func subscribeAlertAction() {
- alertController.alertAction
+ appVM.alertAction
.compactMap { $0 }
.sink { action in
if action == "updateNow" {
diff --git a/AcaMate/1. View/11. Intro & Login/LoginView.swift b/AcaMate/1. View/11. Intro & Login/LoginView.swift
new file mode 100644
index 0000000..4909d95
--- /dev/null
+++ b/AcaMate/1. View/11. Intro & Login/LoginView.swift
@@ -0,0 +1,183 @@
+//
+// LoginView.swift
+// AcaMate
+//
+// Created by Sean Kim on 12/1/24.
+//
+
+import SwiftUI
+import Combine
+
+struct LoginView: View {
+ @EnvironmentObject var appVM: AppViewModel
+ @StateObject private var loginVM = LoginViewModel()
+ @State var cancellables: Set = []
+ @Binding var naviState : NaviState
+
+ @State var selectIdLogin: Bool = false
+
+ @State var userId: String = ""
+ @State var password: String = ""
+ @State var isSecure: Bool = true
+ @State var isSave: Bool = false
+
+ var body: some View {
+ VStack(spacing: 0) {
+ Image(.Icon.appIcon)
+ .resizable()
+ .frame(width: 200, height: 200)
+ .padding(.top, 80)
+ /// 앱 아이콘 이미지
+ VStack(spacing: 16) {
+ Button {
+ // MARK: - TODO, 카카오 계정 로그인 구현
+ appVM.isLoading.toggle()
+ loginAction(type: .Kakao)
+ } label: {
+ makeButton(image: Image(.Icon.kakaoIcon),color: Color(.Other.yellow), "카카오 계정으로 시작하기")
+ }
+
+ Button {
+ // MARK: - TODO, 애플 계정 로그인 구현
+ naviState.set(act: .MOVE, path: .Main)
+ } label: {
+ makeButton(image: Image(.Icon.appleIcon), color: Color(.Text.black), "애플 계정으로 시작하기")
+ }
+ }
+
+ /*
+ VStack(spacing: 16) {
+
+ Button {
+ // MARK: TO-DO
+ // 카카오 로그인 연동
+ naviState.set(act: .MOVE, path: .Main)
+ } label: {
+ HStack(spacing: 24) {
+ Image("Kakao_Icon")
+ .resizable()
+ .frame(width: 32, height: 32)
+ Text("카카오 계정으로 시작하기")
+ .font(.nps(font: .regular, size: 16))
+ .foregroundStyle(Color(.Text.black))
+ }
+ .frame(maxWidth: .infinity)
+ .padding(12)
+ .background {
+ RoundedRectangle(cornerRadius: 12)
+ .foregroundStyle(Color(.Other.yellow))
+ }
+ }
+ .frame(maxWidth: .infinity)
+ /// KAKAO 로그인 버튼
+
+ Button {
+ // MARK: TO-DO
+ // 애플 로그인 연동
+ } label: {
+ HStack(spacing: 24) {
+ Image(systemName: "apple.logo")
+ .resizable()
+ .accentColor(Color(.Text.white))
+ .frame(width: 32, height: 32)
+
+ Text("애플 계정으로 시작하기")
+ .font(.nps(font: .regular, size: 16))
+ .foregroundStyle(Color(.Text.white))
+ }
+ .frame(maxWidth: .infinity)
+ .padding(12)
+ .background {
+ RoundedRectangle(cornerRadius: 12)
+ .foregroundStyle(Color(.Text.black))
+ }
+ }
+ .frame(maxWidth: .infinity)
+ /// APPLE 로그인 버튼
+ }
+ */
+ .padding([.leading,.trailing], 28)
+
+ }
+ .onAppear {
+ subscribeLoginAction()
+ }
+ .frame(maxWidth: .infinity,maxHeight: .infinity)
+ .fullDrawView(.Normal.normal)
+ }
+ func makeButton(image: Image, color: Color? = nil, _ body: String) -> some View {
+ return HStack {
+ image
+ .resizable()
+ .frame(width: 32, height: 32)
+ Spacer(minLength: 12)
+ Text("\(body)")
+ .font(.nps(font: .regular, size: 16))
+ .foregroundStyle(color == Color(.Text.black) ? Color(.Text.white) : Color(.Text.black))
+ Spacer(minLength: 12)
+ }
+ .padding(12)
+ .background {
+ if let color = color {
+ RoundedRectangle(cornerRadius: 12)
+ .foregroundStyle(color)
+ }
+ }
+ }
+
+ private func subscribeLoginAction() {
+ loginVM.loginAction
+ .sink { isTapped in
+ if isTapped {
+ if userId.isEmpty || password.isEmpty {
+ appVM.alertData = SetAlertData().setErrorLogin()
+ appVM.showAlert.toggle()
+ }
+ else {
+
+ }
+ printLog("로그인")
+ }
+ }
+ .store(in: &cancellables)
+ }
+
+ private func loginAction(type: SNSLoginType) {
+ LoginController().login(type)
+ .flatMap{ snsId in
+ loadAPIData(url: "\(API_URL)",
+ path: "/api/v1/in/user/login",
+ parameters: [
+ "sns_id": "\(snsId.snsId)",
+ "acctype": "\(type == .Apple ? "ST00": "ST01")"
+ ],
+ decodingType: APIResponse.self)
+
+ }
+ .sink { completion in
+ switch completion {
+ case .failure(let error):
+ printLog("\(error)")
+ appVM.isLoading.toggle()
+ case .finished:
+ appVM.isLoading.toggle()
+ }
+ } receiveValue: { response in
+ guard let ua = response as? APIResponse else {return}
+ if let bids = ua.data.toStringDict()["bid"] {
+ printLog(bids)
+ if let bidArray: [String] = jsonToSwift(bids) {
+ printLog(bidArray[0])
+ } else {
+ printLog("JSON 변환 실패")
+ }
+ }
+ }
+ .store(in: &cancellables)
+
+ }
+}
+
+//#Preview {
+// LoginView()
+//}
diff --git a/AcaMate/1. View/12. Main/121. Button/BoxBtnView.swift b/AcaMate/1. View/12. Main/121. Button/BoxBtnView.swift
new file mode 100644
index 0000000..10747fb
--- /dev/null
+++ b/AcaMate/1. View/12. Main/121. Button/BoxBtnView.swift
@@ -0,0 +1,39 @@
+//
+// BoxBtnView.swift
+// AcaMate
+//
+// Created by TAnine on 2/4/25.
+//
+
+import SwiftUI
+
+struct BoxBtnView: View {
+ let width: CGFloat
+ let height: CGFloat
+ let action: VOID_TO_VOID?
+
+ @ViewBuilder let content: Content
+
+ var body: some View {
+ Button{
+ guard let action = action else { return }
+ action()
+ } label: {
+ content
+// if let image = image {
+// image
+// .resizable()
+// .frame(width: width, height: height)
+// }
+ }
+ }
+}
+
+#Preview {
+ BoxBtnView(width: 40, height: 40, action: nil){
+ VStack {
+ Text("Test1")
+ Text("Test2")
+ }
+ }
+}
diff --git a/AcaMate/1. View/12. Main/121. Button/CircleBtnView.swift b/AcaMate/1. View/12. Main/121. Button/CircleBtnView.swift
new file mode 100644
index 0000000..80ce92b
--- /dev/null
+++ b/AcaMate/1. View/12. Main/121. Button/CircleBtnView.swift
@@ -0,0 +1,56 @@
+//
+// ButtonView.swift
+// AcaMate
+//
+// Created by TAnine on 2/4/25.
+//
+
+import SwiftUI
+
+
+
+struct CircleBtnView: View {
+ let title: String?
+ let image: Image
+ @Binding var isSelected: Bool
+ let isReverse: Bool
+
+ let action: VOID_TO_VOID?
+
+ var backColor: Color {isReverse ? Color(.Second.light) : Color(.Normal.normal)}
+ var tintColor: Color {isSelected ? Color(.Second.normal) : Color(.Disable.normal)}
+
+ var body: some View {
+ Button{
+ guard let action = action else {return}
+ action()
+ } label: {
+ VStack(alignment: .center, spacing: 0) {
+ self.image
+ .resizable()
+ .renderingMode(.template)
+ .foregroundStyle(self.tintColor)
+ .frame(width: 24, height: 24)
+ if let title = self.title {
+ Text("\(title)")
+ .font(.nps(font: .bold, size: 6))
+ .tint(self.tintColor)
+ }
+ }
+ .padding()
+ .background {
+ if isReverse {
+ Circle()
+ .accentColor(self.backColor)
+ .frame(width: 48, height: 48)
+ .innerShadow(shape: Circle(), color: Color(.Text.black).opacity(0.75), blur: 8, x: 0, y: 4)
+ } else {
+ Circle()
+ .accentColor(self.backColor)
+ .frame(width: 48, height: 48)
+ .shadow(color: Color(.Text.black).opacity(0.75), radius: 8, x: 4, y: 8)
+ }
+ }
+ }
+ }
+}
diff --git a/AcaMate/1. View/12. Main/121. Button/SimpleBtnView.swift b/AcaMate/1. View/12. Main/121. Button/SimpleBtnView.swift
new file mode 100644
index 0000000..dae991c
--- /dev/null
+++ b/AcaMate/1. View/12. Main/121. Button/SimpleBtnView.swift
@@ -0,0 +1,45 @@
+//
+// SimpleBtnView.swift
+// AcaMate
+//
+// Created by TAnine on 2/4/25.
+//
+
+import SwiftUI
+
+struct SimpleBtnView: View {
+ let title: String?
+ let image: Image?
+ let font: Font?
+ let width: CGFloat
+ let height: CGFloat
+
+ let action: VOID_TO_VOID?
+
+
+ var body: some View {
+ Button{
+ guard let action = action else { return }
+ action()
+ } label: {
+ if let title = title, let font = font {
+ Text("\(title)")
+ .font(font)
+ .tint(Color(.Second.dark))
+ .frame(width: width, height: height)
+ }
+ else if let image = image {
+ image
+ .resizable()
+ .frame(width: width, height: height)
+ }
+ }
+ }
+}
+
+#Preview {
+ SimpleBtnView(title: "체크 합니다", image: Image(.BottomBar.home),
+ font: .nps(font: .bold, size: 12),
+ width: 40, height: 40,
+ action: nil)
+}
diff --git a/AcaMate/1. View/12. Main/BottomView.swift b/AcaMate/1. View/12. Main/BottomView.swift
new file mode 100644
index 0000000..72c9e42
--- /dev/null
+++ b/AcaMate/1. View/12. Main/BottomView.swift
@@ -0,0 +1,79 @@
+//
+// BottomView.swift
+// AcaMate
+//
+// Created by TAnine on 2/4/25.
+//
+
+import SwiftUI
+
+struct BottomView: View {
+ @State private var isHomeSelected: Bool = true
+ @State private var isManagementSelected: Bool = false
+ @State private var isChattingSelected: Bool = false
+ @State private var isCalendarSelected: Bool = false
+ @State private var isEtcSelected: Bool = false
+
+ var body: some View {
+ HStack(spacing: 0){
+ Spacer(minLength: 1)
+ CircleBtnView(title: "홈", image: Image(.BottomBar.home),
+ isSelected: $isHomeSelected, isReverse: false,
+ action: {
+ btnAllFalse()
+ isHomeSelected.toggle()
+ })
+ Spacer(minLength: 1)
+
+ CircleBtnView(title: "학습 관리", image: Image(.BottomBar.management),
+ isSelected: $isManagementSelected, isReverse: false,
+ action: {
+ btnAllFalse()
+ isManagementSelected.toggle()
+ })
+ Spacer(minLength: 1)
+ CircleBtnView(title: "채팅", image: Image(.BottomBar.chatting),
+ isSelected: $isChattingSelected, isReverse: false,
+ action: {
+ btnAllFalse()
+ isChattingSelected.toggle()
+ })
+ Spacer(minLength: 1)
+ CircleBtnView(title: "일정", image: Image(.BottomBar.calendar),
+ isSelected: $isCalendarSelected, isReverse: false,
+ action: {
+ btnAllFalse()
+ isCalendarSelected.toggle()
+ })
+ Spacer(minLength: 1)
+ CircleBtnView(title: "더보기", image: Image(.BottomBar.etc),
+ isSelected: $isEtcSelected, isReverse: false,
+ action: {
+ btnAllFalse()
+ isEtcSelected.toggle()
+ })
+ Spacer(minLength: 1)
+ }
+ .padding([.top],12)
+ .background {
+ Rectangle()
+ .foregroundStyle(Color(.Normal.dark))
+ .ignoresSafeArea(edges: .bottom)
+ }
+ .frame(maxWidth: .infinity)
+
+
+ }
+
+ private func btnAllFalse() {
+ isHomeSelected = false
+ isManagementSelected = false
+ isChattingSelected = false
+ isCalendarSelected = false
+ isEtcSelected = false
+ }
+}
+
+#Preview {
+ BottomView()
+}
diff --git a/AcaMate/1. View/12. Main/MainView.swift b/AcaMate/1. View/12. Main/MainView.swift
new file mode 100644
index 0000000..42b7453
--- /dev/null
+++ b/AcaMate/1. View/12. Main/MainView.swift
@@ -0,0 +1,34 @@
+//
+// MainView.swift
+// AcaMate
+//
+// Created by TAnine on 2/4/25.
+//
+
+import SwiftUI
+import Combine
+
+struct MainView: View {
+ @EnvironmentObject var alertController: AlertController
+ @State var cancellables: Set = []
+ @Binding var naviState : NaviState
+
+ var body: some View {
+ VStack(spacing: 0) {
+ TopView(titleName: "Name")
+
+ Spacer()
+
+ BottomView()
+ .frame(maxWidth: .infinity)
+
+// .backgroundStyle(Color(.Normal.dark))
+// .safeAreaInset(edge: .bottom, spacing: 0) {
+// Color(.Normal.dark)
+//// .frame(height: 0)
+// }
+ }
+// .fullDrawView(Color(.Normal.dark))
+ }
+}
+
diff --git a/AcaMate/1. View/12. Main/TopView.swift b/AcaMate/1. View/12. Main/TopView.swift
new file mode 100644
index 0000000..aee8b74
--- /dev/null
+++ b/AcaMate/1. View/12. Main/TopView.swift
@@ -0,0 +1,43 @@
+//
+// TopView.swift
+// AcaMate
+//
+// Created by TAnine on 2/4/25.
+//
+
+import SwiftUI
+
+struct TopView: View {
+ @State var titleName: String = ""
+
+ var body: some View {
+ HStack(alignment: .center, spacing: 0) {
+ SimpleBtnView(title: nil, image: Image(.TopBar.face), font: nil, width: 40, height: 40, action: {
+
+ })
+ .padding(EdgeInsets(top: 12, leading: 24, bottom: 12, trailing: 12))
+
+ Text("\(titleName)")
+ .tint(Color(.Text.disabled))
+ .font(.nps(font: .bold, size: 20))
+ Spacer()
+
+ SimpleBtnView(title: nil, image: Image(.TopBar.face), font: nil, width: 40, height: 40, action: {
+
+ })
+ .hidden()
+
+ }
+ .background {
+ Rectangle()
+ .foregroundStyle(Color(.Other.cell))
+ .ignoresSafeArea(edges: .top)
+ }
+ .frame(maxWidth: .infinity)
+
+ }
+}
+
+#Preview {
+ TopView(titleName: "Name")
+}
diff --git a/AcaMate/4. Model/API Response.swift b/AcaMate/2. Model/API Response.swift
similarity index 80%
rename from AcaMate/4. Model/API Response.swift
rename to AcaMate/2. Model/API Response.swift
index 890d0bf..aba043f 100644
--- a/AcaMate/4. Model/API Response.swift
+++ b/AcaMate/2. Model/API Response.swift
@@ -25,5 +25,11 @@ class VersionData: Codable {
}
+// ----------------
+
+class User_Academy: Codable {
+ let uid: String
+ let bid: [String]
+}
diff --git a/AcaMate/4. Model/Alert.swift b/AcaMate/2. Model/Alert.swift
similarity index 85%
rename from AcaMate/4. Model/Alert.swift
rename to AcaMate/2. Model/Alert.swift
index 6fcba27..ed1dc65 100644
--- a/AcaMate/4. Model/Alert.swift
+++ b/AcaMate/2. Model/Alert.swift
@@ -82,5 +82,16 @@ struct SetAlertData {
])
}
+ /// 로그인 문제 발생
+ func setErrorLogin() -> AlertData {
+ return AlertData(title: "로그인",
+ body: """
+ ID 와 비밀번호가 올바르지 않습니다.
+ 확인 후 다시 시도해주세요.
+ """,
+ button: [
+ ButtonType(name: "확인", role: .cancel, function: nil)
+ ])
+ }
}
diff --git a/AcaMate/4. Model/Navigation.swift b/AcaMate/2. Model/Navigation.swift
similarity index 100%
rename from AcaMate/4. Model/Navigation.swift
rename to AcaMate/2. Model/Navigation.swift
diff --git a/AcaMate/4. Model/SNS Data.swift b/AcaMate/2. Model/SNS Data.swift
similarity index 100%
rename from AcaMate/4. Model/SNS Data.swift
rename to AcaMate/2. Model/SNS Data.swift
diff --git a/AcaMate/3. ViewModel/AlertViewModel.swift b/AcaMate/3. ViewModel/AlertViewModel.swift
new file mode 100644
index 0000000..228379f
--- /dev/null
+++ b/AcaMate/3. ViewModel/AlertViewModel.swift
@@ -0,0 +1,19 @@
+//
+// AlertController.swift
+// AcaMate
+//
+// Created by Sean Kim on 12/13/24.
+//
+
+import SwiftUI
+import Combine
+
+
+class AlertViewModel2: ObservableObject {
+ @Published var showAlert: Bool = false
+ var alertData: AlertData = .init(body: "")
+
+ let alertAction = CurrentValueSubject(nil)
+
+
+}
diff --git a/AcaMate/3. ViewModel/AppViewModel.swift b/AcaMate/3. ViewModel/AppViewModel.swift
new file mode 100644
index 0000000..39549ca
--- /dev/null
+++ b/AcaMate/3. ViewModel/AppViewModel.swift
@@ -0,0 +1,19 @@
+//
+// AppViewModel.swift
+// AcaMate
+//
+// Created by Sean Kim on 12/16/24.
+//
+
+import SwiftUI
+import Combine
+
+class AppViewModel: ObservableObject {
+ @Published var isLoading: Bool = false
+
+ @Published var showAlert: Bool = false
+ var alertData: AlertData = .init(body: "")
+
+ let alertAction = CurrentValueSubject(nil)
+
+}
diff --git a/AcaMate/3. ViewModel/LoginViewModel.swift b/AcaMate/3. ViewModel/LoginViewModel.swift
new file mode 100644
index 0000000..18694ca
--- /dev/null
+++ b/AcaMate/3. ViewModel/LoginViewModel.swift
@@ -0,0 +1,13 @@
+//
+// LoginViewModel.swift
+// AcaMate
+//
+// Created by Sean Kim on 12/14/24.
+//
+
+import SwiftUI
+import Combine
+
+class LoginViewModel: ObservableObject {
+ let loginAction = CurrentValueSubject(false)
+}
diff --git a/AcaMate/3. Controller/APIController.swift b/AcaMate/4. Controller/APIController.swift
similarity index 100%
rename from AcaMate/3. Controller/APIController.swift
rename to AcaMate/4. Controller/APIController.swift
diff --git a/AcaMate/3. Controller/AlertController.swift b/AcaMate/4. Controller/AlertController.swift
similarity index 100%
rename from AcaMate/3. Controller/AlertController.swift
rename to AcaMate/4. Controller/AlertController.swift
diff --git a/AcaMate/3. Controller/KeyController.swift b/AcaMate/4. Controller/KeyController.swift
similarity index 100%
rename from AcaMate/3. Controller/KeyController.swift
rename to AcaMate/4. Controller/KeyController.swift
diff --git a/AcaMate/3. Controller/LoginController.swift b/AcaMate/4. Controller/LoginController.swift
similarity index 92%
rename from AcaMate/3. Controller/LoginController.swift
rename to AcaMate/4. Controller/LoginController.swift
index 5c082d4..4c66795 100644
--- a/AcaMate/3. Controller/LoginController.swift
+++ b/AcaMate/4. Controller/LoginController.swift
@@ -12,28 +12,31 @@ import KakaoSDKAuth
import KakaoSDKUser
import Alamofire
+import Foundation
-class SNSLogin {
+class LoginController {
private var cancellables = Set()
- func login(type: SNSLoginType){
+ func login(_ type: SNSLoginType) -> AnyPublisher {
switch type {
case .Kakao:
- self.checkKakaoToken()
- .sink { completion in
+ return self.checkKakaoToken()
+ .handleEvents(receiveCompletion: { completion in
switch completion {
- case .failure(let error):
+ case .failure(let error) :
printLog("KAKAO LOGIN ERROR: \(error)")
case .finished: break
}
- } receiveValue: { snsId in
- printLog("로그인 완료 \(snsId)")
- }
- .store(in: &cancellables)
+ })
+ .eraseToAnyPublisher()
+//
- case .Apple: break
+ case .Apple:
+ return Fail(error: NSError(domain: "Apple login not implemented", code: 1, userInfo: nil))
+ .eraseToAnyPublisher()
}
+
}
func logout(type: SNSLoginType) {
@@ -54,7 +57,7 @@ class SNSLogin {
//MARK: - KAKAO LOGIN
-extension SNSLogin {
+extension LoginController {
/// 토큰을 가지고 있나 확인
private func checkKakaoToken() -> Future {
return Future { promise in
diff --git a/AcaMate/5. Modifier/TextField.swift b/AcaMate/5. Modifier/TextField.swift
new file mode 100644
index 0000000..ddaa9d5
--- /dev/null
+++ b/AcaMate/5. Modifier/TextField.swift
@@ -0,0 +1,65 @@
+//
+// UIView.swift
+// AcaMate
+//
+// Created by Sean Kim on 12/14/24.
+//
+
+import SwiftUI
+import UIKit
+
+struct CustomTextField: UIViewRepresentable {
+ var placeholder: String
+ @Binding var text: String
+
+ var isSecure: Binding = .constant(false)
+
+ var textColor = UIColor(Color(.Text.detail))
+ var font = UIFont(name: "NPS-font-Regular", size: 16)
+
+ // [필수] 초기화 시 UIView 생성
+ func makeUIView(context: Context) -> UITextField {
+ let txf = UITextField()
+ txf.placeholder = placeholder
+ txf.isSecureTextEntry = isSecure.wrappedValue
+
+ txf.textColor = textColor
+ txf.font = font
+
+ txf.translatesAutoresizingMaskIntoConstraints = false
+
+ let height = (font?.lineHeight ?? 10) + 8
+ txf.frame.size.height = height
+
+ txf.autocorrectionType = .no
+ txf.autocapitalizationType = .none
+ txf.smartInsertDeleteType = .no
+ txf.textContentType = .oneTimeCode
+
+ txf.delegate = context.coordinator
+ return txf
+ }
+
+ // [필수] 스유 상태 변화 따라 UIView 업데이트
+ func updateUIView(_ uiView: UITextField, context: Context) {
+ uiView.text = text
+ uiView.isSecureTextEntry = isSecure.wrappedValue
+ }
+
+ func makeCoordinator() -> Coordinator {
+ Coordinator(self)
+ }
+
+ class Coordinator: NSObject, UITextFieldDelegate {
+ var parent: CustomTextField
+
+ init(_ parent: CustomTextField) {
+ self.parent = parent
+ }
+
+ func textFieldDidChangeSelection(_ textField: UITextField) {
+ parent.text = textField.text ?? ""
+ }
+ }
+
+}
diff --git a/AcaMate/5. Modifier/View.swift b/AcaMate/5. Modifier/View.swift
index 89b8997..bed4bf6 100644
--- a/AcaMate/5. Modifier/View.swift
+++ b/AcaMate/5. Modifier/View.swift
@@ -8,28 +8,29 @@
import SwiftUI
import Combine
+
struct NetworkModifier: ViewModifier {
@ObservedObject private var networkMonitor = NetworkMonitor.shared
- @EnvironmentObject var alertController: AlertController
+ @EnvironmentObject var appVM: AppViewModel
func body(content: Content) -> some View {
content
.onChange(of: networkMonitor.isConnected) { _ , new in
if !new {
- alertController.alertData = SetAlertData().setErrorNetwork()
- alertController.showAlert.toggle()
+ appVM.alertData = SetAlertData().setErrorNetwork()
+ appVM.showAlert.toggle()
}
}
}
}
struct AlertModifier: ViewModifier {
- @EnvironmentObject var controller: AlertController
+ @EnvironmentObject var appVM: AppViewModel
func body(content: Content) -> some View {
content
- .alert(controller.alertData.title,
- isPresented: $controller.showAlert,
- presenting: $controller.alertData) { data in
+ .alert(appVM.alertData.title,
+ isPresented: $appVM.showAlert,
+ presenting: $appVM.alertData) { data in
let btnCount = data.button.count
ForEach(0 ..< btnCount, id: \.self) { index in
let btn = data.wrappedValue.button[index]
@@ -45,8 +46,35 @@ struct AlertModifier: ViewModifier {
}
}
+struct LoadingModifier: ViewModifier {
+ @Binding var isLoading: Bool
+
+ func body(content: Content) -> some View {
+ ZStack {
+ content
+ .disabled(isLoading)
+ .blur(radius: isLoading ? 3:0)
+ if isLoading {
+ Color.Text.detail.opacity(0.6)
+// Color.Second.normal.opacity(0.3)
+ .ignoresSafeArea()
+ ProgressView("Loading...")
+// .tint(Color.Text.black)
+ .tint(Color.Normal.normal)
+ .scaleEffect(1.5)
+ .foregroundStyle(Color.Normal.normal)
+
+ .font(.nps(font: .bold, size: 16))
+
+ .padding()
+ }
+ }
+ }
+}
+
extension View {
- func fullView(_ backColor: Color) -> some View {
+ /// View에 전체적으로 색 입히기
+ func fullDrawView(_ backColor: Color) -> some View {
return self
.frame(maxWidth: .infinity, maxHeight: .infinity)
.background(backColor)
@@ -63,9 +91,17 @@ extension View {
UIApplication.shared.sendAction(#selector(UIResponder.resignFirstResponder), to: nil, from: nil, for: nil)
}
- func setNavigaion() -> some View {
- self
- .navigationBarBackButtonHidden(true)
- .toolbar(.hidden, for: .navigationBar)
+ func loadingView(isLoading: Binding) -> some View {
+ self.modifier(LoadingModifier(isLoading: isLoading))
+ }
+
+ func innerShadow (shape: S, color: Color, lineWidth: CGFloat = 6, blur: CGFloat, x: CGFloat, y: CGFloat) -> some View {
+ return self.overlay {
+ shape
+ .stroke(color, lineWidth: lineWidth)
+ .offset(x: x, y: y)
+ .blur(radius: blur)
+ .mask(shape.fill(LinearGradient(gradient: Gradient(colors: [.black, .clear]), startPoint: .topLeading, endPoint: .bottomTrailing)))
+ }
}
}
diff --git a/AcaMate/6. Resources/Assets.xcassets/AppIcon.appiconset/Contents.json b/AcaMate/6. Resources/Assets.xcassets/AppIcon.appiconset/Contents.json
index 2305880..5a178b1 100644
--- a/AcaMate/6. Resources/Assets.xcassets/AppIcon.appiconset/Contents.json
+++ b/AcaMate/6. Resources/Assets.xcassets/AppIcon.appiconset/Contents.json
@@ -1,6 +1,7 @@
{
"images" : [
{
+ "filename" : "LOGO.png",
"idiom" : "universal",
"platform" : "ios",
"size" : "1024x1024"
@@ -12,6 +13,7 @@
"value" : "dark"
}
],
+ "filename" : "LOGO 1.png",
"idiom" : "universal",
"platform" : "ios",
"size" : "1024x1024"
@@ -23,6 +25,7 @@
"value" : "tinted"
}
],
+ "filename" : "LOGO 2.png",
"idiom" : "universal",
"platform" : "ios",
"size" : "1024x1024"
diff --git a/AcaMate/6. Resources/Assets.xcassets/AppIcon.appiconset/LOGO 1.png b/AcaMate/6. Resources/Assets.xcassets/AppIcon.appiconset/LOGO 1.png
new file mode 100644
index 0000000..38f90a2
Binary files /dev/null and b/AcaMate/6. Resources/Assets.xcassets/AppIcon.appiconset/LOGO 1.png differ
diff --git a/AcaMate/6. Resources/Assets.xcassets/AppIcon.appiconset/LOGO 2.png b/AcaMate/6. Resources/Assets.xcassets/AppIcon.appiconset/LOGO 2.png
new file mode 100644
index 0000000..38f90a2
Binary files /dev/null and b/AcaMate/6. Resources/Assets.xcassets/AppIcon.appiconset/LOGO 2.png differ
diff --git a/AcaMate/6. Resources/Assets.xcassets/AppIcon.appiconset/LOGO.png b/AcaMate/6. Resources/Assets.xcassets/AppIcon.appiconset/LOGO.png
new file mode 100644
index 0000000..38f90a2
Binary files /dev/null and b/AcaMate/6. Resources/Assets.xcassets/AppIcon.appiconset/LOGO.png differ
diff --git a/AcaMate/6. Resources/Assets.xcassets/Color Folder/Text/Border.colorset/Contents.json b/AcaMate/6. Resources/Assets.xcassets/Color Folder/Text/Border.colorset/Contents.json
new file mode 100644
index 0000000..5321c93
--- /dev/null
+++ b/AcaMate/6. Resources/Assets.xcassets/Color Folder/Text/Border.colorset/Contents.json
@@ -0,0 +1,20 @@
+{
+ "colors" : [
+ {
+ "color" : {
+ "color-space" : "srgb",
+ "components" : {
+ "alpha" : "1.000",
+ "blue" : "0.776",
+ "green" : "0.776",
+ "red" : "0.776"
+ }
+ },
+ "idiom" : "universal"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/AcaMate/6. Resources/Assets.xcassets/Image Folder/BottomBar/Calendar.imageset/Calendar.png b/AcaMate/6. Resources/Assets.xcassets/Image Folder/BottomBar/Calendar.imageset/Calendar.png
new file mode 100644
index 0000000..17b4f33
Binary files /dev/null and b/AcaMate/6. Resources/Assets.xcassets/Image Folder/BottomBar/Calendar.imageset/Calendar.png differ
diff --git a/AcaMate/6. Resources/Assets.xcassets/Image Folder/BottomBar/Calendar.imageset/Contents.json b/AcaMate/6. Resources/Assets.xcassets/Image Folder/BottomBar/Calendar.imageset/Contents.json
new file mode 100644
index 0000000..71e4791
--- /dev/null
+++ b/AcaMate/6. Resources/Assets.xcassets/Image Folder/BottomBar/Calendar.imageset/Contents.json
@@ -0,0 +1,12 @@
+{
+ "images" : [
+ {
+ "filename" : "Calendar.png",
+ "idiom" : "universal"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/AcaMate/6. Resources/Assets.xcassets/Image Folder/BottomBar/Chatting.imageset/Chatting.png b/AcaMate/6. Resources/Assets.xcassets/Image Folder/BottomBar/Chatting.imageset/Chatting.png
new file mode 100644
index 0000000..e6f9671
Binary files /dev/null and b/AcaMate/6. Resources/Assets.xcassets/Image Folder/BottomBar/Chatting.imageset/Chatting.png differ
diff --git a/AcaMate/6. Resources/Assets.xcassets/Image Folder/BottomBar/Chatting.imageset/Contents.json b/AcaMate/6. Resources/Assets.xcassets/Image Folder/BottomBar/Chatting.imageset/Contents.json
new file mode 100644
index 0000000..62dd517
--- /dev/null
+++ b/AcaMate/6. Resources/Assets.xcassets/Image Folder/BottomBar/Chatting.imageset/Contents.json
@@ -0,0 +1,12 @@
+{
+ "images" : [
+ {
+ "filename" : "Chatting.png",
+ "idiom" : "universal"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/AcaMate/6. Resources/Assets.xcassets/Image Folder/BottomBar/Contents.json b/AcaMate/6. Resources/Assets.xcassets/Image Folder/BottomBar/Contents.json
new file mode 100644
index 0000000..6e96565
--- /dev/null
+++ b/AcaMate/6. Resources/Assets.xcassets/Image Folder/BottomBar/Contents.json
@@ -0,0 +1,9 @@
+{
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ },
+ "properties" : {
+ "provides-namespace" : true
+ }
+}
diff --git a/AcaMate/6. Resources/Assets.xcassets/Image Folder/BottomBar/Etc.imageset/Contents.json b/AcaMate/6. Resources/Assets.xcassets/Image Folder/BottomBar/Etc.imageset/Contents.json
new file mode 100644
index 0000000..4e58ea0
--- /dev/null
+++ b/AcaMate/6. Resources/Assets.xcassets/Image Folder/BottomBar/Etc.imageset/Contents.json
@@ -0,0 +1,12 @@
+{
+ "images" : [
+ {
+ "filename" : "Etc.png",
+ "idiom" : "universal"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/AcaMate/6. Resources/Assets.xcassets/Image Folder/BottomBar/Etc.imageset/Etc.png b/AcaMate/6. Resources/Assets.xcassets/Image Folder/BottomBar/Etc.imageset/Etc.png
new file mode 100644
index 0000000..4842ed5
Binary files /dev/null and b/AcaMate/6. Resources/Assets.xcassets/Image Folder/BottomBar/Etc.imageset/Etc.png differ
diff --git a/AcaMate/6. Resources/Assets.xcassets/Image Folder/BottomBar/Home.imageset/Contents.json b/AcaMate/6. Resources/Assets.xcassets/Image Folder/BottomBar/Home.imageset/Contents.json
new file mode 100644
index 0000000..92754fa
--- /dev/null
+++ b/AcaMate/6. Resources/Assets.xcassets/Image Folder/BottomBar/Home.imageset/Contents.json
@@ -0,0 +1,12 @@
+{
+ "images" : [
+ {
+ "filename" : "Home.png",
+ "idiom" : "universal"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/AcaMate/6. Resources/Assets.xcassets/Image Folder/BottomBar/Home.imageset/Home.png b/AcaMate/6. Resources/Assets.xcassets/Image Folder/BottomBar/Home.imageset/Home.png
new file mode 100644
index 0000000..b5b2daa
Binary files /dev/null and b/AcaMate/6. Resources/Assets.xcassets/Image Folder/BottomBar/Home.imageset/Home.png differ
diff --git a/AcaMate/6. Resources/Assets.xcassets/Image Folder/BottomBar/Management.imageset/Contents.json b/AcaMate/6. Resources/Assets.xcassets/Image Folder/BottomBar/Management.imageset/Contents.json
new file mode 100644
index 0000000..2061f1b
--- /dev/null
+++ b/AcaMate/6. Resources/Assets.xcassets/Image Folder/BottomBar/Management.imageset/Contents.json
@@ -0,0 +1,12 @@
+{
+ "images" : [
+ {
+ "filename" : "Management.png",
+ "idiom" : "universal"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/AcaMate/6. Resources/Assets.xcassets/Image Folder/BottomBar/Management.imageset/Management.png b/AcaMate/6. Resources/Assets.xcassets/Image Folder/BottomBar/Management.imageset/Management.png
new file mode 100644
index 0000000..fdb724b
Binary files /dev/null and b/AcaMate/6. Resources/Assets.xcassets/Image Folder/BottomBar/Management.imageset/Management.png differ
diff --git a/AcaMate/6. Resources/Assets.xcassets/Image Folder/Icon/App_Icon.imageset/Contents.json b/AcaMate/6. Resources/Assets.xcassets/Image Folder/Icon/App_Icon.imageset/Contents.json
new file mode 100644
index 0000000..eee8d7c
--- /dev/null
+++ b/AcaMate/6. Resources/Assets.xcassets/Image Folder/Icon/App_Icon.imageset/Contents.json
@@ -0,0 +1,12 @@
+{
+ "images" : [
+ {
+ "filename" : "appIcon.png",
+ "idiom" : "universal"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/AcaMate/6. Resources/Assets.xcassets/Image Folder/Icon/App_Icon.imageset/appIcon.png b/AcaMate/6. Resources/Assets.xcassets/Image Folder/Icon/App_Icon.imageset/appIcon.png
new file mode 100644
index 0000000..141f54d
Binary files /dev/null and b/AcaMate/6. Resources/Assets.xcassets/Image Folder/Icon/App_Icon.imageset/appIcon.png differ
diff --git a/AcaMate/6. Resources/Assets.xcassets/Image Folder/Icon/Apple_Icon.imageset/APPLE.png b/AcaMate/6. Resources/Assets.xcassets/Image Folder/Icon/Apple_Icon.imageset/APPLE.png
new file mode 100644
index 0000000..6038e82
Binary files /dev/null and b/AcaMate/6. Resources/Assets.xcassets/Image Folder/Icon/Apple_Icon.imageset/APPLE.png differ
diff --git a/AcaMate/6. Resources/Assets.xcassets/Image Folder/Icon/Apple_Icon.imageset/Contents.json b/AcaMate/6. Resources/Assets.xcassets/Image Folder/Icon/Apple_Icon.imageset/Contents.json
new file mode 100644
index 0000000..687ec46
--- /dev/null
+++ b/AcaMate/6. Resources/Assets.xcassets/Image Folder/Icon/Apple_Icon.imageset/Contents.json
@@ -0,0 +1,12 @@
+{
+ "images" : [
+ {
+ "filename" : "APPLE.png",
+ "idiom" : "universal"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/AcaMate/6. Resources/Assets.xcassets/Image Folder/Icon/Contents.json b/AcaMate/6. Resources/Assets.xcassets/Image Folder/Icon/Contents.json
new file mode 100644
index 0000000..6e96565
--- /dev/null
+++ b/AcaMate/6. Resources/Assets.xcassets/Image Folder/Icon/Contents.json
@@ -0,0 +1,9 @@
+{
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ },
+ "properties" : {
+ "provides-namespace" : true
+ }
+}
diff --git a/AcaMate/6. Resources/Assets.xcassets/Image Folder/Icon/Kakao_Icon.imageset/Contents.json b/AcaMate/6. Resources/Assets.xcassets/Image Folder/Icon/Kakao_Icon.imageset/Contents.json
new file mode 100644
index 0000000..d0dc9a9
--- /dev/null
+++ b/AcaMate/6. Resources/Assets.xcassets/Image Folder/Icon/Kakao_Icon.imageset/Contents.json
@@ -0,0 +1,12 @@
+{
+ "images" : [
+ {
+ "filename" : "KAKAO.png",
+ "idiom" : "universal"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/AcaMate/6. Resources/Assets.xcassets/Image Folder/Icon/Kakao_Icon.imageset/KAKAO.png b/AcaMate/6. Resources/Assets.xcassets/Image Folder/Icon/Kakao_Icon.imageset/KAKAO.png
new file mode 100644
index 0000000..9c6d857
Binary files /dev/null and b/AcaMate/6. Resources/Assets.xcassets/Image Folder/Icon/Kakao_Icon.imageset/KAKAO.png differ
diff --git a/AcaMate/6. Resources/Assets.xcassets/Image Folder/Icon/MI.imageset/Contents.json b/AcaMate/6. Resources/Assets.xcassets/Image Folder/Icon/MI.imageset/Contents.json
new file mode 100644
index 0000000..53ec8f8
--- /dev/null
+++ b/AcaMate/6. Resources/Assets.xcassets/Image Folder/Icon/MI.imageset/Contents.json
@@ -0,0 +1,12 @@
+{
+ "images" : [
+ {
+ "filename" : "MI.png",
+ "idiom" : "universal"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/AcaMate/6. Resources/Assets.xcassets/Image Folder/MI.imageset/MI.png b/AcaMate/6. Resources/Assets.xcassets/Image Folder/Icon/MI.imageset/MI.png
similarity index 100%
rename from AcaMate/6. Resources/Assets.xcassets/Image Folder/MI.imageset/MI.png
rename to AcaMate/6. Resources/Assets.xcassets/Image Folder/Icon/MI.imageset/MI.png
diff --git a/AcaMate/6. Resources/Assets.xcassets/Image Folder/Icon/Page_Icon.imageset/Contents.json b/AcaMate/6. Resources/Assets.xcassets/Image Folder/Icon/Page_Icon.imageset/Contents.json
new file mode 100644
index 0000000..5c6e62d
--- /dev/null
+++ b/AcaMate/6. Resources/Assets.xcassets/Image Folder/Icon/Page_Icon.imageset/Contents.json
@@ -0,0 +1,12 @@
+{
+ "images" : [
+ {
+ "filename" : "PageIcon.png",
+ "idiom" : "universal"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/AcaMate/6. Resources/Assets.xcassets/Image Folder/Icon/Page_Icon.imageset/PageIcon.png b/AcaMate/6. Resources/Assets.xcassets/Image Folder/Icon/Page_Icon.imageset/PageIcon.png
new file mode 100644
index 0000000..49593e9
Binary files /dev/null and b/AcaMate/6. Resources/Assets.xcassets/Image Folder/Icon/Page_Icon.imageset/PageIcon.png differ
diff --git a/AcaMate/6. Resources/Assets.xcassets/Image Folder/Icon/Team_Icon.imageset/Contents.json b/AcaMate/6. Resources/Assets.xcassets/Image Folder/Icon/Team_Icon.imageset/Contents.json
new file mode 100644
index 0000000..935211c
--- /dev/null
+++ b/AcaMate/6. Resources/Assets.xcassets/Image Folder/Icon/Team_Icon.imageset/Contents.json
@@ -0,0 +1,12 @@
+{
+ "images" : [
+ {
+ "filename" : "TeamIcon.png",
+ "idiom" : "universal"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/AcaMate/6. Resources/Assets.xcassets/Image Folder/Team_Icon.imageset/1024.png b/AcaMate/6. Resources/Assets.xcassets/Image Folder/Icon/Team_Icon.imageset/TeamIcon.png
similarity index 100%
rename from AcaMate/6. Resources/Assets.xcassets/Image Folder/Team_Icon.imageset/1024.png
rename to AcaMate/6. Resources/Assets.xcassets/Image Folder/Icon/Team_Icon.imageset/TeamIcon.png
diff --git a/AcaMate/6. Resources/Assets.xcassets/Image Folder/Kakao_Icon.imageset/Contents.json b/AcaMate/6. Resources/Assets.xcassets/Image Folder/Kakao_Icon.imageset/Contents.json
deleted file mode 100644
index 234e650..0000000
--- a/AcaMate/6. Resources/Assets.xcassets/Image Folder/Kakao_Icon.imageset/Contents.json
+++ /dev/null
@@ -1,21 +0,0 @@
-{
- "images" : [
- {
- "filename" : "KakaoIcon.png",
- "idiom" : "universal",
- "scale" : "1x"
- },
- {
- "idiom" : "universal",
- "scale" : "2x"
- },
- {
- "idiom" : "universal",
- "scale" : "3x"
- }
- ],
- "info" : {
- "author" : "xcode",
- "version" : 1
- }
-}
diff --git a/AcaMate/6. Resources/Assets.xcassets/Image Folder/Kakao_Icon.imageset/KakaoIcon.png b/AcaMate/6. Resources/Assets.xcassets/Image Folder/Kakao_Icon.imageset/KakaoIcon.png
deleted file mode 100644
index 6eaf887..0000000
Binary files a/AcaMate/6. Resources/Assets.xcassets/Image Folder/Kakao_Icon.imageset/KakaoIcon.png and /dev/null differ
diff --git a/AcaMate/6. Resources/Assets.xcassets/Image Folder/MI.imageset/Contents.json b/AcaMate/6. Resources/Assets.xcassets/Image Folder/MI.imageset/Contents.json
deleted file mode 100644
index 3958985..0000000
--- a/AcaMate/6. Resources/Assets.xcassets/Image Folder/MI.imageset/Contents.json
+++ /dev/null
@@ -1,21 +0,0 @@
-{
- "images" : [
- {
- "filename" : "MI.png",
- "idiom" : "universal",
- "scale" : "1x"
- },
- {
- "idiom" : "universal",
- "scale" : "2x"
- },
- {
- "idiom" : "universal",
- "scale" : "3x"
- }
- ],
- "info" : {
- "author" : "xcode",
- "version" : 1
- }
-}
diff --git a/AcaMate/6. Resources/Assets.xcassets/Image Folder/Team_Icon.imageset/Contents.json b/AcaMate/6. Resources/Assets.xcassets/Image Folder/Team_Icon.imageset/Contents.json
deleted file mode 100644
index 94202f5..0000000
--- a/AcaMate/6. Resources/Assets.xcassets/Image Folder/Team_Icon.imageset/Contents.json
+++ /dev/null
@@ -1,21 +0,0 @@
-{
- "images" : [
- {
- "filename" : "1024.png",
- "idiom" : "universal",
- "scale" : "1x"
- },
- {
- "idiom" : "universal",
- "scale" : "2x"
- },
- {
- "idiom" : "universal",
- "scale" : "3x"
- }
- ],
- "info" : {
- "author" : "xcode",
- "version" : 1
- }
-}
diff --git a/AcaMate/6. Resources/Assets.xcassets/Image Folder/TopBar/Back.imageset/Back.png b/AcaMate/6. Resources/Assets.xcassets/Image Folder/TopBar/Back.imageset/Back.png
new file mode 100644
index 0000000..e0e5fa4
Binary files /dev/null and b/AcaMate/6. Resources/Assets.xcassets/Image Folder/TopBar/Back.imageset/Back.png differ
diff --git a/AcaMate/6. Resources/Assets.xcassets/Image Folder/TopBar/Back.imageset/Contents.json b/AcaMate/6. Resources/Assets.xcassets/Image Folder/TopBar/Back.imageset/Contents.json
new file mode 100644
index 0000000..7731df3
--- /dev/null
+++ b/AcaMate/6. Resources/Assets.xcassets/Image Folder/TopBar/Back.imageset/Contents.json
@@ -0,0 +1,12 @@
+{
+ "images" : [
+ {
+ "filename" : "Back.png",
+ "idiom" : "universal"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/AcaMate/6. Resources/Assets.xcassets/Image Folder/TopBar/Contents.json b/AcaMate/6. Resources/Assets.xcassets/Image Folder/TopBar/Contents.json
new file mode 100644
index 0000000..6e96565
--- /dev/null
+++ b/AcaMate/6. Resources/Assets.xcassets/Image Folder/TopBar/Contents.json
@@ -0,0 +1,9 @@
+{
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ },
+ "properties" : {
+ "provides-namespace" : true
+ }
+}
diff --git a/AcaMate/6. Resources/Assets.xcassets/Image Folder/TopBar/Edit.imageset/Contents.json b/AcaMate/6. Resources/Assets.xcassets/Image Folder/TopBar/Edit.imageset/Contents.json
new file mode 100644
index 0000000..39f0462
--- /dev/null
+++ b/AcaMate/6. Resources/Assets.xcassets/Image Folder/TopBar/Edit.imageset/Contents.json
@@ -0,0 +1,12 @@
+{
+ "images" : [
+ {
+ "filename" : "Edit.png",
+ "idiom" : "universal"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/AcaMate/6. Resources/Assets.xcassets/Image Folder/TopBar/Edit.imageset/Edit.png b/AcaMate/6. Resources/Assets.xcassets/Image Folder/TopBar/Edit.imageset/Edit.png
new file mode 100644
index 0000000..45cec8c
Binary files /dev/null and b/AcaMate/6. Resources/Assets.xcassets/Image Folder/TopBar/Edit.imageset/Edit.png differ
diff --git a/AcaMate/6. Resources/Assets.xcassets/Image Folder/TopBar/Face.imageset/Contents.json b/AcaMate/6. Resources/Assets.xcassets/Image Folder/TopBar/Face.imageset/Contents.json
new file mode 100644
index 0000000..04b803f
--- /dev/null
+++ b/AcaMate/6. Resources/Assets.xcassets/Image Folder/TopBar/Face.imageset/Contents.json
@@ -0,0 +1,12 @@
+{
+ "images" : [
+ {
+ "filename" : "Face.png",
+ "idiom" : "universal"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/AcaMate/6. Resources/Assets.xcassets/Image Folder/TopBar/Face.imageset/Face.png b/AcaMate/6. Resources/Assets.xcassets/Image Folder/TopBar/Face.imageset/Face.png
new file mode 100644
index 0000000..1e1f225
Binary files /dev/null and b/AcaMate/6. Resources/Assets.xcassets/Image Folder/TopBar/Face.imageset/Face.png differ
diff --git a/AcaMate/6. Resources/Assets.xcassets/Image Folder/TopBar/Market.imageset/Contents.json b/AcaMate/6. Resources/Assets.xcassets/Image Folder/TopBar/Market.imageset/Contents.json
new file mode 100644
index 0000000..d60e6f5
--- /dev/null
+++ b/AcaMate/6. Resources/Assets.xcassets/Image Folder/TopBar/Market.imageset/Contents.json
@@ -0,0 +1,12 @@
+{
+ "images" : [
+ {
+ "filename" : "Market.png",
+ "idiom" : "universal"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/AcaMate/6. Resources/Assets.xcassets/Image Folder/TopBar/Market.imageset/Market.png b/AcaMate/6. Resources/Assets.xcassets/Image Folder/TopBar/Market.imageset/Market.png
new file mode 100644
index 0000000..65c9d0a
Binary files /dev/null and b/AcaMate/6. Resources/Assets.xcassets/Image Folder/TopBar/Market.imageset/Market.png differ
diff --git a/AcaMate/6. Resources/Assets.xcassets/Image Folder/TopBar/Person.imageset/Contents.json b/AcaMate/6. Resources/Assets.xcassets/Image Folder/TopBar/Person.imageset/Contents.json
new file mode 100644
index 0000000..d2ba7bf
--- /dev/null
+++ b/AcaMate/6. Resources/Assets.xcassets/Image Folder/TopBar/Person.imageset/Contents.json
@@ -0,0 +1,12 @@
+{
+ "images" : [
+ {
+ "filename" : "Person.png",
+ "idiom" : "universal"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/AcaMate/6. Resources/Assets.xcassets/Image Folder/TopBar/Person.imageset/Person.png b/AcaMate/6. Resources/Assets.xcassets/Image Folder/TopBar/Person.imageset/Person.png
new file mode 100644
index 0000000..11d4da1
Binary files /dev/null and b/AcaMate/6. Resources/Assets.xcassets/Image Folder/TopBar/Person.imageset/Person.png differ
diff --git a/AcaMate/6. Resources/Assets.xcassets/Image Folder/TopBar/Plus.imageset/Contents.json b/AcaMate/6. Resources/Assets.xcassets/Image Folder/TopBar/Plus.imageset/Contents.json
new file mode 100644
index 0000000..8517f1f
--- /dev/null
+++ b/AcaMate/6. Resources/Assets.xcassets/Image Folder/TopBar/Plus.imageset/Contents.json
@@ -0,0 +1,12 @@
+{
+ "images" : [
+ {
+ "filename" : "Plus.png",
+ "idiom" : "universal"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/AcaMate/6. Resources/Assets.xcassets/Image Folder/TopBar/Plus.imageset/Plus.png b/AcaMate/6. Resources/Assets.xcassets/Image Folder/TopBar/Plus.imageset/Plus.png
new file mode 100644
index 0000000..c139f41
Binary files /dev/null and b/AcaMate/6. Resources/Assets.xcassets/Image Folder/TopBar/Plus.imageset/Plus.png differ
diff --git a/AcaMate/6. Resources/Assets.xcassets/Image Folder/TopBar/Save.imageset/Contents.json b/AcaMate/6. Resources/Assets.xcassets/Image Folder/TopBar/Save.imageset/Contents.json
new file mode 100644
index 0000000..f69137d
--- /dev/null
+++ b/AcaMate/6. Resources/Assets.xcassets/Image Folder/TopBar/Save.imageset/Contents.json
@@ -0,0 +1,12 @@
+{
+ "images" : [
+ {
+ "filename" : "Save.png",
+ "idiom" : "universal"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/AcaMate/6. Resources/Assets.xcassets/Image Folder/TopBar/Save.imageset/Save.png b/AcaMate/6. Resources/Assets.xcassets/Image Folder/TopBar/Save.imageset/Save.png
new file mode 100644
index 0000000..d0934d3
Binary files /dev/null and b/AcaMate/6. Resources/Assets.xcassets/Image Folder/TopBar/Save.imageset/Save.png differ
diff --git a/AcaMate/6. Resources/Assets.xcassets/Image Folder/TopBar/Setting.imageset/Contents.json b/AcaMate/6. Resources/Assets.xcassets/Image Folder/TopBar/Setting.imageset/Contents.json
new file mode 100644
index 0000000..af49693
--- /dev/null
+++ b/AcaMate/6. Resources/Assets.xcassets/Image Folder/TopBar/Setting.imageset/Contents.json
@@ -0,0 +1,12 @@
+{
+ "images" : [
+ {
+ "filename" : "Setting.png",
+ "idiom" : "universal"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/AcaMate/6. Resources/Assets.xcassets/Image Folder/TopBar/Setting.imageset/Setting.png b/AcaMate/6. Resources/Assets.xcassets/Image Folder/TopBar/Setting.imageset/Setting.png
new file mode 100644
index 0000000..067e9d3
Binary files /dev/null and b/AcaMate/6. Resources/Assets.xcassets/Image Folder/TopBar/Setting.imageset/Setting.png differ
diff --git a/AcaMate/6. Resources/Images/BottomBar/Calendar.png b/AcaMate/6. Resources/Images/BottomBar/Calendar.png
new file mode 100644
index 0000000..17b4f33
Binary files /dev/null and b/AcaMate/6. Resources/Images/BottomBar/Calendar.png differ
diff --git a/AcaMate/6. Resources/Images/BottomBar/Chatting.png b/AcaMate/6. Resources/Images/BottomBar/Chatting.png
new file mode 100644
index 0000000..e6f9671
Binary files /dev/null and b/AcaMate/6. Resources/Images/BottomBar/Chatting.png differ
diff --git a/AcaMate/6. Resources/Images/BottomBar/Etc.png b/AcaMate/6. Resources/Images/BottomBar/Etc.png
new file mode 100644
index 0000000..4842ed5
Binary files /dev/null and b/AcaMate/6. Resources/Images/BottomBar/Etc.png differ
diff --git a/AcaMate/6. Resources/Images/BottomBar/Home.png b/AcaMate/6. Resources/Images/BottomBar/Home.png
new file mode 100644
index 0000000..b5b2daa
Binary files /dev/null and b/AcaMate/6. Resources/Images/BottomBar/Home.png differ
diff --git a/AcaMate/6. Resources/Images/BottomBar/Management.png b/AcaMate/6. Resources/Images/BottomBar/Management.png
new file mode 100644
index 0000000..fdb724b
Binary files /dev/null and b/AcaMate/6. Resources/Images/BottomBar/Management.png differ
diff --git a/AcaMate/6. Resources/Images/Icon/APPLE.png b/AcaMate/6. Resources/Images/Icon/APPLE.png
new file mode 100644
index 0000000..6038e82
Binary files /dev/null and b/AcaMate/6. Resources/Images/Icon/APPLE.png differ
diff --git a/AcaMate/6. Resources/Images/Icon/KAKAO.png b/AcaMate/6. Resources/Images/Icon/KAKAO.png
new file mode 100644
index 0000000..9c6d857
Binary files /dev/null and b/AcaMate/6. Resources/Images/Icon/KAKAO.png differ
diff --git a/AcaMate/6. Resources/Images/Icon/LOGO.png b/AcaMate/6. Resources/Images/Icon/LOGO.png
new file mode 100644
index 0000000..38f90a2
Binary files /dev/null and b/AcaMate/6. Resources/Images/Icon/LOGO.png differ
diff --git a/AcaMate/6. Resources/Images/MI.png b/AcaMate/6. Resources/Images/Icon/MI.png
similarity index 100%
rename from AcaMate/6. Resources/Images/MI.png
rename to AcaMate/6. Resources/Images/Icon/MI.png
diff --git a/AcaMate/6. Resources/Images/Icon/PageIcon.png b/AcaMate/6. Resources/Images/Icon/PageIcon.png
new file mode 100644
index 0000000..49593e9
Binary files /dev/null and b/AcaMate/6. Resources/Images/Icon/PageIcon.png differ
diff --git a/AcaMate/6. Resources/Images/Team_Icon.png b/AcaMate/6. Resources/Images/Icon/TeamIcon.png
similarity index 100%
rename from AcaMate/6. Resources/Images/Team_Icon.png
rename to AcaMate/6. Resources/Images/Icon/TeamIcon.png
diff --git a/AcaMate/6. Resources/Images/Icon/appIcon.png b/AcaMate/6. Resources/Images/Icon/appIcon.png
new file mode 100644
index 0000000..141f54d
Binary files /dev/null and b/AcaMate/6. Resources/Images/Icon/appIcon.png differ
diff --git a/AcaMate/6. Resources/Images/KakaoIcon.png b/AcaMate/6. Resources/Images/KakaoIcon.png
deleted file mode 100644
index 6eaf887..0000000
Binary files a/AcaMate/6. Resources/Images/KakaoIcon.png and /dev/null differ
diff --git a/AcaMate/6. Resources/Images/TopBar/Back.png b/AcaMate/6. Resources/Images/TopBar/Back.png
new file mode 100644
index 0000000..e0e5fa4
Binary files /dev/null and b/AcaMate/6. Resources/Images/TopBar/Back.png differ
diff --git a/AcaMate/6. Resources/Images/TopBar/Edit.png b/AcaMate/6. Resources/Images/TopBar/Edit.png
new file mode 100644
index 0000000..45cec8c
Binary files /dev/null and b/AcaMate/6. Resources/Images/TopBar/Edit.png differ
diff --git a/AcaMate/6. Resources/Images/TopBar/Face.png b/AcaMate/6. Resources/Images/TopBar/Face.png
new file mode 100644
index 0000000..1e1f225
Binary files /dev/null and b/AcaMate/6. Resources/Images/TopBar/Face.png differ
diff --git a/AcaMate/6. Resources/Images/TopBar/Market.png b/AcaMate/6. Resources/Images/TopBar/Market.png
new file mode 100644
index 0000000..65c9d0a
Binary files /dev/null and b/AcaMate/6. Resources/Images/TopBar/Market.png differ
diff --git a/AcaMate/6. Resources/Images/TopBar/Person.png b/AcaMate/6. Resources/Images/TopBar/Person.png
new file mode 100644
index 0000000..11d4da1
Binary files /dev/null and b/AcaMate/6. Resources/Images/TopBar/Person.png differ
diff --git a/AcaMate/6. Resources/Images/TopBar/Plus.png b/AcaMate/6. Resources/Images/TopBar/Plus.png
new file mode 100644
index 0000000..c139f41
Binary files /dev/null and b/AcaMate/6. Resources/Images/TopBar/Plus.png differ
diff --git a/AcaMate/6. Resources/Images/TopBar/Save.png b/AcaMate/6. Resources/Images/TopBar/Save.png
new file mode 100644
index 0000000..d0934d3
Binary files /dev/null and b/AcaMate/6. Resources/Images/TopBar/Save.png differ
diff --git a/AcaMate/6. Resources/Images/TopBar/Setting.png b/AcaMate/6. Resources/Images/TopBar/Setting.png
new file mode 100644
index 0000000..067e9d3
Binary files /dev/null and b/AcaMate/6. Resources/Images/TopBar/Setting.png differ
diff --git a/AcaMate/AcaMateApp.swift b/AcaMate/AcaMateApp.swift
index f7adeeb..8c2fade 100644
--- a/AcaMate/AcaMateApp.swift
+++ b/AcaMate/AcaMateApp.swift
@@ -15,7 +15,7 @@ import KakaoSDKAuth
struct AcaMateApp: App {
@UIApplicationDelegateAdaptor(AppDelegate.self) var appDelegate
var cancellables: Set = []
- var alertController = AlertController()
+ @StateObject var appVM = AppViewModel()
init() {
printLog("APP INIT")
@@ -29,7 +29,7 @@ struct AcaMateApp: App {
_ = AuthController.handleOpenUrl(url: url)
}
}
- .environmentObject(self.alertController)
+ .environmentObject(self.appVM)
}
}
}
diff --git a/AcaMate/GoogleService-Info.plist b/AcaMate/GoogleService-Info.plist
new file mode 100644
index 0000000..69fbb6b
--- /dev/null
+++ b/AcaMate/GoogleService-Info.plist
@@ -0,0 +1,30 @@
+
+
+
+
+ API_KEY
+ AIzaSyBsdv91LqE7F-ZnOGZ018FjlDR8S6trIyc
+ GCM_SENDER_ID
+ 477645655994
+ PLIST_VERSION
+ 1
+ BUNDLE_ID
+ me.myds.ipstein.acamate.AcaMate
+ PROJECT_ID
+ acamate-350fd
+ STORAGE_BUCKET
+ acamate-350fd.firebasestorage.app
+ IS_ADS_ENABLED
+
+ IS_ANALYTICS_ENABLED
+
+ IS_APPINVITE_ENABLED
+
+ IS_GCM_ENABLED
+
+ IS_SIGNIN_ENABLED
+
+ GOOGLE_APP_ID
+ 1:477645655994:ios:dd3f8f91d85c5516481783
+
+
\ No newline at end of file
diff --git a/AcaMate/LaunchScreen.storyboard b/AcaMate/LaunchScreen.storyboard
index c846eb2..cb28862 100644
--- a/AcaMate/LaunchScreen.storyboard
+++ b/AcaMate/LaunchScreen.storyboard
@@ -1,5 +1,5 @@
-
+
@@ -17,42 +17,36 @@
-
+
-
-
+
+
-
-
+
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
-
+
-
+
+