// // LatestRecentlyPlayedView.swift // Bremer // // Created by yhornisse on 2023/08/19. // import SwiftUI import AVFoundation struct LatestRecentlyPlayedView : View { @State private var showedLoginView = false @State private var showedUpdateAudioDialog = false @State private var audioTargetSlug = "" @State private var audioInfo = AudioInfo() @State private var errorAlertTitle = "" @State private var showedErrorAlert = false @EnvironmentObject private var audioPlayerViewModel : AudioPlayerViewModel @EnvironmentObject private var settingViewModel : SettingViewModel @ObservedObject private var latestRecentlyPlayedAudioViewModel = LatestRecentlyPlayedAudioViewModel() var body : some View { VStack { Text("再生履歴") if settingViewModel.getSetting().baseUrl == "" { Text("Base URLを設定してください") } else if !latestRecentlyPlayedAudioViewModel.messageText.isEmpty { if (latestRecentlyPlayedAudioViewModel.hasError) { VStack { Text(latestRecentlyPlayedAudioViewModel.messageText) .foregroundColor(.red) if latestRecentlyPlayedAudioViewModel.messageText == "ログインしてください" { LoginButton(action: { self.showedLoginView = true }) } } } else { Text(latestRecentlyPlayedAudioViewModel.messageText) } } List { ForEach(latestRecentlyPlayedAudioViewModel.result, id:\.slug) { audio in Button(action: { audioPlayerViewModel.playAudioList( audioList: latestRecentlyPlayedAudioViewModel.result, audio: audio, usedBy: "recent") }) { Text("\(audio.name) - \(audio.album ?? "")") .font(.system(size: 14)) .frame(height: 35, alignment: .center) .aspectRatio(contentMode: .fit) } .swipeActions(edge: .trailing) { Button { self.audioTargetSlug = audio.slug self.audioInfo.audioName = audio.name self.audioInfo.artistName = audio.artist ?? "" self.audioInfo.albumName = audio.album ?? "" self.audioInfo.localPath = audio.localPath self.showedUpdateAudioDialog = true } label: { Text("変更") } .tint(.green) } } } .listStyle(.plain) Spacer() Divider() AudioPlayerView(audioPlayerViewModel: audioPlayerViewModel) } .sheet(isPresented: $showedLoginView) { LoginWebView() } .alert("更新", isPresented: $showedUpdateAudioDialog) { RenameAudioAlertView(audioInfo: self.audioInfo) {(audioInfo: AudioInfo) in latestRecentlyPlayedAudioViewModel.updateAudio( slug: audioTargetSlug, audioName: audioInfo.audioName, artistName: audioInfo.artistName, albumName: audioInfo.albumName) } onError: {(message: String) in self.errorAlertTitle = message self.showedErrorAlert = true } } message: { Text("新しい名前を入力してください") } .alert(errorAlertTitle, isPresented: $showedErrorAlert, actions: { Button(action: { // nop }, label: { Text("確認") }) }) .onAppear { latestRecentlyPlayedAudioViewModel.bremerApiBaseUrl = settingViewModel.getSetting().baseApiUrl() latestRecentlyPlayedAudioViewModel.getAllAudio() } .onReceive(NotificationCenter.default.publisher(for: AVAudioSession.routeChangeNotification), perform: { param in audioPlayerViewModel.onChangeAudioSessionRoute(param) }) .onReceive(NotificationCenter.default.publisher(for: AVAudioSession.interruptionNotification), perform: { param in audioPlayerViewModel.onInterrupted(param) }) } }