1+ import React , { Component } from 'react' ;
2+ import { StyleSheet , View , Image , Button , FlatList , TouchableOpacity } from 'react-native' ;
3+ import { Text , Card , Divider } from 'react-native-elements' ;
4+ import AsyncStorage from '@react-native-async-storage/async-storage' ;
5+ import FontAwesome5 from 'react-native-vector-icons/FontAwesome5' ;
6+
7+ import Moment from 'moment' ;
8+
9+ import { CardStyles as styles } from '../themes/CardStyles'
10+
11+ const VACCINE_CODES = {
12+ 54 :'adenovirus, type 4' ,
13+ 55 :'adenovirus, type 7' ,
14+ 82 :'adenovirus, unspecified formulation' ,
15+ 24 :'anthrax' ,
16+ 19 :'BCG' ,
17+ 27 :'botulinum antitoxin' ,
18+ 26 :'cholera, unspecified formulation' ,
19+ 29 :'CMVIG' ,
20+ 56 :'dengue fever' ,
21+ 12 :'diphtheria antitoxin' ,
22+ 28 :'DT (pediatric)' ,
23+ 20 :'DTaP' ,
24+ 106 :'DTaP, 5 pertussis antigens' ,
25+ 107 :'DTaP, unspecified formulation' ,
26+ 110 :'DTaP-Hep B-IPV' ,
27+ 50 :'DTaP-Hib' ,
28+ 120 :'DTaP-Hib-IPV' ,
29+ 130 :'DTaP-IPV' ,
30+ 1 :'DTP' ,
31+ 22 :'DTP-Hib' ,
32+ 102 :'DTP-Hib-Hep B' ,
33+ 57 :'hantavirus' ,
34+ 52 :'Hep A, adult' ,
35+ 83 :'Hep A, ped/adol, 2 dose' ,
36+ 84 :'Hep A, ped/adol, 3 dose' ,
37+ 31 :'Hep A, pediatric, unspecified formulation' ,
38+ 85 :'Hep A, unspecified formulation' ,
39+ 104 :'Hep A-Hep B' ,
40+ 30 :'HBIG' ,
41+ 8 :'Hep B, adolescent or pediatric' ,
42+ 42 :'Hep B, adolescent/high risk infant' ,
43+ 43 :'Hep B, adult' ,
44+ 44 :'Hep B, dialysis' ,
45+ 45 :'Hep B, unspecified formulation' ,
46+ 58 :'Hep C' ,
47+ 59 :'Hep E' ,
48+ 60 :'herpes simplex 2' ,
49+ 46 :'Hib (PRP-D)' ,
50+ 47 :'Hib (HbOC)' ,
51+ 48 :'Hib (PRP-T)' ,
52+ 49 :'Hib (PRP-OMP)' ,
53+ 17 :'Hib, unspecified formulation' ,
54+ 51 :'Hib-Hep B' ,
55+ 61 :'HIV' ,
56+ 118 :'HPV, bivalent' ,
57+ 62 :'HPV, quadrivalent' ,
58+ 86 :'IG' ,
59+ 87 :'IGIV' ,
60+ 14 :'IG, unspecified formulation' ,
61+ 111 :'influenza, live, intranasal' ,
62+ 15 :'influenza, split (incl. purified surface antigen)' ,
63+ 16 :'influenza, whole' ,
64+ 88 :'influenza, unspecified formulation' ,
65+ 123 :'influenza, H5N1-1203' ,
66+ 10 :'IPV' ,
67+ 2 :'OPV' ,
68+ 89 :'polio, unspecified formulation' ,
69+ 39 :'Japanese encephalitis SC' ,
70+ 63 :'Junin virus' ,
71+ 64 :'leishmaniasis' ,
72+ 65 :'leprosy' ,
73+ 66 :'Lyme disease' ,
74+ 3 :'MMR' ,
75+ 4 :'M/R' ,
76+ 94 :'MMRV' ,
77+ 67 :'malaria' ,
78+ 5 :'measles' ,
79+ 68 :'melanoma' ,
80+ 32 :'meningococcal MPSV4' ,
81+ 103 :'meningococcal C conjugate' ,
82+ 114 :'meningococcal MCV4P' ,
83+ 108 :'meningococcal ACWY, unspecified formulation' ,
84+ 7 :'mumps' ,
85+ 69 :'parainfluenza-3' ,
86+ 11 :'pertussis' ,
87+ 23 :'plague' ,
88+ 33 :'pneumococcal polysaccharide PPV23' ,
89+ 100 :'pneumococcal conjugate PCV 7' ,
90+ 109 :'pneumococcal, unspecified formulation' ,
91+ 70 :'Q fever' ,
92+ 18 :'rabies, intramuscular injection' ,
93+ 40 :'rabies, intradermal injection' ,
94+ 90 :'rabies, unspecified formulation' ,
95+ 72 :'rheumatic fever' ,
96+ 73 :'Rift Valley fever' ,
97+ 34 :'RIG' ,
98+ 119 :'rotavirus, monovalent' ,
99+ 122 :'rotavirus, unspecified formulation' ,
100+ 116 :'rotavirus, pentavalent' ,
101+ 74 :'rotavirus, tetravalent' ,
102+ 71 :'RSV-IGIV' ,
103+ 93 :'RSV-MAb' ,
104+ 6 :'rubella' ,
105+ 38 :'rubella/mumps' ,
106+ 76 :'Staphylococcus bacterio lysate' ,
107+ 113 :'Td (adult), 5 Lf tetanus toxoid, preservative free, adsorbed' ,
108+ 9 :'Td (adult), 2 Lf tetanus toxoid, preservative free, adsorbed' ,
109+ 115 :'Tdap' ,
110+ 35 :'tetanus toxoid, adsorbed' ,
111+ 112 :'tetanus toxoid, unspecified formulation' ,
112+ 77 :'tick-borne encephalitis' ,
113+ 13 :'TIG' ,
114+ 95 :'TST-OT tine test' ,
115+ 96 :'TST-PPD intradermal' ,
116+ 97 :'TST-PPD tine test' ,
117+ 98 :'TST, unspecified formulation' ,
118+ 78 :'tularemia vaccine' ,
119+ 91 :'typhoid, unspecified formulation' ,
120+ 25 :'typhoid, oral' ,
121+ 41 :'typhoid, parenteral' ,
122+ 53 :'typhoid, parenteral, AKD (U.S. military)' ,
123+ 101 :'typhoid, ViCPs' ,
124+ 75 :'vaccinia (smallpox)' ,
125+ 105 :'vaccinia (smallpox) diluted' ,
126+ 79 :'vaccinia immune globulin' ,
127+ 21 :'varicella' ,
128+ 81 :'VEE, inactivated' ,
129+ 80 :'VEE, live' ,
130+ 92 :'VEE, unspecified formulation' ,
131+ 36 :'VZIG' ,
132+ 117 :'VZIG (IND)' ,
133+ 37 :'yellow fever' ,
134+ 121 :'zoster live' ,
135+ 998 :'no vaccine administered' ,
136+ 999 :'unknown' ,
137+ 99 :'RESERVED - do not use' ,
138+ 133 :'Pneumococcal conjugate PCV 13' ,
139+ 134 :'Japanese Encephalitis IM' ,
140+ 137 :'HPV, unspecified formulation' ,
141+ 136 :'Meningococcal MCV4O' ,
142+ 135 :'Influenza, high dose seasonal' ,
143+ 131 :'typhus, historical' ,
144+ 132 :'DTaP-IPV-HIB-HEP B, historical' ,
145+ 128 :'Novel Influenza-H1N1-09, all formulations' ,
146+ 125 :'Novel Influenza-H1N1-09, nasal' ,
147+ 126 :'Novel influenza-H1N1-09, preservative-free' ,
148+ 127 :'Novel influenza-H1N1-09' ,
149+ 138 :'Td (adult)' ,
150+ 139 :'Td(adult) unspecified formulation' ,
151+ 140 :'Influenza, seasonal, injectable, preservative free' ,
152+ 129 :'Japanese Encephalitis, unspecified formulation' ,
153+ 141 :'Influenza, seasonal, injectable' ,
154+ 142 :'tetanus toxoid, not adsorbed' ,
155+ 143 :'Adenovirus types 4 and 7' ,
156+ 144 :'influenza, seasonal, intradermal, preservative free' ,
157+ 145 :'RSV-MAb (new)' ,
158+ 146 :'DTaP,IPV,Hib,HepB' ,
159+ 147 :'meningococcal MCV4, unspecified formulation' ,
160+ 148 :'Meningococcal C/Y-HIB PRP' ,
161+ 149 :'influenza, live, intranasal, quadrivalent' ,
162+ 150 :'influenza, injectable, quadrivalent, preservative free' ,
163+ 151 :'influenza nasal, unspecified formulation' ,
164+ 152 :'Pneumococcal Conjugate, unspecified formulation' ,
165+ 153 :'Influenza, injectable, MDCK, preservative free' ,
166+ 154 :'Hep A, IG' ,
167+ 155 :'influenza, recombinant, injectable, preservative free' ,
168+ 156 :'Rho(D)-IG' ,
169+ 157 :'Rho(D) -IG IM' ,
170+ 158 :'influenza, injectable, quadrivalent' ,
171+ 159 :'Rho(D) - Unspecified formulation' ,
172+ 160 :'Influenza A monovalent (H5N1), ADJUVANTED-2013' ,
173+ 801 :'AS03 Adjuvant' ,
174+ 161 :'Influenza, injectable,quadrivalent, preservative free, pediatric' ,
175+ 162 :'meningococcal B, recombinant' ,
176+ 163 :'meningococcal B, OMV' ,
177+ 164 :'meningococcal B, unspecified' ,
178+ 165 :'HPV9' ,
179+ 166 :'influenza, intradermal, quadrivalent, preservative free' ,
180+ 167 :'meningococcal, unknown serogroups' ,
181+ 168 :'influenza, trivalent, adjuvanted' ,
182+ 169 :'Hep A, live attenuated' ,
183+ 170 :'DTAP/IPV/HIB - non-US' ,
184+ 171 :'Influenza, injectable, MDCK, preservative free, quadrivalent' ,
185+ 172 :'cholera, WC-rBS' ,
186+ 173 :'cholera, BivWC' ,
187+ 174 :'cholera, live attenuated' ,
188+ 175 :'Rabies - IM Diploid cell culture' ,
189+ 176 :'Rabies - IM fibroblast culture' ,
190+ 177 :'PCV10' ,
191+ 178 :'OPV bivalent' ,
192+ 179 :'OPV ,monovalent, unspecified' ,
193+ 180 :'tetanus immune globulin' ,
194+ 181 :'anthrax immune globulin' ,
195+ 182 :'OPV, Unspecified' ,
196+ 183 :'Yellow fever vaccine - alt' ,
197+ 184 :'Yellow fever, unspecified formulation' ,
198+ 185 :'influenza, recombinant, quadrivalent,injectable, preservative free' ,
199+ 186 :'Influenza, injectable, MDCK, quadrivalent, preservative' ,
200+ 187 :'zoster recombinant' ,
201+ 188 :'zoster, unspecified formulation' ,
202+ 189 :'HepB-CpG' ,
203+ 190 :'Typhoid conjugate vaccine (TCV)' ,
204+ 191 :'meningococcal A polysaccharide (non-US)' ,
205+ 192 :'meningococcal AC polysaccharide (non-US)' ,
206+ 193 :'Hep A-Hep B, pediatric/adolescent' ,
207+ 194 :'Influenza, Southern Hemisphere' ,
208+ 195 :'DT, IPV adsorbed' ,
209+ 196 :'Td, adsorbed, preservative free, adult use, Lf unspecified' ,
210+ 197 :'influenza, high-dose, quadrivalent' ,
211+ 200 :'influenza, Southern Hemisphere, pediatric, preservative free' ,
212+ 201 :'influenza, Southern Hemisphere, preservative free' ,
213+ 202 :'influenza, Southern Hemisphere, quadrivalent, with preservative' ,
214+ 198 :'DTP-hepB-Hib Pentavalent Non-US' ,
215+ 203 :'meningococcal polysaccharide (groups A, C, Y, W-135) TT conjugate' ,
216+ 205 :'Influenza vaccine, quadrivalent, adjuvanted' ,
217+ 206 :'Smallpox monkeypox vaccine (National Stockpile)' ,
218+ 207 :'COVID-19, mRNA, LNP-S, PF, 100 mcg/0.5 mL dose' ,
219+ 208 :'COVID-19, mRNA, LNP-S, PF, 30 mcg/0.3 mL dose' ,
220+ 213 :'SARS-COV-2 (COVID-19) vaccine, UNSPECIFIED' ,
221+ 210 :'COVID-19 vaccine, vector-nr, rS-ChAdOx1, PF, 0.5 mL ' ,
222+ 212 :'COVID-19 vaccine, vector-nr, rS-Ad26, PF, 0.5 mL' ,
223+ 204 :'Ebola Zaire vaccine, live, recombinant, 1mL dose' ,
224+ 214 :'Ebola, unspecified' ,
225+ 211 :'COVID-19 vaccine, Subunit, rS-nanoparticle+Matrix-M1 Adjuvant, PF, 0.5 mL'
226+ }
227+
228+
229+ export default class SHCCard extends Component {
230+
231+ patientRecords = ( ) => {
232+ return this . props . detail . cert . vc . credentialSubject . fhirBundle . entry . filter ( entry => entry . resource . resourceType === "Patient" ) ;
233+ }
234+
235+ otherRecords = ( ) => {
236+ return this . props . detail . cert . vc . credentialSubject . fhirBundle . entry . filter ( entry => entry . resource . resourceType !== "Patient" ) ;
237+ }
238+
239+ patientName = ( ) => {
240+ let pat = this . patientRecords ( ) ;
241+ return pat [ 0 ] . resource . name [ 0 ] . given . join ( ' ' ) + " " + pat [ 0 ] . resource . name [ 0 ] . family
242+ }
243+
244+ patientDob = ( ) => {
245+ let pat = this . patientRecords ( ) ;
246+ return new Date ( pat [ 0 ] . resource . birthDate ) ;
247+ }
248+
249+ issuerName = ( card ) => {
250+ if ( card . pub_key . toLowerCase ( ) === "https://myvaccinerecord.cdph.ca.gov/creds" )
251+ return "State of California"
252+ return card . pub_key . toLowerCase ( ) ;
253+ }
254+
255+ issuedAt = ( card ) => {
256+ return Moment ( new Date ( parseInt ( card . cert . nbf ) * 1000 ) ) . format ( 'MMM DD, YYYY' ) ;
257+ }
258+
259+ showQR = ( card ) => {
260+ this . props . navigation . navigate ( { name : 'QRShow' , params : {
261+ qr : card . rawQR ,
262+ title : this . patientName ( ) ,
263+ detail : "DoB: " + Moment ( this . patientDob ( ) ) . format ( 'MMM DD, YYYY' ) ,
264+ signedBy : this . issuerName ( card ) + " on " + this . issuedAt ( card )
265+ }
266+ } ) ;
267+ }
268+
269+ renderCard = ( ) => {
270+ return (
271+ < View style = { [ styles . card , { backgroundColor :this . props . colors . primary } ] } >
272+ < View style = { { flexDirection :'row' , justifyContent :'space-between' , alignItems :'center' } } >
273+ < Text style = { styles . notes } > { Moment ( this . props . detail . scanDate ) . format ( 'MMM DD, hh:mma' ) } - Vaccine Record</ Text >
274+ < FontAwesome5 style = { styles . button } name = { 'trash' } onPress = { ( ) => this . props . removeItem ( this . props . detail . signature ) } solid />
275+ </ View >
276+
277+ < View style = { { flexDirection :'row' , justifyContent :'space-between' , alignItems :'center' } } >
278+ < Text style = { styles . title } > { this . patientName ( ) } </ Text >
279+ </ View >
280+
281+ < View style = { { flexDirection :'row' , justifyContent :'space-between' , alignItems :'center' } } >
282+ < Text style = { styles . notes } > DoB: { Moment ( this . patientDob ( ) ) . format ( 'MMM DD, YYYY' ) } </ Text >
283+ </ View >
284+
285+ < Divider style = { [ styles . divisor , { borderBottomColor :this . props . colors . cardText } ] } />
286+
287+ < FlatList
288+ data = { this . otherRecords ( ) }
289+ keyExtractor = { item => item . fullUrl }
290+ renderItem = { ( { item} ) => {
291+ return (
292+ < View style = { styles . groupLine } >
293+ < View style = { styles . row } >
294+ < Text style = { styles . notes } > { item . resource . resourceType } at { item . resource . occurrenceDateTime } </ Text >
295+ </ View >
296+
297+ < View style = { styles . row } >
298+ < Text style = { styles . notes } >
299+ Vaccine: { VACCINE_CODES [ item . resource . vaccineCode . coding [ 0 ] . code ] } , Lot #{ item . resource . lotNumber }
300+ </ Text >
301+ </ View >
302+ </ View >
303+ )
304+ } } />
305+
306+ < Divider style = { [ styles . divisor , { borderBottomColor :this . props . colors . cardText } ] } />
307+
308+ < View style = { { flexDirection :'row' , alignItems : 'center' } } >
309+ < FontAwesome5 style = { styles . icon } name = { 'check-circle' } solid />
310+ < Text style = { styles . notes } > { this . issuerName ( this . props . detail ) } on { this . issuedAt ( this . props . detail ) } </ Text >
311+ </ View >
312+ </ View >
313+ ) ;
314+ }
315+
316+
317+ render ( ) {
318+ return this . props . pressable ?
319+ ( < TouchableOpacity onPress = { ( ) => this . showQR ( this . props . detail ) } >
320+ { this . renderCard ( ) }
321+ </ TouchableOpacity >
322+ ) : this . renderCard ( ) ;
323+ }
324+ }
0 commit comments