Fix camera position switch to work in real-time

- Pass camera position from settings to CameraContainerView
- Add onChange handler to regenerate camera session when position changes
- Remove hardcoded .front camera position
- Camera now switches immediately when changed in settings
This commit is contained in:
Matt Bruce 2026-01-04 14:59:59 -06:00
parent 4ecdb8fbfe
commit 19e17b7051

View File

@ -28,6 +28,7 @@ struct ContentView: View {
EquatableView(content: CameraContainerView( EquatableView(content: CameraContainerView(
settings: settings, settings: settings,
sessionKey: cameraSessionKey, sessionKey: cameraSessionKey,
cameraPosition: settings.cameraPosition,
onImageCaptured: { image in onImageCaptured: { image in
handlePhotoCaptured(image) handlePhotoCaptured(image)
} }
@ -79,6 +80,10 @@ struct ContentView: View {
settings.flashMode = settings.isRingLightEnabled ? .on : .off settings.flashMode = settings.isRingLightEnabled ? .on : .off
} }
} }
.onChange(of: settings.cameraPosition) { _, _ in
// Force camera session recreation when camera position changes
cameraSessionKey = UUID()
}
.sheet(isPresented: $showSettings) { .sheet(isPresented: $showSettings) {
SettingsView(viewModel: settings, showPaywall: $showPaywall) SettingsView(viewModel: settings, showPaywall: $showPaywall)
} }
@ -162,6 +167,7 @@ struct ContentView: View {
struct CameraContainerView: View, Equatable { struct CameraContainerView: View, Equatable {
let settings: SettingsViewModel let settings: SettingsViewModel
let sessionKey: UUID let sessionKey: UUID
let cameraPosition: CameraPosition
let onImageCaptured: (UIImage) -> Void let onImageCaptured: (UIImage) -> Void
// Only compare sessionKey for equality - ignore settings and callback changes // Only compare sessionKey for equality - ignore settings and callback changes
@ -170,7 +176,7 @@ struct CameraContainerView: View, Equatable {
} }
var body: some View { var body: some View {
let _ = Design.debugLog("CameraContainerView body evaluated - sessionKey: \(sessionKey)") let _ = Design.debugLog("CameraContainerView body evaluated - sessionKey: \(sessionKey), position: \(cameraPosition)")
MCamera() MCamera()
.setCameraScreen { cameraManager, namespace, closeAction in .setCameraScreen { cameraManager, namespace, closeAction in
CustomCameraScreen( CustomCameraScreen(
@ -182,9 +188,7 @@ struct CameraContainerView: View, Equatable {
) )
} }
.setCapturedMediaScreen(nil) .setCapturedMediaScreen(nil)
// Use front camera as default for selfie app - don't read from settings here .setCameraPosition(cameraPosition)
// to avoid triggering @Observable tracking which breaks the camera
.setCameraPosition(.front)
.startSession() .startSession()
} }
} }