Newer
Older
bremer-ios-app / BremerApp / View / LatestRecentlyPlayedView.swift
//
//  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 audioTargetSlug = ""
    @State
    private var audioInfo = AudioInfo()
    @State
    private var errorAlertTitle = ""
    @State
    private var showedErrorAlert = false
    @State
    private var showedUpdateView = 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.showedUpdateView = true
                        } label: {
                            Text("変更")
                        }
                        .tint(.green)
                    }
                }
            }
            .listStyle(.plain)
            Spacer()
            Divider()
            AudioPlayerView(audioPlayerViewModel: audioPlayerViewModel)
        }
        .sheet(isPresented: $showedLoginView) {
            LoginWebView()
        }
        .sheet(isPresented: $showedUpdateView) {
            RenameAudioView(audioInfo: self.audioInfo){(audioInfo : AudioInfo) in
                latestRecentlyPlayedAudioViewModel.updateAudio(
                    slug: self.audioTargetSlug,
                    audioName: audioInfo.audioName,
                    artistName: audioInfo.artistName,
                    albumName: audioInfo.albumName)
            }
        }
        .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)
        })
    }
}