diff --git a/src/components/session/context.js b/src/components/session/context.js new file mode 100644 index 0000000..ea7a851 --- /dev/null +++ b/src/components/session/context.js @@ -0,0 +1,5 @@ +import React from "react"; + +const AuthUserContext = React.createContext(null); + +export default AuthUserContext; diff --git a/src/components/session/index.js b/src/components/session/index.js new file mode 100644 index 0000000..3c0e3e8 --- /dev/null +++ b/src/components/session/index.js @@ -0,0 +1,4 @@ +import AuthUserContext from "./context"; +import withAuthentication from "./withAuthentication"; + +export { AuthUserContext, withAuthentication }; diff --git a/src/components/session/withAuthentication.js b/src/components/session/withAuthentication.js new file mode 100644 index 0000000..aa05977 --- /dev/null +++ b/src/components/session/withAuthentication.js @@ -0,0 +1,45 @@ +import React from "react"; + +import AuthUserContext from "./context"; +import { withFirebase } from "../firebase"; + +const withAuthentication = Component => { + class WithAuthentication extends React.Component { + constructor(props) { + super(props); + + this.state = { + authUser: JSON.parse(localStorage.getItem("authUser")) + }; + } + + componentDidMount() { + this.listener = this.props.firebase.auth.onAuthStateChanged( + authUser => { + localStorage.setItem("authUser", JSON.stringify(authUser)); + this.setState({ authUser }); + }, + () => { + localStorage.removeItem("authUser"); + this.setState({ authUser: null }); + } + ); + } + + componentWillUnmount() { + this.listener(); + } + + render() { + return ( + + + + ); + } + } + + return withFirebase(WithAuthentication); +}; + +export default withAuthentication;