React Instagram Clone

From bibbleWiki
Revision as of 09:57, 28 March 2022 by Iwiseman (talk | contribs)
Jump to navigation Jump to search

Introduction

This page is about the things I found on the instagram clone created by Karl Hadwin. This was a twelve hour course which aimed to reproduce the social media app Instagram. The repo can be found here

Making the enter key Work for button Click

<button
   type="button"
   title="Sign Out"
   onClick={() => {
     firebase.auth().signOut();
   }}
   onKeyDown={(event) => {
     if (event.key === 'Enter') {
       firebase.auth().signOut();
     }
   }}
>

Example of a listener

This listens for a change in firebase and returns the user logging on.

export default function useAuthListener() {
  const [user, setUser] = useState(JSON.parse(localStorage.getItem('authUser')));
  const { firebase } = useContext(FirebaseContext);

  useEffect(() => {
    const listener = firebase.auth().onAuthStateChanged((authUser) => {
      if (authUser) {
        localStorage.setItem('authUser', JSON.stringify(authUser));
        setUser(authUser);
      } else {
        localStorage.removeItem('authUser');
        setUser(null);
      }
    });

    return () => listener();
  }, [firebase]);

  console.log(`Returning user:`, user);
  return { user };
}

This listener is kicked off with the App and the result is passed down via the Context Provider Pattern

export default function App() {
  const { user } = useAuthListener();

  return (
    <UserContext.Provider value={{ user }}>
      <Router>
        <Suspense fallback={<p>Loading ...</p>}>
          <Routes>
            <Route path={ROUTES.LOGIN} element={<Login />} />
            <Route path={ROUTES.SIGN_UP} element={<SignUp />} />
            <Route path={ROUTES.DASHBOARD} element={<Dashboard />} />
            <Route path="*" element={<NotFound />} />
          </Routes>
        </Suspense>
      </Router>
    </UserContext.Provider>
  );
}

This can now be accessed in components by using the useContext hook in any component being rendered in the app. In this case a component called header

import { useContext } from 'react';

export default function Header() {
  const { user } = useContext(UserContext);
  console.log(user)
  return (
    <header>
    </header>
  );
}