- Auth: переключено на Pulse API (api.digital-home.site) вместо health - TabBar: Главная, Задачи, Привычки, Здоровье, Финансы - Models: TaskModels, HabitModels, FinanceModels, обновлённые AuthModels - Services: APIService (Pulse API), HealthAPIService (health отдельно) - Dashboard: обзор дня с задачами, привычками, readiness, балансом - Tasks: список, фильтр, создание, выполнение, удаление - Habits: список с прогресс-баром, отметка выполнения, стрики - Health: бывший DashboardView, HealthKit sync через health API key - Finance: баланс, список транзакций, добавление расхода/дохода - Health данные через x-api-key вместо JWT токена health сервиса
69 lines
2.4 KiB
Swift
69 lines
2.4 KiB
Swift
import SwiftUI
|
|
|
|
extension Color {
|
|
init(hex: String) {
|
|
let hex = hex.trimmingCharacters(in: CharacterSet.alphanumerics.inverted)
|
|
var int: UInt64 = 0
|
|
Scanner(string: hex).scanHexInt64(&int)
|
|
let a, r, g, b: UInt64
|
|
switch hex.count {
|
|
case 3: (a, r, g, b) = (255, (int >> 8) * 17, (int >> 4 & 0xF) * 17, (int & 0xF) * 17)
|
|
case 6: (a, r, g, b) = (255, int >> 16, int >> 8 & 0xFF, int & 0xFF)
|
|
case 8: (a, r, g, b) = (int >> 24, int >> 16 & 0xFF, int >> 8 & 0xFF, int & 0xFF)
|
|
default: (a, r, g, b) = (255, 0, 0, 0)
|
|
}
|
|
self.init(.sRGB, red: Double(r)/255, green: Double(g)/255, blue: Double(b)/255, opacity: Double(a)/255)
|
|
}
|
|
}
|
|
|
|
@main
|
|
struct PulseApp: App {
|
|
@StateObject private var authManager = AuthManager()
|
|
|
|
var body: some Scene {
|
|
WindowGroup {
|
|
if authManager.isLoggedIn {
|
|
MainTabView()
|
|
.environmentObject(authManager)
|
|
} else {
|
|
LoginView()
|
|
.environmentObject(authManager)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
class AuthManager: ObservableObject {
|
|
@Published var isLoggedIn: Bool = false
|
|
@Published var token: String = ""
|
|
@Published var userName: String = ""
|
|
@Published var userId: Int = 0
|
|
@Published var healthApiKey: String = "health-cosmo-2026"
|
|
|
|
init() {
|
|
token = UserDefaults.standard.string(forKey: "pulseToken") ?? ""
|
|
userName = UserDefaults.standard.string(forKey: "userName") ?? ""
|
|
userId = UserDefaults.standard.integer(forKey: "userId")
|
|
healthApiKey = UserDefaults.standard.string(forKey: "healthApiKey") ?? "health-cosmo-2026"
|
|
isLoggedIn = !token.isEmpty
|
|
}
|
|
|
|
func login(token: String, user: UserInfo) {
|
|
self.token = token
|
|
self.userName = user.name ?? user.email
|
|
self.userId = user.id
|
|
UserDefaults.standard.set(token, forKey: "pulseToken")
|
|
UserDefaults.standard.set(user.name ?? user.email, forKey: "userName")
|
|
UserDefaults.standard.set(user.id, forKey: "userId")
|
|
isLoggedIn = true
|
|
}
|
|
|
|
func logout() {
|
|
token = ""; userName = ""; userId = 0
|
|
UserDefaults.standard.removeObject(forKey: "pulseToken")
|
|
UserDefaults.standard.removeObject(forKey: "userName")
|
|
UserDefaults.standard.removeObject(forKey: "userId")
|
|
isLoggedIn = false
|
|
}
|
|
}
|