From 282c090f978b853eb37f32dd0433255b485e3426 Mon Sep 17 00:00:00 2001 From: Alex Andreev Date: Wed, 9 Feb 2022 12:40:22 +0300 Subject: [PATCH] Show extension reviews Signed-off-by: Alex Andreev --- src/common/routes/preferences.ts | 5 + .../+preferences/extension-page.tsx | 112 ++++++++++++++---- 2 files changed, 96 insertions(+), 21 deletions(-) diff --git a/src/common/routes/preferences.ts b/src/common/routes/preferences.ts index 882a8a10f0..e8f36b9f1d 100644 --- a/src/common/routes/preferences.ts +++ b/src/common/routes/preferences.ts @@ -46,6 +46,10 @@ export const extensionPageRoute: RouteProps = { path: `${preferencesRoute.path}/extension/:extensionId?`, }; +export const extensionReviewsRoute: RouteProps = { + path: `${extensionPageRoute.path}/reviews`, +}; + export const preferencesURL = buildURL(preferencesRoute.path); export const appURL = buildURL(appRoute.path); export const proxyURL = buildURL(proxyRoute.path); @@ -56,3 +60,4 @@ export const extensionURL = buildURL(extensionRoute.path); export const terminalURL = buildURL(terminalRoute.path); export const installURL = buildURL(installRoute.path); export const extensionPageURL = buildURL<{ extensionId?: string }>(extensionPageRoute.path); +export const extensionReviewsURL = buildURL<{ extensionId?: string }>(extensionReviewsRoute.path); diff --git a/src/renderer/components/+preferences/extension-page.tsx b/src/renderer/components/+preferences/extension-page.tsx index 0743d1cd3e..d122216541 100644 --- a/src/renderer/components/+preferences/extension-page.tsx +++ b/src/renderer/components/+preferences/extension-page.tsx @@ -6,30 +6,41 @@ import styles from "./extension-page.module.scss"; import React, { useEffect, useState } from "react"; -import { Extension, getExtensionById } from "./extension-list"; +import { Extension, getExtensionById, getReviewsExtensionById, Review } from "./extension-list"; import { Spinner } from "../spinner"; import { ExtensionCard } from "./extension-card"; -import { useParams } from "react-router"; +import { matchPath, Route, RouteProps, Switch, useParams } from "react-router"; import { MarkdownViewer } from "../markdown-viewer"; +import { Tab, Tabs } from "../tabs"; +import { navigate } from "../../navigation"; +import { extensionPageRoute, extensionPageURL, extensionReviewsRoute, extensionReviewsURL } from "../../../common/routes"; export function ExtensionPage() { const [extension, setExtension] = useState(null); const [description, setDescription] = useState(""); + const [reviews, setReviews] = useState([]); const { id } = useParams<{ id?: string }>(); + const isActive = (route: RouteProps) => !!matchPath(location.pathname, { path: route.path, exact: true }); useEffect(() => { async function fetchExtension() { return await getExtensionById(id); } + async function fetchReviews() { + return await getReviewsExtensionById(id); + } + async function loadData() { try { const extension = await fetchExtension(); const readmeUrl = `${extension.githubRepositoryUrl.replace("github.com", "raw.githubusercontent.com")}/master/README.md`; const description = await (await fetch(readmeUrl)).text(); + const reviews = await fetchReviews(); setExtension(extension); setDescription(description); + setReviews(reviews); } catch (error) { console.error(error); } @@ -46,27 +57,86 @@ export function ExtensionPage() {

+ { + navigate(url); + }}> + + + {/* {tabs.map(({ title, routePath, url = routePath, exact }) => { + const isActive = !!matchPath(currentLocation, { path: routePath, exact }); + + return ; + })} */} + + +
-
- -
-
-

Categories

-
- {extension.category.map(category => ( - {category.name} - ))} -
-

Tags

-
- {extension.tags.map(tag => ( - {tag.name} - ))} -
-

More Info

-
-
+ + + + + + + +
); } + +function Overview({ extension, description }: { extension: Extension, description: string }) { + return ( + <> +
+ +
+
+

Categories

+
+ {extension.category.map(category => ( + {category.name} + ))} +
+

Tags

+
+ {extension.tags.map(tag => ( + {tag.name} + ))} +
+

More Info

+
+
+ + ); +} + +function Reviews({ reviews }: { reviews: Review[] }) { + return ( +
+

User reviews

+ + {reviews.map(review => ( +
+
+ +
+
+
{review.user.firstName} {review.user.lastName}
+
rating
+
+ {review.content} +
+
+
+ ))} +
+ ); +}