1
- import React , { Component , useState } from "react" ;
2
- import Quagga from "quagga " ;
1
+ import React , { Component } from "react" ;
2
+ import Quagga from "@ericblade/quagga2 " ;
3
3
4
- class Scanner extends Component {
5
- state = {
4
+ interface ScannerProps {
5
+ onDetected : ( result : any ) => void ;
6
+ setScanning : ( scanning : boolean ) => void ;
7
+ }
8
+
9
+ interface ScannerState {
10
+ facingMode : string ;
11
+ isHidden : boolean ;
12
+ }
13
+
14
+ class Scanner extends Component < ScannerProps , ScannerState > {
15
+ state : ScannerState = {
6
16
facingMode : "environment" ,
17
+ isHidden : false ,
7
18
} ;
8
19
9
20
handleClick = ( ) => {
10
- if ( this . state . facingMode === "environment" ) {
11
- this . setState ( { facingMode : "user" } ) ;
12
- } else {
13
- this . setState ( { facingMode : "environment" } ) ;
14
- }
21
+ const { facingMode } = this . state ;
22
+ const newFacingMode = facingMode === "environment" ? "user" : "environment" ;
23
+ this . setState ( { facingMode : newFacingMode } ) ;
15
24
16
25
Quagga . init (
17
26
{
@@ -21,8 +30,7 @@ class Scanner extends Component {
21
30
width : window . innerWidth * window . devicePixelRatio ,
22
31
height : window . innerHeight * window . devicePixelRatio ,
23
32
aspectRatio : { ideal : window . innerHeight / window . innerWidth } ,
24
- facingMode : this . state . facingMode ,
25
- focusMode : "continuous" ,
33
+ facingMode : newFacingMode ,
26
34
} ,
27
35
} ,
28
36
locator : {
@@ -40,7 +48,7 @@ class Scanner extends Component {
40
48
} ,
41
49
locate : true ,
42
50
} ,
43
- function ( err ) {
51
+ ( err : any ) => {
44
52
if ( err ) {
45
53
return console . log ( err ) ;
46
54
}
@@ -49,43 +57,43 @@ class Scanner extends Component {
49
57
) ;
50
58
} ;
51
59
52
- componentDidMount = ( ) => {
53
- console . log ( this . state . facingMode ) ;
60
+ componentDidMount ( ) {
61
+ const { facingMode } = this . state ;
62
+ console . log ( facingMode ) ;
54
63
this . handleClick ( ) ;
55
64
Quagga . onDetected ( this . _onDetected ) ;
56
- } ;
65
+ }
57
66
58
- componentWillUnmount = ( ) => {
67
+ componentWillUnmount ( ) {
59
68
Quagga . offDetected ( this . _onDetected ) ;
60
- } ;
69
+ }
61
70
62
- _onDetected = ( result ) => {
63
- this . props . onDetected ( result ) ;
71
+ _onDetected = ( result : any ) => {
72
+ const { onDetected } = this . props ;
73
+ onDetected ( result ) ;
64
74
Quagga . stop ( ) ;
65
75
} ;
66
76
67
- state = {
68
- isHidden : false ,
69
- } ;
70
-
71
77
_onClose = ( ) => {
72
- this . setState ( {
73
- isHidden : ! this . state . isHidden ,
74
- } ) ;
75
- this . props . setScanning ( false ) ;
78
+ const { isHidden } = this . state ;
79
+ this . setState ( { isHidden : ! isHidden } ) ;
80
+ const { setScanning } = this . props ;
81
+ setScanning ( false ) ;
76
82
Quagga . stop ( ) ;
77
83
} ;
78
84
79
85
render ( ) {
80
- const vid = {
86
+ const { isHidden } = this . state ;
87
+
88
+ const vid : React . CSSProperties = {
81
89
position : "fixed" ,
82
- zIndex : " 999" ,
83
- left : "0px" ,
84
- top : "0px" ,
90
+ zIndex : 999 ,
91
+ left : 0 ,
92
+ top : 0 ,
85
93
} ;
86
94
87
95
return (
88
- ! this . state . isHidden && (
96
+ ! isHidden && (
89
97
< >
90
98
< div id = "controls" >
91
99
< span id = "close" >
@@ -115,19 +123,33 @@ class Scanner extends Component {
115
123
}
116
124
}
117
125
118
- class Result extends Component {
119
- render ( ) {
120
- const result = this . props . result ;
126
+ interface ResultProps {
127
+ result : any ;
128
+ }
121
129
130
+ class Result extends Component < ResultProps > {
131
+ render ( ) {
132
+ const { result } = this . props ;
122
133
if ( ! result ) {
123
134
return null ;
124
135
}
125
136
return result . codeResult . code ;
126
137
}
127
138
}
128
139
129
- class Scan extends React . Component {
130
- state = {
140
+ interface ScanProps {
141
+ onDetected : ( barcode : string ) => void ;
142
+ handleSubmit : ( barcode : string , obj : object ) => void ;
143
+ }
144
+
145
+ interface ScanState {
146
+ scanning : boolean ;
147
+ results : any [ ] ;
148
+ codeResult : string ;
149
+ }
150
+
151
+ class Scan extends React . Component < ScanProps , ScanState > {
152
+ state : ScanState = {
131
153
scanning : false ,
132
154
results : [ ] ,
133
155
codeResult : "" ,
@@ -137,19 +159,19 @@ class Scan extends React.Component {
137
159
this . setState ( { scanning : true } ) ;
138
160
} ;
139
161
140
- _onDetected = ( result ) => {
141
- this . setState ( {
142
- results : this . state . results . concat ( [ result ] ) ,
143
- codeResult : result . codeResult . code ,
144
- } ) ;
145
- this . setState ( { scanning : ! this . state . scanning } ) ;
146
- let barcode = result . codeResult . code ;
147
- this . props . onDetected ( barcode ) ;
162
+ _onDetected = ( result : any ) => {
163
+ const { onDetected, handleSubmit } = this . props ;
164
+ const { results } = this . state ;
165
+ const newResults = [ ...results , result ] ;
166
+ const codeResult = result . codeResult . code ;
167
+ this . setState ( { results : newResults , codeResult, scanning : false } ) ;
168
+ onDetected ( codeResult ) ;
148
169
Quagga . stop ( ) ;
149
- this . props . handleSubmit ( barcode , { } ) ;
170
+ handleSubmit ( codeResult , { } ) ;
150
171
} ;
151
172
152
173
render ( ) {
174
+ const { scanning } = this . state ;
153
175
return (
154
176
< >
155
177
< button
@@ -161,7 +183,7 @@ class Scan extends React.Component {
161
183
>
162
184
< span className = "icon-barcode" />
163
185
</ button >
164
- { this . state . scanning ? (
186
+ { scanning ? (
165
187
< Scanner
166
188
onDetected = { this . _onDetected }
167
189
setScanning = { ( scanning ) => this . setState ( { scanning } ) }
0 commit comments