damus

nostr ios client
git clone git://jb55.com/damus
Log | Files | Refs | README | LICENSE

CameraMediaView.swift (2905B)


      1 //
      2 //  MediaViewer.swift
      3 //  damus
      4 //
      5 //  Created by Suhail Saqan on 12/22/23.
      6 //
      7 
      8 import SwiftUI
      9 import Kingfisher
     10 
     11 // MARK: - Camera Media Viewer
     12 struct CameraMediaView: View {
     13     let video_controller: VideoController
     14     let urls: [MediaUrl]
     15     
     16     @Environment(\.presentationMode) var presentationMode
     17     
     18     @State private var selectedIndex = 0
     19     @State var showMenu = true
     20     
     21     let settings: UserSettingsStore
     22     
     23     var tabViewIndicator: some View {
     24         HStack(spacing: 10) {
     25             ForEach(urls.indices, id: \.self) { index in
     26                 Capsule()
     27                     .fill(index == selectedIndex ? Color(UIColor.label) : Color.secondary)
     28                     .frame(width: 7, height: 7)
     29                     .onTapGesture {
     30                         selectedIndex = index
     31                     }
     32             }
     33         }
     34         .padding()
     35         .background(.regularMaterial)
     36         .clipShape(Capsule())
     37     }
     38     
     39     var body: some View {
     40         ZStack {
     41             Color(.systemBackground)
     42                 .ignoresSafeArea()
     43             
     44             TabView(selection: $selectedIndex) {
     45                 ForEach(urls.indices, id: \.self) { index in
     46                     ZoomableScrollView {
     47                         ImageContainerView(video_controller: video_controller, url: urls[index], settings: settings)
     48                             .aspectRatio(contentMode: .fit)
     49                             .padding(.top, Theme.safeAreaInsets?.top)
     50                             .padding(.bottom, Theme.safeAreaInsets?.bottom)
     51                     }
     52                     .ignoresSafeArea()
     53                     .tag(index)
     54                 }
     55             }
     56             .ignoresSafeArea()
     57             .tabViewStyle(PageTabViewStyle(indexDisplayMode: .never))
     58             .gesture(TapGesture(count: 2).onEnded {
     59                 // Prevents menu from hiding on double tap
     60             })
     61             .gesture(TapGesture(count: 1).onEnded {
     62                 showMenu.toggle()
     63             })
     64             .overlay(
     65                 GeometryReader { geo in
     66                     VStack {
     67                         if showMenu {
     68                             NavDismissBarView()
     69                             Spacer()
     70                             
     71                             if (urls.count > 1) {
     72                                 tabViewIndicator
     73                             }
     74                         }
     75                     }
     76                     .animation(.easeInOut, value: showMenu)
     77                     .padding(.bottom, geo.safeAreaInsets.bottom == 0 ? 12 : 0)
     78                 }
     79             )
     80         }
     81     }
     82 }
     83 
     84 struct CameraMediaView_Previews: PreviewProvider {
     85     static var previews: some View {
     86         let url: MediaUrl = .image(URL(string: "https://jb55.com/red-me.jpg")!)
     87         CameraMediaView(video_controller: test_damus_state.video, urls: [url], settings: test_damus_state.settings)
     88     }
     89 }