72 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			Swift
		
	
	
	
	
	
			
		
		
	
	
			72 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			Swift
		
	
	
	
	
	
//
 | 
						|
//  yobbleApp.swift
 | 
						|
//  yobble
 | 
						|
//
 | 
						|
//  Created by cheykrym on 19.09.2025.
 | 
						|
//
 | 
						|
 | 
						|
import SwiftUI
 | 
						|
import CoreData
 | 
						|
 | 
						|
@main
 | 
						|
struct yobbleApp: App {
 | 
						|
    @StateObject private var themeManager = ThemeManager()
 | 
						|
    @StateObject private var viewModel = LoginViewModel()
 | 
						|
    @StateObject private var messageCenter = IncomingMessageCenter()
 | 
						|
    private let persistenceController = PersistenceController.shared
 | 
						|
    
 | 
						|
    var body: some Scene {
 | 
						|
        WindowGroup {
 | 
						|
            ZStack(alignment: .top) {
 | 
						|
                Group {
 | 
						|
                    if viewModel.isLoading {
 | 
						|
                        SplashScreenView()
 | 
						|
                    } else if viewModel.isLoggedIn {
 | 
						|
                        MainView(viewModel: viewModel)
 | 
						|
                    } else {
 | 
						|
                        LoginView(viewModel: viewModel)
 | 
						|
                    }
 | 
						|
                }
 | 
						|
 | 
						|
                if let banner = messageCenter.banner {
 | 
						|
                    NewMessageBannerView(
 | 
						|
                        banner: banner,
 | 
						|
                        onOpen: { messageCenter.openCurrentChat() },
 | 
						|
                        onDismiss: { messageCenter.dismissBanner() }
 | 
						|
                    )
 | 
						|
                    .padding(.horizontal, 16)
 | 
						|
                    .padding(.top, 12)
 | 
						|
                    .transition(.move(edge: .top).combined(with: .opacity))
 | 
						|
                    .zIndex(1)
 | 
						|
                }
 | 
						|
            }
 | 
						|
            .animation(.spring(response: 0.35, dampingFraction: 0.8), value: messageCenter.banner != nil)
 | 
						|
            .sheet(item: AppConfig.PRESENT_CHAT_AS_SHEET ? $messageCenter.presentedChat : .constant(nil)) { chatItem in
 | 
						|
                NavigationView {
 | 
						|
                    PrivateChatView(
 | 
						|
                        chat: chatItem,
 | 
						|
                        currentUserId: messageCenter.currentUserId
 | 
						|
                    )
 | 
						|
                        .toolbar {
 | 
						|
                            ToolbarItem(placement: .cancellationAction) {
 | 
						|
                                Button(NSLocalizedString("Закрыть", comment: "")) {
 | 
						|
                                    messageCenter.presentedChat = nil
 | 
						|
                                }
 | 
						|
                            }
 | 
						|
                        }
 | 
						|
                }
 | 
						|
            }
 | 
						|
            .environmentObject(messageCenter)
 | 
						|
            .environmentObject(themeManager)
 | 
						|
            .preferredColorScheme(themeManager.theme.colorScheme)
 | 
						|
            .environment(\.managedObjectContext, persistenceController.viewContext)
 | 
						|
            .onAppear {
 | 
						|
                messageCenter.currentUserId = viewModel.userId.isEmpty ? nil : viewModel.userId
 | 
						|
            }
 | 
						|
            .onChange(of: viewModel.userId) { newValue in
 | 
						|
                messageCenter.currentUserId = newValue.isEmpty ? nil : newValue
 | 
						|
            }
 | 
						|
        }
 | 
						|
    }
 | 
						|
}
 |