Skip to content

Commit 0066328

Browse files
committed
Merge branch 'dev'
Lines starting with '#' will be ignored, and an empty message aborts
2 parents 500b362 + f498c18 commit 0066328

5 files changed

Lines changed: 101 additions & 4 deletions

File tree

README.md

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1 +1,21 @@
1+
# SonarGuard Home Security System 🚀
2+
3+
## Overview
4+
**SonarGuard** is a **web + IoT** security system that provides real-time motion detection and alerts for home security.
5+
It integrates **Next.js**, **AWS Cognito**, **MongoDB**, and **Firebase** to offer a secure and scalable solution.
6+
7+
## 🔥 Features
8+
- **Motion Detection**: Uses **Radar Sensor (Arduino UNO + NodeMCU)** for detecting movement.
9+
- **Authentication**: **AWS Cognito** for user sign-up & OTP verification.
10+
- **Secure Access**: **JWT Token Authentication** restricts unauthorized access.
11+
- **Real-time Alerts**: Sends **SNS Email Alerts** on motion detection using **EmailJS**.
12+
- **Data Storage**: Stores registered users in **MongoDB**, sensor data in **Firebase Realtime Database**.
13+
14+
## 🛠 Tech Stack
15+
- **Frontend**: Next.js (App Router), Tailwind CSS, TypeScript
16+
- **Backend**: Firebase Realtime Database, MongoDB
17+
- **Auth & Security**: AWS Cognito, JWT Authentication
18+
- **IoT Integration**: Radar Sensor, Arduino UNO, NodeMCU
19+
- **Cloud Services**: AWS Lambda, SNS Email Alerts, EmailJS
20+
_
121

miscellaneous/emailTriggerCode.txt

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
import { NextResponse, NextRequest } from "next/server";
2+
import { getDatabase, ref, onValue } from "firebase/database";
3+
import emailjs from "emailjs-com";
4+
5+
const db = getDatabase();
6+
const movementRef = ref(db, "movement");
7+
8+
// Function to fetch email list from backend
9+
const fetchEmails = async (token: string) => {
10+
try {
11+
const response = await fetch("/api/getMembers", {
12+
method: "GET",
13+
headers: {
14+
"Content-Type": "application/json",
15+
"authorization": `Bearer ${token}`,
16+
17+
}
18+
});
19+
20+
const data = await response.json();
21+
return data;
22+
} catch (error) {
23+
console.error("Error in fetchEmails:", error);
24+
return { error: "Failed to fetch members" };
25+
}
26+
};
27+
28+
// API Handler
29+
export async function GET(req: NextRequest) {
30+
// Extract token from headers
31+
const authHeader = req.headers.get("authorization");
32+
if (!authHeader) {
33+
return NextResponse.json({ error: "Unauthorized" }, { status: 401 });
34+
}
35+
36+
const token = authHeader.split(" ")[1];
37+
console.log("Received Token in API:", token);
38+
39+
// Fetch members using token
40+
const data = await fetchEmails(token);
41+
console.log("Fetched Members:", data);
42+
43+
return NextResponse.json({ message: "API Email Trigger Response", data }, { status: 200 });
44+
}

src/app/dashboard/page.tsx

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,12 @@ import AlertMessage from "@/components/AlertMessage";
55
import {jwtDecode} from "jwt-decode";
66
import Members from "@/components/Members";
77
import RadarReading from "@/components/RadarReading";
8+
import { MembersProvider } from "@/contexts/MemberContext";
89

910
export default function Dashboard() {
1011
const router = useRouter();
1112
const [auth, setAuth] = useState(false);
1213
const [alert, setAlert] = useState<{ message: string; type: "success" | "error" } | null>(null);
13-
1414

1515
// Show alert
1616
const showAlert = (message: string, type: "success" | "error") => {
@@ -58,8 +58,10 @@ export default function Dashboard() {
5858
<>
5959
{alert && <AlertMessage message={alert.message} type={alert.type} />}
6060
<div className="grid sm:grid-cols-1 md:grid-cols-1 lg:grid-cols-2 p-4 ">
61-
<Members/>
62-
<RadarReading/>
61+
<MembersProvider>
62+
<Members/>
63+
<RadarReading/>
64+
</MembersProvider>
6365
</div>
6466
</>
6567
) : (

src/components/Members.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
11
import { useEffect, useState } from "react";
22
import AlertMessage from "./AlertMessage";
3+
import { useMembers } from "@/contexts/MemberContext";
34

45
const Members = () => {
56
const [email, setEmail] = useState("");
67
const [alert, setAlert] = useState<{ message: string; type: "success" | "error"}|null>(null);
7-
const [members, setMembers] = useState([]);
8+
const { members, setMembers } = useMembers();
89
const token = localStorage.getItem("token");
910

1011

src/contexts/MemberContext.tsx

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
import { createContext, useContext, useState, ReactNode } from "react";
2+
3+
// Define the context type
4+
interface MembersContextType {
5+
members: any[]; // Replace 'any' with the actual type if known
6+
setMembers: React.Dispatch<React.SetStateAction<any[]>>;
7+
}
8+
9+
// Create the context
10+
const MembersContext = createContext<MembersContextType | undefined>(undefined);
11+
12+
// Create the provider component
13+
export const MembersProvider = ({ children }: { children: ReactNode }) => {
14+
const [members, setMembers] = useState<any[]>([]);
15+
16+
return (
17+
<MembersContext.Provider value={{ members, setMembers }}>
18+
{children}
19+
</MembersContext.Provider>
20+
);
21+
};
22+
23+
// Custom hook for using the context
24+
export const useMembers = () => {
25+
const context = useContext(MembersContext);
26+
if (!context) {
27+
throw new Error("useMembers must be used within a MembersProvider");
28+
}
29+
return context;
30+
};

0 commit comments

Comments
 (0)