diff --git a/frontend-next/src/app/api/firebase-config.js b/frontend-next/src/app/api/firebase-config.js index 5d82756..0d51435 100644 --- a/frontend-next/src/app/api/firebase-config.js +++ b/frontend-next/src/app/api/firebase-config.js @@ -2,13 +2,13 @@ import { initializeApp, getApps, getApp } from "firebase/app"; import { getAuth } from "firebase/auth"; var config = { - apiKey: process.env.FIREBASE_CONFIG_API_KEY, - authDomain: process.env.FIREBASE_CONFIG_AUTH_DOMAIN, - projectId: process.env.FIREBASE_CONFIG_PROJECT_ID, - storageBucket: process.env.FIREBASE_CONFIG_STORAGE_BUCKET, - messagingSenderId: process.env.FIREBASE_CONFIG_MESSAGING_SENDER_ID, - appId: process.env.FIREBASE_CONFIG_APPID, - databaseURL: process.env.FIREBASE_CONFIG_DATABASE_URL, + apiKey: "AIzaSyDbDPjQGt-lIjNPeTG-Q5AECM1m0vtOr2c", + authDomain: "chatmaps-3e7fa.firebaseapp.com", + projectId: "chatmaps-3e7fa", + storageBucket: "chatmaps-3e7fa.appspot.com", + messagingSenderId: "771010649524", + appId: "1:771010649524:web:b6e66d3457820c817b26e1", + databaseURL: "https://chatmaps-3e7fa-default-rtdb.firebaseio.com/", } var app = getApps().length > 0 ? getApp() : initializeApp(config); diff --git a/frontend-next/src/app/api/signout/route.js b/frontend-next/src/app/api/signout/route.js index e33509a..e107f50 100644 --- a/frontend-next/src/app/api/signout/route.js +++ b/frontend-next/src/app/api/signout/route.js @@ -6,5 +6,5 @@ export async function GET(req) { cookies().delete('user') cookies().delete('session') cookies().delete('uid') - return NextResponse.json({}, { status: 200 }); + return NextResponse.redirect(new URL("/",req.url)) } \ No newline at end of file diff --git a/frontend-next/src/app/app/layout.js b/frontend-next/src/app/app/layout.js index 4b40e5e..18a5f84 100644 --- a/frontend-next/src/app/app/layout.js +++ b/frontend-next/src/app/app/layout.js @@ -1,6 +1,5 @@ import { Inter } from "next/font/google"; import "../globals.css"; -import { Header, Sidebar } from "./shared" const inter = Inter({ subsets: ["latin"] }); @@ -13,13 +12,7 @@ export default function RootLayout({ children }) { return ( -
-
-
{children} -
- -
); diff --git a/frontend-next/src/app/app/page.js b/frontend-next/src/app/app/page.js index d3ec30d..ad74268 100644 --- a/frontend-next/src/app/app/page.js +++ b/frontend-next/src/app/app/page.js @@ -1,6 +1,44 @@ "use client" -import { useState, useEffect } from 'react' -import {Map, Marker} from "pigeon-maps" +import { useState, useEffect, createContext, useContext } from 'react' +import {Map, Marker, ZoomControl} from "pigeon-maps" +import { Form, useForm } from "react-hook-form"; +import { app } from "../api/firebase-config"; +import { getDatabase, ref, onValue, get, set} from "firebase/database"; +var database = getDatabase(app) + +// Data types +function Chat({chatObj}) { + let dateOptions = { + weekday: 'long', + year: 'numeric', + month: 'short', + day: 'numeric', + hour: '2-digit', + minute: '2-digit' + }; + return ( +
+
+ {chatObj.user}: {chatObj.body} +
+
+ {new Date(chatObj.timestamp).toLocaleString(dateOptions)} +
+
+ ) +} + +function ChatRoomSidebar({roomObj, click}) { +return ( +
+
+
{roomObj.name}
+
{roomObj.description}
+
+
+) +} + function WelcomeMessage() { //TODO: REALLY GROSS WAY TO GET COOKIES, NEED NEW WAY TO STORE USER DATA WITHOUT API CALLS. THIS PAGE HAS TO BE CLIENT SIDE DUE TO MAPS / GEOLOCATION @@ -20,7 +58,7 @@ function WelcomeMessage() { return (
- Welcome, {data.firstName} {data.lastName} + Welcome, {data.firstName} {data.lastName} ({data.username})
Lets see what's happening in your area. @@ -30,23 +68,12 @@ function WelcomeMessage() { } -function Geo() { - const [isLoading, setLoading] = useState(true) - const [data, setData] = useState(); - useEffect(() => { - if('geolocation' in navigator) { - // Retrieve latitude & longitude coordinates from `navigator.geolocation` Web API - navigator.geolocation.getCurrentPosition(({ coords }) => { - const { latitude, longitude } = coords; - setData(coords) - setLoading(false) - }) - } - }, []); - if (!isLoading) { +function Geo({loc}) { + if (loc) { return ( - - + + + ) } else { @@ -57,17 +84,204 @@ function Geo() { } -function Home() { + + +// Main Tabs +function MainTabHome({loc}) { return ( -
- -
- + <> + +
+ +
+ + ) +} + +function MainTabChatRoom({room}) { + var { register, control, reset, handleSubmit} = useForm() + const [chats, setData] = useState(null) + const [isLoading, setLoading] = useState(true) + + var user + fetch('/api/user') + .then((res) => res.json()) + .then((data) => { + user = data + }) + + var unsubscribeUpdater + useEffect(() => { + unsubscribeUpdater = onValue(ref(database, `/rooms/${room}/chats`), (snapshot) => { + var chatsArr = [] + var messages = snapshot.val() + for (var message in messages) { + chatsArr.push() + } + setData(chatsArr.reverse()) + setLoading(false) + }) + }, []) + + function sendMessage(data) { + reset() + var payload = { + body: data.message, + user: user.username, + timestamp: new Date().getTime() + } + set(ref(database,`/rooms/${room}/chats/${user.username}-${new Date().getTime()}`), payload) + } + + + if (isLoading) return
Loading
+ if (!chats) return
No Chats
+ return ( +
+
+ {chats} +
+
+
+ + +
) } +function CreateRoom({loc}) { + var { register, control, reset, handleSubmit} = useForm() + function createRoom(data) { + reset() + var path = String(loc.latitude.toFixed(2)).replace(".","")+"/"+String(loc.longitude.toFixed(2)).replace(".","") + var timestamp = new Date().getTime() + var payload = { + name: data.name, + description: data.description, + timestamp: timestamp, + latitude: loc.latitude, + longitude: loc.longitude, + path: path + } + set(ref(database,`/rooms/${path}/${data.name}-${timestamp}`), payload) + } + + return ( +
+
+ +
+
+ Creating room near ({loc.latitude.toFixed(2)}, {loc.longitude.toFixed(2)}) +
+ +
+
+ ) +} + +function Home() { + var [tab, setTab] = useState("nearby") + var [mainTab, setMainTab] = useState("home") + var [chatRoom, setChatRoom] = useState("Dev") + + const [myRooms, setRoomData] = useState(null) + const [isRoomLoading, setRoomLoading] = useState(true) + useEffect(() => { + fetch('/api/user').then((res) => res.json()) + .then((user) => { + get(ref(database, '/users/'+user.uid+'/rooms')).then((snapshot) => { + var rooms = snapshot.val() + var roomArr = [] + for (var room in rooms) { + roomArr.push( {setChatRoom(rooms[room].path+"/"+rooms[room].name+"-"+rooms[room].timestamp);setMainTab("chat")}}/>) + } + setRoomData(roomArr) + setRoomLoading(false) + }) + }) + }, []) + + + const [location, setLocation] = useState(null); + const [loadingLoc, setLoadingLoc] = useState(true) + const [nearby, setNearby] = useState(null); + const [loadingNearby, setLoadingNearby] = useState(true); + useEffect(() => { + if('geolocation' in navigator) { + // Retrieve latitude & longitude coordinates from `navigator.geolocation` Web API + navigator.geolocation.getCurrentPosition(({ coords }) => { + setLocation(coords) + setLoadingLoc(false) + var nearbyArr = [] + var path = String(coords.latitude.toFixed(2)).replace(".","")+"/"+String(coords.longitude.toFixed(2)).replace(".","") + get(ref(database, `/rooms/${path}`)).then((snapshot) => { + if (snapshot.exists()) { + var data = snapshot.val() + for (var room in data) { + nearbyArr.push( {setChatRoom(data[room].path+"/"+data[room].name+"-"+data[room].timestamp);setMainTab("chat")}}/>) + } + setLoadingNearby(false) + setNearby(nearbyArr) + } else { + setLoadingNearby(false) + } + }) + }) + } + }, []); + + + return ( +
+
+ +
+ {(mainTab == "home" && !loadingLoc) && } + {(mainTab == "home" && loadingLoc) && } + {mainTab == "chat" && } +
+
+
+
+
+
+
{setTab("nearby")}}>Nearby
+
{setTab("rooms")}}>My Rooms
+
{setTab("create")}}>Create
+
+
+ {tab == "nearby" &&
+
+ {(!nearby && !loadingNearby) &&
No Nearby Rooms
Create One?
} + {loadingNearby &&
Loading...
} + {nearby} +
+
} + {tab == "rooms" &&
+
+ {isRoomLoading &&
Loading
} + {(!myRooms && !isRoomLoading) &&
No User Saved Rooms
} + {myRooms} +
+
} + {(tab == "create" && !loadingLoc) && } + {(tab == "create" && loadingLoc) &&
Loading...
} +
+
+
+ ) +} export default Home; \ No newline at end of file diff --git a/frontend-next/src/app/app/shared.js b/frontend-next/src/app/app/shared.js deleted file mode 100644 index d9021ae..0000000 --- a/frontend-next/src/app/app/shared.js +++ /dev/null @@ -1,18 +0,0 @@ -export function Header() { - return ( -
- -
- ) -} - -export function Sidebar() { - return ( -
-
- Sidebar -
-
- - ) - }