155 lines
6.3 KiB
Swift
155 lines
6.3 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 thumbID = UUID()
|
||
let postID = UUID()
|
||
|
||
let authorId = UUID()
|
||
let authorUserName = "username_\(Int.random(in: 1...5))"
|
||
// 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: 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(page: Int, limit: Int, completion: @escaping ([Post]) -> Void) {
|
||
DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) {
|
||
let start = page * limit
|
||
let end = min(start + limit, self.posts.count)
|
||
|
||
if start < end {
|
||
completion(Array(self.posts[start..<end]))
|
||
} else {
|
||
completion([])
|
||
}
|
||
}
|
||
}
|
||
|
||
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)
|
||
}
|
||
}
|
||
}
|