diff --git a/.changeset/yellow-badgers-promise.md b/.changeset/yellow-badgers-promise.md new file mode 100644 index 0000000..79f3b98 --- /dev/null +++ b/.changeset/yellow-badgers-promise.md @@ -0,0 +1,14 @@ +--- +"saleor-app-emails-and-messages": minor +"saleor-app-data-importer": minor +"saleor-app-products-feed": minor +"saleor-app-monitoring": minor +"saleor-app-invoices": minor +"saleor-app-search": minor +"saleor-app-slack": minor +"saleor-app-taxes": minor +"saleor-app-cms": minor +"saleor-app-crm": minor +--- + +Added additional ENV variables (see each app's .env.example), that can overwrite app base URL. This change allows easy apps development using Docker diff --git a/apps/cms/.env.example b/apps/cms/.env.example index 644ccab..356e823 100644 --- a/apps/cms/.env.example +++ b/apps/cms/.env.example @@ -8,3 +8,11 @@ REST_APL_ENDPOINT= REST_APL_TOKEN= APP_LOG_LEVEL=info + +# Local development variables. When developped locally with Saleor inside docker, these can be set to: +# APP_IFRAME_BASE_URL = http://localhost:3000, so Dashboard on host can access iframe +# APP_API_BASE_URL=http://host.docker.internal:3000 - so Saleor can reach App running on host, from the container. +# If developped with tunnels, set this empty, it will fallback to default Next's localhost:3000 +# https://docs.saleor.io/docs/3.x/developer/extending/apps/local-app-development +APP_IFRAME_BASE_URL= +APP_API_BASE_URL= \ No newline at end of file diff --git a/apps/cms/src/pages/api/manifest.ts b/apps/cms/src/pages/api/manifest.ts index 7070478..6faf84b 100644 --- a/apps/cms/src/pages/api/manifest.ts +++ b/apps/cms/src/pages/api/manifest.ts @@ -8,15 +8,18 @@ import { productVariantDeletedWebhook } from "./webhooks/product-variant-deleted import { productUpdatedWebhook } from "./webhooks/product-updated"; export default createManifestHandler({ - async manifestFactory(context) { + async manifestFactory({ appBaseUrl }) { + const iframeBaseUrl = process.env.APP_IFRAME_BASE_URL ?? appBaseUrl; + const apiBaseURL = process.env.APP_API_BASE_URL ?? appBaseUrl; + const manifest: AppManifest = { about: "CMS App is a multi-integration app that connects Saleor with popular Content Management Systems.", - appUrl: context.appBaseUrl, + appUrl: iframeBaseUrl, author: "Saleor Commerce", brand: { logo: { - default: `${context.appBaseUrl}/logo.png`, + default: `${apiBaseURL}/logo.png`, }, }, dataPrivacyUrl: "https://saleor.io/legal/privacy/", @@ -26,13 +29,13 @@ export default createManifestHandler({ name: "CMS", permissions: ["MANAGE_PRODUCTS"], supportUrl: "https://github.com/saleor/apps/discussions", - tokenTargetUrl: `${context.appBaseUrl}/api/register`, + tokenTargetUrl: `${apiBaseURL}/api/register`, version: packageJson.version, webhooks: [ - productVariantCreatedWebhook.getWebhookManifest(context.appBaseUrl), - productVariantUpdatedWebhook.getWebhookManifest(context.appBaseUrl), - productVariantDeletedWebhook.getWebhookManifest(context.appBaseUrl), - productUpdatedWebhook.getWebhookManifest(context.appBaseUrl), + productVariantCreatedWebhook.getWebhookManifest(apiBaseURL), + productVariantUpdatedWebhook.getWebhookManifest(apiBaseURL), + productVariantDeletedWebhook.getWebhookManifest(apiBaseURL), + productUpdatedWebhook.getWebhookManifest(apiBaseURL), ], }; diff --git a/apps/cms/turbo.json b/apps/cms/turbo.json index a801d77..906544e 100644 --- a/apps/cms/turbo.json +++ b/apps/cms/turbo.json @@ -18,7 +18,9 @@ "SENTRY_PROJECT", "SENTRY_ORG", "SENTRY_AUTH_TOKEN", - "SENTRY_ENVIRONMENT" + "SENTRY_ENVIRONMENT", + "APP_IFRAME_BASE_URL", + "APP_API_BASE_URL" ] } } diff --git a/apps/crm/.env.example b/apps/crm/.env.example index c556029..edad22a 100644 --- a/apps/crm/.env.example +++ b/apps/crm/.env.example @@ -9,4 +9,12 @@ REST_APL_TOKEN= MAILCHIMP_CLIENT_ID= MAILCHIMP_CLIENT_SECRET= -APP_LOG_LEVEL=info \ No newline at end of file +APP_LOG_LEVEL=info + +# Local development variables. When developped locally with Saleor inside docker, these can be set to: +# APP_IFRAME_BASE_URL = http://localhost:3000, so Dashboard on host can access iframe +# APP_API_BASE_URL=http://host.docker.internal:3000 - so Saleor can reach App running on host, from the container. +# If developped with tunnels, set this empty, it will fallback to default Next's localhost:3000 +# https://docs.saleor.io/docs/3.x/developer/extending/apps/local-app-development +APP_IFRAME_BASE_URL= +APP_API_BASE_URL= \ No newline at end of file diff --git a/apps/crm/src/pages/api/manifest.ts b/apps/crm/src/pages/api/manifest.ts index bc71ae7..a1855d0 100644 --- a/apps/crm/src/pages/api/manifest.ts +++ b/apps/crm/src/pages/api/manifest.ts @@ -6,14 +6,17 @@ import { customerCreatedWebhook } from "./webhooks/customer-created"; import { customerMetadataUpdatedWebhook } from "./webhooks/customer-updated"; export default createManifestHandler({ - async manifestFactory(context) { + async manifestFactory({ appBaseUrl }) { + const iframeBaseUrl = process.env.APP_IFRAME_BASE_URL ?? appBaseUrl; + const apiBaseURL = process.env.APP_API_BASE_URL ?? appBaseUrl; + const manifest: AppManifest = { about: "CRM App allows synchronization of customers from Saleor to other platforms", - appUrl: context.appBaseUrl, + appUrl: iframeBaseUrl, author: "Saleor Commerce", brand: { logo: { - default: `${context.appBaseUrl}/logo.png`, + default: `${apiBaseURL}/logo.png`, }, }, dataPrivacyUrl: "https://saleor.io/legal/privacy/", @@ -34,11 +37,11 @@ export default createManifestHandler({ */ ], supportUrl: "https://github.com/saleor/apps/discussions", - tokenTargetUrl: `${context.appBaseUrl}/api/register`, + tokenTargetUrl: `${apiBaseURL}/api/register`, version: packageJson.version, webhooks: [ - customerCreatedWebhook.getWebhookManifest(context.appBaseUrl), - customerMetadataUpdatedWebhook.getWebhookManifest(context.appBaseUrl), + customerCreatedWebhook.getWebhookManifest(apiBaseURL), + customerMetadataUpdatedWebhook.getWebhookManifest(apiBaseURL), ], }; diff --git a/apps/crm/turbo.json b/apps/crm/turbo.json index 8893b2b..da07620 100644 --- a/apps/crm/turbo.json +++ b/apps/crm/turbo.json @@ -19,7 +19,9 @@ "SENTRY_PROJECT", "SENTRY_AUTH_TOKEN", "SENTRY_ORG", - "SENTRY_ENVIRONMENT" + "SENTRY_ENVIRONMENT", + "APP_IFRAME_BASE_URL", + "APP_API_BASE_URL" ] } } diff --git a/apps/data-importer/.env.example b/apps/data-importer/.env.example index abc3cff..f3ce46c 100644 --- a/apps/data-importer/.env.example +++ b/apps/data-importer/.env.example @@ -2,4 +2,12 @@ NEXT_PUBLIC_NUVO_LICENSE_KEY= NEXT_PUBLIC_NUVO_PROD_MODE=false -APP_LOG_LEVEL=info \ No newline at end of file +APP_LOG_LEVEL=info + +# Local development variables. When developped locally with Saleor inside docker, these can be set to: +# APP_IFRAME_BASE_URL = http://localhost:3000, so Dashboard on host can access iframe +# APP_API_BASE_URL=http://host.docker.internal:3000 - so Saleor can reach App running on host, from the container. +# If developped with tunnels, set this empty, it will fallback to default Next's localhost:3000 +# https://docs.saleor.io/docs/3.x/developer/extending/apps/local-app-development +APP_IFRAME_BASE_URL= +APP_API_BASE_URL= \ No newline at end of file diff --git a/apps/data-importer/src/pages/api/manifest.ts b/apps/data-importer/src/pages/api/manifest.ts index 0d94ad6..0624d31 100644 --- a/apps/data-importer/src/pages/api/manifest.ts +++ b/apps/data-importer/src/pages/api/manifest.ts @@ -4,15 +4,18 @@ import { AppManifest } from "@saleor/app-sdk/types"; import packageJson from "../../../package.json"; export default createManifestHandler({ - async manifestFactory(context) { + async manifestFactory({ appBaseUrl }) { + const iframeBaseUrl = process.env.APP_IFRAME_BASE_URL ?? appBaseUrl; + const apiBaseURL = process.env.APP_API_BASE_URL ?? appBaseUrl; + const manifest: AppManifest = { about: "Data Importer allows batch import of shop data to Saleor from sources like CSV or Excel", - appUrl: context.appBaseUrl, + appUrl: iframeBaseUrl, author: "Saleor Commerce", brand: { logo: { - default: `${context.appBaseUrl}/logo.png`, + default: `${apiBaseURL}/logo.png`, }, }, dataPrivacyUrl: "https://saleor.io/legal/privacy/", @@ -27,7 +30,7 @@ export default createManifestHandler({ name: "Data Importer", permissions: ["MANAGE_USERS"], supportUrl: "https://github.com/saleor/apps/discussions", - tokenTargetUrl: `${context.appBaseUrl}/api/register`, + tokenTargetUrl: `${apiBaseURL}/api/register`, version: packageJson.version, webhooks: [ /** diff --git a/apps/data-importer/turbo.json b/apps/data-importer/turbo.json index 9b0f1d4..0523606 100644 --- a/apps/data-importer/turbo.json +++ b/apps/data-importer/turbo.json @@ -22,7 +22,9 @@ "SENTRY_ORG", "SENTRY_DSN", "SENTRY_ENVIRONMENT", - "NEXT_PUBLIC_SENTRY_DSN" + "NEXT_PUBLIC_SENTRY_DSN", + "APP_IFRAME_BASE_URL", + "APP_API_BASE_URL" ] } } diff --git a/apps/emails-and-messages/.env.example b/apps/emails-and-messages/.env.example index 118ad0f..356e823 100644 --- a/apps/emails-and-messages/.env.example +++ b/apps/emails-and-messages/.env.example @@ -7,4 +7,12 @@ APL= REST_APL_ENDPOINT= REST_APL_TOKEN= -APP_LOG_LEVEL=info \ No newline at end of file +APP_LOG_LEVEL=info + +# Local development variables. When developped locally with Saleor inside docker, these can be set to: +# APP_IFRAME_BASE_URL = http://localhost:3000, so Dashboard on host can access iframe +# APP_API_BASE_URL=http://host.docker.internal:3000 - so Saleor can reach App running on host, from the container. +# If developped with tunnels, set this empty, it will fallback to default Next's localhost:3000 +# https://docs.saleor.io/docs/3.x/developer/extending/apps/local-app-development +APP_IFRAME_BASE_URL= +APP_API_BASE_URL= \ No newline at end of file diff --git a/apps/emails-and-messages/src/pages/api/manifest.ts b/apps/emails-and-messages/src/pages/api/manifest.ts index 604ed04..a758492 100644 --- a/apps/emails-and-messages/src/pages/api/manifest.ts +++ b/apps/emails-and-messages/src/pages/api/manifest.ts @@ -4,15 +4,18 @@ import { AppManifest } from "@saleor/app-sdk/types"; import packageJson from "../../../package.json"; export default createManifestHandler({ - async manifestFactory(context) { + async manifestFactory({ appBaseUrl }) { + const iframeBaseUrl = process.env.APP_IFRAME_BASE_URL ?? appBaseUrl; + const apiBaseURL = process.env.APP_API_BASE_URL ?? appBaseUrl; + const manifest: AppManifest = { about: "Emails & Messages App is a multi-vendor Saleor app that integrates with notification services.", - appUrl: context.appBaseUrl, + appUrl: iframeBaseUrl, author: "Saleor Commerce", brand: { logo: { - default: `${context.appBaseUrl}/logo.png`, + default: `${apiBaseURL}/logo.png`, }, }, dataPrivacyUrl: "https://saleor.io/legal/privacy/", @@ -31,7 +34,7 @@ export default createManifestHandler({ */ requiredSaleorVersion: ">=3.10 <4", supportUrl: "https://github.com/saleor/apps/discussions", - tokenTargetUrl: `${context.appBaseUrl}/api/register`, + tokenTargetUrl: `${apiBaseURL}/api/register`, version: packageJson.version, }; diff --git a/apps/emails-and-messages/turbo.json b/apps/emails-and-messages/turbo.json index 08723e4..c08adae 100644 --- a/apps/emails-and-messages/turbo.json +++ b/apps/emails-and-messages/turbo.json @@ -19,7 +19,9 @@ "SENTRY_DSN", "SENTRY_AUTH_TOKEN", "NEXT_PUBLIC_SENTRY_DSN", - "SENTRY_ENVIRONMENT" + "SENTRY_ENVIRONMENT", + "APP_IFRAME_BASE_URL", + "APP_API_BASE_URL" ] } } diff --git a/apps/invoices/.env.example b/apps/invoices/.env.example index bec91ed..723675c 100644 --- a/apps/invoices/.env.example +++ b/apps/invoices/.env.example @@ -8,4 +8,12 @@ APP_LOG_LEVEL=info # See api/register.tsx # Leave empty to allow all domains # Example: "https:\/\/.*.saleor.cloud\/graphql\/" to enable Saleor Cloud APIs -ALLOWED_DOMAIN_PATTERN= \ No newline at end of file +ALLOWED_DOMAIN_PATTERN= + +# Local development variables. When developped locally with Saleor inside docker, these can be set to: +# APP_IFRAME_BASE_URL = http://localhost:3000, so Dashboard on host can access iframe +# APP_API_BASE_URL=http://host.docker.internal:3000 - so Saleor can reach App running on host, from the container. +# If developped with tunnels, set this empty, it will fallback to default Next's localhost:3000 +# https://docs.saleor.io/docs/3.x/developer/extending/apps/local-app-development +APP_IFRAME_BASE_URL= +APP_API_BASE_URL= \ No newline at end of file diff --git a/apps/invoices/src/pages/api/manifest.ts b/apps/invoices/src/pages/api/manifest.ts index 1714df6..7f35897 100644 --- a/apps/invoices/src/pages/api/manifest.ts +++ b/apps/invoices/src/pages/api/manifest.ts @@ -6,11 +6,14 @@ import { invoiceRequestedWebhook } from "./webhooks/invoice-requested"; import { REQUIRED_SALEOR_VERSION } from "../../saleor-app"; export default createManifestHandler({ - async manifestFactory(context) { + async manifestFactory({ appBaseUrl }) { + const iframeBaseUrl = process.env.APP_IFRAME_BASE_URL ?? appBaseUrl; + const apiBaseURL = process.env.APP_API_BASE_URL ?? appBaseUrl; + const manifest: AppManifest = { about: "An app that generates PDF invoices for Orders and stores them in Saleor file storage.", - appUrl: context.appBaseUrl, + appUrl: iframeBaseUrl, author: "Saleor Commerce", dataPrivacyUrl: "https://saleor.io/legal/privacy/", extensions: [], @@ -23,12 +26,12 @@ export default createManifestHandler({ */ requiredSaleorVersion: REQUIRED_SALEOR_VERSION, supportUrl: "https://github.com/saleor/apps/discussions", - tokenTargetUrl: `${context.appBaseUrl}/api/register`, + tokenTargetUrl: `${apiBaseURL}/api/register`, version: packageJson.version, - webhooks: [invoiceRequestedWebhook.getWebhookManifest(context.appBaseUrl)], + webhooks: [invoiceRequestedWebhook.getWebhookManifest(apiBaseURL)], brand: { logo: { - default: `${context.appBaseUrl}/logo.png`, + default: `${apiBaseURL}/logo.png`, }, }, }; diff --git a/apps/invoices/turbo.json b/apps/invoices/turbo.json index ea524a2..85e2b40 100644 --- a/apps/invoices/turbo.json +++ b/apps/invoices/turbo.json @@ -20,7 +20,9 @@ "SENTRY_ORG", "SENTRY_AUTH_TOKEN", "NEXT_PUBLIC_SENTRY_DSN", - "SENTRY_ENVIRONMENT" + "SENTRY_ENVIRONMENT", + "APP_IFRAME_BASE_URL", + "APP_API_BASE_URL" ] } } diff --git a/apps/klaviyo/.env.example b/apps/klaviyo/.env.example index d4b1107..d4e2a76 100644 --- a/apps/klaviyo/.env.example +++ b/apps/klaviyo/.env.example @@ -8,4 +8,12 @@ ALLOWED_DOMAIN_PATTERN= # Encryption key used by the EncryptedSettingsManager. Required by the production builds SECRET_KEY= -APP_LOG_LEVEL=info \ No newline at end of file +APP_LOG_LEVEL=info + +# Local development variables. When developped locally with Saleor inside docker, these can be set to: +# APP_IFRAME_BASE_URL = http://localhost:3000, so Dashboard on host can access iframe +# APP_API_BASE_URL=http://host.docker.internal:3000 - so Saleor can reach App running on host, from the container. +# If developped with tunnels, set this empty, it will fallback to default Next's localhost:3000 +# https://docs.saleor.io/docs/3.x/developer/extending/apps/local-app-development +APP_IFRAME_BASE_URL= +APP_API_BASE_URL= \ No newline at end of file diff --git a/apps/monitoring/turbo.json b/apps/monitoring/turbo.json index a0fc2c6..cb18e8f 100644 --- a/apps/monitoring/turbo.json +++ b/apps/monitoring/turbo.json @@ -18,7 +18,9 @@ "SENTRY_PROJECT", "SENTRY_AUTH_TOKEN", "NEXT_PUBLIC_VERCEL_ENV", - "MONITORING_APP_API_URL" + "MONITORING_APP_API_URL", + "APP_IFRAME_BASE_URL", + "APP_API_BASE_URL" ] } } diff --git a/apps/products-feed/.env.example b/apps/products-feed/.env.example index bcc5a09..c25a2f2 100644 --- a/apps/products-feed/.env.example +++ b/apps/products-feed/.env.example @@ -1 +1,9 @@ -APP_DEBUG=info \ No newline at end of file +APP_DEBUG=info + +# Local development variables. When developped locally with Saleor inside docker, these can be set to: +# APP_IFRAME_BASE_URL = http://localhost:3000, so Dashboard on host can access iframe +# APP_API_BASE_URL=http://host.docker.internal:3000 - so Saleor can reach App running on host, from the container. +# If developped with tunnels, set this empty, it will fallback to default Next's localhost:3000 +# https://docs.saleor.io/docs/3.x/developer/extending/apps/local-app-development +APP_IFRAME_BASE_URL= +APP_API_BASE_URL= \ No newline at end of file diff --git a/apps/products-feed/src/pages/api/manifest.ts b/apps/products-feed/src/pages/api/manifest.ts index c122e8e..f6db47b 100644 --- a/apps/products-feed/src/pages/api/manifest.ts +++ b/apps/products-feed/src/pages/api/manifest.ts @@ -9,14 +9,17 @@ import { webhookProductVariantDeleted } from "./webhooks/product_variant_deleted import { webhookProductVariantUpdated } from "./webhooks/product_variant_updated"; export default createManifestHandler({ - async manifestFactory(context) { + async manifestFactory({ appBaseUrl }) { + const iframeBaseUrl = process.env.APP_IFRAME_BASE_URL ?? appBaseUrl; + const apiBaseURL = process.env.APP_API_BASE_URL ?? appBaseUrl; + const manifest: AppManifest = { about: "Generate feeds consumed by Merchant Platforms", - appUrl: context.appBaseUrl, + appUrl: iframeBaseUrl, author: "Saleor Commerce", brand: { logo: { - default: `${context.appBaseUrl}/logo.png`, + default: `${apiBaseURL}/logo.png`, }, }, dataPrivacyUrl: "https://saleor.io/legal/privacy/", @@ -26,14 +29,14 @@ export default createManifestHandler({ name: "Product Feed", permissions: ["MANAGE_PRODUCTS"], supportUrl: "https://github.com/saleor/apps/discussions", - tokenTargetUrl: `${context.appBaseUrl}/api/register`, + tokenTargetUrl: `${apiBaseURL}/api/register`, version: packageJson.version, webhooks: [ - webhookProductCreated.getWebhookManifest(context.appBaseUrl), - webhookProductDeleted.getWebhookManifest(context.appBaseUrl), - webhookProductVariantCreated.getWebhookManifest(context.appBaseUrl), - webhookProductVariantDeleted.getWebhookManifest(context.appBaseUrl), - webhookProductVariantUpdated.getWebhookManifest(context.appBaseUrl), + webhookProductCreated.getWebhookManifest(apiBaseURL), + webhookProductDeleted.getWebhookManifest(apiBaseURL), + webhookProductVariantCreated.getWebhookManifest(apiBaseURL), + webhookProductVariantDeleted.getWebhookManifest(apiBaseURL), + webhookProductVariantUpdated.getWebhookManifest(apiBaseURL), ], }; diff --git a/apps/products-feed/turbo.json b/apps/products-feed/turbo.json index 05a7384..1479d14 100644 --- a/apps/products-feed/turbo.json +++ b/apps/products-feed/turbo.json @@ -20,7 +20,9 @@ "FEED_CACHE_MAX_AGE", "VERCEL_URL", "PORT", - "SENTRY_ENVIRONMENT" + "SENTRY_ENVIRONMENT", + "APP_IFRAME_BASE_URL", + "APP_API_BASE_URL" ] } } diff --git a/apps/search/.env.example b/apps/search/.env.example index cbee4ca..5c2d304 100644 --- a/apps/search/.env.example +++ b/apps/search/.env.example @@ -1,4 +1,12 @@ # Encryption key used by the EncryptedSettingsManager. Required by the production builds SECRET_KEY= -APP_LOG_LEVEL=info \ No newline at end of file +APP_LOG_LEVEL=info + +# Local development variables. When developped locally with Saleor inside docker, these can be set to: +# APP_IFRAME_BASE_URL = http://localhost:3000, so Dashboard on host can access iframe +# APP_API_BASE_URL=http://host.docker.internal:3000 - so Saleor can reach App running on host, from the container. +# If developped with tunnels, set this empty, it will fallback to default Next's localhost:3000 +# https://docs.saleor.io/docs/3.x/developer/extending/apps/local-app-development +APP_IFRAME_BASE_URL= +APP_API_BASE_URL= \ No newline at end of file diff --git a/apps/search/src/pages/api/manifest.ts b/apps/search/src/pages/api/manifest.ts index 24032f3..b4b8586 100644 --- a/apps/search/src/pages/api/manifest.ts +++ b/apps/search/src/pages/api/manifest.ts @@ -10,14 +10,17 @@ import { webhookProductVariantDeleted } from "./webhooks/saleor/product_variant_ import { webhookProductVariantUpdated } from "./webhooks/saleor/product_variant_updated"; export default createManifestHandler({ - async manifestFactory(context) { + async manifestFactory({ appBaseUrl }) { + const iframeBaseUrl = process.env.APP_IFRAME_BASE_URL ?? appBaseUrl; + const apiBaseURL = process.env.APP_API_BASE_URL ?? appBaseUrl; + const manifest: AppManifest = { about: "Search App is a multi-integration app that connects your Saleor store with search engines.", - appUrl: context.appBaseUrl, + appUrl: iframeBaseUrl, brand: { logo: { - default: `${context.appBaseUrl}/logo.png`, + default: `${apiBaseURL}/logo.png`, }, }, dataPrivacyUrl: "https://saleor.io/legal/privacy/", @@ -39,7 +42,7 @@ export default createManifestHandler({ "MANAGE_PRODUCT_TYPES_AND_ATTRIBUTES", ], supportUrl: "https://github.com/saleor/apps/discussions", - tokenTargetUrl: `${context.appBaseUrl}/api/register`, + tokenTargetUrl: `${apiBaseURL}/api/register`, version: packageJson.version, webhooks: [ /** @@ -47,12 +50,12 @@ export default createManifestHandler({ * Read more * https://docs.saleor.io/docs/3.x/developer/api-reference/objects/webhook */ - webhookProductCreated.getWebhookManifest(context.appBaseUrl), - webhookProductDeleted.getWebhookManifest(context.appBaseUrl), - webhookProductUpdated.getWebhookManifest(context.appBaseUrl), - webhookProductVariantCreated.getWebhookManifest(context.appBaseUrl), - webhookProductVariantDeleted.getWebhookManifest(context.appBaseUrl), - webhookProductVariantUpdated.getWebhookManifest(context.appBaseUrl), + webhookProductCreated.getWebhookManifest(apiBaseURL), + webhookProductDeleted.getWebhookManifest(apiBaseURL), + webhookProductUpdated.getWebhookManifest(apiBaseURL), + webhookProductVariantCreated.getWebhookManifest(apiBaseURL), + webhookProductVariantDeleted.getWebhookManifest(apiBaseURL), + webhookProductVariantUpdated.getWebhookManifest(apiBaseURL), ], }; diff --git a/apps/search/turbo.json b/apps/search/turbo.json index 00bd069..154607b 100644 --- a/apps/search/turbo.json +++ b/apps/search/turbo.json @@ -17,7 +17,9 @@ "SENTRY_ORG", "NEXT_PUBLIC_VERCEL_ENV", "NEXT_PUBLIC_SENTRY_DSN", - "SENTRY_ENVIRONMENT" + "SENTRY_ENVIRONMENT", + "APP_IFRAME_BASE_URL", + "APP_API_BASE_URL" ] } } diff --git a/apps/slack/.env.example b/apps/slack/.env.example index cbee4ca..5c2d304 100644 --- a/apps/slack/.env.example +++ b/apps/slack/.env.example @@ -1,4 +1,12 @@ # Encryption key used by the EncryptedSettingsManager. Required by the production builds SECRET_KEY= -APP_LOG_LEVEL=info \ No newline at end of file +APP_LOG_LEVEL=info + +# Local development variables. When developped locally with Saleor inside docker, these can be set to: +# APP_IFRAME_BASE_URL = http://localhost:3000, so Dashboard on host can access iframe +# APP_API_BASE_URL=http://host.docker.internal:3000 - so Saleor can reach App running on host, from the container. +# If developped with tunnels, set this empty, it will fallback to default Next's localhost:3000 +# https://docs.saleor.io/docs/3.x/developer/extending/apps/local-app-development +APP_IFRAME_BASE_URL= +APP_API_BASE_URL= \ No newline at end of file diff --git a/apps/slack/src/pages/api/manifest.ts b/apps/slack/src/pages/api/manifest.ts index 0b0c47d..4ac5a8b 100644 --- a/apps/slack/src/pages/api/manifest.ts +++ b/apps/slack/src/pages/api/manifest.ts @@ -5,15 +5,18 @@ import packageJson from "../../../package.json"; import { orderCreatedWebhook } from "./webhooks/order-created"; const handler = createManifestHandler({ - async manifestFactory(context) { + async manifestFactory({ appBaseUrl }) { + const iframeBaseUrl = process.env.APP_IFRAME_BASE_URL ?? appBaseUrl; + const apiBaseURL = process.env.APP_API_BASE_URL ?? appBaseUrl; + const manifest: AppManifest = { about: "Saleor Slack integration allows you to get notifications on Slack channel from Saleor events.", - appUrl: context.appBaseUrl, + appUrl: iframeBaseUrl, author: "Saleor Commerce", brand: { logo: { - default: `${context.appBaseUrl}/logo.png`, + default: `${apiBaseURL}/logo.png`, }, }, dataPrivacyUrl: "https://saleor.io/legal/privacy/", @@ -23,9 +26,9 @@ const handler = createManifestHandler({ name: "Slack", permissions: ["MANAGE_ORDERS"], supportUrl: "https://github.com/saleor/apps/discussions", - tokenTargetUrl: `${context.appBaseUrl}/api/register`, + tokenTargetUrl: `${apiBaseURL}/api/register`, version: packageJson.version, - webhooks: [orderCreatedWebhook.getWebhookManifest(context.appBaseUrl)], + webhooks: [orderCreatedWebhook.getWebhookManifest(apiBaseURL)], }; return manifest; diff --git a/apps/slack/turbo.json b/apps/slack/turbo.json index 8fc607b..2f0082a 100644 --- a/apps/slack/turbo.json +++ b/apps/slack/turbo.json @@ -18,7 +18,9 @@ "SENTRY_PROJECT", "SENTRY_AUTH_TOKEN", "SENTRY_ENVIRONMENT", - "NEXT_PUBLIC_VERCEL_ENV" + "NEXT_PUBLIC_VERCEL_ENV", + "APP_IFRAME_BASE_URL", + "APP_API_BASE_URL" ] } } diff --git a/apps/taxes/.env.example b/apps/taxes/.env.example index 6c323ed..82c8750 100644 --- a/apps/taxes/.env.example +++ b/apps/taxes/.env.example @@ -8,4 +8,12 @@ PORT= VERCEL_URL= REST_APL_ENDPOINT= REST_APL_TOKEN= -ALLOWED_DOMAIN_PATTERN= \ No newline at end of file +ALLOWED_DOMAIN + +# Local development variables. When developped locally with Saleor inside docker, these can be set to: +# APP_IFRAME_BASE_URL = http://localhost:3000, so Dashboard on host can access iframe +# APP_API_BASE_URL=http://host.docker.internal:3000 - so Saleor can reach App running on host, from the container. +# If developped with tunnels, set this empty, it will fallback to default Next's localhost:3000 +# https://docs.saleor.io/docs/3.x/developer/extending/apps/local-app-development +APP_IFRAME_BASE_URL= +APP_API_BASE_URL=_PATTERN= \ No newline at end of file diff --git a/apps/taxes/src/pages/api/manifest.ts b/apps/taxes/src/pages/api/manifest.ts index 21179f2..2cd6910 100644 --- a/apps/taxes/src/pages/api/manifest.ts +++ b/apps/taxes/src/pages/api/manifest.ts @@ -9,14 +9,17 @@ import { orderFulfilledAsyncWebhook } from "./webhooks/order-fulfilled"; import { REQUIRED_SALEOR_VERSION } from "../../../saleor-app"; export default createManifestHandler({ - async manifestFactory(context) { + async manifestFactory({ appBaseUrl }) { + const iframeBaseUrl = process.env.APP_IFRAME_BASE_URL ?? appBaseUrl; + const apiBaseURL = process.env.APP_API_BASE_URL ?? appBaseUrl; + const manifest: AppManifest = { about: "Taxes App allows dynamic taxes calculations for orders", - appUrl: context.appBaseUrl, + appUrl: iframeBaseUrl, author: "Saleor Commerce", brand: { logo: { - default: `${context.appBaseUrl}/logo.png`, + default: `${apiBaseURL}/logo.png`, }, }, dataPrivacyUrl: "https://saleor.io/legal/privacy/", @@ -27,13 +30,13 @@ export default createManifestHandler({ permissions: ["HANDLE_TAXES", "MANAGE_ORDERS"], requiredSaleorVersion: REQUIRED_SALEOR_VERSION, supportUrl: "https://github.com/saleor/apps/discussions", - tokenTargetUrl: `${context.appBaseUrl}/api/register`, + tokenTargetUrl: `${apiBaseURL}/api/register`, version: packageJson.version, webhooks: [ - orderCalculateTaxesSyncWebhook.getWebhookManifest(context.appBaseUrl), - checkoutCalculateTaxesSyncWebhook.getWebhookManifest(context.appBaseUrl), - orderCreatedAsyncWebhook.getWebhookManifest(context.appBaseUrl), - orderFulfilledAsyncWebhook.getWebhookManifest(context.appBaseUrl), + orderCalculateTaxesSyncWebhook.getWebhookManifest(apiBaseURL), + checkoutCalculateTaxesSyncWebhook.getWebhookManifest(apiBaseURL), + orderCreatedAsyncWebhook.getWebhookManifest(apiBaseURL), + orderFulfilledAsyncWebhook.getWebhookManifest(apiBaseURL), ], }; diff --git a/apps/taxes/turbo.json b/apps/taxes/turbo.json index 9e45bb8..9e92b3c 100644 --- a/apps/taxes/turbo.json +++ b/apps/taxes/turbo.json @@ -18,7 +18,9 @@ "SENTRY_DSN", "SENTRY_AUTH_TOKEN", "SENTRY_ENVIRONMENT", - "NEXT_PUBLIC_SENTRY_DSN" + "NEXT_PUBLIC_SENTRY_DSN", + "APP_IFRAME_BASE_URL", + "APP_API_BASE_URL" ] } }