From 0a268264af0bebc5c64e84303d4467552da20f2e Mon Sep 17 00:00:00 2001 From: midas_hsiung Date: Sun, 10 Nov 2024 17:49:56 +0800 Subject: [PATCH 1/2] make rating page search same as download --- frontend/src.rar | Bin 0 -> 14185 bytes frontend/src/pages/download.tsx | 38 ++++--- frontend/src/pages/rating.tsx | 187 ++++++++++++++++++++++++++++---- 3 files changed, 188 insertions(+), 37 deletions(-) create mode 100644 frontend/src.rar diff --git a/frontend/src.rar b/frontend/src.rar new file mode 100644 index 0000000000000000000000000000000000000000..d1c495bd8faf59255160f36afb73cf6c12f43fed GIT binary patch literal 14185 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 XN8Cq5fa$O3zmFyI&`^ei0)YJ=$nQ?I literal 0 HcmV?d00001 diff --git a/frontend/src/pages/download.tsx b/frontend/src/pages/download.tsx index 1991a35..7ad3b06 100644 --- a/frontend/src/pages/download.tsx +++ b/frontend/src/pages/download.tsx @@ -157,37 +157,39 @@ const DownloadPage: React.FC = () => { {error &&

{error}

} -
-

Available Packages:

- {packages.length > 0 ? ( + {packages.length > 0 ? ( +
+

Available Packages:

    {packages.map((pkg) => (
  • - {pkg.Name} (v{pkg.Version}) + {pkg.Name}
  • ))}
- ) : ( -

No packages found. Try a different search term.

- )} - -
- - + +
+ + Current Page: {offset + 1} + +
-
+ ) : ( +

No packages found. Try a different search term.

+ )} + ); }; -export default DownloadPage; +export default DownloadPage; \ No newline at end of file diff --git a/frontend/src/pages/rating.tsx b/frontend/src/pages/rating.tsx index 8efdfb5..b8820e9 100644 --- a/frontend/src/pages/rating.tsx +++ b/frontend/src/pages/rating.tsx @@ -1,44 +1,193 @@ -import React, { useState } from 'react'; +import React, { useState, useEffect } from 'react'; import PageLayout from './pageLayout'; +interface PackageMetadata { + ID: string; + Name: string; + Version: string; +} + +interface RatingData { + overall: number; + dependencyPinning: number; + codeReviewMetric: number; +} + const RatingPage: React.FC = () => { - const [packageName, setPackageName] = useState(''); - const [ratingData, setRatingData] = useState({ - overall: 4, - dependencyPinning: 0.8, - codeReviewMetric: 0.75, - }); - - const handleSearch = (e: React.FormEvent) => { - e.preventDefault(); - console.log('Searching for:', packageName); - // Add logic to fetch rating details for the entered package name + const [searchTerm, setSearchTerm] = useState(''); + const [packages, setPackages] = useState([]); + const [ratingData, setRatingData] = useState(null); + const [authToken, setAuthToken] = useState(null); + const [error, setError] = useState(null); + const [offset, setOffset] = useState(0); + + // Retrieve auth token from localStorage on component mount + useEffect(() => { + const token = localStorage.getItem('authToken'); + if (token) { + setAuthToken(token); + } else { + alert('Authentication token not found. Please log in.'); + } + }, []); + + // Fetch packages based on search term and offset (pagination) + const handleSearch = async (page = 0) => { + setError(null); + setPackages([]); + setRatingData(null); // Reset rating data on new search + + if (!authToken) { + alert('Authentication token is missing. Please log in.'); + return; + } + + try { + const requestBody = [{ Name: searchTerm }]; + + const response = await fetch(`/packages?offset=${page}`, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + 'X-Authorization': authToken, + }, + body: JSON.stringify(requestBody), + }); + + + // Simulate response data + // const response1 = JSON.stringify({ + // status: 200, + // data: [ + // { + // Name: 'example-package', + // Version: '1.0.0', + // ID: '1', + // }, + // { + // Name: 'another-package', + // Version: '2.0.1', + // ID: '2', + // }, + // ], + // headers: { + // offset: '10', + // }, + // }); + // const response = JSON.parse(response1); + + if (response.status === 200) { + const data: PackageMetadata[] = await response.json(); + setPackages(data); + setOffset(page); // Update offset with the current page number + } else if (response.status === 400) { + setError('Search failed: Missing fields or invalid query.'); + } else if (response.status === 403) { + setError('Search failed: Authentication failed due to invalid or missing AuthenticationToken.'); + } else if (response.status === 413) { + setError('Search failed: Too many packages returned.'); + } else { + setError('Search failed with an unknown error.'); + } + } catch (err) { + console.error('Error during search:', err); + setError('An error occurred while searching for packages.'); + } + }; + + // Fetch rating for a specific package + const fetchRating = async (packageId: string) => { + setError(null); + setRatingData(null); + + try { + const response = await fetch(`/ratings?packageId=${encodeURIComponent(packageId)}`, { + method: 'GET', + headers: { + 'Content-Type': 'application/json', + }, + }); + + if (response.ok) { + const data: RatingData = await response.json(); + setRatingData(data); + } else { + setError('Failed to fetch rating. Please try again.'); + } + } catch (err) { + console.error('Error fetching rating:', err); + setError('An error occurred while fetching the rating.'); + } + }; + + const handleNextPage = () => { + handleSearch(offset + 1); // Move to the next page + }; + + const handlePreviousPage = () => { + if (offset > 0) handleSearch(offset - 1); // Move to the previous page if possible }; return ( -
+ { e.preventDefault(); handleSearch(0); }} style={{ maxWidth: '500px', margin: '0 auto' }}>
-
- {packageName && ( + {error &&

{error}

} + + {packages.length > 0 ? ( +
+

Available Packages:

+
    + {packages.map((pkg) => ( +
  • + {pkg.Name} + +
  • + ))} +
+ +
+ + Current Page: {offset + 1} + +
+
+ ) : ( +

No packages found. Try a different search term.

+ )} + + {ratingData && (
-

Rating for: {packageName}

+

Rating Details

Overall Rating: {ratingData.overall} / 5

Dependency Pinning: {ratingData.dependencyPinning.toFixed(2)}

Code Review Metric: {ratingData.codeReviewMetric.toFixed(2)}

@@ -48,4 +197,4 @@ const RatingPage: React.FC = () => { ); }; -export default RatingPage; +export default RatingPage; \ No newline at end of file From a7d85d4015801d9e1b6758d554bde52f7254cbfc Mon Sep 17 00:00:00 2001 From: midas_hsiung Date: Sun, 10 Nov 2024 17:51:04 +0800 Subject: [PATCH 2/2] delete files --- frontend/src.rar | Bin 14185 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 frontend/src.rar diff --git a/frontend/src.rar b/frontend/src.rar deleted file mode 100644 index d1c495bd8faf59255160f36afb73cf6c12f43fed..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14185 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 XN8Cq5fa$O3zmFyI&`^ei0)YJ=$nQ?I