RaysMovieClub/src/App.js

164 lines
4.3 KiB
JavaScript

import { firebaseConfig } from "./config/Config"
import { initializeApp } from "firebase/app"
import { Routes, Route } from "react-router-dom"
import { useState, useEffect } from "react"
import { getAuth,
createUserWithEmailAndPassword,
onAuthStateChanged,
signOut,
signInWithEmailAndPassword } from "firebase/auth";
import { getFirestore,
collection,
getDoc,
doc,
getDocs } from "firebase/firestore";
import {getStorage} from "firebase/storage"
import { Header } from "./components/Header"
import './App.css'
import { About } from "./pages/About"
import { Home } from "./pages/Home"
import { Contact } from "./pages/Contact"
import { Signup } from "./pages/Signup"
import { Signout } from "./pages/Signout"
import { Signin } from "./pages/Signin"
import { Detail } from "./pages/Detail";
// contexts
import { AuthContext } from "./contexts/AuthContext"
import { StorageContext } from "./contexts/StorageContext";
function App() {
const FBapp = initializeApp(firebaseConfig)
const FBauth = getAuth(FBapp)
const FBdb = getFirestore(FBapp)
const FBstorage = getStorage(FBapp)
// navigation array
const navItems = [
{ label: "Home", link: "/" },
{ label: "About", link: "/about" },
{ label: "Contact", link: "/contact" },
{ label: "Create Account", link: "/signup" },
{ label: "Log in", link: "/signin" },
]
// navigation for authenticated user
const AuthnavItems = [
{ label: "Home", link: "/" },
{ label: "About", link: "/about" },
{ label: "Contact", link: "/contact" },
]
/// application states
const [nav, setNav] = useState(navItems)
const [auth, setAuth] = useState(false)
const [data, setData] = useState([])
const [ fetching , setFetching ] = useState( false )
useEffect( () => {
if( data.length === 0 && fetching === false ) {
readData()
setFetching( true )
}
}, [data])
// authentication observer
onAuthStateChanged(FBauth, (user) => {
if( user ) {
// currently authenticated
setAuth( user )
setNav( AuthnavItems )
}
else {
// currently unauthenticated
setAuth( false )
setNav( navItems )
}
})
const saySomething = (word) => {
alert(word)
}
// signing up a user
const signUp = (email, password) => {
createUserWithEmailAndPassword(FBauth, email, password)
.then( (userCredential) => {
// do something
})
.catch((error) => console.log(error.message))
}
const logOut = () => {
signOut(FBauth).then( () => {
// user is signed out
})
}
const signIn = (email, password) => {
return new Promise((resolve, reject) => {
signInWithEmailAndPassword(FBauth, email, password)
.then(() => {
// user is signed in
resolve(true)
})
.catch((error) => {
console.log(error)
reject( error.code )
})
})
}
// function to get data
const readData = async () => {
const querySnapshot = await getDocs( collection(FBdb, "movies") )
let listdata = []
querySnapshot.forEach( (doc) => {
let item = doc.data()
item.id = doc.id
listdata.push( item )
})
setData( listdata )
}
// function to get a single item
const getDocument = async ( itemId) => {
const docRef = doc( FBdb, "movies", itemId )
const docSnap = await getDoc( docRef )
let movie = docSnap.data()
movie.id = itemId
return movie
}
return (
<div className="App">
<Header items={nav} user={auth} />
<AuthContext.Provider value={auth}>
<StorageContext.Provider value={FBstorage}>
<Routes>
<Route path="/" element={<Home items = {data} />} />
<Route path="/about" element={<About greeting="Hey you, this is about page!" handler={saySomething} />} />
<Route path="/contact" element={<Contact greeting="Hey you, this is contact page!" />} />
<Route path="/signup" element={ <Signup handler={signUp}/> } />
<Route path="/signout" element={ <Signout handler={logOut}/> } />
<Route path="/signin" element={ <Signin handler={signIn} authstate={auth}/> } />
<Route path="/detail/:id" element={<Detail handler={getDocument} />} />
</Routes>
</StorageContext.Provider>
</AuthContext.Provider>
</div>
);
}
export default App;