diff --git a/src/app/components/courses.js b/src/app/components/courses.js
index 26f3139..d759bc0 100644
--- a/src/app/components/courses.js
+++ b/src/app/components/courses.js
@@ -1,17 +1,64 @@
-import React from 'react'
+"use client";
+import React, {useState, useEffect} from 'react'
import CourseCard from './coursecard'
-import data from '../data.json'
+import { nebulaFetch } from '../utils/api'
function Courses() {
+ const [courses, setCourses] = useState([]);
+ const [loading, setLoading] = useState(true);
+ const [error, setError] = useState(null);
+
+ useEffect(() => {
+ async function fetchCourses() {
+ try {
+ console.log("Starting fetch..");
+ const apiResponse = await nebulaFetch('course/all'); // gets all courses
+ console.log("After fetch");
+ console.log("API Response:" , apiResponse);
+ setCourses(apiResponse.data || []);
+ } catch (err) {
+ console.error("API error: ", err);
+ setError(err.message);
+ } finally {
+ setLoading(false);
+ }
+ }
+ fetchCourses();
+ }, []);
+
+ if (loading)
+ return
+
+
Loading course data...
+
+
+ if (error)
+ return Error: {error}
;
+
+ const relevantCourses = ["1337", "2305","2340","3341", "3345"];
+ const filtered = courses.filter(course =>
+ course.subject_prefix == "CS" && relevantCourses.includes(course.course_number))
+
+ const unique = []; // remove duplicates
+ const seen = new Set();
+
+ for (const course of filtered) {
+ if (!seen.has(course.course_number)) {
+ seen.add(course.course_number);
+ unique.push(course);
+ }
+ }
+
return (
- {data.courses.map((course, idx) => (
+ {unique.map((course, idx) => (
))}
diff --git a/src/app/utils/api.js b/src/app/utils/api.js
new file mode 100644
index 0000000..e1fd96a
--- /dev/null
+++ b/src/app/utils/api.js
@@ -0,0 +1,17 @@
+const NEBULA_API_ENDPOINT = 'https://api.utdnebula.com/';
+
+export async function nebulaFetch(path) {
+ const url = `${NEBULA_API_ENDPOINT}${path}`;
+ const headers = {
+ 'x-api-key': process.env.NEXT_PUBLIC_NEBULA_API_KEY,
+ };
+ const response = await fetch(url, {
+ headers,
+ });
+ console.log(response);
+ if (!response.ok) {
+ throw new Error(`Nebula API error: ${response.status}`);
+ }
+ return response.json();
+
+}