2020-07-07 10:22:17 +00:00
|
|
|
import { AppsmithUIConfigs, FeatureFlagConfig } from "./types";
|
2020-08-28 08:34:01 +00:00
|
|
|
import { Integrations } from "@sentry/tracing";
|
2020-08-28 17:23:07 +00:00
|
|
|
import * as Sentry from "@sentry/react";
|
|
|
|
|
import { createBrowserHistory } from "history";
|
|
|
|
|
const history = createBrowserHistory();
|
2020-08-28 08:34:01 +00:00
|
|
|
|
2021-02-16 10:29:08 +00:00
|
|
|
export type INJECTED_CONFIGS = {
|
2020-08-13 04:46:06 +00:00
|
|
|
sentry: {
|
|
|
|
|
dsn: string;
|
|
|
|
|
release: string;
|
|
|
|
|
environment: string;
|
|
|
|
|
};
|
2020-08-27 12:54:03 +00:00
|
|
|
smartLook: {
|
2020-07-07 10:22:17 +00:00
|
|
|
id: string;
|
|
|
|
|
};
|
|
|
|
|
enableGoogleOAuth: boolean;
|
|
|
|
|
enableGithubOAuth: boolean;
|
|
|
|
|
enableRapidAPI: boolean;
|
2020-11-05 05:24:30 +00:00
|
|
|
segment: {
|
|
|
|
|
apiKey: string;
|
|
|
|
|
ceKey: string;
|
|
|
|
|
};
|
2020-12-02 10:42:51 +00:00
|
|
|
fusioncharts: {
|
|
|
|
|
licenseKey: string;
|
|
|
|
|
};
|
2020-07-07 10:22:17 +00:00
|
|
|
optimizely: string;
|
|
|
|
|
enableMixpanel: boolean;
|
|
|
|
|
google: string;
|
|
|
|
|
enableTNCPP: boolean;
|
2020-07-23 05:32:00 +00:00
|
|
|
cloudHosting: boolean;
|
2020-07-07 10:22:17 +00:00
|
|
|
algolia: {
|
|
|
|
|
apiId: string;
|
|
|
|
|
apiKey: string;
|
|
|
|
|
indexName: string;
|
|
|
|
|
};
|
|
|
|
|
logLevel: "debug" | "error";
|
2020-08-14 09:47:47 +00:00
|
|
|
appVersion: {
|
|
|
|
|
id: string;
|
|
|
|
|
releaseDate: string;
|
|
|
|
|
};
|
|
|
|
|
intercomAppID: string;
|
2020-08-20 05:13:20 +00:00
|
|
|
mailEnabled: boolean;
|
2020-11-04 12:20:14 +00:00
|
|
|
disableTelemetry: boolean;
|
2021-04-22 03:30:09 +00:00
|
|
|
cloudServicesBaseUrl: string;
|
2021-06-08 05:40:11 +00:00
|
|
|
googleRecaptchaSiteKey: string;
|
2021-07-19 15:28:41 +00:00
|
|
|
supportEmail: string;
|
2020-07-07 10:22:17 +00:00
|
|
|
};
|
2020-01-22 12:26:25 +00:00
|
|
|
declare global {
|
|
|
|
|
interface Window {
|
2020-07-07 10:22:17 +00:00
|
|
|
APPSMITH_FEATURE_CONFIGS: INJECTED_CONFIGS;
|
2020-08-14 09:47:47 +00:00
|
|
|
Intercom: any;
|
2020-01-22 12:26:25 +00:00
|
|
|
}
|
|
|
|
|
}
|
2019-11-25 12:22:05 +00:00
|
|
|
|
2020-08-13 04:46:06 +00:00
|
|
|
const capitalizeText = (text: string) => {
|
|
|
|
|
const rest = text.slice(1);
|
|
|
|
|
const first = text[0].toUpperCase();
|
|
|
|
|
return `${first}${rest}`;
|
|
|
|
|
};
|
|
|
|
|
|
2020-07-07 10:22:17 +00:00
|
|
|
const getConfigsFromEnvVars = (): INJECTED_CONFIGS => {
|
|
|
|
|
return {
|
2020-08-13 04:46:06 +00:00
|
|
|
sentry: {
|
|
|
|
|
dsn: process.env.REACT_APP_SENTRY_DSN || "",
|
|
|
|
|
release: process.env.REACT_APP_SENTRY_RELEASE || "",
|
2020-08-28 08:34:01 +00:00
|
|
|
environment:
|
|
|
|
|
process.env.REACT_APP_SENTRY_ENVIRONMENT ||
|
|
|
|
|
capitalizeText(process.env.NODE_ENV),
|
2020-08-13 04:46:06 +00:00
|
|
|
},
|
2020-08-27 12:54:03 +00:00
|
|
|
smartLook: {
|
|
|
|
|
id: process.env.REACT_APP_SMART_LOOK_ID || "",
|
2020-07-07 10:22:17 +00:00
|
|
|
},
|
|
|
|
|
enableGoogleOAuth: process.env.REACT_APP_OAUTH2_GOOGLE_CLIENT_ID
|
|
|
|
|
? process.env.REACT_APP_OAUTH2_GOOGLE_CLIENT_ID.length > 0
|
|
|
|
|
: false,
|
|
|
|
|
enableGithubOAuth: process.env.REACT_APP_OAUTH2_GITHUB_CLIENT_ID
|
|
|
|
|
? process.env.REACT_APP_OAUTH2_GITHUB_CLIENT_ID.length > 0
|
|
|
|
|
: false,
|
2020-11-05 05:24:30 +00:00
|
|
|
segment: {
|
|
|
|
|
apiKey: process.env.REACT_APP_SEGMENT_KEY || "",
|
|
|
|
|
ceKey: process.env.REACT_APP_SEGMENT_CE_KEY || "",
|
|
|
|
|
},
|
2020-12-02 10:42:51 +00:00
|
|
|
fusioncharts: {
|
|
|
|
|
licenseKey: process.env.REACT_APP_FUSIONCHARTS_LICENSE_KEY || "",
|
|
|
|
|
},
|
2020-07-07 10:22:17 +00:00
|
|
|
optimizely: process.env.REACT_APP_OPTIMIZELY_KEY || "",
|
|
|
|
|
enableMixpanel: process.env.REACT_APP_SEGMENT_KEY
|
|
|
|
|
? process.env.REACT_APP_SEGMENT_KEY.length > 0
|
|
|
|
|
: false,
|
|
|
|
|
algolia: {
|
|
|
|
|
apiId: process.env.REACT_APP_ALGOLIA_API_ID || "",
|
|
|
|
|
apiKey: process.env.REACT_APP_ALGOLIA_API_KEY || "",
|
|
|
|
|
indexName: process.env.REACT_APP_ALGOLIA_SEARCH_INDEX_NAME || "",
|
|
|
|
|
},
|
|
|
|
|
logLevel:
|
|
|
|
|
(process.env.REACT_APP_CLIENT_LOG_LEVEL as
|
|
|
|
|
| "debug"
|
|
|
|
|
| "error"
|
2021-07-05 05:49:43 +00:00
|
|
|
| undefined) || "error",
|
2020-07-07 10:22:17 +00:00
|
|
|
google: process.env.REACT_APP_GOOGLE_MAPS_API_KEY || "",
|
|
|
|
|
enableTNCPP: process.env.REACT_APP_TNC_PP
|
|
|
|
|
? process.env.REACT_APP_TNC_PP.length > 0
|
|
|
|
|
: false,
|
|
|
|
|
enableRapidAPI: process.env.REACT_APP_MARKETPLACE_URL
|
|
|
|
|
? process.env.REACT_APP_MARKETPLACE_URL.length > 0
|
|
|
|
|
: false,
|
2020-07-23 05:32:00 +00:00
|
|
|
cloudHosting: process.env.REACT_APP_CLOUD_HOSTING
|
|
|
|
|
? process.env.REACT_APP_CLOUD_HOSTING.length > 0
|
|
|
|
|
: false,
|
2020-08-14 09:47:47 +00:00
|
|
|
appVersion: {
|
|
|
|
|
id: process.env.REACT_APP_VERSION_ID || "",
|
|
|
|
|
releaseDate: process.env.REACT_APP_VERSION_RELEASE_DATE || "",
|
|
|
|
|
},
|
|
|
|
|
intercomAppID: process.env.REACT_APP_INTERCOM_APP_ID || "",
|
2020-08-20 05:13:20 +00:00
|
|
|
mailEnabled: process.env.REACT_APP_MAIL_ENABLED
|
|
|
|
|
? process.env.REACT_APP_MAIL_ENABLED.length > 0
|
|
|
|
|
: false,
|
2020-11-11 18:24:19 +00:00
|
|
|
disableTelemetry: true,
|
2021-04-22 03:30:09 +00:00
|
|
|
cloudServicesBaseUrl: process.env.REACT_APP_CLOUD_SERVICES_BASE_URL || "",
|
2021-06-08 05:40:11 +00:00
|
|
|
googleRecaptchaSiteKey:
|
|
|
|
|
process.env.REACT_APP_GOOGLE_RECAPTCHA_SITE_KEY || "",
|
2021-07-19 15:28:41 +00:00
|
|
|
supportEmail: process.env.APPSMITH_SUPPORT_EMAIL || "support@appsmith.com",
|
2020-07-07 10:22:17 +00:00
|
|
|
};
|
|
|
|
|
};
|
|
|
|
|
|
2021-04-02 09:47:16 +00:00
|
|
|
const getConfig = (fromENV: string, fromWindow = "") => {
|
2020-09-21 12:50:19 +00:00
|
|
|
if (fromWindow.length > 0) return { enabled: true, value: fromWindow };
|
|
|
|
|
else if (fromENV.length > 0) return { enabled: true, value: fromENV };
|
2020-07-07 10:22:17 +00:00
|
|
|
return { enabled: false, value: "" };
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
// TODO(Abhinav): See if this is called so many times, that we may need some form of memoization.
|
2019-11-25 12:22:05 +00:00
|
|
|
export const getAppsmithConfigs = (): AppsmithUIConfigs => {
|
2020-07-07 10:22:17 +00:00
|
|
|
const { APPSMITH_FEATURE_CONFIGS } = window;
|
|
|
|
|
const ENV_CONFIG = getConfigsFromEnvVars();
|
|
|
|
|
const getFeatureFlags = (
|
2021-04-02 09:47:16 +00:00
|
|
|
optimizelyApiKey = "",
|
2020-07-07 10:22:17 +00:00
|
|
|
): FeatureFlagConfig | undefined => {
|
|
|
|
|
if (optimizelyApiKey.length > 0) {
|
|
|
|
|
return {
|
|
|
|
|
remoteConfig: {
|
|
|
|
|
optimizely: optimizelyApiKey,
|
|
|
|
|
},
|
|
|
|
|
default: {},
|
|
|
|
|
};
|
|
|
|
|
}
|
|
|
|
|
return;
|
|
|
|
|
};
|
|
|
|
|
|
2020-08-13 04:46:06 +00:00
|
|
|
// const sentry = getConfig(ENV_CONFIG.sentry, APPSMITH_FEATURE_CONFIGS.sentry);
|
|
|
|
|
const sentryDSN = getConfig(
|
|
|
|
|
ENV_CONFIG.sentry.dsn,
|
|
|
|
|
APPSMITH_FEATURE_CONFIGS.sentry.dsn,
|
|
|
|
|
);
|
|
|
|
|
const sentryRelease = getConfig(
|
|
|
|
|
ENV_CONFIG.sentry.release,
|
|
|
|
|
APPSMITH_FEATURE_CONFIGS.sentry.release,
|
|
|
|
|
);
|
|
|
|
|
const sentryENV = getConfig(
|
|
|
|
|
ENV_CONFIG.sentry.environment,
|
2020-09-02 19:47:49 +00:00
|
|
|
APPSMITH_FEATURE_CONFIGS.sentry.environment,
|
2020-08-13 04:46:06 +00:00
|
|
|
);
|
2020-07-07 10:22:17 +00:00
|
|
|
const segment = getConfig(
|
2020-11-05 05:24:30 +00:00
|
|
|
ENV_CONFIG.segment.apiKey,
|
|
|
|
|
APPSMITH_FEATURE_CONFIGS.segment.apiKey,
|
2020-07-07 10:22:17 +00:00
|
|
|
);
|
2020-12-02 10:42:51 +00:00
|
|
|
const fusioncharts = getConfig(
|
|
|
|
|
ENV_CONFIG.fusioncharts.licenseKey,
|
|
|
|
|
APPSMITH_FEATURE_CONFIGS.fusioncharts.licenseKey,
|
|
|
|
|
);
|
2020-07-07 10:22:17 +00:00
|
|
|
const google = getConfig(ENV_CONFIG.google, APPSMITH_FEATURE_CONFIGS.google);
|
|
|
|
|
|
2021-06-08 05:40:11 +00:00
|
|
|
const googleRecaptchaSiteKey = getConfig(
|
|
|
|
|
ENV_CONFIG.googleRecaptchaSiteKey,
|
|
|
|
|
APPSMITH_FEATURE_CONFIGS.googleRecaptchaSiteKey,
|
|
|
|
|
);
|
|
|
|
|
|
2020-07-07 10:22:17 +00:00
|
|
|
// As the following shows, the config variables can be set using a combination
|
|
|
|
|
// of env variables and injected configs
|
2020-08-27 12:54:03 +00:00
|
|
|
const smartLook = getConfig(
|
|
|
|
|
ENV_CONFIG.smartLook.id,
|
|
|
|
|
APPSMITH_FEATURE_CONFIGS.smartLook.id,
|
2020-07-07 10:22:17 +00:00
|
|
|
);
|
|
|
|
|
|
|
|
|
|
const algoliaAPIID = getConfig(
|
|
|
|
|
ENV_CONFIG.algolia.apiId,
|
2020-11-04 12:20:14 +00:00
|
|
|
APPSMITH_FEATURE_CONFIGS.algolia.apiId,
|
2020-07-07 10:22:17 +00:00
|
|
|
);
|
|
|
|
|
const algoliaAPIKey = getConfig(
|
|
|
|
|
ENV_CONFIG.algolia.apiKey,
|
|
|
|
|
APPSMITH_FEATURE_CONFIGS.algolia.apiKey,
|
|
|
|
|
);
|
|
|
|
|
const algoliaIndex = getConfig(
|
|
|
|
|
ENV_CONFIG.algolia.indexName,
|
|
|
|
|
APPSMITH_FEATURE_CONFIGS.algolia.indexName,
|
|
|
|
|
);
|
|
|
|
|
|
2020-11-05 05:24:30 +00:00
|
|
|
const segmentCEKey = getConfig(
|
|
|
|
|
ENV_CONFIG.segment.ceKey,
|
|
|
|
|
APPSMITH_FEATURE_CONFIGS.segment.ceKey,
|
|
|
|
|
);
|
|
|
|
|
|
2020-11-12 13:31:40 +00:00
|
|
|
// We enable segment tracking if either the Cloud API key is set or the self-hosted CE key is set
|
|
|
|
|
segment.enabled = segment.enabled || segmentCEKey.enabled;
|
|
|
|
|
|
2020-11-12 06:26:09 +00:00
|
|
|
let sentryTelemetry = true;
|
|
|
|
|
// Turn off all analytics if telemetry is disabled
|
|
|
|
|
if (APPSMITH_FEATURE_CONFIGS.disableTelemetry) {
|
|
|
|
|
smartLook.enabled = false;
|
|
|
|
|
segment.enabled = false;
|
|
|
|
|
sentryTelemetry = false;
|
|
|
|
|
}
|
|
|
|
|
|
2020-07-07 10:22:17 +00:00
|
|
|
return {
|
2020-08-13 04:46:06 +00:00
|
|
|
sentry: {
|
2020-11-12 06:26:09 +00:00
|
|
|
enabled:
|
|
|
|
|
sentryDSN.enabled &&
|
|
|
|
|
sentryRelease.enabled &&
|
|
|
|
|
sentryENV.enabled &&
|
|
|
|
|
sentryTelemetry,
|
2020-08-13 04:46:06 +00:00
|
|
|
dsn: sentryDSN.value,
|
|
|
|
|
release: sentryRelease.value,
|
|
|
|
|
environment: sentryENV.value,
|
2020-12-09 09:12:12 +00:00
|
|
|
normalizeDepth: 3,
|
2020-08-28 17:23:07 +00:00
|
|
|
integrations: [
|
|
|
|
|
new Integrations.BrowserTracing({
|
|
|
|
|
// Can also use reactRouterV4Instrumentation
|
|
|
|
|
routingInstrumentation: Sentry.reactRouterV5Instrumentation(history),
|
|
|
|
|
}),
|
|
|
|
|
],
|
2021-03-31 07:40:59 +00:00
|
|
|
tracesSampleRate: 0.1,
|
2020-08-13 04:46:06 +00:00
|
|
|
},
|
2020-08-27 12:54:03 +00:00
|
|
|
smartLook: {
|
|
|
|
|
enabled: smartLook.enabled,
|
|
|
|
|
id: smartLook.value,
|
2020-07-07 10:22:17 +00:00
|
|
|
},
|
|
|
|
|
segment: {
|
|
|
|
|
enabled: segment.enabled,
|
|
|
|
|
apiKey: segment.value,
|
2020-11-05 05:24:30 +00:00
|
|
|
ceKey: segmentCEKey.value,
|
2020-07-07 10:22:17 +00:00
|
|
|
},
|
2020-12-02 10:42:51 +00:00
|
|
|
fusioncharts: {
|
|
|
|
|
enabled: fusioncharts.enabled,
|
|
|
|
|
licenseKey: fusioncharts.value,
|
|
|
|
|
},
|
2020-07-07 10:22:17 +00:00
|
|
|
algolia: {
|
|
|
|
|
enabled: true,
|
|
|
|
|
apiId: algoliaAPIID.value || "AZ2Z9CJSJ0",
|
|
|
|
|
apiKey: algoliaAPIKey.value || "d113611dccb80ac14aaa72a6e3ac6d10",
|
|
|
|
|
indexName: algoliaIndex.value || "test_appsmith",
|
|
|
|
|
},
|
|
|
|
|
google: {
|
|
|
|
|
enabled: google.enabled,
|
|
|
|
|
apiKey: google.value,
|
|
|
|
|
},
|
2021-06-08 05:40:11 +00:00
|
|
|
googleRecaptchaSiteKey: {
|
|
|
|
|
enabled: googleRecaptchaSiteKey.enabled,
|
|
|
|
|
apiKey: googleRecaptchaSiteKey.value,
|
|
|
|
|
},
|
2020-07-07 10:22:17 +00:00
|
|
|
enableRapidAPI:
|
|
|
|
|
ENV_CONFIG.enableRapidAPI || APPSMITH_FEATURE_CONFIGS.enableRapidAPI,
|
|
|
|
|
enableGithubOAuth:
|
|
|
|
|
ENV_CONFIG.enableGithubOAuth ||
|
|
|
|
|
APPSMITH_FEATURE_CONFIGS.enableGithubOAuth,
|
|
|
|
|
enableGoogleOAuth:
|
|
|
|
|
ENV_CONFIG.enableGoogleOAuth ||
|
|
|
|
|
APPSMITH_FEATURE_CONFIGS.enableGoogleOAuth,
|
|
|
|
|
enableMixpanel:
|
|
|
|
|
ENV_CONFIG.enableMixpanel || APPSMITH_FEATURE_CONFIGS.enableMixpanel,
|
2020-07-23 05:32:00 +00:00
|
|
|
cloudHosting:
|
|
|
|
|
ENV_CONFIG.cloudHosting || APPSMITH_FEATURE_CONFIGS.cloudHosting,
|
2020-07-07 10:22:17 +00:00
|
|
|
featureFlag: getFeatureFlags(
|
|
|
|
|
ENV_CONFIG.optimizely || APPSMITH_FEATURE_CONFIGS.optimizely,
|
|
|
|
|
),
|
|
|
|
|
logLevel: ENV_CONFIG.logLevel || APPSMITH_FEATURE_CONFIGS.logLevel,
|
|
|
|
|
enableTNCPP: ENV_CONFIG.enableTNCPP || APPSMITH_FEATURE_CONFIGS.enableTNCPP,
|
2020-08-14 09:47:47 +00:00
|
|
|
appVersion: ENV_CONFIG.appVersion || APPSMITH_FEATURE_CONFIGS.appVersion,
|
|
|
|
|
intercomAppID:
|
|
|
|
|
ENV_CONFIG.intercomAppID || APPSMITH_FEATURE_CONFIGS.intercomAppID,
|
2020-08-20 05:13:20 +00:00
|
|
|
mailEnabled: ENV_CONFIG.mailEnabled || APPSMITH_FEATURE_CONFIGS.mailEnabled,
|
2020-11-04 12:20:14 +00:00
|
|
|
disableTelemetry: APPSMITH_FEATURE_CONFIGS.disableTelemetry,
|
Initialise comments (#3328)
* Initial scaffolding for comments CRUD APIs
* add actions
* add assets
* state management for existing comments and creating new
* add ui components
* add overlay comments wrapper to baseWidget
* add toggle comment mode button at editor header
* trigger tests
* Disallow commenting as someone else
* Add applicationId for comments
* lint
* Add overlay blacklist to prevent component interaction while adding comments
* Comment thread style updates
* Placeholder comment context menu
* Controlled comment thread visibility for making new comments visible by default
* Update comment type description
* Reset input on save
* Resolve comment thread button ui
* fix close on esc key, dont create new comment on outside click
* Submit on enter
* add emoji picker
* Attempt at adding a websocket server in Java
* CRUD APIs for comment threads
* Add API for getting all threads in application
* Move types to a separate file
* Initial commit for real time server (RTS)
* Add script to start RTS
* Fix position property
* Use create comment thread API
* Use add comment to thread API
* Add custom cursor
* Dispatch logout init on 401 errors
* Allow CORS for real time connection
* Add more logs to RTS
* Fix construction of MongoClient
* WIP: Real time comments
* Enable comments
* Minor updates
* Read backend API base URL from environment
* Escape to reset comments mode
* Set popover position as auto and boundary as scroll parent
* Disable warning
* Added permissions for comment threads
* Add resolved API for comment threads
* Migration to set commenting permission on existing apps
* Fix updates bringing the RTS down
* Show view latest button, scroll to bottom on creating a new comment
* Cleanup comment reducer
* Move to typescript for RTS
* Add missing server.ts and tsconfig files
* Resolve / unresolve comment
* Scaffold app comments
* Minor fixes: comment on top of all widgets, add toggle button at viewer header
* Reconnect socket on creating a new app, set connected status in store
* Retry socket connection flow
* Integration tests for comments with api mocks using msw
* Fix circular depependency
* rm file
* Minor cleanup and comments
* Minor refactors: move isScrolledToBottom to common hooks, decouple prevent interactions overlay from comments wrapper
* Use policies when pushing updates in RTS
* ENV var to set if comments are enabled
* Fix: check if editor/viewer is initialised before waiting for init action
* Add tests for comments reducer
* Revert "ENV var to set if comments are enabled"
This reverts commit 988efeaa69d378d943a387e1e73510334958adc5.
* Enable comments for users with appsmith email
* lint
* fix
* Try running a socket.io server inside backend
* Update comment reducer tests
* Init mentions within comments
* Fix comment thread updates with email rooms
* Minor fixes
* Refactors / review suggestions
* lint
* increase cache limit for builds
* Comment out tests for feature that's under development
* Add Dockerfile for RTS
* Fix policies missing for first comment in threads
* Use draftJS for comments input with mentions support
* fix fixtures
* Use thread's policies when querying for threads
* Update socket.io to v4
* Add support for richer body with mentions
* Update comment body type to RawDraftContentState
* fix stale method
* Fix mentions search
* Minor cleanups
* Comment context menu and thread UI updates
* revert: Scaffold app comments
* Yarn dependencies
* Delete comment using id api added
* Init app comments
* Add test for creating thread
* Api for delete comment with id
* Test comment creation response and policies
* Copy comment links
* Fix reset editor state
* Delete valid comment testcase added
* Delete comment TC : code refactor
* Don't allow creating comments with an empty body
* Pin comments WIP[]
* Ignore dependency-reduced-pom.xml files from VCS
* Cleanup of some dev-only files, for review
* Delete comment
* Update socket.io to v4 in RTS
* Pin and resolve comment thread object added in commentThread
* Pin and resolve comment thread object added in commentThread
* Update comment thread API
* Added creationTime and updationTime in comment thread response
* Added creationTime and updationTime in comment thread response
* Added human readable id to comment threads, fallback to username for null name in user document
* Refactor
* lint
* fix test, rm duplicate selector
* comment out saga used for dev
* CommentThread viewed status, username fallback for getName=null, username field added in pin & resolve status
* lint
* trigger tests
Co-authored-by: Shrikant Sharat Kandula <shrikant@appsmith.com>
Co-authored-by: Abhijeet <abhi.nagarnaik@gmail.com>
2021-04-29 10:33:51 +00:00
|
|
|
commentsTestModeEnabled: false,
|
2021-04-22 03:30:09 +00:00
|
|
|
cloudServicesBaseUrl:
|
|
|
|
|
ENV_CONFIG.cloudServicesBaseUrl ||
|
|
|
|
|
APPSMITH_FEATURE_CONFIGS.cloudServicesBaseUrl,
|
2021-07-19 15:28:41 +00:00
|
|
|
appsmithSupportEmail: ENV_CONFIG.supportEmail,
|
2020-07-07 10:22:17 +00:00
|
|
|
};
|
2019-11-25 12:22:05 +00:00
|
|
|
};
|