@@ -9,22 +9,27 @@ import SwiftUI
9
9
import FaceLiveness
10
10
11
11
struct ExampleLivenessView : View {
12
- @Binding var isPresented : Bool
12
+ @Binding var containerViewState : ContainerViewState
13
13
@ObservedObject var viewModel : ExampleLivenessViewModel
14
14
15
- init ( sessionID: String , isPresented: Binding < Bool > ) {
16
- self . viewModel = . init( sessionID: sessionID)
17
- self . _isPresented = isPresented
15
+ init ( sessionID: String , containerViewState: Binding < ContainerViewState > ) {
16
+ self . _containerViewState = containerViewState
17
+ if case let . liveness( selectedCamera) = _containerViewState. wrappedValue {
18
+ self . viewModel = . init( sessionID: sessionID, presentationState: . liveness( selectedCamera) )
19
+ } else {
20
+ self . viewModel = . init( sessionID: sessionID)
21
+ }
18
22
}
19
23
20
24
var body : some View {
21
25
switch viewModel. presentationState {
22
- case . liveness:
26
+ case . liveness( let camera ) :
23
27
FaceLivenessDetectorView (
24
28
sessionID: viewModel. sessionID,
25
29
region: " us-east-1 " ,
30
+ challengeOptions: . init( faceMovementChallengeOption: FaceMovementChallengeOption ( camera: camera) ) ,
26
31
isPresented: Binding (
27
- get: { viewModel. presentationState == . liveness } ,
32
+ get: { viewModel. presentationState == . liveness( camera ) } ,
28
33
set: { _ in }
29
34
) ,
30
35
onCompletion: { result in
@@ -33,11 +38,11 @@ struct ExampleLivenessView: View {
33
38
case . success:
34
39
withAnimation { viewModel. presentationState = . result }
35
40
case . failure( . sessionNotFound) , . failure( . cameraPermissionDenied) , . failure( . accessDenied) :
36
- viewModel. presentationState = . liveness
37
- isPresented = false
41
+ viewModel. presentationState = . liveness( camera )
42
+ containerViewState = . startSession
38
43
case . failure( . userCancelled) :
39
- viewModel. presentationState = . liveness
40
- isPresented = false
44
+ viewModel. presentationState = . liveness( camera )
45
+ containerViewState = . startSession
41
46
case . failure( . sessionTimedOut) :
42
47
viewModel. presentationState = . error( . sessionTimedOut)
43
48
case . failure( . socketClosed) :
@@ -46,6 +51,10 @@ struct ExampleLivenessView: View {
46
51
viewModel. presentationState = . error( . countdownFaceTooClose)
47
52
case . failure( . invalidSignature) :
48
53
viewModel. presentationState = . error( . invalidSignature)
54
+ case . failure( . faceInOvalMatchExceededTimeLimitError) :
55
+ viewModel. presentationState = . error( . faceInOvalMatchExceededTimeLimitError)
56
+ case . failure( . internalServer) :
57
+ viewModel. presentationState = . error( . internalServer)
49
58
case . failure( . cameraNotAvailable) :
50
59
viewModel. presentationState = . error( . cameraNotAvailable)
51
60
case . failure( . validation) :
@@ -58,11 +67,11 @@ struct ExampleLivenessView: View {
58
67
}
59
68
}
60
69
)
61
- . id ( isPresented )
70
+ . id ( containerViewState )
62
71
case . result:
63
72
LivenessResultView (
64
73
sessionID: viewModel. sessionID,
65
- onTryAgain: { isPresented = false } ,
74
+ onTryAgain: { containerViewState = . startSession } ,
66
75
content: {
67
76
LivenessResultContentView ( fetchResults: viewModel. fetchLivenessResult)
68
77
}
@@ -71,7 +80,7 @@ struct ExampleLivenessView: View {
71
80
case . error( let detectionError) :
72
81
LivenessResultView (
73
82
sessionID: viewModel. sessionID,
74
- onTryAgain: { isPresented = false } ,
83
+ onTryAgain: { containerViewState = . startSession } ,
75
84
content: {
76
85
switch detectionError {
77
86
case . socketClosed:
0 commit comments