mirror of
https://github.com/abhay-raizada/PeerScribe.git
synced 2026-04-27 00:34:03 +00:00
Store added pharmacy in local storage
This commit is contained in:
@@ -1,6 +1,7 @@
|
|||||||
import {useState} from 'react';
|
import {useState} from 'react';
|
||||||
import {Alert, Button, Modal, Text, TextInput, View} from 'react-native';
|
import {Alert, Button, Modal, Text, TextInput, View} from 'react-native';
|
||||||
import {Section} from '../common/Section';
|
import {Section} from '../common/Section';
|
||||||
|
import {getData, storeData} from '../../utils/localStorage';
|
||||||
|
|
||||||
export const AddPharmacy = ({
|
export const AddPharmacy = ({
|
||||||
isVisible,
|
isVisible,
|
||||||
@@ -24,6 +25,31 @@ export const AddPharmacy = ({
|
|||||||
const handleName = (value: string) => {
|
const handleName = (value: string) => {
|
||||||
setName(value);
|
setName(value);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
async function handleAddClick() {
|
||||||
|
if (!npub || !relay || !name) {
|
||||||
|
Alert.alert(
|
||||||
|
'Missing Inputs',
|
||||||
|
'Please enter name, npub and relay of the Pharmacy',
|
||||||
|
);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (npub.length !== 63 || !npub.startsWith('npub1')) {
|
||||||
|
Alert.alert('Invalid Npub');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
let pharmacyListString = (await getData('pharmacyList')) || '[]';
|
||||||
|
let pharmacyList = JSON.parse(pharmacyListString) as Array<{
|
||||||
|
label: string;
|
||||||
|
npub: string;
|
||||||
|
relay: string;
|
||||||
|
}>;
|
||||||
|
pharmacyList = [...pharmacyList, {label: name, relay: relay, npub: npub}];
|
||||||
|
await storeData('pharmacyList', JSON.stringify(pharmacyList));
|
||||||
|
|
||||||
|
onAdd(npub, relay, name);
|
||||||
|
}
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Modal
|
<Modal
|
||||||
visible={isVisible}
|
visible={isVisible}
|
||||||
@@ -93,16 +119,7 @@ export const AddPharmacy = ({
|
|||||||
<Button title="Cancel" onPress={() => onClose()}></Button>
|
<Button title="Cancel" onPress={() => onClose()}></Button>
|
||||||
</View>
|
</View>
|
||||||
<View style={{margin: 10}}>
|
<View style={{margin: 10}}>
|
||||||
<Button
|
<Button title="Add" onPress={handleAddClick}></Button>
|
||||||
title="Add"
|
|
||||||
onPress={() => {
|
|
||||||
if (!npub || !relay || !name)
|
|
||||||
Alert.alert(
|
|
||||||
'Missing Inputs',
|
|
||||||
'Please enter name, npub and relay of the Pharmacy',
|
|
||||||
);
|
|
||||||
onAdd(npub, relay, name);
|
|
||||||
}}></Button>
|
|
||||||
</View>
|
</View>
|
||||||
</View>
|
</View>
|
||||||
</Section>
|
</Section>
|
||||||
|
|||||||
@@ -1,15 +1,16 @@
|
|||||||
import {Dropdown} from 'react-native-element-dropdown';
|
import {Dropdown} from 'react-native-element-dropdown';
|
||||||
import {Section} from '../common/Section';
|
import {Section} from '../common/Section';
|
||||||
import {Button, Dimensions, Text, View} from 'react-native';
|
import {Button, Dimensions, Text, View} from 'react-native';
|
||||||
import React, {useState} from 'react';
|
import React, {useEffect, useState} from 'react';
|
||||||
import {AddPharmacy} from './AddPharmacy';
|
import {AddPharmacy} from './AddPharmacy';
|
||||||
|
import {getData} from '../../utils/localStorage';
|
||||||
|
|
||||||
export const pharmacyData = [
|
export const pharmacyData = [
|
||||||
{
|
{
|
||||||
label: 'Pharmacy A',
|
label: 'Default pharmacy',
|
||||||
value: 'A',
|
value: 'default',
|
||||||
npub: 'npub1tea09rtjeuzgk4gjajzry37wuyv7h02d4zw38cpadcrkg5yt0qhqncr7km',
|
npub: 'npub1tea09rtjeuzgk4gjajzry37wuyv7h02d4zw38cpadcrkg5yt0qhqncr7km',
|
||||||
relays: ['wss://relay.damus.io'],
|
relay: 'wss://relay.damus.io',
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: ' + Add Pharmacy',
|
label: ' + Add Pharmacy',
|
||||||
@@ -27,6 +28,20 @@ export const PharmacyPicker: React.FC<PharmacyPickerProps> = ({
|
|||||||
handleLocationChange,
|
handleLocationChange,
|
||||||
}) => {
|
}) => {
|
||||||
const [showAddPharmacyModal, setShowAddPharmacyModal] = useState(false);
|
const [showAddPharmacyModal, setShowAddPharmacyModal] = useState(false);
|
||||||
|
const [pharmacyList, setPharmacyList] = useState(pharmacyData);
|
||||||
|
const [initialized, setInitialized] = useState(false);
|
||||||
|
|
||||||
|
const initialize = async () => {
|
||||||
|
let pharmacyListString = (await getData('pharmacyList')) || '[]';
|
||||||
|
let newPharmacyList = JSON.parse(pharmacyListString);
|
||||||
|
let storePharmacyList = [...newPharmacyList, ...pharmacyList];
|
||||||
|
setPharmacyList(storePharmacyList);
|
||||||
|
setInitialized(true);
|
||||||
|
handleLocationChange(storePharmacyList[0]);
|
||||||
|
};
|
||||||
|
useEffect(() => {
|
||||||
|
if (!initialized) initialize();
|
||||||
|
}, []);
|
||||||
|
|
||||||
const renderItem = (item: any) => {
|
const renderItem = (item: any) => {
|
||||||
if (item.value === 'custom') {
|
if (item.value === 'custom') {
|
||||||
@@ -56,7 +71,7 @@ export const PharmacyPicker: React.FC<PharmacyPickerProps> = ({
|
|||||||
<Text style={{color: 'grey', paddingBottom: 5}}>
|
<Text style={{color: 'grey', paddingBottom: 5}}>
|
||||||
Npub: {item.npub}
|
Npub: {item.npub}
|
||||||
</Text>
|
</Text>
|
||||||
<Text style={{color: 'grey'}}>Relays: {item.relays.join(', ')}</Text>
|
<Text style={{color: 'grey'}}>Relay: {item.relay}</Text>
|
||||||
</View>
|
</View>
|
||||||
</View>
|
</View>
|
||||||
);
|
);
|
||||||
@@ -67,11 +82,11 @@ export const PharmacyPicker: React.FC<PharmacyPickerProps> = ({
|
|||||||
<Section title="Choose a Pharmacy">
|
<Section title="Choose a Pharmacy">
|
||||||
<View style={{width: width - 40}}>
|
<View style={{width: width - 40}}>
|
||||||
<Dropdown
|
<Dropdown
|
||||||
data={pharmacyData}
|
data={pharmacyList}
|
||||||
labelField={'label'}
|
labelField={'label'}
|
||||||
valueField={'label'}
|
valueField={'label'}
|
||||||
onChange={handleLocationChange}
|
onChange={handleLocationChange}
|
||||||
value={pharmacyData[0]}
|
value={pharmacyList[0]}
|
||||||
renderItem={renderItem}
|
renderItem={renderItem}
|
||||||
style={{width: '100%'}}
|
style={{width: '100%'}}
|
||||||
placeholderStyle={{color: 'white'}}
|
placeholderStyle={{color: 'white'}}
|
||||||
@@ -85,6 +100,7 @@ export const PharmacyPicker: React.FC<PharmacyPickerProps> = ({
|
|||||||
setShowAddPharmacyModal(false);
|
setShowAddPharmacyModal(false);
|
||||||
}}
|
}}
|
||||||
onAdd={() => {
|
onAdd={() => {
|
||||||
|
initialize();
|
||||||
setShowAddPharmacyModal(false);
|
setShowAddPharmacyModal(false);
|
||||||
}}
|
}}
|
||||||
/>
|
/>
|
||||||
|
|||||||
@@ -47,11 +47,17 @@ export const PrescriptionCreator = () => {
|
|||||||
const [selectedPharmacyId, setSelectedPharmacyId] = useState(
|
const [selectedPharmacyId, setSelectedPharmacyId] = useState(
|
||||||
pharmacyData[0].npub,
|
pharmacyData[0].npub,
|
||||||
);
|
);
|
||||||
const [selectedPharmacyRelays, setSelectedPharmacyRelays] = useState([]);
|
const [selectedPharmacyRelays, setSelectedPharmacyRelays] = useState<
|
||||||
|
Array<string>
|
||||||
|
>([pharmacyData[0].relay!]);
|
||||||
|
|
||||||
const handleLocationChange = (item: any) => {
|
const handleLocationChange = (item: {
|
||||||
|
name: string;
|
||||||
|
npub: string;
|
||||||
|
relay: string;
|
||||||
|
}) => {
|
||||||
setSelectedPharmacyId(item.npub);
|
setSelectedPharmacyId(item.npub);
|
||||||
setSelectedPharmacyRelays(item.relays);
|
setSelectedPharmacyRelays([item.relay]);
|
||||||
};
|
};
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
@@ -119,10 +125,18 @@ export const PrescriptionCreator = () => {
|
|||||||
pubkey: pk,
|
pubkey: pk,
|
||||||
};
|
};
|
||||||
const finalEvent = finalizeEvent(baseKind4Event, sk);
|
const finalEvent = finalizeEvent(baseKind4Event, sk);
|
||||||
|
console.log(
|
||||||
|
'FINAL EVENT IS ',
|
||||||
|
finalEvent,
|
||||||
|
'relays are',
|
||||||
|
selectedPharmacyRelays,
|
||||||
|
);
|
||||||
const pool = new SimplePool();
|
const pool = new SimplePool();
|
||||||
console.log('publishing event');
|
console.log('publishing event');
|
||||||
await Promise.allSettled(pool.publish(selectedPharmacyRelays, finalEvent));
|
let messages = await Promise.allSettled(
|
||||||
console.log('Event Published');
|
pool.publish(selectedPharmacyRelays, finalEvent),
|
||||||
|
);
|
||||||
|
console.log('Messages from relays', messages);
|
||||||
Alert.alert('Prescription Sent to the pharmacy!');
|
Alert.alert('Prescription Sent to the pharmacy!');
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -10,16 +10,16 @@
|
|||||||
"test": "jest"
|
"test": "jest"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
|
"@react-native-async-storage/async-storage": "^1.24.0",
|
||||||
"@react-native-community/datetimepicker": "^8.0.1",
|
"@react-native-community/datetimepicker": "^8.0.1",
|
||||||
"@react-native-community/segmented-control": "^2.2.2",
|
"@react-native-community/segmented-control": "^2.2.2",
|
||||||
"@react-native-community/slider": "^4.5.0",
|
"@react-native-community/slider": "^4.5.0",
|
||||||
"@react-native-picker/picker": "^2.6.1",
|
"@react-native-picker/picker": "^2.6.1",
|
||||||
|
"@rneui/base": "^4.0.0-rc.8",
|
||||||
|
"@rneui/themed": "^4.0.0-rc.8",
|
||||||
"buffer": "^6.0.3",
|
"buffer": "^6.0.3",
|
||||||
"events": "^3.3.0",
|
"events": "^3.3.0",
|
||||||
"nostr-tools": "^2.3.1",
|
"nostr-tools": "^2.3.1",
|
||||||
"react-native-safe-area-context": "^4.5.0",
|
|
||||||
"@rneui/base": "^4.0.0-rc.8",
|
|
||||||
"@rneui/themed": "^4.0.0-rc.8",
|
|
||||||
"react": "18.2.0",
|
"react": "18.2.0",
|
||||||
"react-native": "0.73.4",
|
"react-native": "0.73.4",
|
||||||
"react-native-crypto": "^2.2.0",
|
"react-native-crypto": "^2.2.0",
|
||||||
@@ -29,6 +29,7 @@
|
|||||||
"react-native-get-random-values": "^1.11.0",
|
"react-native-get-random-values": "^1.11.0",
|
||||||
"react-native-picker-select": "^9.0.1",
|
"react-native-picker-select": "^9.0.1",
|
||||||
"react-native-randombytes": "^3.6.1",
|
"react-native-randombytes": "^3.6.1",
|
||||||
|
"react-native-safe-area-context": "^4.5.0",
|
||||||
"react-native-url-polyfill": "^2.0.0",
|
"react-native-url-polyfill": "^2.0.0",
|
||||||
"react-native-vector-icons": "^10.1.0",
|
"react-native-vector-icons": "^10.1.0",
|
||||||
"react-native-webview": "^13.8.4",
|
"react-native-webview": "^13.8.4",
|
||||||
|
|||||||
29
utils/localStorage.ts
Normal file
29
utils/localStorage.ts
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
import AsyncStorage from '@react-native-async-storage/async-storage';
|
||||||
|
|
||||||
|
export const storeData = async (key: string, value: string): Promise<void> => {
|
||||||
|
try {
|
||||||
|
await AsyncStorage.setItem(key, value);
|
||||||
|
console.log('Data stored successfully');
|
||||||
|
} catch (error) {
|
||||||
|
console.error('Failed to store data:', error);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
export const getData = async (key: string): Promise<string | null> => {
|
||||||
|
try {
|
||||||
|
const value = await AsyncStorage.getItem(key);
|
||||||
|
return value;
|
||||||
|
} catch (error) {
|
||||||
|
console.error('Failed to retrieve data:', error);
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
export const removeData = async (key: string): Promise<void> => {
|
||||||
|
try {
|
||||||
|
await AsyncStorage.removeItem(key);
|
||||||
|
console.log('Data removed successfully');
|
||||||
|
} catch (error) {
|
||||||
|
console.error('Failed to remove data:', error);
|
||||||
|
}
|
||||||
|
};
|
||||||
19
yarn.lock
19
yarn.lock
@@ -1555,6 +1555,13 @@
|
|||||||
"@nodelib/fs.scandir" "2.1.5"
|
"@nodelib/fs.scandir" "2.1.5"
|
||||||
fastq "^1.6.0"
|
fastq "^1.6.0"
|
||||||
|
|
||||||
|
"@react-native-async-storage/async-storage@^1.24.0":
|
||||||
|
version "1.24.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/@react-native-async-storage/async-storage/-/async-storage-1.24.0.tgz#888efbc62a26f7d9464b32f4d3027b7f2771999b"
|
||||||
|
integrity sha512-W4/vbwUOYOjco0x3toB8QCr7EjIP6nE9G7o8PMguvvjYT5Awg09lyV4enACRx4s++PPulBiBSjL0KTFx2u0Z/g==
|
||||||
|
dependencies:
|
||||||
|
merge-options "^3.0.4"
|
||||||
|
|
||||||
"@react-native-community/cli-clean@12.3.2":
|
"@react-native-community/cli-clean@12.3.2":
|
||||||
version "12.3.2"
|
version "12.3.2"
|
||||||
resolved "https://registry.yarnpkg.com/@react-native-community/cli-clean/-/cli-clean-12.3.2.tgz#d4f1730c3d22d816b4d513d330d5f3896a3f5921"
|
resolved "https://registry.yarnpkg.com/@react-native-community/cli-clean/-/cli-clean-12.3.2.tgz#d4f1730c3d22d816b4d513d330d5f3896a3f5921"
|
||||||
@@ -4380,6 +4387,11 @@ is-path-inside@^3.0.3:
|
|||||||
resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283"
|
resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283"
|
||||||
integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==
|
integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==
|
||||||
|
|
||||||
|
is-plain-obj@^2.1.0:
|
||||||
|
version "2.1.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-2.1.0.tgz#45e42e37fccf1f40da8e5f76ee21515840c09287"
|
||||||
|
integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==
|
||||||
|
|
||||||
is-plain-object@^2.0.4:
|
is-plain-object@^2.0.4:
|
||||||
version "2.0.4"
|
version "2.0.4"
|
||||||
resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677"
|
resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677"
|
||||||
@@ -5207,6 +5219,13 @@ memoize-one@^5.0.0:
|
|||||||
resolved "https://registry.yarnpkg.com/memoize-one/-/memoize-one-5.2.1.tgz#8337aa3c4335581839ec01c3d594090cebe8f00e"
|
resolved "https://registry.yarnpkg.com/memoize-one/-/memoize-one-5.2.1.tgz#8337aa3c4335581839ec01c3d594090cebe8f00e"
|
||||||
integrity sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q==
|
integrity sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q==
|
||||||
|
|
||||||
|
merge-options@^3.0.4:
|
||||||
|
version "3.0.4"
|
||||||
|
resolved "https://registry.yarnpkg.com/merge-options/-/merge-options-3.0.4.tgz#84709c2aa2a4b24c1981f66c179fe5565cc6dbb7"
|
||||||
|
integrity sha512-2Sug1+knBjkaMsMgf1ctR1Ujx+Ayku4EdJN4Z+C2+JzoeF7A3OZ9KM2GY0CpQS51NR61LTurMJrRKPhSs3ZRTQ==
|
||||||
|
dependencies:
|
||||||
|
is-plain-obj "^2.1.0"
|
||||||
|
|
||||||
merge-stream@^2.0.0:
|
merge-stream@^2.0.0:
|
||||||
version "2.0.0"
|
version "2.0.0"
|
||||||
resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60"
|
resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60"
|
||||||
|
|||||||
Reference in New Issue
Block a user