145 lines
		
	
	
		
			5.9 KiB
		
	
	
	
		
			Swift
		
	
	
	
	
	
			
		
		
	
	
			145 lines
		
	
	
		
			5.9 KiB
		
	
	
	
		
			Swift
		
	
	
	
	
	
import Foundation
 | 
						||
 | 
						||
class PostService {
 | 
						||
    static let shared = PostService()
 | 
						||
 | 
						||
    private var posts: [Post] = []
 | 
						||
 | 
						||
    init() {
 | 
						||
        generateMockPosts()
 | 
						||
    }
 | 
						||
 | 
						||
    private func generateMockPosts() {
 | 
						||
        guard posts.isEmpty else { return }
 | 
						||
 | 
						||
        let sampleTitles = [
 | 
						||
            "Обзор TikTok UI",
 | 
						||
            "Мой первый ролик",
 | 
						||
            "Котик в кадре",
 | 
						||
            "SwiftUI мастер-класс",
 | 
						||
            "Анимации и переходы",
 | 
						||
            "Съёмка с дрона",
 | 
						||
            "Урок по дизайну",
 | 
						||
            "Как сделать свайпы",
 | 
						||
            "Лучший UI 2025",
 | 
						||
            "Мой первый ролик",
 | 
						||
            "Котик в кадре",
 | 
						||
            "SwiftUI мастер-класс",
 | 
						||
            "Анимации и переходы",
 | 
						||
            "Съёмка с дрона",
 | 
						||
            "Урок по дизайну",
 | 
						||
            "Как сделать свайпы",
 | 
						||
            "Лучший UI 2025",
 | 
						||
            "Мой первый ролик",
 | 
						||
            "Котик в кадре",
 | 
						||
            "SwiftUI мастер-класс",
 | 
						||
            "Анимации и переходы",
 | 
						||
            "Съёмка с дрона",
 | 
						||
            "Урок по дизайну",
 | 
						||
            "Как сделать свайпы",
 | 
						||
            "Лучший UI 2025",
 | 
						||
            "Мой первый ролик",
 | 
						||
            "Котик в кадре",
 | 
						||
            "SwiftUI мастер-класс",
 | 
						||
            "Анимации и переходы",
 | 
						||
            "Съёмка с дрона",
 | 
						||
            "Урок по дизайну",
 | 
						||
            "Как сделать свайпы",
 | 
						||
            "Лучший UI 2025",
 | 
						||
            "Мой первый ролик",
 | 
						||
            "Котик в кадре",
 | 
						||
            "SwiftUI мастер-класс",
 | 
						||
            "Анимации и переходы",
 | 
						||
            "Съёмка с дрона",
 | 
						||
            "Урок по дизайну",
 | 
						||
            "Как сделать свайпы",
 | 
						||
            "Лучший UI 2025",
 | 
						||
            "Завершаем проект"
 | 
						||
        ]
 | 
						||
 | 
						||
        let sampleDescriptions = [
 | 
						||
            "Первый тестовый пост с видео",
 | 
						||
            "Фейковый контент для ленты",
 | 
						||
            "Видео с котиком 🐱",
 | 
						||
            "Интерфейс в стиле TikTok",
 | 
						||
            "Просто тестирую отображение",
 | 
						||
            "Код и UI — любовь",
 | 
						||
            "Видео в реальном времени",
 | 
						||
            "Интересный UX пример",
 | 
						||
            "Анимации, переходы, свайпы",
 | 
						||
            "Фейковый контент для ленты",
 | 
						||
            "Видео с котиком 🐱",
 | 
						||
            "Интерфейс в стиле TikTok",
 | 
						||
            "Просто тестирую отображение",
 | 
						||
            "Код и UI — любовь",
 | 
						||
            "Видео в реальном времени",
 | 
						||
            "Интересный UX пример",
 | 
						||
            "Анимации, переходы, свайпы",
 | 
						||
            "Фейковый контент для ленты",
 | 
						||
            "Видео с котиком 🐱",
 | 
						||
            "Интерфейс в стиле TikTok",
 | 
						||
            "Просто тестирую отображение",
 | 
						||
            "Код и UI — любовь",
 | 
						||
            "Видео в реальном времени",
 | 
						||
            "Интересный UX пример",
 | 
						||
            "Анимации, переходы, свайпы",
 | 
						||
            "Фейковый контент для ленты",
 | 
						||
            "Видео с котиком 🐱",
 | 
						||
            "Интерфейс в стиле TikTok",
 | 
						||
            "Просто тестирую отображение",
 | 
						||
            "Код и UI — любовь",
 | 
						||
            "Видео в реальном времени",
 | 
						||
            "Интересный UX пример",
 | 
						||
            "Анимации, переходы, свайпы",
 | 
						||
            "Вот это да, пост работает!"
 | 
						||
        ]
 | 
						||
 | 
						||
        for i in 0..<32 {
 | 
						||
            let mediaID = UUID()
 | 
						||
            let thumbID = Bool.random() ? UUID() : nil
 | 
						||
            let postID = UUID()
 | 
						||
            
 | 
						||
            let authorId = "user_\(Int.random(in: 1...5))"
 | 
						||
            let post = Post(
 | 
						||
                id: postID,
 | 
						||
                title: sampleTitles[i],
 | 
						||
                description: sampleDescriptions[i],
 | 
						||
                media: [
 | 
						||
                    MediaItem(id: mediaID, type: .video)
 | 
						||
                ],
 | 
						||
                mediaOrder: [mediaID],
 | 
						||
                thumbnailID: thumbID,
 | 
						||
                duration: Double.random(in: 15.0...180.0),
 | 
						||
                createdAt: Date(),
 | 
						||
                updatedAt: Date(),
 | 
						||
                views: Int.random(in: 1_000...10_000),
 | 
						||
                likes: Int.random(in: 100...2_000),
 | 
						||
                saves: Int.random(in: 10...500),
 | 
						||
                commentsCount: Int.random(in: 0...100),
 | 
						||
                isLikedByCurrentUser: Bool.random(),
 | 
						||
                isSavedByCurrentUser: Bool.random(),
 | 
						||
                authorID: authorId,
 | 
						||
                authorUsername: "username_\(authorId.split(separator: "_").last ?? "")",
 | 
						||
                hashtags: ["#тест", "#видео", "#swiftui", "#ui"].shuffled().prefix(2).map { $0 },
 | 
						||
                location: Bool.random() ? "Москва" : nil,
 | 
						||
                languageCode: Bool.random() ? ["ru", "en"] : ["ru"],
 | 
						||
                accessLevel: [.public, .friends, .archive].randomElement()!
 | 
						||
            )
 | 
						||
            posts.append(post)
 | 
						||
        }
 | 
						||
    }
 | 
						||
 | 
						||
    func fetchAllPosts(completion: @escaping ([Post]) -> Void) {
 | 
						||
        DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) {
 | 
						||
            completion(self.posts)
 | 
						||
        }
 | 
						||
    }
 | 
						||
 | 
						||
    func fetchPost(by id: UUID, completion: @escaping (Post?) -> Void) {
 | 
						||
        DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) {
 | 
						||
            let result = self.posts.first { $0.id == id }
 | 
						||
            completion(result)
 | 
						||
        }
 | 
						||
    }
 | 
						||
}
 |