saleor-dashboard/src/apps/components/CustomAppDetailsPage/CustomAppDetailsPage.tsx
AlicjaSzu 211b0b892d
Apps (#599)
* create Apps view

* create more app components, generate types and messages

* apps refactor, update snapshots

* show error message in tooltip  when app installation fail

* update apps components and view, add apps list to storybook

* update defaultMessages

* create app details view

* update AppListPage with Skeleton component

* create app activate/deactivate dialogs, create app details stories

* add AppHeader to AppDetailsPage

* update defaultMessages

* update AppDetails view and components after review

* create custom app details view

* refactor webhooks

* update webhooks fixtures

* update WebhookDetailsPage story

* update strings

* create CustomAppCreate view and components

* update AppListPage story

* create AppInstall view and page

* handle errors in AppInstall view

* update defaultMessages

* add AppInstallPage to storybook

* add status prop to MessageManager

* update defaultMessages

* remove service account section

* remove service account routes

* remove as operator from notify status

* add notifications for app installations

* update styles for deactivated app

* update app installations with local storage

* update defaultMessages

* AppInstall update

* dd delete button to ongoin installations table

* fix active installations condition

* fix error messages in AppsList

* update defaultMessages

* add iframe to AppDetailsPage

* create AppDetailsSettingsPage

* install macaw-ui

* apps styles clean up

* update schema, fixtures

* few apps updates

* WebhookCreate - fix onBack button name

* WebhookCreatePage story update

* rename apps table from external to thirdparty

* update defaultMessages

* fix test, update snapshots

* AppDetailsSettings - add token to headers

* fix first number in local apps query

* app details settings - use shop domain host

* add onSettingsRowClick to InstalledApps

* resolve conflicts

* update changelog and messages

* add noopener noreferrer do app privacy link

* update snapshots

* update snapshots

* updates after review

* update defaultMessages

* CustomAppDetails - add missing notify status
2020-07-22 12:54:15 +02:00

173 lines
5.7 KiB
TypeScript

import { AppErrorFragment } from "@saleor/apps/types/AppErrorFragment";
import AccountPermissions from "@saleor/components/AccountPermissions";
import AppHeader from "@saleor/components/AppHeader";
import AppStatus from "@saleor/components/AppStatus";
import CardSpacer from "@saleor/components/CardSpacer";
import { ConfirmButtonTransitionState } from "@saleor/components/ConfirmButton";
import Container from "@saleor/components/Container";
import Form from "@saleor/components/Form";
import Grid from "@saleor/components/Grid";
import PageHeader from "@saleor/components/PageHeader";
import SaveButtonBar from "@saleor/components/SaveButtonBar";
import { ShopInfo_shop_permissions } from "@saleor/components/Shop/types/ShopInfo";
import { sectionNames } from "@saleor/intl";
import { PermissionEnum } from "@saleor/types/globalTypes";
import { getFormErrors } from "@saleor/utils/errors";
import getAppErrorMessage from "@saleor/utils/errors/app";
import WebhooksList from "@saleor/webhooks/components/WebhooksList";
import React from "react";
import { useIntl } from "react-intl";
import { AppUpdate_appUpdate_app } from "../../types/AppUpdate";
import CustomAppDefaultToken from "../CustomAppDefaultToken";
import CustomAppInformation from "../CustomAppInformation";
import CustomAppTokens from "../CustomAppTokens";
export interface CustomAppDetailsPageFormData {
hasFullAccess: boolean;
isActive: boolean;
name: string;
permissions: PermissionEnum[];
}
export interface CustomAppDetailsPageProps {
apiUri: string;
disabled: boolean;
errors: AppErrorFragment[];
permissions: ShopInfo_shop_permissions[];
saveButtonBarState: ConfirmButtonTransitionState;
app: AppUpdate_appUpdate_app;
token: string;
onApiUriClick: () => void;
onBack: () => void;
onTokenDelete: (id: string) => void;
onTokenClose: () => void;
onTokenCreate: () => void;
onSubmit: (data: CustomAppDetailsPageFormData) => void;
onWebhookCreate: () => void;
onWebhookRemove: (id: string) => void;
navigateToWebhookDetails: (id: string) => () => void;
}
const CustomAppDetailsPage: React.FC<CustomAppDetailsPageProps> = props => {
const {
apiUri,
disabled,
errors,
permissions,
saveButtonBarState,
app,
navigateToWebhookDetails,
token,
onApiUriClick,
onBack,
onTokenClose,
onTokenCreate,
onTokenDelete,
onSubmit,
onWebhookCreate,
onWebhookRemove
} = props;
const intl = useIntl();
const webhooks = app?.webhooks;
const formErrors = getFormErrors(["permissions"], errors || []);
const permissionsError = getAppErrorMessage(formErrors.permissions, intl);
const initialForm: CustomAppDetailsPageFormData = {
hasFullAccess:
permissions?.filter(
perm =>
app?.permissions?.filter(userPerm => userPerm.code === perm.code)
.length === 0
).length === 0 || false,
isActive: !!app?.isActive,
name: app?.name || "",
permissions: app?.permissions?.map(perm => perm.code) || []
};
return (
<Form initial={initialForm} onSubmit={onSubmit} confirmLeave>
{({ data, change, hasChanged, submit }) => (
<Container>
<AppHeader onBack={onBack}>
{intl.formatMessage(sectionNames.apps)}
</AppHeader>
<PageHeader title={app?.name} />
<Grid>
<div>
{token && (
<>
<CustomAppDefaultToken
apiUri={apiUri}
token={token}
onApiUriClick={onApiUriClick}
onTokenClose={onTokenClose}
/>
<CardSpacer />
</>
)}
<CustomAppInformation
data={data}
disabled={disabled}
errors={errors}
onChange={change}
/>
<CardSpacer />
<CustomAppTokens
tokens={app?.tokens}
onCreate={onTokenCreate}
onDelete={onTokenDelete}
/>
<CardSpacer />
<WebhooksList
webhooks={webhooks}
onRemove={onWebhookRemove}
onRowClick={navigateToWebhookDetails}
onCreate={app?.isActive && onWebhookCreate}
/>
</div>
<div>
<AccountPermissions
data={data}
errorMessage={permissionsError}
disabled={disabled}
permissions={permissions}
permissionsExceeded={false}
onChange={change}
fullAccessLabel={intl.formatMessage({
defaultMessage: "Grant this app full access to the store",
description: "checkbox label"
})}
description={intl.formatMessage({
defaultMessage:
"Expand or restrict app permissions to access certain part of Saleor system.",
description: "card description"
})}
/>
<CardSpacer />
<AppStatus
data={data}
disabled={disabled}
label={intl.formatMessage({
defaultMessage: "App is active",
description: "checkbox label"
})}
onChange={change}
/>
</div>
</Grid>
<SaveButtonBar
disabled={disabled || !hasChanged}
state={saveButtonBarState}
onCancel={onBack}
onSave={submit}
/>
</Container>
)}
</Form>
);
};
CustomAppDetailsPage.displayName = "CustomAppDetailsPage";
export default CustomAppDetailsPage;