@crowdin/app-project-module
Version:
Module that generates for you all common endpoints for serving standalone Crowdin App
131 lines (130 loc) • 6.56 kB
JavaScript
;
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.default = handle;
const util_1 = require("../../../util");
const jsx_renderer_1 = require("../../../util/jsx-renderer");
const logger_1 = require("../../../util/logger");
const subscription_1 = require("../../../util/subscription");
const defaults_1 = require("../util/defaults");
const users_1 = require("./users");
function handle(config, integration) {
return (0, util_1.runAsyncWrapper)((req, res) => __awaiter(this, void 0, void 0, function* () {
var _a, _b, _c, _d;
const logger = req.logInfo || logger_1.log;
const installed = !!req.crowdinApiClient;
const loggedIn = !!req.integrationCredentials;
const options = {
name: config.name,
};
let view = 'main';
if (!installed) {
view = 'install';
}
else if (!loggedIn) {
view = 'login';
options.loginFields = (_a = integration.loginForm) === null || _a === void 0 ? void 0 : _a.fields;
if (integration.oauthLogin) {
options.loginFields = integration.oauthLogin.loginFields || [];
options.oauthUrl = (0, defaults_1.constructOauthUrl)({
config,
integration,
clientId: req.crowdinContext.clientId,
});
options.oauthLogin = true;
options.oauthMode = integration.oauthLogin.mode;
}
}
else {
if (integration.getConfiguration) {
options.config = JSON.stringify(req.integrationSettings || {});
options.reloadOnConfigSave = !!integration.reloadOnConfigSave;
options.integrationPagination = integration.integrationPagination;
if ((_b = req.query) === null || _b === void 0 ? void 0 : _b.parentUrl) {
const parentUrl = new URL(req.query.parentUrl);
parentUrl.searchParams.set('zen-mode', 'true');
options.zenModeUrl = parentUrl.toString();
}
const configurationFields = yield integration.getConfiguration({
projectId: req.crowdinContext.jwtPayload.context.project_id,
client: req.crowdinApiClient,
credentials: req.integrationCredentials,
settings: req.integrationSettings,
clientId: req.crowdinContext.clientId,
});
options.configurationFields = (0, defaults_1.groupFieldsByCategory)(configurationFields);
logger(`Adding configuration fields ${JSON.stringify(options.configurationFields, null, 2)}`);
}
options.hasOrganization = !!req.crowdinContext.jwtPayload.domain;
const userId = req.crowdinContext.jwtPayload.context.user_id;
options.isOwner = req.integrationCredentials.ownerId === userId;
options.userId = userId;
options.isManager = yield (0, users_1.isManager)({
client: req.crowdinApiClient,
projectId: req.crowdinContext.jwtPayload.context.project_id,
memberId: userId,
});
}
options.infoModal = integration.infoModal;
options.syncNewElements = integration.syncNewElements;
options.filtering = Object.assign(Object.assign({}, integration.filtering), { integrationFilterConfig: JSON.stringify(((_c = integration.filtering) === null || _c === void 0 ? void 0 : _c.integrationFilterConfig) || []) });
options.withCronSync = integration.withCronSync;
options.webhooks = integration.webhooks
? {
crowdin: true,
integration: !!integration.webhooks.integrationWebhookInterceptor,
}
: {};
options.integrationOneLevelFetching = integration.integrationOneLevelFetching;
options.integrationSearchListener = integration.integrationSearchListener;
options.progressiveCrowdinFilesLoading = integration.progressiveCrowdinFilesLoading;
options.checkSubscription = !(0, subscription_1.isAppFree)(config);
options.uploadTranslations = integration.uploadTranslations;
options.forcePushTranslations = integration.forcePushTranslations;
options.forcePushSources = integration.forcePushSources;
options.excludedTargetLanguages = integration.excludedTargetLanguages;
const menuItems = (0, defaults_1.buildMenuItems)(integration, config.name);
options.integrationButtonMenuItems = menuItems.integrationButtonMenuItems;
options.crowdinButtonMenuItems = menuItems.crowdinButtonMenuItems;
options.sentryData = process.env.SENTRY_DSN
? {
dsn: process.env.SENTRY_DSN,
appIdentifier: config.identifier,
}
: null;
options.notice = integration.notice;
options.asyncProgress = {
checkInterval: ((_d = integration.asyncProgress) === null || _d === void 0 ? void 0 : _d.checkInterval) || 1000,
};
logger(`Routing user to ${view} view`);
let html;
if (view === 'install') {
html = (0, jsx_renderer_1.renderJSXOnClient)({
name: 'install',
props: options,
});
}
else if (view === 'login') {
html = (0, jsx_renderer_1.renderJSXOnClient)({
name: 'login',
props: options,
});
}
else {
html = (0, jsx_renderer_1.renderJSXOnClient)({
name: 'main',
props: options,
});
}
res.setHeader('Content-Type', 'text/html; charset=utf-8');
return res.send(html);
}));
}