121 lines
6.7 KiB
Swift
121 lines
6.7 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 postID = UUID()
|
||
let authorId = UUID()
|
||
let authorUserName = "username_\(Int.random(in: 1...5))"
|
||
let thumbID = UUID()
|
||
|
||
var mediaItems: [MediaItem] = []
|
||
var mediaOrder: [UUID] = []
|
||
|
||
let mediaTypeChoice = Int.random(in: 0...2)
|
||
|
||
if mediaTypeChoice == 0 { // Single Video
|
||
let mediaID = UUID()
|
||
let width = 1080
|
||
let randomRatio = Double.random(in: 1.0...1.77)
|
||
let height = Int(Double(width) * randomRatio)
|
||
mediaItems.append(MediaItem(id: mediaID, type: .video, width: width, height: height))
|
||
mediaOrder.append(mediaID)
|
||
} else if mediaTypeChoice == 1 { // Single Photo
|
||
let mediaID = UUID()
|
||
let width = 1080
|
||
let randomRatio = Double.random(in: 1.0...1.77)
|
||
let height = Int(Double(width) * randomRatio)
|
||
mediaItems.append(MediaItem(id: mediaID, type: .photo, width: width, height: height))
|
||
mediaOrder.append(mediaID)
|
||
} else { // Photo Gallery
|
||
let numberOfPhotos = Int.random(in: 2...5)
|
||
for _ in 0..<numberOfPhotos {
|
||
let mediaID = UUID()
|
||
let width = 1080
|
||
let randomRatio = Double.random(in: 1.0...1.77)
|
||
let height = Int(Double(width) * randomRatio)
|
||
mediaItems.append(MediaItem(id: mediaID, type: .photo, width: width, height: height))
|
||
mediaOrder.append(mediaID)
|
||
}
|
||
}
|
||
|
||
let post = Post(
|
||
id: postID,
|
||
title: sampleTitles[i],
|
||
description: sampleDescriptions[i],
|
||
media: mediaItems,
|
||
mediaOrder: mediaOrder,
|
||
thumbnailID: thumbID,
|
||
duration: mediaItems.first?.type == .video ? Double.random(in: 15.0...180.0) : nil,
|
||
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: authorUserName,
|
||
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)
|
||
}
|
||
}
|
||
}
|