import {Alert, Appearance, Dimensions, Image, Text, View} from 'react-native'; import {Colors} from 'react-native/Libraries/NewAppScreen'; import {useEffect, useState} from 'react'; import {Button} from '@ant-design/react-native'; // import { SendPrescription } from './sendPrescription'; import {Dropdown} from 'react-native-element-dropdown'; import { SimplePool, UnsignedEvent, finalizeEvent, getPublicKey, nip04, nip19, } from 'nostr-tools'; import EncryptedStorage from 'react-native-encrypted-storage'; import {ImportNsec} from './ImportNsec'; import {Section} from './Section'; import {PatientForm} from './PatientForm'; import {AddressForm} from './AddressForm'; import {MedicineForm} from './MedicineForm'; function OBJtoXML(obj: any) { var xml = ''; for (var prop in obj) { xml += '<' + prop + '>'; if (Array.isArray(obj[prop])) { for (var array of obj[prop]) { // A real botch fix here xml += ''; xml += '<' + prop + '>'; xml += OBJtoXML(new Object(array)); } } else if (typeof obj[prop] == 'object') { xml += OBJtoXML(new Object(obj[prop])); } else { xml += obj[prop]; } xml += ''; } var xml = xml.replace(/<\/?[0-9]{1,}>/g, ''); return xml; } const colorScheme = Appearance.getColorScheme(); const backgroundStyle = { backgroundColor: Colors.darker, }; const width = Dimensions.get('window').width; //full width const height = Dimensions.get('window').height; const locationData = [ { label: 'Pharmacy A', value: 'A', npub: 'npub1tea09rtjeuzgk4gjajzry37wuyv7h02d4zw38cpadcrkg5yt0qhqncr7km', relays: ['wss://relay.damus.io'], }, { label: 'Pharmacy B', value: 'B', npub: 'npub1tea09rtjeuzgk4gjajzry37wuyv7h02d4zw38cpadcrkg5yt0qhqncr7km', relays: ['wss://relay.primal.net'], }, { label: 'Pharmacy C', value: 'C', npub: 'npub1tea09rtjeuzgk4gjajzry37wuyv7h02d4zw38cpadcrkg5yt0qhqncr7km', relays: ['wss://relay.hllo.live'], }, { label: 'Pharmacy D', value: 'D', npub: 'npub1tea09rtjeuzgk4gjajzry37wuyv7h02d4zw38cpadcrkg5yt0qhqncr7km', relays: ['wss://nos.lol', 'wss://relay.damus.io'], }, ]; const locationDummyData = [{label: 'Pharmacy A', value: 'A'}]; export const PrescriptionCreator = () => { const [showImportNsec, setShowImportNsec] = useState(false); const [loggedInNpub, setLoggedInNpub] = useState(''); const [selectedPharmacyId, setSelectedPharmacyId] = useState( locationData[0].npub, ); const [selectedPharmacyRelays, setSelectedPharmacyRelays] = useState([]); const [finalJSON, setFinalJson] = useState({}); useEffect(() => { async function initialize() { let doctorCredentials = null; try { doctorCredentials = await EncryptedStorage.getItem('user_credentials'); if (!doctorCredentials) { setShowImportNsec(true); } else { setLoggedInNpub( nip19.npubEncode( getPublicKey(nip19.decode(doctorCredentials).data as Uint8Array), ), ); } } catch (e) { console.log('Error getting credentials', e); } } initialize(); }, []); const renderItem = (item: any) => { return ( {item.label} Npub: {item.npub} Relays: {item.relays.join(', ')} ); }; const nestedFormCallback = ( xmlTag: string, value: Object | Array | string, ) => { console.log('Filling', xmlTag, value); setFinalJson({...finalJSON, [xmlTag]: value}); }; const handleLocationChange = (item: any) => { setSelectedPharmacyId(item.npub); setSelectedPharmacyRelays(item.relays); }; const handleImportNsec = (nsec: string) => { EncryptedStorage.setItem('user_credentials', nsec); if (nsec.startsWith('nsec1') && nsec.length !== 63) { Alert.alert('not a valid nsec!'); return; } setLoggedInNpub( nip19.npubEncode(getPublicKey(nip19.decode(nsec).data as Uint8Array)), ); setShowImportNsec(false); }; const handleButtonPress = () => { console.log('Final JSON is', finalJSON); const xml = OBJtoXML({prescription: finalJSON}); console.log('XML is...', xml, typeof xml); sendPrescription(xml); }; const sendPrescription = async (xml: string) => { console.log('Will generate IDs'); const sk = nip19.decode( (await EncryptedStorage.getItem('user_credentials')) as `nsec1${string}`, ).data as Uint8Array; const pk = getPublicKey(sk); const pharmacyId = nip19.decode(selectedPharmacyId).data as string; console.log('Got ids'); console.log('content is ', xml); const baseKind4Event: UnsignedEvent = { kind: 4, tags: [['p', pharmacyId]], content: await nip04.encrypt(sk, pharmacyId, `${xml}`), created_at: Math.floor(Date.now() / 1000), pubkey: pk, }; const finalEvent = finalizeEvent(baseKind4Event, sk); const pool = new SimplePool(); console.log('publishing event'); await Promise.allSettled(pool.publish(selectedPharmacyRelays, finalEvent)); console.log('Event Published'); Alert.alert('Prescription Sent to the pharmacy!'); }; return (
From the practice of {loggedInNpub}
{ setShowImportNsec(false); }} onPress={handleImportNsec} />
); };