Skip to content

Commit a10720b

Browse files
commit code for part three v1.3
1 parent 1b15198 commit a10720b

File tree

4 files changed

+96
-32
lines changed

4 files changed

+96
-32
lines changed

src/App.tsx

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import "./env";
33
import React, { Suspense } from "react";
44
import { FirebaseAppProvider, AuthCheck } from "reactfire";
55

6-
import { IonApp, IonRouterOutlet, IonLoading } from "@ionic/react";
6+
import { IonApp, IonRouterOutlet, IonLoading } from "@ionic/react";
77
import { Route, Redirect } from "react-router-dom";
88
import { IonReactRouter } from "@ionic/react-router";
99

@@ -30,6 +30,7 @@ import Home from "./pages/Home";
3030

3131
import { Plugins } from "@capacitor/core";
3232
import CreateAccount from "./pages/CreateAccount";
33+
import { DataProvider } from "./DataContext";
3334
const { SplashScreen } = Plugins;
3435

3536
// Hide the splash (you should do this on app launch)
@@ -49,7 +50,9 @@ const PrivateRoutes: React.FunctionComponent = () => {
4950
return (
5051
<IonRouterOutlet>
5152
<Route exact path="/home">
52-
<Home />
53+
<DataProvider>
54+
<Home />
55+
</DataProvider>
5356
</Route>
5457
<Redirect exact path="/" to="/home" />
5558
</IonRouterOutlet>
@@ -61,11 +64,11 @@ const App: React.FunctionComponent = () => {
6164
<FirebaseAppProvider firebaseConfig={FIREBASE_CONFIG}>
6265
<IonApp>
6366
<IonReactRouter>
64-
<Suspense fallback={<IonLoading isOpen={true} />}>
65-
<AuthCheck fallback={<PublicRoutes />}>
66-
<PrivateRoutes />
67-
</AuthCheck>
68-
</Suspense>
67+
<Suspense fallback={<IonLoading isOpen={true} />}>
68+
<AuthCheck fallback={<PublicRoutes />}>
69+
<PrivateRoutes />
70+
</AuthCheck>
71+
</Suspense>
6972
</IonReactRouter>
7073
</IonApp>
7174
</FirebaseAppProvider>

src/DataContext.tsx

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
import React from "react";
2+
import { useFirebaseApp, useFirestoreCollectionData } from "reactfire";
3+
import { FIREBASE_COLLECTION_NAME } from "./env";
4+
5+
import { IModalData } from "./components/AddSomethingModal";
6+
7+
interface IState {
8+
dataCollection: null | undefined | any;
9+
addItem: (itemData: IModalData) => Promise<void>;
10+
removeItem: (itemData: IModalData) => Promise<void>;
11+
}
12+
13+
// create the context
14+
export const DataContext = React.createContext<IState | undefined>(undefined);
15+
16+
// create the context provider, we are using use state to ensure that
17+
// we get reactive values from the context...
18+
19+
export const DataProvider: React.FC = ({ children }) => {
20+
// another reactfire hook to get the firebase app
21+
const thingsRef = useFirebaseApp()
22+
.firestore()
23+
.collection(FIREBASE_COLLECTION_NAME);
24+
25+
// another hook to query firebase collection using
26+
// the reference you created above
27+
const data = useFirestoreCollectionData(thingsRef, { idField: "id" });
28+
29+
/**
30+
*
31+
* @param itemData
32+
*/
33+
const addItem = (itemData: IModalData) => {
34+
return thingsRef.doc().set({ ...itemData });
35+
};
36+
37+
/**
38+
*
39+
* @param itemData
40+
*/
41+
const removeItem = (itemData: IModalData) => {
42+
return thingsRef.doc(itemData.id).delete();
43+
};
44+
45+
// the store object
46+
let state = {
47+
dataCollection: data,
48+
addItem,
49+
removeItem,
50+
};
51+
52+
// wrap the application in the provider with the initialized context
53+
return <DataContext.Provider value={state}>{children}</DataContext.Provider>;
54+
};
55+
56+
export default DataContext;
57+
export const useDataProvider = () =>
58+
React.useContext<IState | undefined>(DataContext)!;

src/pages/AddSomethingModal.tsx renamed to src/components/AddSomethingModal.tsx

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import {
1010
} from "@ionic/react";
1111

1212
import { useForm } from "react-hook-form";
13-
import { MyIonTextItem } from "../components/MyIonTextItem";
13+
import { MyIonTextItem } from "./MyIonTextItem";
1414

1515
const AddSomethingModal: React.FunctionComponent<{
1616
onCloseModal: (data: IModalResponse) => Promise<void>;
@@ -78,10 +78,11 @@ const AddSomethingModal: React.FunctionComponent<{
7878

7979
export default AddSomethingModal;
8080

81-
type IModalData = {
81+
export type IModalData = {
8282
podcastName: string;
8383
podcastHost: string;
8484
podcastURL: string;
85+
id? : string;
8586
};
8687

8788
export type IModalResponse = {

src/pages/Home.tsx

Lines changed: 25 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -15,16 +15,14 @@ import {
1515
IonAlert,
1616
} from "@ionic/react";
1717

18-
import {
19-
useFirestoreCollectionData,
20-
useFirebaseApp,
21-
useAuth,
22-
AuthCheck,
23-
} from "reactfire";
18+
import { useAuth, AuthCheck } from "reactfire";
2419
import "firebase/firestore";
25-
import { FIREBASE_COLLECTION_NAME } from "../env";
26-
import AddSomethingModal, { IModalResponse } from "./AddSomethingModal";
20+
import AddSomethingModal, {
21+
IModalResponse,
22+
IModalData,
23+
} from "../components/AddSomethingModal";
2724
import { useHistory } from "react-router";
25+
import { useDataProvider } from "../DataContext";
2826

2927
type IShowAlert = null | {
3028
header: string;
@@ -36,15 +34,9 @@ const Home: React.FunctionComponent = () => {
3634
// reactfire hook to get auth information
3735
const auth = useAuth();
3836
const history = useHistory();
37+
const { addItem, removeItem, dataCollection } = useDataProvider();
3938

40-
// another reactfire hook to get the firebase app
41-
const thingsRef = useFirebaseApp()
42-
.firestore()
43-
.collection(FIREBASE_COLLECTION_NAME);
44-
45-
// another hook to query firebase collection using
46-
// the reference you created above
47-
const data = useFirestoreCollectionData(thingsRef, { idField: "id" });
39+
console.log(dataCollection);
4840

4941
// manages the state to determine if we need to open
5042
// the modal or not
@@ -71,17 +63,27 @@ const Home: React.FunctionComponent = () => {
7163

7264
/**
7365
*
74-
* @param response
66+
* @param item IModalData
67+
*/
68+
const removeSomething = (item: IModalData) => {
69+
removeItem(item)
70+
.then(() => showAlert("Success"))
71+
.catch((error: any) => {
72+
showAlert(error.message, true);
73+
});
74+
};
75+
76+
/**
77+
*
78+
* @param response IModalResponse
7579
*/
7680
const addSomething = async (response: IModalResponse) => {
7781
setShowModal(false);
7882
if (response.hasData) {
7983
alert(JSON.stringify(response.data));
80-
thingsRef
81-
.doc()
82-
.set({ ...response.data })
84+
addItem(response.data!)
8385
.then(() => showAlert("Success"))
84-
.catch((error) => {
86+
.catch((error: any) => {
8587
showAlert(error.message, true);
8688
});
8789
} else {
@@ -138,9 +140,9 @@ const Home: React.FunctionComponent = () => {
138140
<AuthCheck fallback={<IonLoading isOpen={true} />}>
139141
{/* list of items from reactfire */}
140142
<IonList>
141-
{data.map((e: any) => {
143+
{dataCollection.map((e: any) => {
142144
return (
143-
<IonItem key={e.id}>
145+
<IonItem key={e.id} onClick={() => removeSomething(e)}>
144146
<IonLabel className="ion-text-wrap">
145147
<pre>{JSON.stringify(e, null, 2)}</pre>
146148
</IonLabel>

0 commit comments

Comments
 (0)