@@ -39,25 +39,39 @@ export const ScannerContainer: React.FC<Props> = (props) => {
39
39
const [ isError , setError ] = useState ( false )
40
40
const [ colorAnimationValue ] = useState ( new Animated . Value ( 0 ) )
41
41
const [ textAnimationValue ] = useState ( new Animated . Value ( 0 ) )
42
+ const [ scannerRef , setScannerRef ] = useState ( null )
43
+
44
+ // NOTE: this is needed because QRScanner behaves weirdly when the screen is
45
+ // remounted....
46
+ if ( scannerRef ) scannerRef . reactivate ( )
47
+
48
+ const rerender = ( ) => {
49
+ setRenderKey ( Date . now ( ) )
50
+ if ( scannerRef ) scannerRef . reactivate ( )
51
+ }
42
52
43
53
useEffect ( ( ) => {
44
- let focusListener ! : NavigationEventSubscription
54
+ let listeners : NavigationEventSubscription [ ] = [ ]
45
55
if ( navigation ) {
46
- focusListener = navigation . addListener ( 'willFocus' , ( ) => {
47
- // NOTE: the re-render and the re-mount should only fire during the willFocus event
48
- setRenderKey ( Date . now ( ) )
49
- } )
56
+ listeners . push ( navigation . addListener ( 'didFocus' , ( ) => {
57
+ rerender ( )
58
+ checkCameraPermissions ( )
59
+ } ) )
60
+ } else {
61
+ checkCameraPermissions ( )
50
62
}
51
63
52
- check ( CAMERA_PERMISSION ) . then ( perm => {
64
+ return ( ) => listeners . forEach ( l => l . remove ( ) )
65
+ } , [ ] )
66
+
67
+ const checkCameraPermissions = async ( ) => {
68
+ return check ( CAMERA_PERMISSION ) . then ( perm => {
53
69
setPermission ( perm )
54
70
if ( perm !== RESULTS . GRANTED && perm !== RESULTS . BLOCKED ) {
55
71
requestCameraPermission ( )
56
72
}
57
73
} )
58
-
59
- return focusListener . remove
60
- } , [ ] )
74
+ }
61
75
62
76
const requestCameraPermission = async ( ) => {
63
77
const permission = await request ( CAMERA_PERMISSION )
@@ -115,7 +129,7 @@ export const ScannerContainer: React.FC<Props> = (props) => {
115
129
} ) ,
116
130
] )
117
131
118
- const parseJWT = ( jwt : string ) => {
132
+ const onScan = ( jwt : string ) => {
119
133
try {
120
134
const interactionToken = JolocomLib . parse . interactionToken . fromJWT ( jwt )
121
135
onScannerSuccess ( interactionToken )
@@ -124,6 +138,7 @@ export const ScannerContainer: React.FC<Props> = (props) => {
124
138
setError ( true )
125
139
Animated . parallel ( [ animateColor ( ) , animateText ( ) ] ) . start ( ( ) => {
126
140
setError ( false )
141
+ rerender ( )
127
142
} )
128
143
}
129
144
}
@@ -133,7 +148,8 @@ export const ScannerContainer: React.FC<Props> = (props) => {
133
148
return (
134
149
< ScannerComponent
135
150
reRenderKey = { reRenderKey }
136
- onScan = { parseJWT }
151
+ onScan = { onScan }
152
+ onScannerRef = { r => setScannerRef ( r ) }
137
153
isTorchPressed = { isTorch }
138
154
onPressTorch = { ( state : boolean ) => setTorch ( state ) }
139
155
isError = { isError }
@@ -142,6 +158,7 @@ export const ScannerContainer: React.FC<Props> = (props) => {
142
158
/>
143
159
)
144
160
} else if ( permission === RESULTS . UNAVAILABLE ) {
161
+ // TODO: maybe add a message here like "do you even camera?"
145
162
return (
146
163
< View
147
164
style = { {
0 commit comments