Skip to content

Commit 7752b9d

Browse files
suhailsaqanjb55
authored andcommitted
Add ability to preview media taken with camera
Closes: #1254 Reviewed-by: William Casarin <[email protected]> Signed-off-by: William Casarin <[email protected]>
1 parent c1f23df commit 7752b9d

File tree

3 files changed

+107
-7
lines changed

3 files changed

+107
-7
lines changed

damus.xcodeproj/project.pbxproj

+8-6
Original file line numberDiff line numberDiff line change
@@ -420,13 +420,14 @@
420420
9C83F89329A937B900136C08 /* TextViewWrapper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9C83F89229A937B900136C08 /* TextViewWrapper.swift */; };
421421
9CA876E229A00CEA0003B9A3 /* AttachMediaUtility.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9CA876E129A00CE90003B9A3 /* AttachMediaUtility.swift */; };
422422
ADFE73552AD4793100EC7326 /* QRScanNSECView.swift in Sources */ = {isa = PBXBuildFile; fileRef = ADFE73542AD4793100EC7326 /* QRScanNSECView.swift */; };
423+
BA0F0A6F2B36207E001641B2 /* CameraMediaView.swift in Sources */ = {isa = PBXBuildFile; fileRef = BA0F0A6E2B36207E001641B2 /* CameraMediaView.swift */; };
424+
BA10192F2B449556009C57DA /* CameraPreview.swift in Sources */ = {isa = PBXBuildFile; fileRef = BA10192E2B449556009C57DA /* CameraPreview.swift */; };
423425
BA37598A2ABCCDE40018D73B /* ImageResizer.swift in Sources */ = {isa = PBXBuildFile; fileRef = BA3759892ABCCDE30018D73B /* ImageResizer.swift */; };
424426
BA37598D2ABCCE500018D73B /* PhotoCaptureProcessor.swift in Sources */ = {isa = PBXBuildFile; fileRef = BA37598B2ABCCE500018D73B /* PhotoCaptureProcessor.swift */; };
425427
BA37598E2ABCCE500018D73B /* VideoCaptureProcessor.swift in Sources */ = {isa = PBXBuildFile; fileRef = BA37598C2ABCCE500018D73B /* VideoCaptureProcessor.swift */; };
426428
BA3759922ABCCEBA0018D73B /* CameraService+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = BA37598F2ABCCEBA0018D73B /* CameraService+Extensions.swift */; };
427429
BA3759932ABCCEBA0018D73B /* CameraModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = BA3759902ABCCEBA0018D73B /* CameraModel.swift */; };
428430
BA3759942ABCCEBA0018D73B /* CameraService.swift in Sources */ = {isa = PBXBuildFile; fileRef = BA3759912ABCCEBA0018D73B /* CameraService.swift */; };
429-
BA3759972ABCCF360018D73B /* CameraPreview.swift in Sources */ = {isa = PBXBuildFile; fileRef = BA3759962ABCCF360018D73B /* CameraPreview.swift */; };
430431
BA4AB0AE2A63B9270070A32A /* AddEmojiView.swift in Sources */ = {isa = PBXBuildFile; fileRef = BA4AB0AD2A63B9270070A32A /* AddEmojiView.swift */; };
431432
BA4AB0B02A63B94D0070A32A /* EmojiListItemView.swift in Sources */ = {isa = PBXBuildFile; fileRef = BA4AB0AF2A63B94D0070A32A /* EmojiListItemView.swift */; };
432433
BA693074295D649800ADDB87 /* UserSettingsStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = BA693073295D649800ADDB87 /* UserSettingsStore.swift */; };
@@ -1238,13 +1239,14 @@
12381239
9C83F89229A937B900136C08 /* TextViewWrapper.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TextViewWrapper.swift; sourceTree = "<group>"; };
12391240
9CA876E129A00CE90003B9A3 /* AttachMediaUtility.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AttachMediaUtility.swift; sourceTree = "<group>"; };
12401241
ADFE73542AD4793100EC7326 /* QRScanNSECView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = QRScanNSECView.swift; sourceTree = "<group>"; };
1242+
BA0F0A6E2B36207E001641B2 /* CameraMediaView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CameraMediaView.swift; sourceTree = "<group>"; };
1243+
BA10192E2B449556009C57DA /* CameraPreview.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CameraPreview.swift; sourceTree = "<group>"; };
12411244
BA3759892ABCCDE30018D73B /* ImageResizer.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ImageResizer.swift; sourceTree = "<group>"; };
12421245
BA37598B2ABCCE500018D73B /* PhotoCaptureProcessor.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PhotoCaptureProcessor.swift; sourceTree = "<group>"; };
12431246
BA37598C2ABCCE500018D73B /* VideoCaptureProcessor.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = VideoCaptureProcessor.swift; sourceTree = "<group>"; };
12441247
BA37598F2ABCCEBA0018D73B /* CameraService+Extensions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "CameraService+Extensions.swift"; sourceTree = "<group>"; };
12451248
BA3759902ABCCEBA0018D73B /* CameraModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CameraModel.swift; sourceTree = "<group>"; };
12461249
BA3759912ABCCEBA0018D73B /* CameraService.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CameraService.swift; sourceTree = "<group>"; };
1247-
BA3759962ABCCF360018D73B /* CameraPreview.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CameraPreview.swift; sourceTree = "<group>"; };
12481250
BA4AB0AD2A63B9270070A32A /* AddEmojiView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AddEmojiView.swift; sourceTree = "<group>"; };
12491251
BA4AB0AF2A63B94D0070A32A /* EmojiListItemView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EmojiListItemView.swift; sourceTree = "<group>"; };
12501252
BA693073295D649800ADDB87 /* UserSettingsStore.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UserSettingsStore.swift; sourceTree = "<group>"; };
@@ -2487,8 +2489,9 @@
24872489
BA3759952ABCCF360018D73B /* Camera */ = {
24882490
isa = PBXGroup;
24892491
children = (
2490-
BA3759962ABCCF360018D73B /* CameraPreview.swift */,
24912492
BAA578D42AED7F4000EA8BE3 /* CameraView.swift */,
2493+
BA10192E2B449556009C57DA /* CameraPreview.swift */,
2494+
BA0F0A6E2B36207E001641B2 /* CameraMediaView.swift */,
24922495
);
24932496
path = Camera;
24942497
sourceTree = "<group>";
@@ -2498,8 +2501,6 @@
24982501
children = (
24992502
D72A2D042AD9C1B5002AFF62 /* MockDamusState.swift */,
25002503
D72A2D062AD9C1FB002AFF62 /* MockProfiles.swift */,
2501-
BAA8C3262AEC570800696158 /* CameraView.swift */,
2502-
BA3759962ABCCF360018D73B /* CameraPreview.swift */,
25032504
);
25042505
path = Mocking;
25052506
sourceTree = "<group>";
@@ -2890,7 +2891,6 @@
28902891
4C8D1A6F29F31E5000ACDF75 /* FriendsButton.swift in Sources */,
28912892
3A5E47C52A4A6CF400C0D090 /* Trie.swift in Sources */,
28922893
4C216F382871EDE300040376 /* DirectMessageModel.swift in Sources */,
2893-
BA3759972ABCCF360018D73B /* CameraPreview.swift in Sources */,
28942894
4C75EFA627FF87A20006080F /* Nostr.swift in Sources */,
28952895
4CA927672A290F8B0098A105 /* RelativeTime.swift in Sources */,
28962896
4CB883A62975F83C00DC99E7 /* LNUrlPayRequest.swift in Sources */,
@@ -3107,6 +3107,7 @@
31073107
4C1253562A76C8C60004F4B8 /* BroadcastNotify.swift in Sources */,
31083108
4C3BEFD42819DE8F00B3DE84 /* NostrKind.swift in Sources */,
31093109
4C32B9532A9AD44700DC3548 /* Verifier.swift in Sources */,
3110+
BA10192F2B449556009C57DA /* CameraPreview.swift in Sources */,
31103111
4C3EA66028FF5E7700C48A62 /* node_id.c in Sources */,
31113112
4C687C212A5F7ED00092C550 /* DamusBackground.swift in Sources */,
31123113
4CA352A02A76AE80003BB08B /* Notify.swift in Sources */,
@@ -3175,6 +3176,7 @@
31753176
4C1A9A2529DDDF2600516EAC /* ZapSettingsView.swift in Sources */,
31763177
4C2CDDF7299D4A5E00879FD5 /* Debouncer.swift in Sources */,
31773178
3AAA95CC298E07E900F3D526 /* DeepLPlan.swift in Sources */,
3179+
BA0F0A6F2B36207E001641B2 /* CameraMediaView.swift in Sources */,
31783180
4FE60CDD295E1C5E00105A1F /* Wallet.swift in Sources */,
31793181
3AA247FF297E3D900090C62D /* RepostsView.swift in Sources */,
31803182
3AE45AF6297BB2E700C1D842 /* LibreTranslateServer.swift in Sources */,
+89
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
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+
}

damus/Views/Camera/CameraView.swift

+10-1
Original file line numberDiff line numberDiff line change
@@ -174,7 +174,16 @@ struct CameraView: View {
174174

175175
HStack(alignment: .center) {
176176
if !model.mediaItems.isEmpty {
177-
NavigationLink(destination: Text(model.mediaItems.map { $0.url.absoluteString }.joined(separator: ", "))) {
177+
NavigationLink(destination: CameraMediaView(video_controller: damus_state.video, urls: model.mediaItems.map { mediaItem in
178+
switch mediaItem.type {
179+
case .image:
180+
return .image(mediaItem.url)
181+
case .video:
182+
return .video(mediaItem.url)
183+
}
184+
}, settings: damus_state.settings)
185+
.navigationBarBackButtonHidden(true)
186+
) {
178187
capturedPhotoThumbnail
179188
}
180189
.frame(width: 100, alignment: .leading)

0 commit comments

Comments
 (0)