saleor-dashboard/src/new-apps/components/AppListPage/AppListPage.tsx
Lukasz Ostrowski 477de5c3dc
Change Vercel deployment button to fork on github button (#3119)
* Change vercel deployment button to fork on github button

* Extract translations
2023-02-07 11:59:06 +01:00

130 lines
4.2 KiB
TypeScript

import Container from "@dashboard/components/Container";
import PageHeader from "@dashboard/components/PageHeader";
import PreviewPill from "@dashboard/components/PreviewPill";
import useNavigator from "@dashboard/hooks/useNavigator";
import { sectionNames } from "@dashboard/intl";
import { AppUrls } from "@dashboard/new-apps/urls";
import { ListProps } from "@dashboard/types";
import { Typography } from "@material-ui/core";
import React, { useCallback } from "react";
import { FormattedMessage, useIntl } from "react-intl";
import AllAppList from "../AllAppList";
import InstalledAppList from "../InstalledAppList";
import { InstallWithManifestFormButton } from "../InstallWithManifestFormButton";
import MarketplaceAlert from "../MarketplaceAlert";
import SectionHeader from "../SectionHeader";
import { messages } from "./messages";
import { useStyles } from "./styles";
import { AppListPageSections } from "./types";
import {
getVerifiedAppsInstallations,
getVerifiedInstallableMarketplaceApps,
getVerifiedInstalledApps,
resolveSectionsAvailability,
} from "./utils";
export interface AppListPageProps extends AppListPageSections, ListProps {
marketplaceError?: Error;
}
export const AppListPage: React.FC<AppListPageProps> = props => {
const {
appsInstallations,
installedApps,
installableMarketplaceApps,
comingSoonMarketplaceApps,
disabled,
settings,
marketplaceError,
onUpdateListSettings,
} = props;
const intl = useIntl();
const classes = useStyles();
const verifiedInstalledApps = getVerifiedInstalledApps(
installedApps,
installableMarketplaceApps,
);
const verifiedAppsIntallations = getVerifiedAppsInstallations(
appsInstallations,
installableMarketplaceApps,
);
const verifiedInstallableMarketplaceApps =
getVerifiedInstallableMarketplaceApps(
installedApps,
installableMarketplaceApps,
);
const sectionsAvailability = resolveSectionsAvailability({
...props,
installableMarketplaceApps: verifiedInstallableMarketplaceApps,
});
const navigate = useNavigator();
const navigateToAppInstallPage = useCallback(
(manifestUrl: string) => {
navigate(AppUrls.resolveAppInstallUrl(manifestUrl));
},
[navigate],
);
const navigateToGithubForkPage = useCallback((githubForkUrl: string) => {
window.open(githubForkUrl, "_blank");
}, []);
return (
<Container>
<PageHeader title={intl.formatMessage(sectionNames.apps)}>
<InstallWithManifestFormButton onSubmitted={navigateToAppInstallPage} />
</PageHeader>
<Typography variant="body1">
<FormattedMessage {...messages.installAppDescription} />
</Typography>
<div className={classes.appContent}>
{sectionsAvailability.installed && (
<>
<SectionHeader title={intl.formatMessage(messages.installedApps)} />
<InstalledAppList
appList={verifiedInstalledApps}
appInstallationList={verifiedAppsIntallations}
disabled={disabled}
settings={settings}
onUpdateListSettings={onUpdateListSettings}
/>
</>
)}
<MarketplaceAlert error={marketplaceError} />
{sectionsAvailability.all && !marketplaceError && (
<>
<SectionHeader
title={
<>
<FormattedMessage {...messages.allApps} />
<PreviewPill className={classes.previewLabel} />
</>
}
/>
<AllAppList
appList={verifiedInstallableMarketplaceApps}
appInstallationList={appsInstallations}
navigateToAppInstallPage={navigateToAppInstallPage}
navigateToGithubForkPage={navigateToGithubForkPage}
/>
</>
)}
{sectionsAvailability.comingSoon && !marketplaceError && (
<>
<SectionHeader
title={intl.formatMessage(messages.comingSoonApps)}
/>
<AllAppList
appList={comingSoonMarketplaceApps}
appInstallationList={appsInstallations}
/>
</>
)}
</div>
</Container>
);
};
AppListPage.displayName = "AppListPage";
export default AppListPage;