-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathMainContext.tsx
85 lines (81 loc) · 2.19 KB
/
MainContext.tsx
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
import {
createContext,
useCallback,
useContext,
useEffect,
useState,
} from "react";
import * as SQLite from "expo-sqlite";
import { ReactNode } from "react";
import { isDevice } from "expo-device";
import * as Notifications from "expo-notifications";
import { MedItem } from "./lib/Types";
const db = SQLite.openDatabase("medds");
const MainContext = createContext<{
database: SQLite.WebSQLDatabase;
expoPushToken: string;
fetchData: () => void;
data: MedItem[] | null;
}>({
database: db,
expoPushToken: "",
fetchData: () => {},
data: null,
});
const getPushToken = () => {
if (!isDevice) {
return Promise.reject("Must use physical device for Push Notifications");
}
try {
return Notifications.getPermissionsAsync()
.then((statusResult) => {
return statusResult.status !== "granted"
? Notifications.requestPermissionsAsync()
: statusResult;
})
.then((statusResult) => {
if (statusResult.status !== "granted") {
throw "Failed to get push token for push notification!";
}
return Notifications.getExpoPushTokenAsync();
})
.then((tokenData) => tokenData.data);
} catch (error) {
return Promise.reject("Couldn't check notifications permissions");
}
};
export function MainContextProvider({ children }: { children: ReactNode }) {
const [expoPushToken, setExpoPushToken] = useState<string>("");
const [data, setData] = useState<MedItem[] | null>(null);
const getData = () => {
db.exec(
[{ sql: "SELECT * FROM Medds ORDER BY id DESC;", args: [] }],
true,
(err, results) => {
if (results && "rows" in results[0] && results[0].rows.length !== 0) {
setData(results[0]?.rows as MedItem[]);
} else {
setData(null);
}
}
);
};
useEffect(() => {
getData();
getPushToken().then((pushToken) => {
if (pushToken) {
setExpoPushToken(pushToken);
}
});
}, []);
return (
<MainContext.Provider
value={{ database: db, expoPushToken, fetchData: getData, data }}
>
{children}
</MainContext.Provider>
);
}
export const useMainContext = () => {
return useContext(MainContext);
};