import { useAppBridge, withAuthorization } from "@saleor/app-sdk/app-bridge"; import { SALEOR_API_URL_HEADER, SALEOR_AUTHORIZATION_BEARER_HEADER } from "@saleor/app-sdk/const"; import { ChangeEvent, ReactElement, SyntheticEvent, useEffect, useState } from "react"; import { ConfigurationError } from "../components/ConfigurationError/ConfigurationError"; import { useAppApi } from "../hooks/useAppApi"; import { AppColumnsLayout } from "../components/AppColumnsLayout/AppColumnsLayout"; import { useDashboardNotification } from "@saleor/apps-shared"; import { Input, Text, Box, Button } from "@saleor/macaw-ui/next"; import { TextLink } from "@saleor/apps-ui"; import { AccessWarning } from "../components/AccessWarning/AccessWarning"; interface ConfigurationField { key: string; value: string; } function Configuration() { const { appBridgeState } = useAppBridge(); const { notifyError, notifySuccess } = useDashboardNotification(); const [configuration, setConfiguration] = useState(); const { data: configurationData, error } = useAppApi<{ data: ConfigurationField[] }>({ url: "/api/configuration", }); useEffect(() => { if (configurationData && !configuration) { setConfiguration(configurationData.data); } }, [configurationData, configuration]); const handleSubmit = (event: SyntheticEvent) => { event.preventDefault(); fetch("/api/configuration", { method: "POST", headers: [ ["content-type", "application/json"], [SALEOR_API_URL_HEADER, appBridgeState?.saleorApiUrl!], [SALEOR_AUTHORIZATION_BEARER_HEADER, appBridgeState?.token!], ], body: JSON.stringify({ data: configuration }), }) .then(async (response) => { notifySuccess("Success", "Configuration updated successfully"); }) .catch(async () => { await notifyError("Configuration update failed"); }); }; const onChange = (event: ChangeEvent) => { const { name, value } = event.target as HTMLInputElement; setConfiguration((prev) => prev!.map((prevField) => (prevField.key === name ? { ...prevField, value } : prevField)) ); }; if (error) { console.error("Can't establish connection with the App API: ", error); return ; } if (configuration === undefined) { return Loading; } return (
{configuration!.map(({ key, value }) => (
))}
); } function Instructions() { const { appBridge } = useAppBridge(); const { data } = useAppApi({ url: "/api/slack-app-manifest", }); const slackUrl = new URL("https://api.slack.com/apps"); slackUrl.searchParams.append("new_app", "1"); slackUrl.searchParams.append("manifest_json", JSON.stringify(data)); const openExternalUrl = (to: string) => { appBridge?.dispatch({ type: "redirect", payload: { newContext: true, actionId: "redirect_from_slack_app", to, }, }); }; return ( <> How to configure
  • 1. Install Slack application
  • 2. Copy incoming Webhook URL from Slack app configuration and paste it below into{" "} WEBHOOK_URL field
  • 3. Save configuration
  • Useful links ); } const ConfigurationWithAuth = withAuthorization({ notIframe: , unmounted: null, noDashboardToken: , dashboardTokenInvalid: , })(Configuration); ConfigurationWithAuth.getLayout = (page: ReactElement) => ( Configuration {page} ); export default ConfigurationWithAuth;