chore: migrate to v3 and adopt Doppler for secrets management #3
@@ -48,7 +48,12 @@ struct ChapterReaderView: View {
|
||||
}
|
||||
.navigationTitle(vm.content.map { "Ch.\($0.chapter.number)" } ?? "")
|
||||
.navigationBarTitleDisplayMode(.inline)
|
||||
.toolbar { audioToolbarButton }
|
||||
.overlay(alignment: .bottomTrailing) {
|
||||
// Floating audio button when player is not active
|
||||
if !audioPlayer.isActive {
|
||||
floatingAudioButton
|
||||
}
|
||||
}
|
||||
.task {
|
||||
print("[ChapterReaderView] .task fired — calling vm.load()")
|
||||
await vm.load()
|
||||
@@ -140,7 +145,34 @@ struct ChapterReaderView: View {
|
||||
}
|
||||
}
|
||||
|
||||
// MARK: - Audio toolbar button
|
||||
// MARK: - Floating audio button
|
||||
|
||||
@ViewBuilder
|
||||
private var floatingAudioButton: some View {
|
||||
Button {
|
||||
vm.toggleAudio(audioPlayer: audioPlayer, settings: authStore.settings)
|
||||
} label: {
|
||||
HStack(spacing: 8) {
|
||||
Image(systemName: "play.circle.fill")
|
||||
.font(.system(size: 22))
|
||||
Text("Listen")
|
||||
.font(.subheadline.weight(.semibold))
|
||||
}
|
||||
.foregroundStyle(.white)
|
||||
.padding(.horizontal, 20)
|
||||
.padding(.vertical, 12)
|
||||
.background(
|
||||
Capsule()
|
||||
.fill(Color.amber)
|
||||
.shadow(color: .black.opacity(0.25), radius: 8, y: 4)
|
||||
)
|
||||
}
|
||||
.buttonStyle(.plain)
|
||||
.padding(.trailing, 20)
|
||||
.padding(.bottom, 20)
|
||||
}
|
||||
|
||||
// MARK: - Audio toolbar button (kept for when player is active)
|
||||
|
||||
@ToolbarContentBuilder
|
||||
private var audioToolbarButton: some ToolbarContent {
|
||||
|
||||
Reference in New Issue
Block a user