1
0
mirror of https://github.com/lensapp/lens.git synced 2025-05-20 05:10:56 +00:00

Show extension reviews

Signed-off-by: Alex Andreev <alex.andreev.email@gmail.com>
This commit is contained in:
Alex Andreev 2022-02-09 12:40:22 +03:00
parent 80faf93c80
commit 282c090f97
2 changed files with 96 additions and 21 deletions

View File

@ -46,6 +46,10 @@ export const extensionPageRoute: RouteProps = {
path: `${preferencesRoute.path}/extension/:extensionId?`, path: `${preferencesRoute.path}/extension/:extensionId?`,
}; };
export const extensionReviewsRoute: RouteProps = {
path: `${extensionPageRoute.path}/reviews`,
};
export const preferencesURL = buildURL(preferencesRoute.path); export const preferencesURL = buildURL(preferencesRoute.path);
export const appURL = buildURL(appRoute.path); export const appURL = buildURL(appRoute.path);
export const proxyURL = buildURL(proxyRoute.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 terminalURL = buildURL(terminalRoute.path);
export const installURL = buildURL(installRoute.path); export const installURL = buildURL(installRoute.path);
export const extensionPageURL = buildURL<{ extensionId?: string }>(extensionPageRoute.path); export const extensionPageURL = buildURL<{ extensionId?: string }>(extensionPageRoute.path);
export const extensionReviewsURL = buildURL<{ extensionId?: string }>(extensionReviewsRoute.path);

View File

@ -6,30 +6,41 @@
import styles from "./extension-page.module.scss"; import styles from "./extension-page.module.scss";
import React, { useEffect, useState } from "react"; 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 { Spinner } from "../spinner";
import { ExtensionCard } from "./extension-card"; 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 { MarkdownViewer } from "../markdown-viewer";
import { Tab, Tabs } from "../tabs";
import { navigate } from "../../navigation";
import { extensionPageRoute, extensionPageURL, extensionReviewsRoute, extensionReviewsURL } from "../../../common/routes";
export function ExtensionPage() { export function ExtensionPage() {
const [extension, setExtension] = useState<Extension>(null); const [extension, setExtension] = useState<Extension>(null);
const [description, setDescription] = useState<string>(""); const [description, setDescription] = useState<string>("");
const [reviews, setReviews] = useState<Review[]>([]);
const { id } = useParams<{ id?: string }>(); const { id } = useParams<{ id?: string }>();
const isActive = (route: RouteProps) => !!matchPath(location.pathname, { path: route.path, exact: true });
useEffect(() => { useEffect(() => {
async function fetchExtension() { async function fetchExtension() {
return await getExtensionById(id); return await getExtensionById(id);
} }
async function fetchReviews() {
return await getReviewsExtensionById(id);
}
async function loadData() { async function loadData() {
try { try {
const extension = await fetchExtension(); const extension = await fetchExtension();
const readmeUrl = `${extension.githubRepositoryUrl.replace("github.com", "raw.githubusercontent.com")}/master/README.md`; const readmeUrl = `${extension.githubRepositoryUrl.replace("github.com", "raw.githubusercontent.com")}/master/README.md`;
const description = await (await fetch(readmeUrl)).text(); const description = await (await fetch(readmeUrl)).text();
const reviews = await fetchReviews();
setExtension(extension); setExtension(extension);
setDescription(description); setDescription(description);
setReviews(reviews);
} catch (error) { } catch (error) {
console.error(error); console.error(error);
} }
@ -46,7 +57,44 @@ export function ExtensionPage() {
<section className="page"> <section className="page">
<ExtensionCard extension={extension}/> <ExtensionCard extension={extension}/>
<hr /> <hr />
<Tabs scrollable={false} onChange={(url) => {
navigate(url);
}}>
<Tab
value={`/preferences/extension/${extension.id}`}
label="Overview"
active={isActive(extensionPageRoute)}
/>
<Tab
value={`${extension.id}/reviews`}
label="Rating & Review"
active={isActive(extensionReviewsRoute)}
/>
{/* {tabs.map(({ title, routePath, url = routePath, exact }) => {
const isActive = !!matchPath(currentLocation, { path: routePath, exact });
return <Tab key={url} label={title} value={url} active={isActive}/>;
})} */}
</Tabs>
<div className={styles.contents}> <div className={styles.contents}>
<Switch>
<Route path={extensionReviewsURL()}>
<Reviews reviews={reviews}/>
</Route>
<Route path={extensionPageURL()}>
<Overview extension={extension} description={description}/>
</Route>
</Switch>
</div>
</section>
);
}
function Overview({ extension, description }: { extension: Extension, description: string }) {
return (
<>
<div className="github"> <div className="github">
<MarkdownViewer markdown={description} /> <MarkdownViewer markdown={description} />
</div> </div>
@ -66,7 +114,29 @@ export function ExtensionPage() {
<h3 className="mb-5 mtp-5">More Info</h3> <h3 className="mb-5 mtp-5">More Info</h3>
<div className="moreInfo"></div> <div className="moreInfo"></div>
</div> </div>
</div> </>
</section> );
}
function Reviews({ reviews }: { reviews: Review[] }) {
return (
<div className="reviews">
<h2>User reviews</h2>
{reviews.map(review => (
<div key={review.id} className="review">
<div className="avatar">
</div>
<div className="content">
<div className="mb-4"><b>{review.user.firstName} {review.user.lastName}</b></div>
<div className="rating">rating</div>
<div className="text">
{review.content}
</div>
</div>
</div>
))}
</div>
); );
} }