Compare commits
No commits in common. "eef7d01d8c7e3d9621245a3666d0a08403d0db74" and "584ab61cdcce1190fd74e7f312b121adf3813408" have entirely different histories.
eef7d01d8c
...
584ab61cdc
3
.gitignore
vendored
|
@ -1,8 +1,7 @@
|
||||||
# 특정 환경에 따라 추가
|
# 특정 환경에 따라 추가
|
||||||
./private/
|
./private/
|
||||||
|
|
||||||
# 인텔리제이꺼
|
|
||||||
*.idea
|
|
||||||
|
|
||||||
# Xcode 관련
|
# Xcode 관련
|
||||||
# 사용자별 설정 파일
|
# 사용자별 설정 파일
|
||||||
|
|
|
@ -7,9 +7,6 @@
|
||||||
objects = {
|
objects = {
|
||||||
|
|
||||||
/* Begin PBXBuildFile section */
|
/* 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 */; };
|
A771FFF22CFB70D100367DA6 /* KakaoSDK in Frameworks */ = {isa = PBXBuildFile; productRef = A771FFF12CFB70D100367DA6 /* KakaoSDK */; };
|
||||||
A78774722CF586AF002FE2EE /* Alamofire in Frameworks */ = {isa = PBXBuildFile; productRef = A78774712CF586AF002FE2EE /* Alamofire */; };
|
A78774722CF586AF002FE2EE /* Alamofire in Frameworks */ = {isa = PBXBuildFile; productRef = A78774712CF586AF002FE2EE /* Alamofire */; };
|
||||||
A7A518CF2CF555E200822D0D /* README.md in Resources */ = {isa = PBXBuildFile; fileRef = A7A518CE2CF555E200822D0D /* README.md */; };
|
A7A518CF2CF555E200822D0D /* README.md in Resources */ = {isa = PBXBuildFile; fileRef = A7A518CE2CF555E200822D0D /* README.md */; };
|
||||||
|
@ -48,11 +45,8 @@
|
||||||
isa = PBXFrameworksBuildPhase;
|
isa = PBXFrameworksBuildPhase;
|
||||||
buildActionMask = 2147483647;
|
buildActionMask = 2147483647;
|
||||||
files = (
|
files = (
|
||||||
A73892232D526A9D00659A62 /* FirebaseAppCheck in Frameworks */,
|
|
||||||
A78774722CF586AF002FE2EE /* Alamofire in Frameworks */,
|
A78774722CF586AF002FE2EE /* Alamofire in Frameworks */,
|
||||||
A73892252D526A9D00659A62 /* FirebaseCrashlytics in Frameworks */,
|
|
||||||
A771FFF22CFB70D100367DA6 /* KakaoSDK in Frameworks */,
|
A771FFF22CFB70D100367DA6 /* KakaoSDK in Frameworks */,
|
||||||
A73892212D526A9D00659A62 /* FirebaseAnalytics in Frameworks */,
|
|
||||||
);
|
);
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
};
|
};
|
||||||
|
@ -99,9 +93,6 @@
|
||||||
packageProductDependencies = (
|
packageProductDependencies = (
|
||||||
A78774712CF586AF002FE2EE /* Alamofire */,
|
A78774712CF586AF002FE2EE /* Alamofire */,
|
||||||
A771FFF12CFB70D100367DA6 /* KakaoSDK */,
|
A771FFF12CFB70D100367DA6 /* KakaoSDK */,
|
||||||
A73892202D526A9D00659A62 /* FirebaseAnalytics */,
|
|
||||||
A73892222D526A9D00659A62 /* FirebaseAppCheck */,
|
|
||||||
A73892242D526A9D00659A62 /* FirebaseCrashlytics */,
|
|
||||||
);
|
);
|
||||||
productName = AcaMate;
|
productName = AcaMate;
|
||||||
productReference = A7A518BB2CF5558B00822D0D /* AcaMate.app */;
|
productReference = A7A518BB2CF5558B00822D0D /* AcaMate.app */;
|
||||||
|
@ -134,7 +125,6 @@
|
||||||
packageReferences = (
|
packageReferences = (
|
||||||
A78774702CF586AF002FE2EE /* XCRemoteSwiftPackageReference "Alamofire" */,
|
A78774702CF586AF002FE2EE /* XCRemoteSwiftPackageReference "Alamofire" */,
|
||||||
A771FFF02CFB70D100367DA6 /* XCRemoteSwiftPackageReference "kakao-ios-sdk" */,
|
A771FFF02CFB70D100367DA6 /* XCRemoteSwiftPackageReference "kakao-ios-sdk" */,
|
||||||
A738921F2D526A9D00659A62 /* XCRemoteSwiftPackageReference "firebase-ios-sdk" */,
|
|
||||||
);
|
);
|
||||||
preferredProjectObjectVersion = 77;
|
preferredProjectObjectVersion = 77;
|
||||||
productRefGroup = A7A518BC2CF5558B00822D0D /* Products */;
|
productRefGroup = A7A518BC2CF5558B00822D0D /* Products */;
|
||||||
|
@ -388,14 +378,6 @@
|
||||||
/* End XCConfigurationList section */
|
/* End XCConfigurationList section */
|
||||||
|
|
||||||
/* Begin XCRemoteSwiftPackageReference 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" */ = {
|
A771FFF02CFB70D100367DA6 /* XCRemoteSwiftPackageReference "kakao-ios-sdk" */ = {
|
||||||
isa = XCRemoteSwiftPackageReference;
|
isa = XCRemoteSwiftPackageReference;
|
||||||
repositoryURL = "https://github.com/kakao/kakao-ios-sdk";
|
repositoryURL = "https://github.com/kakao/kakao-ios-sdk";
|
||||||
|
@ -415,21 +397,6 @@
|
||||||
/* End XCRemoteSwiftPackageReference section */
|
/* End XCRemoteSwiftPackageReference section */
|
||||||
|
|
||||||
/* Begin XCSwiftPackageProductDependency 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 */ = {
|
A771FFF12CFB70D100367DA6 /* KakaoSDK */ = {
|
||||||
isa = XCSwiftPackageProductDependency;
|
isa = XCSwiftPackageProductDependency;
|
||||||
package = A771FFF02CFB70D100367DA6 /* XCRemoteSwiftPackageReference "kakao-ios-sdk" */;
|
package = A771FFF02CFB70D100367DA6 /* XCRemoteSwiftPackageReference "kakao-ios-sdk" */;
|
||||||
|
|
|
@ -1,15 +1,6 @@
|
||||||
{
|
{
|
||||||
"originHash" : "3b609245b8d633048f6670834279f82d0601cc0879a2d8c9c86fa0dd25734ea3",
|
"originHash" : "48d44fe9560aaa48bc97ae34cdb596f62fa2d739be3dafd4261b95db8f8c86ab",
|
||||||
"pins" : [
|
"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",
|
"identity" : "alamofire",
|
||||||
"kind" : "remoteSourceControl",
|
"kind" : "remoteSourceControl",
|
||||||
|
@ -19,78 +10,6 @@
|
||||||
"version" : "5.10.2"
|
"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",
|
"identity" : "kakao-ios-sdk",
|
||||||
"kind" : "remoteSourceControl",
|
"kind" : "remoteSourceControl",
|
||||||
|
@ -99,42 +18,6 @@
|
||||||
"branch" : "master",
|
"branch" : "master",
|
||||||
"revision" : "ab4309c1950550add307046ad1e08024c7514603"
|
"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
|
"version" : 3
|
||||||
|
|
|
@ -1,6 +0,0 @@
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<Bucket
|
|
||||||
uuid = "800DD51A-C089-4DC4-AE55-7F5ABD5C0AE7"
|
|
||||||
type = "1"
|
|
||||||
version = "2.0">
|
|
||||||
</Bucket>
|
|
|
@ -12,11 +12,10 @@ import UserNotifications
|
||||||
import KakaoSDKCommon
|
import KakaoSDKCommon
|
||||||
import KakaoSDKAuth
|
import KakaoSDKAuth
|
||||||
|
|
||||||
import FirebaseCore
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class AppDelegate: NSObject, UIApplicationDelegate {
|
class AppDelegate: NSObject, UIApplicationDelegate, UNUserNotificationCenterDelegate {
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -29,7 +28,6 @@ class AppDelegate: NSObject, UIApplicationDelegate {
|
||||||
}
|
}
|
||||||
|
|
||||||
//MARK: - Set Notification
|
//MARK: - Set Notification
|
||||||
|
|
||||||
let center = UNUserNotificationCenter.current()
|
let center = UNUserNotificationCenter.current()
|
||||||
let authOptions: UNAuthorizationOptions = [.alert, .badge, .sound]
|
let authOptions: UNAuthorizationOptions = [.alert, .badge, .sound]
|
||||||
center.requestAuthorization(options: authOptions) { granted, error in
|
center.requestAuthorization(options: authOptions) { granted, error in
|
||||||
|
@ -49,9 +47,6 @@ class AppDelegate: NSObject, UIApplicationDelegate {
|
||||||
//MARK: - 네트워크 모니터 초기화
|
//MARK: - 네트워크 모니터 초기화
|
||||||
_ = NetworkMonitor.shared
|
_ = NetworkMonitor.shared
|
||||||
|
|
||||||
//MARK: - FIREBASE 초기화
|
|
||||||
FirebaseApp.configure()
|
|
||||||
|
|
||||||
printLog("End Set AppDelegate")
|
printLog("End Set AppDelegate")
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
@ -65,12 +60,6 @@ class AppDelegate: NSObject, UIApplicationDelegate {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
extension AppDelegate: UNUserNotificationCenterDelegate {
|
|
||||||
|
|
||||||
//
|
|
||||||
func registerForRemoteNotifications() {
|
func registerForRemoteNotifications() {
|
||||||
UNUserNotificationCenter.current().requestAuthorization(options: [.alert, .sound, .badge]) { granted, error in
|
UNUserNotificationCenter.current().requestAuthorization(options: [.alert, .sound, .badge]) { granted, error in
|
||||||
print("Permission granted: \(granted)")
|
print("Permission granted: \(granted)")
|
||||||
|
@ -97,7 +86,7 @@ extension AppDelegate: UNUserNotificationCenterDelegate {
|
||||||
printLog("APNs 등록 실패: \(error)")
|
printLog("APNs 등록 실패: \(error)")
|
||||||
}
|
}
|
||||||
|
|
||||||
// 앱 켜져있을때 알럿 받으면 직접 로컬로 알림 띄워주는 곳
|
// 앱 켜져있을때 알럿 받으면 (오는게 확인되면 바로 뜨는 곳)
|
||||||
func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification) async -> UNNotificationPresentationOptions {
|
func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification) async -> UNNotificationPresentationOptions {
|
||||||
let userInfo = notification.request.content.userInfo
|
let userInfo = notification.request.content.userInfo
|
||||||
|
|
||||||
|
@ -118,7 +107,7 @@ extension AppDelegate: UNUserNotificationCenterDelegate {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// 수신 받은 Noti를 터치해 앱으로 진입했을 때 호출 (앱 상태 여부 무관)
|
// 수신 받은 Notification을 터치해 앱으로 진입했을 때 호출
|
||||||
func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) {
|
func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) {
|
||||||
let userInfo = response.notification.request.content.userInfo
|
let userInfo = response.notification.request.content.userInfo
|
||||||
if let apsData = userInfo["aps"] as? [AnyHashable: Any] {
|
if let apsData = userInfo["aps"] as? [AnyHashable: Any] {
|
||||||
|
@ -128,7 +117,9 @@ extension AppDelegate: UNUserNotificationCenterDelegate {
|
||||||
if let param = alert["parameter"] {
|
if let param = alert["parameter"] {
|
||||||
printLog(param as? String)
|
printLog(param as? String)
|
||||||
}
|
}
|
||||||
|
// viewModel.setBadge()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -9,10 +9,8 @@ import SwiftUI
|
||||||
import Combine
|
import Combine
|
||||||
|
|
||||||
|
|
||||||
/// 이거 위에 다른 뷰들이 위젯 느낌으로 계속 갈아 끼워지는거
|
|
||||||
struct NavigationView: View {
|
struct NavigationView: View {
|
||||||
@EnvironmentObject var appVM: AppViewModel
|
|
||||||
|
|
||||||
@State private var naviState : NaviState = .init(act: .NONE, path: .Intro)
|
@State private var naviState : NaviState = .init(act: .NONE, path: .Intro)
|
||||||
@State private var history: [PathName] = [.Intro]
|
@State private var history: [PathName] = [.Intro]
|
||||||
|
|
||||||
|
@ -27,7 +25,7 @@ struct NavigationView: View {
|
||||||
case .Login :
|
case .Login :
|
||||||
LoginView(naviState: $naviState)
|
LoginView(naviState: $naviState)
|
||||||
case .Main:
|
case .Main:
|
||||||
MainView(naviState: $naviState)
|
EmptyView()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
.onChange(of: naviState) { old, new in
|
.onChange(of: naviState) { old, new in
|
||||||
|
@ -43,37 +41,30 @@ struct NavigationView: View {
|
||||||
case .MOVE:
|
case .MOVE:
|
||||||
moveHistory(path: new.path)
|
moveHistory(path: new.path)
|
||||||
}
|
}
|
||||||
|
|
||||||
// LOG
|
// LOG
|
||||||
printLog("\(old.path) => \(new.path)")
|
printLog("\(old.path) => \(new.path)")
|
||||||
showHistory()
|
showHistory()
|
||||||
}
|
}
|
||||||
.onTapGesture {
|
.fullView(.Normal.normal)
|
||||||
endTextEditing()
|
|
||||||
}
|
|
||||||
.fullDrawView(.Normal.normal)
|
|
||||||
.setAlert()
|
.setAlert()
|
||||||
.setNetwork()
|
.setNetwork()
|
||||||
.loadingView(isLoading: $appVM.isLoading)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// 경로에 한 단계 추가
|
|
||||||
private func addHistory(path: PathName) {
|
private func addHistory(path: PathName) {
|
||||||
history.append(path)
|
history.append(path)
|
||||||
}
|
}
|
||||||
|
|
||||||
/// 가장 가까운 경로 삭제
|
|
||||||
private func popHistory() {
|
private func popHistory() {
|
||||||
history.removeLast()
|
history.removeLast()
|
||||||
naviState.set(act: .NONE, path: history.last ?? .NONE)
|
naviState.set(act: .NONE, path: history.last ?? .NONE)
|
||||||
}
|
}
|
||||||
|
|
||||||
/// 경로 기록 전체 삭제
|
|
||||||
private func resetHistory(path: PathName) {
|
private func resetHistory(path: PathName) {
|
||||||
history.removeAll()
|
history.removeAll()
|
||||||
addHistory(path: path)
|
addHistory(path: path)
|
||||||
}
|
}
|
||||||
|
|
||||||
/// 경로의 최상단 지우고, 새로 이동하는 경로로 설정
|
|
||||||
private func moveHistory(path: PathName) {
|
private func moveHistory(path: PathName) {
|
||||||
if path == .NONE {
|
if path == .NONE {
|
||||||
naviState.set(act: .RESET, path: history.first ?? .Main)
|
naviState.set(act: .RESET, path: history.first ?? .Main)
|
|
@ -9,8 +9,7 @@ import SwiftUI
|
||||||
import Combine
|
import Combine
|
||||||
|
|
||||||
struct IntroView: View {
|
struct IntroView: View {
|
||||||
@EnvironmentObject var appVM: AppViewModel
|
@EnvironmentObject var alertController: AlertController
|
||||||
|
|
||||||
@State var cancellables: Set<AnyCancellable> = []
|
@State var cancellables: Set<AnyCancellable> = []
|
||||||
@Binding var naviState : NaviState
|
@Binding var naviState : NaviState
|
||||||
|
|
||||||
|
@ -18,12 +17,15 @@ struct IntroView: View {
|
||||||
VStack(spacing: 0) {
|
VStack(spacing: 0) {
|
||||||
Spacer()
|
Spacer()
|
||||||
.frame(height: 100)
|
.frame(height: 100)
|
||||||
Image(.Icon.appIcon)
|
Image("Team_Icon")
|
||||||
.resizable()
|
.resizable()
|
||||||
.frame(width: 200, height: 200)
|
.frame(width: 200, height: 200)
|
||||||
|
.background(.white)
|
||||||
|
.border(.black)
|
||||||
|
.padding()
|
||||||
Spacer()
|
Spacer()
|
||||||
HStack(spacing: 4) {
|
HStack(spacing: 4) {
|
||||||
Image(.Icon.teamIcon)
|
Image("Team_Icon")
|
||||||
.resizable()
|
.resizable()
|
||||||
.frame(width: 24, height: 24)
|
.frame(width: 24, height: 24)
|
||||||
Text("STEIN")
|
Text("STEIN")
|
||||||
|
@ -50,17 +52,16 @@ struct IntroView: View {
|
||||||
} receiveValue: { version in
|
} receiveValue: { version in
|
||||||
let compareForce = compareVersion(version.force_ver, currentVersion())
|
let compareForce = compareVersion(version.force_ver, currentVersion())
|
||||||
let compareChoice = compareVersion(version.final_ver, currentVersion())
|
let compareChoice = compareVersion(version.final_ver, currentVersion())
|
||||||
|
|
||||||
if compareForce == .bigger {
|
if compareForce == .bigger {
|
||||||
appVM.alertData = SetAlertData().setForceUpdate(
|
alertController.alertData = SetAlertData().setForceUpdate(
|
||||||
action: appVM.alertAction
|
action: alertController.alertAction
|
||||||
)
|
)
|
||||||
appVM.showAlert.toggle()
|
alertController.showAlert.toggle()
|
||||||
} else if compareChoice == .bigger && version.choice_update_yn {
|
} else if compareChoice == .bigger && version.choice_update_yn {
|
||||||
appVM.alertData = SetAlertData().setSelectUpdate(
|
alertController.alertData = SetAlertData().setSelectUpdate(
|
||||||
action: appVM.alertAction
|
action: alertController.alertAction
|
||||||
)
|
)
|
||||||
appVM.showAlert.toggle()
|
alertController.showAlert.toggle()
|
||||||
} else {
|
} else {
|
||||||
naviState.set(act: .RESET, path: .Login)
|
naviState.set(act: .RESET, path: .Login)
|
||||||
}
|
}
|
||||||
|
@ -72,7 +73,7 @@ struct IntroView: View {
|
||||||
}
|
}
|
||||||
|
|
||||||
private func subscribeAlertAction() {
|
private func subscribeAlertAction() {
|
||||||
appVM.alertAction
|
alertController.alertAction
|
||||||
.compactMap { $0 }
|
.compactMap { $0 }
|
||||||
.sink { action in
|
.sink { action in
|
||||||
if action == "updateNow" {
|
if action == "updateNow" {
|
57
AcaMate/1. View/1. Intro & Login/LoginView.swift
Normal file
|
@ -0,0 +1,57 @@
|
||||||
|
//
|
||||||
|
// 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()
|
||||||
|
//}
|
|
@ -1,117 +0,0 @@
|
||||||
//
|
|
||||||
// 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))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,183 +0,0 @@
|
||||||
//
|
|
||||||
// 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<AnyCancellable> = []
|
|
||||||
@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<User_Academy>.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<User_Academy> 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()
|
|
||||||
//}
|
|
|
@ -1,39 +0,0 @@
|
||||||
//
|
|
||||||
// BoxBtnView.swift
|
|
||||||
// AcaMate
|
|
||||||
//
|
|
||||||
// Created by TAnine on 2/4/25.
|
|
||||||
//
|
|
||||||
|
|
||||||
import SwiftUI
|
|
||||||
|
|
||||||
struct BoxBtnView<Content: View>: 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")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,56 +0,0 @@
|
||||||
//
|
|
||||||
// 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)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,45 +0,0 @@
|
||||||
//
|
|
||||||
// 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)
|
|
||||||
}
|
|
|
@ -1,79 +0,0 @@
|
||||||
//
|
|
||||||
// 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()
|
|
||||||
}
|
|
|
@ -1,34 +0,0 @@
|
||||||
//
|
|
||||||
// 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<AnyCancellable> = []
|
|
||||||
@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))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
|
@ -1,43 +0,0 @@
|
||||||
//
|
|
||||||
// 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")
|
|
||||||
}
|
|
|
@ -6,10 +6,7 @@
|
||||||
//
|
//
|
||||||
import SwiftUI
|
import SwiftUI
|
||||||
// MARK: - ACAMATE
|
// MARK: - ACAMATE
|
||||||
// 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
|
||||||
#if DEV && LOCAL
|
|
||||||
public let API_URL: String = "http://localhost:5144"
|
|
||||||
#elseif DEV
|
|
||||||
public let API_URL: String = "https://devacamate.ipstein.myds.me"
|
public let API_URL: String = "https://devacamate.ipstein.myds.me"
|
||||||
#else
|
#else
|
||||||
public let API_URL: String = "https://acamate.ipstein.myds.me"
|
public let API_URL: String = "https://acamate.ipstein.myds.me"
|
||||||
|
@ -125,19 +122,6 @@ public func jsonToDict(_ input: String) -> [String: Any] {
|
||||||
return [:]
|
return [:]
|
||||||
}
|
}
|
||||||
|
|
||||||
/// JSON 배열의 형태를 Swift의 배열 형태로 변환한다.
|
|
||||||
public func jsonToSwift<T: Decodable>(_ 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] {
|
func versionChange(ver: String) -> [Int] {
|
||||||
return ver.components(separatedBy: ["."]).map {Int($0) ?? 0}
|
return ver.components(separatedBy: ["."]).map {Int($0) ?? 0}
|
||||||
}
|
}
|
|
@ -12,31 +12,28 @@ import KakaoSDKAuth
|
||||||
import KakaoSDKUser
|
import KakaoSDKUser
|
||||||
|
|
||||||
import Alamofire
|
import Alamofire
|
||||||
import Foundation
|
|
||||||
|
|
||||||
class LoginController {
|
class SNSLogin {
|
||||||
private var cancellables = Set<AnyCancellable>()
|
private var cancellables = Set<AnyCancellable>()
|
||||||
|
|
||||||
func login(_ type: SNSLoginType) -> AnyPublisher<SNSID,Error> {
|
func login(type: SNSLoginType){
|
||||||
switch type {
|
switch type {
|
||||||
case .Kakao:
|
case .Kakao:
|
||||||
return self.checkKakaoToken()
|
self.checkKakaoToken()
|
||||||
.handleEvents(receiveCompletion: { completion in
|
.sink { completion in
|
||||||
switch completion {
|
switch completion {
|
||||||
case .failure(let error) :
|
case .failure(let error):
|
||||||
printLog("KAKAO LOGIN ERROR: \(error)")
|
printLog("KAKAO LOGIN ERROR: \(error)")
|
||||||
case .finished: break
|
case .finished: break
|
||||||
}
|
}
|
||||||
})
|
} receiveValue: { snsId in
|
||||||
.eraseToAnyPublisher()
|
printLog("로그인 완료 \(snsId)")
|
||||||
//
|
}
|
||||||
|
.store(in: &cancellables)
|
||||||
|
|
||||||
case .Apple:
|
case .Apple: break
|
||||||
return Fail(error: NSError(domain: "Apple login not implemented", code: 1, userInfo: nil))
|
|
||||||
.eraseToAnyPublisher()
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func logout(type: SNSLoginType) {
|
func logout(type: SNSLoginType) {
|
||||||
|
@ -57,7 +54,7 @@ class LoginController {
|
||||||
|
|
||||||
|
|
||||||
//MARK: - KAKAO LOGIN
|
//MARK: - KAKAO LOGIN
|
||||||
extension LoginController {
|
extension SNSLogin {
|
||||||
/// 토큰을 가지고 있나 확인
|
/// 토큰을 가지고 있나 확인
|
||||||
private func checkKakaoToken() -> Future<SNSID, Error> {
|
private func checkKakaoToken() -> Future<SNSID, Error> {
|
||||||
return Future { promise in
|
return Future { promise in
|
|
@ -1,19 +0,0 @@
|
||||||
//
|
|
||||||
// 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<String?, Never>(nil)
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
|
@ -1,19 +0,0 @@
|
||||||
//
|
|
||||||
// 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<String?, Never>(nil)
|
|
||||||
|
|
||||||
}
|
|
|
@ -1,13 +0,0 @@
|
||||||
//
|
|
||||||
// LoginViewModel.swift
|
|
||||||
// AcaMate
|
|
||||||
//
|
|
||||||
// Created by Sean Kim on 12/14/24.
|
|
||||||
//
|
|
||||||
|
|
||||||
import SwiftUI
|
|
||||||
import Combine
|
|
||||||
|
|
||||||
class LoginViewModel: ObservableObject {
|
|
||||||
let loginAction = CurrentValueSubject<Bool, Never>(false)
|
|
||||||
}
|
|
|
@ -25,11 +25,5 @@ class VersionData: Codable {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// ----------------
|
|
||||||
|
|
||||||
class User_Academy: Codable {
|
|
||||||
let uid: String
|
|
||||||
let bid: [String]
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
|
@ -82,16 +82,5 @@ struct SetAlertData {
|
||||||
])
|
])
|
||||||
}
|
}
|
||||||
|
|
||||||
/// 로그인 문제 발생
|
|
||||||
func setErrorLogin() -> AlertData {
|
|
||||||
return AlertData(title: "로그인",
|
|
||||||
body: """
|
|
||||||
ID 와 비밀번호가 올바르지 않습니다.
|
|
||||||
확인 후 다시 시도해주세요.
|
|
||||||
""",
|
|
||||||
button: [
|
|
||||||
ButtonType(name: "확인", role: .cancel, function: nil)
|
|
||||||
])
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,65 +0,0 @@
|
||||||
//
|
|
||||||
// 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<Bool> = .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 ?? ""
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
|
@ -8,29 +8,28 @@
|
||||||
import SwiftUI
|
import SwiftUI
|
||||||
import Combine
|
import Combine
|
||||||
|
|
||||||
|
|
||||||
struct NetworkModifier: ViewModifier {
|
struct NetworkModifier: ViewModifier {
|
||||||
@ObservedObject private var networkMonitor = NetworkMonitor.shared
|
@ObservedObject private var networkMonitor = NetworkMonitor.shared
|
||||||
@EnvironmentObject var appVM: AppViewModel
|
@EnvironmentObject var alertController: AlertController
|
||||||
|
|
||||||
func body(content: Content) -> some View {
|
func body(content: Content) -> some View {
|
||||||
content
|
content
|
||||||
.onChange(of: networkMonitor.isConnected) { _ , new in
|
.onChange(of: networkMonitor.isConnected) { _ , new in
|
||||||
if !new {
|
if !new {
|
||||||
appVM.alertData = SetAlertData().setErrorNetwork()
|
alertController.alertData = SetAlertData().setErrorNetwork()
|
||||||
appVM.showAlert.toggle()
|
alertController.showAlert.toggle()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
struct AlertModifier: ViewModifier {
|
struct AlertModifier: ViewModifier {
|
||||||
@EnvironmentObject var appVM: AppViewModel
|
@EnvironmentObject var controller: AlertController
|
||||||
func body(content: Content) -> some View {
|
func body(content: Content) -> some View {
|
||||||
content
|
content
|
||||||
.alert(appVM.alertData.title,
|
.alert(controller.alertData.title,
|
||||||
isPresented: $appVM.showAlert,
|
isPresented: $controller.showAlert,
|
||||||
presenting: $appVM.alertData) { data in
|
presenting: $controller.alertData) { data in
|
||||||
let btnCount = data.button.count
|
let btnCount = data.button.count
|
||||||
ForEach(0 ..< btnCount, id: \.self) { index in
|
ForEach(0 ..< btnCount, id: \.self) { index in
|
||||||
let btn = data.wrappedValue.button[index]
|
let btn = data.wrappedValue.button[index]
|
||||||
|
@ -46,35 +45,8 @@ 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 {
|
extension View {
|
||||||
/// View에 전체적으로 색 입히기
|
func fullView(_ backColor: Color) -> some View {
|
||||||
func fullDrawView(_ backColor: Color) -> some View {
|
|
||||||
return self
|
return self
|
||||||
.frame(maxWidth: .infinity, maxHeight: .infinity)
|
.frame(maxWidth: .infinity, maxHeight: .infinity)
|
||||||
.background(backColor)
|
.background(backColor)
|
||||||
|
@ -91,17 +63,9 @@ extension View {
|
||||||
UIApplication.shared.sendAction(#selector(UIResponder.resignFirstResponder), to: nil, from: nil, for: nil)
|
UIApplication.shared.sendAction(#selector(UIResponder.resignFirstResponder), to: nil, from: nil, for: nil)
|
||||||
}
|
}
|
||||||
|
|
||||||
func loadingView(isLoading: Binding<Bool>) -> some View {
|
func setNavigaion() -> some View {
|
||||||
self.modifier(LoadingModifier(isLoading: isLoading))
|
self
|
||||||
}
|
.navigationBarBackButtonHidden(true)
|
||||||
|
.toolbar(.hidden, for: .navigationBar)
|
||||||
func innerShadow<S: Shape> (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)))
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,7 +1,6 @@
|
||||||
{
|
{
|
||||||
"images" : [
|
"images" : [
|
||||||
{
|
{
|
||||||
"filename" : "LOGO.png",
|
|
||||||
"idiom" : "universal",
|
"idiom" : "universal",
|
||||||
"platform" : "ios",
|
"platform" : "ios",
|
||||||
"size" : "1024x1024"
|
"size" : "1024x1024"
|
||||||
|
@ -13,7 +12,6 @@
|
||||||
"value" : "dark"
|
"value" : "dark"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"filename" : "LOGO 1.png",
|
|
||||||
"idiom" : "universal",
|
"idiom" : "universal",
|
||||||
"platform" : "ios",
|
"platform" : "ios",
|
||||||
"size" : "1024x1024"
|
"size" : "1024x1024"
|
||||||
|
@ -25,7 +23,6 @@
|
||||||
"value" : "tinted"
|
"value" : "tinted"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"filename" : "LOGO 2.png",
|
|
||||||
"idiom" : "universal",
|
"idiom" : "universal",
|
||||||
"platform" : "ios",
|
"platform" : "ios",
|
||||||
"size" : "1024x1024"
|
"size" : "1024x1024"
|
||||||
|
|
Before Width: | Height: | Size: 811 KiB |
Before Width: | Height: | Size: 811 KiB |
Before Width: | Height: | Size: 811 KiB |
|
@ -1,20 +0,0 @@
|
||||||
{
|
|
||||||
"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
|
|
||||||
}
|
|
||||||
}
|
|
Before Width: | Height: | Size: 636 B |
|
@ -1,12 +0,0 @@
|
||||||
{
|
|
||||||
"images" : [
|
|
||||||
{
|
|
||||||
"filename" : "Calendar.png",
|
|
||||||
"idiom" : "universal"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"info" : {
|
|
||||||
"author" : "xcode",
|
|
||||||
"version" : 1
|
|
||||||
}
|
|
||||||
}
|
|
Before Width: | Height: | Size: 543 B |
|
@ -1,12 +0,0 @@
|
||||||
{
|
|
||||||
"images" : [
|
|
||||||
{
|
|
||||||
"filename" : "Chatting.png",
|
|
||||||
"idiom" : "universal"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"info" : {
|
|
||||||
"author" : "xcode",
|
|
||||||
"version" : 1
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,9 +0,0 @@
|
||||||
{
|
|
||||||
"info" : {
|
|
||||||
"author" : "xcode",
|
|
||||||
"version" : 1
|
|
||||||
},
|
|
||||||
"properties" : {
|
|
||||||
"provides-namespace" : true
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,12 +0,0 @@
|
||||||
{
|
|
||||||
"images" : [
|
|
||||||
{
|
|
||||||
"filename" : "Etc.png",
|
|
||||||
"idiom" : "universal"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"info" : {
|
|
||||||
"author" : "xcode",
|
|
||||||
"version" : 1
|
|
||||||
}
|
|
||||||
}
|
|
Before Width: | Height: | Size: 635 B |
|
@ -1,12 +0,0 @@
|
||||||
{
|
|
||||||
"images" : [
|
|
||||||
{
|
|
||||||
"filename" : "Home.png",
|
|
||||||
"idiom" : "universal"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"info" : {
|
|
||||||
"author" : "xcode",
|
|
||||||
"version" : 1
|
|
||||||
}
|
|
||||||
}
|
|
Before Width: | Height: | Size: 604 B |
|
@ -1,12 +0,0 @@
|
||||||
{
|
|
||||||
"images" : [
|
|
||||||
{
|
|
||||||
"filename" : "Management.png",
|
|
||||||
"idiom" : "universal"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"info" : {
|
|
||||||
"author" : "xcode",
|
|
||||||
"version" : 1
|
|
||||||
}
|
|
||||||
}
|
|
Before Width: | Height: | Size: 577 B |
|
@ -1,12 +0,0 @@
|
||||||
{
|
|
||||||
"images" : [
|
|
||||||
{
|
|
||||||
"filename" : "appIcon.png",
|
|
||||||
"idiom" : "universal"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"info" : {
|
|
||||||
"author" : "xcode",
|
|
||||||
"version" : 1
|
|
||||||
}
|
|
||||||
}
|
|
Before Width: | Height: | Size: 120 KiB |
Before Width: | Height: | Size: 15 KiB |
|
@ -1,12 +0,0 @@
|
||||||
{
|
|
||||||
"images" : [
|
|
||||||
{
|
|
||||||
"filename" : "APPLE.png",
|
|
||||||
"idiom" : "universal"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"info" : {
|
|
||||||
"author" : "xcode",
|
|
||||||
"version" : 1
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,9 +0,0 @@
|
||||||
{
|
|
||||||
"info" : {
|
|
||||||
"author" : "xcode",
|
|
||||||
"version" : 1
|
|
||||||
},
|
|
||||||
"properties" : {
|
|
||||||
"provides-namespace" : true
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,12 +0,0 @@
|
||||||
{
|
|
||||||
"images" : [
|
|
||||||
{
|
|
||||||
"filename" : "KAKAO.png",
|
|
||||||
"idiom" : "universal"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"info" : {
|
|
||||||
"author" : "xcode",
|
|
||||||
"version" : 1
|
|
||||||
}
|
|
||||||
}
|
|
Before Width: | Height: | Size: 15 KiB |
|
@ -1,12 +0,0 @@
|
||||||
{
|
|
||||||
"images" : [
|
|
||||||
{
|
|
||||||
"filename" : "MI.png",
|
|
||||||
"idiom" : "universal"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"info" : {
|
|
||||||
"author" : "xcode",
|
|
||||||
"version" : 1
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,12 +0,0 @@
|
||||||
{
|
|
||||||
"images" : [
|
|
||||||
{
|
|
||||||
"filename" : "PageIcon.png",
|
|
||||||
"idiom" : "universal"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"info" : {
|
|
||||||
"author" : "xcode",
|
|
||||||
"version" : 1
|
|
||||||
}
|
|
||||||
}
|
|
Before Width: | Height: | Size: 36 KiB |
|
@ -1,12 +0,0 @@
|
||||||
{
|
|
||||||
"images" : [
|
|
||||||
{
|
|
||||||
"filename" : "TeamIcon.png",
|
|
||||||
"idiom" : "universal"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"info" : {
|
|
||||||
"author" : "xcode",
|
|
||||||
"version" : 1
|
|
||||||
}
|
|
||||||
}
|
|
21
AcaMate/6. Resources/Assets.xcassets/Image Folder/Kakao_Icon.imageset/Contents.json
vendored
Normal file
|
@ -0,0 +1,21 @@
|
||||||
|
{
|
||||||
|
"images" : [
|
||||||
|
{
|
||||||
|
"filename" : "KakaoIcon.png",
|
||||||
|
"idiom" : "universal",
|
||||||
|
"scale" : "1x"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"idiom" : "universal",
|
||||||
|
"scale" : "2x"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"idiom" : "universal",
|
||||||
|
"scale" : "3x"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"info" : {
|
||||||
|
"author" : "xcode",
|
||||||
|
"version" : 1
|
||||||
|
}
|
||||||
|
}
|
BIN
AcaMate/6. Resources/Assets.xcassets/Image Folder/Kakao_Icon.imageset/KakaoIcon.png
vendored
Normal file
After Width: | Height: | Size: 69 KiB |
21
AcaMate/6. Resources/Assets.xcassets/Image Folder/MI.imageset/Contents.json
vendored
Normal file
|
@ -0,0 +1,21 @@
|
||||||
|
{
|
||||||
|
"images" : [
|
||||||
|
{
|
||||||
|
"filename" : "MI.png",
|
||||||
|
"idiom" : "universal",
|
||||||
|
"scale" : "1x"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"idiom" : "universal",
|
||||||
|
"scale" : "2x"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"idiom" : "universal",
|
||||||
|
"scale" : "3x"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"info" : {
|
||||||
|
"author" : "xcode",
|
||||||
|
"version" : 1
|
||||||
|
}
|
||||||
|
}
|
Before Width: | Height: | Size: 5.2 KiB After Width: | Height: | Size: 5.2 KiB |
Before Width: | Height: | Size: 3.1 KiB After Width: | Height: | Size: 3.1 KiB |
21
AcaMate/6. Resources/Assets.xcassets/Image Folder/Team_Icon.imageset/Contents.json
vendored
Normal file
|
@ -0,0 +1,21 @@
|
||||||
|
{
|
||||||
|
"images" : [
|
||||||
|
{
|
||||||
|
"filename" : "1024.png",
|
||||||
|
"idiom" : "universal",
|
||||||
|
"scale" : "1x"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"idiom" : "universal",
|
||||||
|
"scale" : "2x"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"idiom" : "universal",
|
||||||
|
"scale" : "3x"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"info" : {
|
||||||
|
"author" : "xcode",
|
||||||
|
"version" : 1
|
||||||
|
}
|
||||||
|
}
|
Before Width: | Height: | Size: 587 B |
|
@ -1,12 +0,0 @@
|
||||||
{
|
|
||||||
"images" : [
|
|
||||||
{
|
|
||||||
"filename" : "Back.png",
|
|
||||||
"idiom" : "universal"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"info" : {
|
|
||||||
"author" : "xcode",
|
|
||||||
"version" : 1
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,9 +0,0 @@
|
||||||
{
|
|
||||||
"info" : {
|
|
||||||
"author" : "xcode",
|
|
||||||
"version" : 1
|
|
||||||
},
|
|
||||||
"properties" : {
|
|
||||||
"provides-namespace" : true
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,12 +0,0 @@
|
||||||
{
|
|
||||||
"images" : [
|
|
||||||
{
|
|
||||||
"filename" : "Edit.png",
|
|
||||||
"idiom" : "universal"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"info" : {
|
|
||||||
"author" : "xcode",
|
|
||||||
"version" : 1
|
|
||||||
}
|
|
||||||
}
|
|
Before Width: | Height: | Size: 684 B |
|
@ -1,12 +0,0 @@
|
||||||
{
|
|
||||||
"images" : [
|
|
||||||
{
|
|
||||||
"filename" : "Face.png",
|
|
||||||
"idiom" : "universal"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"info" : {
|
|
||||||
"author" : "xcode",
|
|
||||||
"version" : 1
|
|
||||||
}
|
|
||||||
}
|
|
Before Width: | Height: | Size: 2.2 KiB |
|
@ -1,12 +0,0 @@
|
||||||
{
|
|
||||||
"images" : [
|
|
||||||
{
|
|
||||||
"filename" : "Market.png",
|
|
||||||
"idiom" : "universal"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"info" : {
|
|
||||||
"author" : "xcode",
|
|
||||||
"version" : 1
|
|
||||||
}
|
|
||||||
}
|
|
Before Width: | Height: | Size: 535 B |
|
@ -1,12 +0,0 @@
|
||||||
{
|
|
||||||
"images" : [
|
|
||||||
{
|
|
||||||
"filename" : "Person.png",
|
|
||||||
"idiom" : "universal"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"info" : {
|
|
||||||
"author" : "xcode",
|
|
||||||
"version" : 1
|
|
||||||
}
|
|
||||||
}
|
|
Before Width: | Height: | Size: 1.2 KiB |
|
@ -1,12 +0,0 @@
|
||||||
{
|
|
||||||
"images" : [
|
|
||||||
{
|
|
||||||
"filename" : "Plus.png",
|
|
||||||
"idiom" : "universal"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"info" : {
|
|
||||||
"author" : "xcode",
|
|
||||||
"version" : 1
|
|
||||||
}
|
|
||||||
}
|
|
Before Width: | Height: | Size: 261 B |
|
@ -1,12 +0,0 @@
|
||||||
{
|
|
||||||
"images" : [
|
|
||||||
{
|
|
||||||
"filename" : "Save.png",
|
|
||||||
"idiom" : "universal"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"info" : {
|
|
||||||
"author" : "xcode",
|
|
||||||
"version" : 1
|
|
||||||
}
|
|
||||||
}
|
|
Before Width: | Height: | Size: 844 B |
|
@ -1,12 +0,0 @@
|
||||||
{
|
|
||||||
"images" : [
|
|
||||||
{
|
|
||||||
"filename" : "Setting.png",
|
|
||||||
"idiom" : "universal"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"info" : {
|
|
||||||
"author" : "xcode",
|
|
||||||
"version" : 1
|
|
||||||
}
|
|
||||||
}
|
|
Before Width: | Height: | Size: 2.3 KiB |
Before Width: | Height: | Size: 636 B |
Before Width: | Height: | Size: 543 B |
Before Width: | Height: | Size: 635 B |
Before Width: | Height: | Size: 604 B |
Before Width: | Height: | Size: 577 B |
Before Width: | Height: | Size: 15 KiB |
Before Width: | Height: | Size: 15 KiB |
Before Width: | Height: | Size: 811 KiB |
Before Width: | Height: | Size: 36 KiB |
Before Width: | Height: | Size: 120 KiB |
BIN
AcaMate/6. Resources/Images/KakaoIcon.png
Normal file
After Width: | Height: | Size: 69 KiB |
Before Width: | Height: | Size: 5.2 KiB After Width: | Height: | Size: 5.2 KiB |
Before Width: | Height: | Size: 3.1 KiB After Width: | Height: | Size: 3.1 KiB |
Before Width: | Height: | Size: 587 B |
Before Width: | Height: | Size: 684 B |
Before Width: | Height: | Size: 2.2 KiB |
Before Width: | Height: | Size: 535 B |
Before Width: | Height: | Size: 1.2 KiB |