Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
123 changes: 72 additions & 51 deletions astro/src/components/FilterPage.jsx
Original file line number Diff line number Diff line change
@@ -1,5 +1,8 @@
import { useState } from "react";
import { useState, useEffect } from "react";
import ContentGrid from "./ContentGrid";
import FilterPageContent from "./FilterPageContent";

const API_URL = "http://localhost:8000/magazine_issue/search/";

const FilterPage = () => {
const [filterType, setFilterType] = useState("month"); // 'month' or 'issue'
Expand All @@ -12,6 +15,8 @@ const FilterPage = () => {
const [endIssue, setEndIssue] = useState("");
const [endIssueYear, setEndIssueYear] = useState("");
const [results, setResults] = useState([]);
const [loading, setLoading] = useState(false); // Loading state for search
const [error, setError] = useState(null); // Error state

const handleFilterTypeChange = (e) => {
const selectedType = e.target.value;
Expand All @@ -26,30 +31,49 @@ const FilterPage = () => {
setEndIssueYear("");
};

const handleSearch = () => {
const newResults = [];
if (filterType === "month") {
if (startMonth && startYear && endMonth && endYear) {
newResults.push(
`Results from ${startMonth}/${startYear} to ${endMonth}/${endYear}`
);
} else {
newResults.push("Please select both start and end months and years.");
const handleSearch = async () => {
setLoading(true);
setError(null);
setResults([]);

try {
let params = "";

if (filterType === "month") {
if (startMonth && startYear && endMonth && endYear) {
params = `?date_begin=${startMonth}-${startYear}&date_end=${endMonth}-${endYear}`;
} else {
alert("Please select both start and end months and years.");
setLoading(false);
return;
}
} else if (filterType === "issue") {
if (startIssue && startIssueYear && endIssue && endIssueYear) {
params = `?issue_begin=${startIssue}&issue_year_begin=${startIssueYear}&issue_end=${endIssue}&issue_year_end=${endIssueYear}`;
} else {
alert("Please select issue numbers and years for both start and end.");
setLoading(false);
return;
}
}
} else if (filterType === "issue") {
if (startIssue && startIssueYear && endIssue && endIssueYear) {
newResults.push(
`Results for Issues #${startIssue} (${startIssueYear}) to #${endIssue} (${endIssueYear})`
);
} else {
newResults.push(
"Please select issue numbers and years for both start and end."
);

const response = await fetch(`${API_URL}${params}`);
if (!response.ok) {
throw new Error("Failed to fetch search results");
}

const result = await response.json();
setResults(result);
} catch (err) {
setError(err.message);
} finally {
setLoading(false);
}
setResults(newResults);
};

if (loading) return <p className="text-white">Loading...</p>;
if (error) return <p className="text-white">Error: {error}</p>;

return (
<div className="w-full p-6 bg-white rounded-lg shadow-lg">
{/* Filter Type Selection */}
Expand Down Expand Up @@ -86,36 +110,39 @@ const FilterPage = () => {
className="border border-gray-300 p-2 rounded-md w-1/4"
>
<option value="">Start Month</option>
<option value="01">January</option>
<option value="02">February</option>
{/* Other months */}
<option value="March">March</option>
<option value="June">June</option>
<option value="September">September</option>
<option value="December">December</option>
</select>
<select
value={startYear}
onChange={(e) => setStartYear(e.target.value)}
className="border border-gray-300 p-2 rounded-md w-1/4"
>
<option value="">Start Year</option>
<option value="2024">2024</option>
{/* Other years */}
<option value="2010">2010</option>
<option value="2011">2011</option>
</select>
<select
value={endMonth}
onChange={(e) => setEndMonth(e.target.value)}
className="border border-gray-300 p-2 rounded-md w-1/4"
>
<option value="">End Month</option>
<option value="01">January</option>
{/* Other months */}
<option value="March">March</option>
<option value="June">June</option>
<option value="September">September</option>
<option value="December">December</option>
</select>
<select
value={endYear}
onChange={(e) => setEndYear(e.target.value)}
className="border border-gray-300 p-2 rounded-md w-1/4"
>
<option value="">End Year</option>
<option value="2024">2024</option>
{/* Other years */}
<option value="2010">2010</option>
<option value="2011">2011</option>
</select>
<button
onClick={handleSearch}
Expand All @@ -139,19 +166,18 @@ const FilterPage = () => {
<option value="">Start Issue</option>
<option value="1">1</option>
<option value="2">2</option>
{/* Other issue numbers */}
<option value="3">3</option>
<option value="4">4</option>
</select>
<select
value={startIssueYear}
onChange={(e) => setStartIssueYear(e.target.value)}
className="border border-gray-300 p-2 rounded-md w-1/4"
>
<option value="">Start Year</option>
<option value="2024">2024</option>
{/* Other years */}
<option value="2010">2010</option>
<option value="2011">2011</option>
</select>


<select
value={endIssue}
onChange={(e) => setEndIssue(e.target.value)}
Expand All @@ -160,16 +186,17 @@ const FilterPage = () => {
<option value="">End Issue</option>
<option value="1">1</option>
<option value="2">2</option>
{/* Other issue numbers */}
<option value="3">3</option>
<option value="4">4</option>
</select>
<select
value={endIssueYear}
onChange={(e) => setEndIssueYear(e.target.value)}
className="border border-gray-300 p-2 rounded-md w-1/4"
>
<option value="">End Year</option>
<option value="2024">2024</option>
{/* Other years */}
<option value="2010">2010</option>
<option value="2011">2011</option>
</select>
<button
onClick={handleSearch}
Expand All @@ -181,23 +208,17 @@ const FilterPage = () => {
</div>
)}

{/* Results */}
<div className="mb-6">
{results.length > 0 && (
<div className="text-lg font-semibold">
<ul>
{results.map((result, index) => (
<li key={index}>{result}</li>
))}
</ul>
</div>

{/* Results Display */}
<div className="mt-6">
{results.length > 0 ? (
<FilterPageContent items={results} />
) : (
<p className="text-gray-500">No results found. Try adjusting your filters.</p>
)}
</div>

{/* Content Grid */}
<ContentGrid />
</div>
);
};

export default FilterPage;
export default FilterPage;
45 changes: 45 additions & 0 deletions astro/src/components/FilterPageContent.jsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
import React from "react";

function FilterPageContent({ items }) {
return (
<div className="mt-12 px-4 sm:px-6 lg:px-8 bg-gray-900 min-h-screen">
<h3 className="text-4xl font-bold mb-10 text-white tracking-tight leading-tight">Magazine Issues</h3>
{items.length > 0 ? (
<div className="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4 gap-8">
{items.map((item, index) => (
<div
key={index}
className="bg-gray-800 text-white rounded-lg shadow-lg hover:shadow-2xl transition-all duration-300 ease-in-out transform hover:scale-105"
>
<div>
<img
src={item.front_cover}
alt={`Cover of issue ${item.issue_number}`}
className="rounded-t-lg w-full h-48 object-cover"
/>
</div>
<div className="p-6 space-y-4">
<h4 className="text-2xl font-semibold text-gray-100">{`Issue ${item.issue_number}`}</h4>
<p className="text-sm text-gray-400 leading-relaxed">
Publication Date: {item.publication_date}
</p>
<a
href={item.url}
target="_blank"
rel="noopener noreferrer"
className="text-indigo-400 hover:text-indigo-300 font-medium transition-colors duration-200"
>
Explore
</a>
</div>
</div>
))}
</div>
) : (
<p className="text-gray-500 text-lg">No results found.</p>
)}
</div>
);
}

export default FilterPageContent;