Skip to content

Commit

Permalink
Migrate AudioBanner to SwiftUI
Browse files Browse the repository at this point in the history
  • Loading branch information
mohamede1945 committed Sep 28, 2024
1 parent 5424de3 commit c6ed48b
Show file tree
Hide file tree
Showing 13 changed files with 511 additions and 869 deletions.
11 changes: 7 additions & 4 deletions Features/AudioBannerFeature/AudioBannerBuilder.swift
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ import AppDependencies
import QuranAudioKit
import ReciterListFeature
import ReciterService
import SwiftUI
import UIKit

@MainActor
Expand All @@ -33,13 +34,15 @@ public struct AudioBannerBuilder {
baseURL: container.filesAppHost,
downloader: container.downloadManager
),
remoteCommandsHandler: RemoteCommandsHandler(center: .shared())
)
let viewController = AudioBannerViewController(
viewModel: viewModel,
remoteCommandsHandler: RemoteCommandsHandler(center: .shared()),
reciterListBuilder: ReciterListBuilder(),
advancedAudioOptionsBuilder: AdvancedAudioOptionsBuilder()
)
let view = AudioBannerView(viewModel: viewModel)
.enableToastPresenter()
.enableUIKitNavigator()
let viewController = UIHostingController(rootView: view)
viewController.view.backgroundColor = nil
viewModel.listener = listener
return (viewController, viewModel)
}
Expand Down
60 changes: 60 additions & 0 deletions Features/AudioBannerFeature/AudioBannerView.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
//
// AudioBannerView.swift
//
//
// Created by Mohamed Afifi on 2024-09-23.
//

import NoorUI
import SwiftUI
import UIx

struct AudioBannerView: View {
@StateObject var viewModel: AudioBannerViewModel
@Environment(\.showToast) private var showToast
@Environment(\.uikitNavigator) private var navigator
@ScaledMetric private var toastOffset = 100

var body: some View {
let actions = AudioBannerActions(
play: { viewModel.playFromBanner() },
pause: { viewModel.pauseFromBanner() },
resume: { viewModel.resumeFromBanner() },
stop: { viewModel.stopFromBanner() },
backward: { viewModel.backwardFromBanner() },
forward: { viewModel.forwardFromBanner() },
cancelDownloading: { await viewModel.cancelDownload() },
reciters: { viewModel.presentReciterList() },
more: { viewModel.showAdvancedAudioOptions() }
)
AudioBannerViewUI(
state: viewModel.audioBannerState,
actions: actions
)
.onChange(of: viewModel.toast?.message) { _ in
if let toast = viewModel.toast {
viewModel.toast = nil
showToast?(Toast(toast.message, action: toast.action, bottomOffset: toastOffset))
}
}
.onChange(of: viewModel.viewControllerToPresent) { _ in
if let presentingVC = viewModel.viewControllerToPresent {
viewModel.viewControllerToPresent = nil
navigator?.viewController?.present(presentingVC, animated: true)
}
}
.onChange(of: viewModel.dismissPresentedViewController) { _ in
if viewModel.dismissPresentedViewController {
viewModel.dismissPresentedViewController = false
navigator?.viewController?.dismiss(animated: true)
}
}
.errorAlert(error: $viewModel.error)
.taskOnce {
await viewModel.start()
}
.onDisappear {
ToastPresenter.shared.dismissCurrentToast()
}
}
}
Loading

0 comments on commit c6ed48b

Please sign in to comment.