Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
63 commits
Select commit Hold shift + click to select a range
cdd6c3c
test branch
daniellimss Apr 27, 2023
7778c5e
Merge pull request #1 from markcwy-ra/daniel-test
markcwy-ra Apr 27, 2023
e8c63a4
2nd test
daniellimss Apr 27, 2023
b0ea97a
Merge pull request #2 from markcwy-ra/daniel-test2
markcwy-ra Apr 27, 2023
cbdbb3b
Mark test
markcwy-ra Apr 27, 2023
26d170d
Update App.js
markcwy-ra Apr 27, 2023
f7aeabd
Merge pull request #3 from markcwy-ra/mark-test
daniellimss Apr 27, 2023
9d5cd8d
Initial commit: Switch to function components
markcwy-ra Apr 27, 2023
6d30b8d
Added router package
markcwy-ra Apr 27, 2023
227f41a
Firebase & React Router set up
markcwy-ra Apr 27, 2023
9e37580
Added authentication
markcwy-ra Apr 27, 2023
603258c
Added a NavContext to allow easier navigation
markcwy-ra Apr 28, 2023
22465eb
Merge pull request #4 from markcwy-ra/mark-loginflow
markcwy-ra Apr 28, 2023
a855d6b
useContext walkthrough
markcwy-ra Apr 28, 2023
4fe0747
Merge pull request #5 from markcwy-ra/mark-loginflow
markcwy-ra Apr 28, 2023
2440ffd
Added NavBar component
markcwy-ra Apr 28, 2023
d97a64e
Fixed some navigational issues
markcwy-ra Apr 28, 2023
d33fa3e
Added explore page
markcwy-ra Apr 28, 2023
151b9bd
Added list placeholders
markcwy-ra Apr 28, 2023
518fc24
Merge pull request #6 from markcwy-ra/mark-profile
markcwy-ra Apr 30, 2023
467247a
Added poke search
markcwy-ra Apr 30, 2023
110b9ef
Merge pull request #8 from markcwy-ra/mark-explore
daniellimss Apr 30, 2023
9bc3c81
added axios
daniellimss May 2, 2023
080191b
Delete dan-firebase-test.js
markcwy-ra May 2, 2023
6c1f7c0
Merge pull request #9 from markcwy-ra/daniel-search
markcwy-ra May 2, 2023
947c72a
Edits to app.js for firebase
markcwy-ra May 2, 2023
bd8cf0d
Merge pull request #10 from markcwy-ra/mark-edits
markcwy-ra May 2, 2023
26d640e
minor css
daniellimss May 2, 2023
a37bc7d
Merge pull request #11 from markcwy-ra/daniel-search
markcwy-ra May 2, 2023
203ea3e
writing to firebase
daniellimss May 2, 2023
82643d5
writing to firebase
daniellimss May 2, 2023
db10989
Merge pull request #12 from markcwy-ra/daniel-firebase
markcwy-ra May 2, 2023
ba88439
Fixed object writing issue
markcwy-ra May 2, 2023
ef43ab5
Display generated top 10/wish lists
markcwy-ra May 2, 2023
a22edb9
Added Pokestats screen + routing
markcwy-ra May 3, 2023
ddcfec7
Merge pull request #13 from markcwy-ra/mark-lists
markcwy-ra May 3, 2023
1b7b52d
Linked profile to poke stats screens, added some style and poke type css
markcwy-ra May 3, 2023
4f60fff
added pokemon search input validation
daniellimss May 3, 2023
0e6c786
Tried something that didn't work in List.js
markcwy-ra May 4, 2023
5371968
Merge pull request #14 from markcwy-ra/daniel-validation
markcwy-ra May 4, 2023
fcb788a
Merge pull request #15 from markcwy-ra/mark-pokestats
daniellimss May 4, 2023
8b76e06
modified validation and showed image
daniellimss May 4, 2023
3bd8748
Added listordering packages + fixed no pokemon bug
markcwy-ra May 4, 2023
af47bc0
Merge pull request #16 from markcwy-ra/mark-listordering
markcwy-ra May 4, 2023
85bceae
Merge pull request #17 from markcwy-ra/daniel-validation
markcwy-ra May 4, 2023
6ba8a03
trying to include types
daniellimss May 4, 2023
3bec358
temp
markcwy-ra May 4, 2023
65cfa02
Merge pull request #18 from markcwy-ra/mark-temp
markcwy-ra May 4, 2023
9c3b489
Merge pull request #19 from markcwy-ra/daniel-pokeImg
markcwy-ra May 4, 2023
f8ed216
Fixed poke stats not loading bug
markcwy-ra May 4, 2023
1605a22
Added list reordering for profile page
markcwy-ra May 4, 2023
564ba8e
Restructured database to use usernames as keys
markcwy-ra May 4, 2023
4f40d8f
fixed database reorder bug
markcwy-ra May 5, 2023
ce3bf2d
Added ability to delete pokemon from lists on profile page
markcwy-ra May 5, 2023
984e212
Separated header into its own component
markcwy-ra May 5, 2023
54a1cc7
made some css changes
daniellimss May 5, 2023
eb7fa85
minor css
daniellimss May 5, 2023
d986895
Merge pull request #20 from markcwy-ra/daniel-pokesearch
daniellimss May 5, 2023
a932695
Added user search feature
markcwy-ra May 5, 2023
d08e6a6
Started work on explore page, realised i need to make an other-user p…
markcwy-ra May 5, 2023
009a34f
Merge pull request #21 from markcwy-ra/mark-delete
daniellimss May 6, 2023
b41f714
created check for topten prevent further adding
daniellimss May 6, 2023
102fe51
resolved topten and wishlist issue
daniellimss May 8, 2023
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
/build

# misc

.DS_Store
.env.local
.env.development.local
Expand All @@ -21,3 +22,4 @@
npm-debug.log*
yarn-debug.log*
yarn-error.log*
.env
2,132 changes: 2,008 additions & 124 deletions package-lock.json

Large diffs are not rendered by default.

8 changes: 8 additions & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,16 @@
"version": "0.1.0",
"private": true,
"dependencies": {
"@fortawesome/fontawesome-svg-core": "^6.4.0",
"@fortawesome/free-regular-svg-icons": "^6.4.0",
"@fortawesome/free-solid-svg-icons": "^6.4.0",
"@fortawesome/react-fontawesome": "^0.2.0",
"axios": "^1.4.0",
"dotenv": "^16.0.3",
"firebase": "^9.21.0",
"react": "^18.1.0",
"react-dom": "^18.1.0",
"react-router-dom": "^6.10.0",
"react-scripts": "5.0.1"
},
"scripts": {
Expand Down
52 changes: 46 additions & 6 deletions src/App.css
Original file line number Diff line number Diff line change
@@ -1,19 +1,59 @@
* {
margin: 0;
padding: 0;
box-sizing: border-box;
font-family: "Nippo", sans-serif;
}

html,
body,
body #root {
overflow: hidden;
height: 100%;
}

body {
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen",
"Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue",
sans-serif;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
overflow-y: hidden;
}

.App {
height: 100%;
text-align: center;
background-color: #282c34;
padding: 20px;
}

.App-logo {
height: 40vmin;
pointer-events: none;
h1 {
font-size: 45px;
}

.App-header {
background-color: #282c34;
min-height: 100vh;
h2 {
font-size: 36px;
}

.contents {
height: 100%;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
font-size: calc(10px + 2vmin);
color: white;
}

button {
padding: 5px;
height: fit-content;
width: fit-content;
}

form input {
padding: 10px;
border: none;
border-radius: 20px;
}
202 changes: 184 additions & 18 deletions src/App.js
Original file line number Diff line number Diff line change
@@ -1,20 +1,186 @@
import React from "react";
import logo from "./logo.png";
import "./App.css";

class App extends React.Component {
render() {
return (
<div className="App">
<header className="App-header">
<img src={logo} className="App-logo" alt="logo" />
<p>
Edit <code>src/App.js</code> and save to reload.
</p>
</header>
</div>
);
}
}
//--------- Firebase ---------//

import { database, auth } from "./firebase";
import { onAuthStateChanged } from "firebase/auth";
import { ref, onValue, onChildAdded } from "firebase/database";

//----------- React -----------//

import React, { useEffect, useState } from "react";

//-------- React Router --------//

import { Routes, Route, useNavigate, Navigate } from "react-router-dom";

//---------- Screens ----------//

import SplashScreen from "./Screens/SplashScreen/SplashScreen";
import LoginScreen from "./Screens/LoginScreen";
import SignUpScreen from "./Screens/SignUpScreen/SignUpScreen";
import ProfileScreen from "./Screens/ProfileScreen/ProfileScreen";
import PokeStatsScreen from "./Screens/PokeStatsScreen/PokeStatsScreen";
import ExploreScreen from "./Screens/ExploreScreen/ExploreScreen";
import SearchPokeScreen from "./Screens/SearchPokeScreen/SearchPokeScreen";
import SearchUserScreen from "./Screens/SearchUserScreen/SearchUserScreen";

//--------- Variables ---------//

const DB_USERS_KEY = "users";
// const DB_IMAGES_KEY = "images";
const UserContext = React.createContext(null);
const NavContext = React.createContext(null);
const userObj = {
uid: null,
email: null,
name: null,
pic: null,
};

//------------------------------//

const App = () => {
const [user, setUser] = useState(userObj);
const [userList, setUserList] = useState([]);
const [topten, setTopten] = useState(null);
const [toptenorder, setToptenorder] = useState([]);
const [wishlist, setWishlist] = useState(null);
const [wishlistorder, setWishlistorder] = useState(null);

const navigate = useNavigate();
const handleNavigate = (e) => {
navigate(`/${e.target.id}`);
};

useEffect(() => {
const usersRef = ref(database, DB_USERS_KEY);

onChildAdded(usersRef, (data) => {
setUserList((prevUsers) => [...prevUsers, data.key]);
});

onAuthStateChanged(auth, (user) => {
if (user) {
setUser({
uid: user.uid,
email: user.email,
name: user.displayName,
pic: user.photoURL,
});
}
});
}, []);

useEffect(() => {
if (user.uid && user.name) {
const CURRENT_USER_KEY = DB_USERS_KEY + "/" + user.name.toLowerCase();
const toptenRef = ref(database, CURRENT_USER_KEY + "/topten");
const toptenorderRef = ref(database, CURRENT_USER_KEY + "/toptenorder");
const wishlistRef = ref(database, CURRENT_USER_KEY + "/wishlist");
const wishlistorderRef = ref(
database,
CURRENT_USER_KEY + "/wishlistorder"
);
onValue(toptenRef, (snapshot) => {
const data = snapshot.val();
setTopten(data);
});
onValue(toptenorderRef, (snapshot) => {
const data = snapshot.val();
setToptenorder(data);
});
onValue(wishlistRef, (snapshot) => {
const data = snapshot.val();
setWishlist(data);
});
onValue(wishlistorderRef, (snapshot) => {
const data = snapshot.val();
setWishlistorder(data);
});
}
}, [user]);

return (
<NavContext.Provider value={{ navigate, handleNavigate }}>
<UserContext.Provider value={{ user, setUser, DB_USERS_KEY }}>
<div className="App">
<Routes>
<Route
path="/"
element={user.uid ? <Navigate to="/profile" /> : <SplashScreen />}
/>
<Route path="/login" element={<LoginScreen />} />
<Route path="/signup" element={<SignUpScreen />} />
<Route
path="/explore"
element={
user.uid ? (
<ExploreScreen userList={userList} />
) : (
<Navigate to="/" />
)
}
/>
<Route path="/profile">
<Route
index
element={
user.uid ? (
<ProfileScreen
topten={topten}
toptenorder={toptenorder}
setToptenorder={setToptenorder}
wishlist={wishlist}
wishlistorder={wishlistorder}
setWishlistorder={setWishlistorder}
/>
) : (
<Navigate to="/" />
)
}
/>
<Route
path=":link"
element={
user.uid ? (
<PokeStatsScreen topten={topten} wishlist={wishlist} />
) : (
<Navigate to="/" />
)
}
/>
</Route>
<Route
path="/search-poke"
element={
user.uid ? (
<SearchPokeScreen DB_USERS_KEY={DB_USERS_KEY} />
) : (
<Navigate to="/" />
)
}
/>
<Route path="/search">
<Route
index
element={
user.uid ? (
<SearchUserScreen userList={userList} />
) : (
<Navigate to="/" />
)
}
/>
<Route
path=":link"
element={user.uid ? <ProfileScreen /> : <Navigate to="/" />}
/>
</Route>
</Routes>
</div>
</UserContext.Provider>
</NavContext.Provider>
);
};

export default App;
export { UserContext, NavContext };
13 changes: 13 additions & 0 deletions src/Components/HeaderBar/HeaderBar.css
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
#header {
display: flex;
align-items: center;
justify-content: space-between;
width: 100%;
margin-bottom: 10px;
}

#header #header-user {
display: flex;
align-items: center;
gap: 5px;
}
41 changes: 41 additions & 0 deletions src/Components/HeaderBar/HeaderBar.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
import { useContext } from "react";
import { NavContext, UserContext } from "../../App";
import "./HeaderBar.css";
import { signOut } from "firebase/auth";
import { auth } from "../../firebase";

const userObj = {
uid: null,
email: null,
name: null,
pic: null,
};

const HeaderBar = ({ title }) => {
const { user, setUser } = useContext(UserContext);
const { navigate } = useContext(NavContext);

const handleLogOut = async () => {
await setUser(userObj);
signOut(auth);
};

const handleClick = () => {
handleLogOut();
navigate("/");
};

return (
<div id="header">
<div id="header-user">
{title === user.name && <img src={user.pic} alt={user.name} />}
<h1>{title}</h1>
</div>
<button onClick={handleClick} id="/">
Log Out
</button>
</div>
);
};

export default HeaderBar;
Loading