From 03ead0d1ca0e7a94eb37bf953ec90cb4793543a5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jaros=C5=82aw=20Sadzi=C5=84ski?= Date: Tue, 2 Apr 2024 13:22:58 +0200 Subject: [PATCH] (core) Adding a flag for the UI to check if emails are enabled Summary: Front-end code can now test if emails are enabled and hide some parts of UI based on it. Test Plan: Only secondery text was hidden on add users dialog. Tested manually. Reviewers: georgegevoian Reviewed By: georgegevoian Subscribers: georgegevoian Differential Revision: https://phab.getgrist.com/D4221 --- app/client/lib/ACUserManager.ts | 8 ++++---- app/common/gristUrls.ts | 3 +++ app/server/lib/FlexServer.ts | 4 ++-- app/server/lib/GristServer.ts | 2 ++ app/server/lib/ICreate.ts | 8 ++------ app/server/lib/INotifier.ts | 9 +++++++++ app/server/lib/sendAppPage.ts | 1 + 7 files changed, 23 insertions(+), 12 deletions(-) diff --git a/app/client/lib/ACUserManager.ts b/app/client/lib/ACUserManager.ts index fb746a56..ca35d4b7 100644 --- a/app/client/lib/ACUserManager.ts +++ b/app/client/lib/ACUserManager.ts @@ -16,6 +16,7 @@ import { cssMemberText, } from "app/client/ui/UserItem"; import {createUserImage, cssUserImage} from "app/client/ui/UserImage"; +import {getGristConfig} from 'app/common/urlUtils'; import {Computed, computed, dom, DomElementArg, Holder, IDisposableOwner, Observable, styled} from "grainjs"; import {cssMenuItem} from "popweasel"; @@ -111,10 +112,9 @@ export function buildACMemberEmail( )), cssMemberText( cssMemberPrimaryPlus(t("Invite new member")), - cssMemberSecondaryPlus( - // dom.text(use => `We'll email an invite to ${use(emailObs)}`) - dom.text(use => t("We'll email an invite to {{email}}", {email: use(emailObs)})) // TODO i18next - ) + getGristConfig().notifierEnabled ? cssMemberSecondaryPlus( + dom.text(use => t("We'll email an invite to {{email}}", {email: use(emailObs)})) + ) : null, ), testId("um-add-email") ) diff --git a/app/common/gristUrls.ts b/app/common/gristUrls.ts index a7708354..69f2fa2a 100644 --- a/app/common/gristUrls.ts +++ b/app/common/gristUrls.ts @@ -786,6 +786,9 @@ export interface GristLoadConfig { canCloseAccount?: boolean; experimentalPlugins?: boolean; + + // If backend has an email service for sending notifications. + notifierEnabled?: boolean; } export const Features = StringUnion( diff --git a/app/server/lib/FlexServer.ts b/app/server/lib/FlexServer.ts index 728adee8..020e70ae 100644 --- a/app/server/lib/FlexServer.ts +++ b/app/server/lib/FlexServer.ts @@ -47,7 +47,7 @@ import {initGristSessions, SessionStore} from 'app/server/lib/gristSessions'; import {HostedStorageManager} from 'app/server/lib/HostedStorageManager'; import {IBilling} from 'app/server/lib/IBilling'; import {IDocStorageManager} from 'app/server/lib/IDocStorageManager'; -import {INotifier} from 'app/server/lib/INotifier'; +import {EmptyNotifier, INotifier} from 'app/server/lib/INotifier'; import {InstallAdmin} from 'app/server/lib/InstallAdmin'; import log from 'app/server/lib/log'; import {getLoginSystem} from 'app/server/lib/logins'; @@ -384,7 +384,7 @@ export class FlexServer implements GristServer { } public hasNotifier(): boolean { - return Boolean(this._notifier); + return Boolean(this._notifier) && this._notifier !== EmptyNotifier; } public getNotifier(): INotifier { diff --git a/app/server/lib/GristServer.ts b/app/server/lib/GristServer.ts index a1fd8dac..b72b3ed5 100644 --- a/app/server/lib/GristServer.ts +++ b/app/server/lib/GristServer.ts @@ -52,6 +52,7 @@ export interface GristServer { getHomeDBManager(): HomeDBManager; getStorageManager(): IDocStorageManager; getTelemetry(): ITelemetry; + hasNotifier(): boolean; getNotifier(): INotifier; getDocTemplate(): Promise; getTag(): string; @@ -142,6 +143,7 @@ export function createDummyGristServer(): GristServer { getStorageManager() { throw new Error('no storage manager'); }, getTelemetry() { return createDummyTelemetry(); }, getNotifier() { throw new Error('no notifier'); }, + hasNotifier() { return false; }, getDocTemplate() { throw new Error('no doc template'); }, getTag() { return 'tag'; }, sendAppPage() { return Promise.resolve(); }, diff --git a/app/server/lib/ICreate.ts b/app/server/lib/ICreate.ts index 8f3ab17c..8d76d030 100644 --- a/app/server/lib/ICreate.ts +++ b/app/server/lib/ICreate.ts @@ -5,7 +5,7 @@ import {HomeDBManager} from 'app/gen-server/lib/HomeDBManager'; import {ExternalStorage} from 'app/server/lib/ExternalStorage'; import {createDummyTelemetry, GristServer} from 'app/server/lib/GristServer'; import {IBilling} from 'app/server/lib/IBilling'; -import {INotifier} from 'app/server/lib/INotifier'; +import {EmptyNotifier, INotifier} from 'app/server/lib/INotifier'; import {InstallAdmin, SimpleInstallAdmin} from 'app/server/lib/InstallAdmin'; import {ISandbox, ISandboxCreationOptions} from 'app/server/lib/ISandbox'; import {IShell} from 'app/server/lib/IShell'; @@ -99,11 +99,7 @@ export function makeSimpleCreator(opts: { }; }, Notifier(dbManager, gristConfig) { - return notifier?.create(dbManager, gristConfig) ?? { - get testPending() { return false; }, - async deleteUser() { /* do nothing */ }, - testSetSendMessageCallback() { return undefined; }, - }; + return notifier?.create(dbManager, gristConfig) ?? EmptyNotifier; }, ExternalStorage(purpose, extraPrefix) { for (const s of storage || []) { diff --git a/app/server/lib/INotifier.ts b/app/server/lib/INotifier.ts index 34740b1a..9c3e0364 100644 --- a/app/server/lib/INotifier.ts +++ b/app/server/lib/INotifier.ts @@ -10,3 +10,12 @@ export interface INotifier { // Return undefined if no notification system is available. testSetSendMessageCallback(op: (body: SendGridMail, description: string) => Promise): SendGridConfig|undefined; } + +/** + * A notifier that does nothing. Used when no email notifications are configured. + */ +export const EmptyNotifier: INotifier = { + get testPending() { return false; }, + async deleteUser() { /* do nothing */ }, + testSetSendMessageCallback() { return undefined; }, +} as const; diff --git a/app/server/lib/sendAppPage.ts b/app/server/lib/sendAppPage.ts index 98aff5fb..8c5ebf92 100644 --- a/app/server/lib/sendAppPage.ts +++ b/app/server/lib/sendAppPage.ts @@ -97,6 +97,7 @@ export function makeGristConfig(options: MakeGristConfigOptions): GristLoadConfi templateOrg: getTemplateOrg(), canCloseAccount: isAffirmative(process.env.GRIST_ACCOUNT_CLOSE), experimentalPlugins: isAffirmative(process.env.GRIST_EXPERIMENTAL_PLUGINS), + notifierEnabled: server?.hasNotifier(), ...extra, }; }