big update

This commit is contained in:
15lu.akari
2025-08-26 23:37:39 +03:00
parent 6b88875bee
commit a87a3d12ab
34 changed files with 803 additions and 282 deletions

View File

@ -1,7 +1,6 @@
import Foundation
import AVKit
import Combine
@MainActor
class SightViewModel: ObservableObject {
@Published var sightName: String = "Загрузка..."
@ -10,8 +9,9 @@ class SightViewModel: ObservableObject {
@Published var articleHeading: String = ""
@Published var articleBody: String = ""
@Published var mediaState: MediaState = .loading
private var sightModel: SightModel?
private var selectedLanguage: String = "ru" // по умолчанию
enum MediaState {
case loading
@ -20,10 +20,20 @@ class SightViewModel: ObservableObject {
case error
}
func setLanguage(_ language: String) {
self.selectedLanguage = language
}
func loadInitialData(sightId: Int) async {
do {
async let sightModelTask = fetchJSON(from: "https://white-nights.krbl.ru/services/content/sight/\(sightId)", type: SightModel.self)
async let articlesTask = fetchJSON(from: "https://white-nights.krbl.ru/services/content/sight/\(sightId)/article", type: [Article].self)
async let sightModelTask = fetchJSON(
from: "https://white-nights.krbl.ru/services/content/sight/\(sightId)?lang=\(selectedLanguage)",
type: SightModel.self
)
async let articlesTask = fetchJSON(
from: "https://white-nights.krbl.ru/services/content/sight/\(sightId)/article?lang=\(selectedLanguage)",
type: [Article].self
)
let (fetchedSightModel, fetchedArticles) = try await (sightModelTask, articlesTask)
@ -63,20 +73,23 @@ class SightViewModel: ObservableObject {
}
if let videoPreviewId = sight.video_preview,
let url = URL(string: "https://white-nights.krbl.ru/services/content/media/\(videoPreviewId)/download") {
let url = URL(string: "https://white-nights.krbl.ru/services/content/media/\(videoPreviewId)/download?lang=\(selectedLanguage)") {
let player = AVPlayer(url: url)
player.play()
self.mediaState = .video(player)
} else if let url = URL(string: "https://white-nights.krbl.ru/services/content/media/\(sight.preview_media)/download") {
} else if let url = URL(string: "https://white-nights.krbl.ru/services/content/media/\(sight.preview_media)/download?lang=\(selectedLanguage)") {
self.mediaState = .image(url)
} else {
self.mediaState = .error
}
} else {
do {
let mediaItems = try await fetchJSON(from: "https://white-nights.krbl.ru/services/content/article/\(article.id)/media", type: [ArticleMedia].self)
let mediaItems = try await fetchJSON(
from: "https://white-nights.krbl.ru/services/content/article/\(article.id)/media?lang=\(selectedLanguage)",
type: [ArticleMedia].self
)
if let firstMedia = mediaItems.first,
let url = URL(string: "https://white-nights.krbl.ru/services/content/media/\(firstMedia.id)/download") {
let url = URL(string: "https://white-nights.krbl.ru/services/content/media/\(firstMedia.id)/download?lang=\(selectedLanguage)") {
self.mediaState = .image(url)
} else {
self.mediaState = .error