From 896834f65a674f47e2214c94f202e57731bca769 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Karol=20S=C3=B3jko?= Date: Wed, 8 Mar 2023 12:53:59 +0100 Subject: [PATCH] chore(web): put sign-in email notifications setting under paywall (#2249) * chore: upgrade setting names to value objects * chore(web): put sign-in email notifications setting under paywall * chore: fix using setting name value objects in mocha tests * chore: fix wording on email notifications titles --- ...ings-npm-1.20.0-5fa566e627-6e8c03107e.zip} | Bin 30835 -> 30327 bytes .../GetRecoveryCodes/GetRecoveryCodes.ts | 4 +- packages/snjs/lib/Services/Api/ApiService.ts | 17 ++--- packages/snjs/lib/Services/Api/Paths.ts | 6 +- .../Services/Features/FeaturesService.spec.ts | 2 +- .../lib/Services/Features/FeaturesService.ts | 6 +- .../snjs/lib/Services/Listed/ListedService.ts | 4 +- packages/snjs/lib/Services/Mfa/MfaService.ts | 12 +++- .../Services/Settings/SNSettingsService.ts | 12 +--- .../Settings/SettingsClientInterface.ts | 4 +- .../lib/Services/Settings/SettingsGateway.ts | 24 ++++--- .../lib/Services/Settings/SettingsList.ts | 8 +-- packages/snjs/mocha/features.test.js | 2 +- packages/snjs/mocha/recovery.test.js | 4 +- packages/snjs/mocha/settings.test.js | 26 ++++---- packages/snjs/package.json | 2 +- .../Panes/Account/AccountPreferences.tsx | 2 +- .../Panes/Account/{ => Email}/Email.tsx | 61 +++++++++++++----- .../Preferences/Panes/Account/Files.tsx | 6 +- .../NoProSubscription.tsx | 10 ++- .../SubscriptionSharing.tsx | 12 +++- .../CloudBackups/CloudBackupProvider.tsx | 12 ++-- .../Backups/CloudBackups/CloudBackups.tsx | 4 +- .../Panes/Backups/EmailBackups.tsx | 14 ++-- .../Preferences/Panes/Security/Privacy.tsx | 7 +- yarn.lock | 11 ++-- 26 files changed, 163 insertions(+), 109 deletions(-) rename .yarn/cache/{@standardnotes-settings-npm-1.19.1-5a4afbfb46-d99d49d440.zip => @standardnotes-settings-npm-1.20.0-5fa566e627-6e8c03107e.zip} (69%) rename packages/web/src/javascripts/Components/Preferences/Panes/Account/{ => Email}/Email.tsx (67%) rename packages/web/src/javascripts/Components/Preferences/Panes/Account/{SubscriptionSharing => }/NoProSubscription.tsx (85%) diff --git a/.yarn/cache/@standardnotes-settings-npm-1.19.1-5a4afbfb46-d99d49d440.zip b/.yarn/cache/@standardnotes-settings-npm-1.20.0-5fa566e627-6e8c03107e.zip similarity index 69% rename from .yarn/cache/@standardnotes-settings-npm-1.19.1-5a4afbfb46-d99d49d440.zip rename to .yarn/cache/@standardnotes-settings-npm-1.20.0-5fa566e627-6e8c03107e.zip index 81d2516e577f6e31e1a5ee33f7539e31a0a0f16a..f9f50f13a4a9b32a3d62921746deb95d41fba70f 100644 GIT binary patch delta 3602 zcmY*b2{_aLAKyk}b1fk>bA()TC6@aLF~?jJG3VT5&I--3hzNbDEQt)iln7liM^Y3y z%2LjfBexU^`Hz16fAxHy@8@~Hp3m$3em>9pUS0&R&Vs9+YrvjDlv*?(AP^hStzk^g zIT83#AMtEtUG`bM42*(Yv(4^h%#cD0*upB!Wdl{8(Ip>0+VqmI7}@mMQ_K)Prvpol zlU^S1^-*8CZPIPB)PJ&gm@0enbQ-^E(gPPs7n(A3H1e9@$Mr*QO(D{&1tGx)DRGZ-An*(aNLtD)iS>9tWBxw5Z|hEe z-E=APEiDLve~d#9#LsT}vW*+5pQI6qiRTOsy2Q$ssD>Mz&jfT>Z{3|ocmIq$s=zBFN(4H0RxRt$%efFTp-Sorsi@&e<0bj8^r@Gwiou2t4_V{rZl{`ycFo1Z zoSfP&9~bbwUmp$TTPii4Pu_4=F1QZqN*xLvp;?6I%QQT*^Naas-w(F8P+(sm-nKK_ z$L}jeh*26%c@c5J`L*~)h0PF6rsHrhzApSd*Wr86g`4CnZ-~?7SL-adbdhzM+QA!{ z%~*{*)!d?@2V>{rZn&o9FWblNHLdshz}s(;ujht7tucknkgs^O<-O~SW>1{**Y#O4 z4$Hy{#1Mr6R%=Bd(+*lwrpd{*mk$I1v4iyQFxV}PUBi@FKp;mL2!sW|))-*X6$Ws- zaF7GSEARs$0~kcys$-Q&f?WKq`;{v2+n%rQxVzfACPL4jEkC*^CBv{za{L+l#sb#7 z9DCeq1~i@|Wfwky=CJ$HdrV8nfQ8P zL)aQ&4>w~`R6N{yqMl}vc=GLgdS8^$c-=o?;#r>sQBvKuvs$&4wX`UqDgXF4xDY8> z+~^txA3H}w{R~DKH5(KZYy9kJ_tZ`e{o+%5u!(AbFxgvWqrQesOzP)K3QDLXTOMq6 zbN$pBN2h-71EGb(M@aP9CwU6JFM|X=bjfl{ONW$yjA=owxB2rC2oyJ~XVSAMKhet+ z4y53ftS33Zp|7wOknig@`jf`u!IZ5}vj#j)lj-PNljkNqFsoLh^M}8ikvp1;AdQ!l z?T)h&&+~UC!{{^qi8XoerM2hCO(aIp@mN0Ho5wbfi|$df*cz3U#!mOfMa;fR>fpM- zvXMWMWc4F1ec=d4{=??_%rED%aGLk(z3MGPGrkOBY=y(cy2p zCWUj|OTakZCjsC5(~CRu#+q(tv%~L08}h1n)hsCoKJZ_-Q)7l{E#1mXBfHm?A0rTg z?BilSCHN)g!Cfv9P8StJqOXl&mR&|H3)ti$$8GX2YRtJ0kd}`n24%|3bjZZ;XHxAX z7tU2VmZwvO`fIa-m$64~bGVg9XhApMVv=VkT<%8uwzGfJqfWMw)r*WBZn-<9z+bIM zVMuZN;Z}HCaji1bzFFz7khOQbhHXBk$ zk@PdYU2~2}0gq#n%w2t~COuXK&Wif@9DA&l;bRj`MRi71#Z6GXHumxSWCJQqg~7N# zN(sIT7j_~v91zpN^Zzcps9w&nb}$H($t*n;CRYZ~u;3wQzE(!WE>u>1Ip%S|%COQn zo}0vbR4l?)bayT?2KbTlK6?%otvN(~?sQ-iRIs5k_HJpmL4mzJ9izW;!TW(OdojiC z8FcYc3ZnLN?23=1PU7-=YW8y{rz#28q|dcr(Mq?EB)%GWtL~Z6Kmq?xIwR?U0v{Y> zZ!}@cQj~9!gUeLCV^%Y28QF865;p{cvzp(rWqDMS5W;S7`(08KS#U6+n~~kqH5(j?Sf6^ruE*hf zRKj`+1}E@pW<4zISvwraUeaiswVpSKjI6Zsre4^?2u#u(eJR_hhUx6h@?VBq;F8XLP|s#un7)zR`-k(we6iA}TK^p7(Rc6bd# z{>U2tzRrLW;hsgjy?NVdJ2S%lEHq&+8C0`rxyAxZs}nBx2HNhcKW$9O7n`kGlsWYm zVvVJ^fha#c5J@mcoR%S89;eT^f~d$ynzI-h*^?}td(lG6_|*ODvl!)*lCl%6Y#weM zFQ)Id6ppa-;8`~5o%12?RKlJgBHTRXLu`$bYw*$cUeGdDYkKuit@bXv)~<7(DG{PK?>zjLRo2VGILzp-JfGfbw-h zLimPokAK|Zfvr*ExN{Hcspdgd%YLGPS4Iq}cv_|Ha)`_67NG)LH8DNQf-c9tmR$d( zg_sME93qb^Lj%UzhM$kF#6_OCmR$6vB=nv97T5OpfiqnI0s*#ReA`2)CezM<4Nh?~ z>#Aqw{|i>2(OB!>nZrZQ&9Of5ULVoA5Sx~Jnmyb3VTyYBa!R=z1)ef|c__7pNFRIk zN&@#ZdI3Xelav~Iw{hn{kYoD^IKsl0+{TY&Rl^>FE_d$3w|Twanq{7l+hee z4Hoho@x1A}=9x9>-A&R;L0)l{35kF;!fvg(49_&?&^Ym#L;-U8TUPUV6?HV~mfuPfNy zEIE9GO(e?sQrRiBPjZ(C1s{8oEsKuw)~3?N+R`=%Vg5Dlc)erJ?LYl49r4Oizvw}m z|6C|!mzN3}5|bUiCnr51iaYpmGU-+6>jkpy?ma?zu@0%KS1&XiDlC{I&F0qq;MtD$ zf2+mj+ZCuIGxEMbx4!njA%=VG^g=~%#fWfhg-n~0oK0JYycyaYYhmTUZiSX@@4&8N zJ1n_mUMR`n|Cz7_C00Mp@3ogd`|+YgA?=VO`f@`mmk{C!1_4W6$eIR%3-pg2dOtB1j0FmbUJzMr0F2WBc)|q%dmlMS&Tps;O!_E5 zd~|khl^pm0cV9V3=WnP8Xap%hSoMIS2m`>~4+A;zTjU0G@F+kb0EMvKN%LRFoI#~N zlWPxz_#uEie_@EI0TV_uc?#eVpgX_h4 zkN}S#H{_b}&WrMc3?b|$|B8ZuQt%Oox#~)$nde95Of`pWI{dw7bOgN;k08dKWN+8f&hlZhy1T+{c_Ro z$I%ixoOj5-+`|JLkKVoSckVMueACLAOn+GQToG5U9>|8~qPN CK09gv delta 3840 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 { constructor(private authClient: AuthClientInterface, private settingsClient: SettingsClientInterface) {} async execute(): Promise> { - const existingRecoveryCodes = await this.settingsClient.getSetting(SettingName.RecoveryCodes) + const existingRecoveryCodes = await this.settingsClient.getSetting( + SettingName.create(SettingName.NAMES.RecoveryCodes).getValue(), + ) if (existingRecoveryCodes !== undefined) { return Result.ok(existingRecoveryCodes) } diff --git a/packages/snjs/lib/Services/Api/ApiService.ts b/packages/snjs/lib/Services/Api/ApiService.ts index 1a28bf66c..53a184c75 100644 --- a/packages/snjs/lib/Services/Api/ApiService.ts +++ b/packages/snjs/lib/Services/Api/ApiService.ts @@ -1,6 +1,5 @@ import { FeatureDescription } from '@standardnotes/features' import { joinPaths } from '@standardnotes/utils' -import { SettingName, SubscriptionSettingName } from '@standardnotes/settings' import { AbstractService, ApiServiceInterface, @@ -568,31 +567,25 @@ export class SNApiService }) } - async getSetting(userUuid: UuidString, settingName: SettingName): Promise> { + async getSetting(userUuid: UuidString, settingName: string): Promise> { return await this.tokenRefreshableRequest({ verb: HttpVerb.Get, - url: joinPaths(this.host, Paths.v1.setting(userUuid, settingName.toLowerCase() as SettingName)), + url: joinPaths(this.host, Paths.v1.setting(userUuid, settingName.toLowerCase())), authentication: this.getSessionAccessToken(), fallbackErrorMessage: API_MESSAGE_FAILED_GET_SETTINGS, }) } - async getSubscriptionSetting( - userUuid: UuidString, - settingName: SubscriptionSettingName, - ): Promise> { + async getSubscriptionSetting(userUuid: UuidString, settingName: string): Promise> { return await this.tokenRefreshableRequest({ verb: HttpVerb.Get, - url: joinPaths( - this.host, - Paths.v1.subscriptionSetting(userUuid, settingName.toLowerCase() as SubscriptionSettingName), - ), + url: joinPaths(this.host, Paths.v1.subscriptionSetting(userUuid, settingName.toLowerCase())), authentication: this.getSessionAccessToken(), fallbackErrorMessage: API_MESSAGE_FAILED_GET_SETTINGS, }) } - async deleteSetting(userUuid: UuidString, settingName: SettingName): Promise> { + async deleteSetting(userUuid: UuidString, settingName: string): Promise> { return this.tokenRefreshableRequest({ verb: HttpVerb.Delete, url: joinPaths(this.host, Paths.v1.setting(userUuid, settingName)), diff --git a/packages/snjs/lib/Services/Api/Paths.ts b/packages/snjs/lib/Services/Api/Paths.ts index 96a8fe3e8..331987108 100644 --- a/packages/snjs/lib/Services/Api/Paths.ts +++ b/packages/snjs/lib/Services/Api/Paths.ts @@ -1,5 +1,3 @@ -import { SettingName, SubscriptionSettingName } from '@standardnotes/settings' - const FilesPaths = { closeUploadSession: '/v1/files/upload/close-session', createFileValetToken: '/v1/files/valet-tokens', @@ -31,8 +29,8 @@ const ItemsPaths = { const SettingsPaths = { settings: (userUuid: string) => `/v1/users/${userUuid}/settings`, - setting: (userUuid: string, settingName: SettingName) => `/v1/users/${userUuid}/settings/${settingName}`, - subscriptionSetting: (userUuid: string, settingName: SubscriptionSettingName) => + setting: (userUuid: string, settingName: string) => `/v1/users/${userUuid}/settings/${settingName}`, + subscriptionSetting: (userUuid: string, settingName: string) => `/v1/users/${userUuid}/subscription-settings/${settingName}`, } diff --git a/packages/snjs/lib/Services/Features/FeaturesService.spec.ts b/packages/snjs/lib/Services/Features/FeaturesService.spec.ts index 4a6b27f67..12c32a2a8 100644 --- a/packages/snjs/lib/Services/Features/FeaturesService.spec.ts +++ b/packages/snjs/lib/Services/Features/FeaturesService.spec.ts @@ -725,7 +725,7 @@ describe('featuresService', () => { const featuresService = createService() await featuresService.migrateFeatureRepoToUserSetting([extensionRepoItem]) - expect(settingsService.updateSetting).toHaveBeenCalledWith(SettingName.ExtensionKey, extensionKey, true) + expect(settingsService.updateSetting).toHaveBeenCalledWith(SettingName.create(SettingName.NAMES.ExtensionKey).getValue(), extensionKey, true) }) }) diff --git a/packages/snjs/lib/Services/Features/FeaturesService.ts b/packages/snjs/lib/Services/Features/FeaturesService.ts index ac9a7e473..d581531c1 100644 --- a/packages/snjs/lib/Services/Features/FeaturesService.ts +++ b/packages/snjs/lib/Services/Features/FeaturesService.ts @@ -341,7 +341,11 @@ export class SNFeaturesService const userKeyMatch = repoUrl.match(/\w{32,64}/) if (userKeyMatch && userKeyMatch.length > 0) { const userKey = userKeyMatch[0] - await this.settingsService.updateSetting(SettingName.ExtensionKey, userKey, true) + await this.settingsService.updateSetting( + SettingName.create(SettingName.NAMES.ExtensionKey).getValue(), + userKey, + true, + ) await this.itemManager.changeFeatureRepo(item, (m) => { m.migratedToUserSetting = true }) diff --git a/packages/snjs/lib/Services/Listed/ListedService.ts b/packages/snjs/lib/Services/Listed/ListedService.ts index 3f3723ee9..1348c2710 100644 --- a/packages/snjs/lib/Services/Listed/ListedService.ts +++ b/packages/snjs/lib/Services/Listed/ListedService.ts @@ -108,7 +108,9 @@ export class ListedService extends AbstractService implements ListedClientInterf } private async getSettingsBasedListedAccounts(): Promise { - const response = await this.settingsService.getSetting(SettingName.ListedAuthorSecrets) + const response = await this.settingsService.getSetting( + SettingName.create(SettingName.NAMES.ListedAuthorSecrets).getValue(), + ) if (!response) { return [] } diff --git a/packages/snjs/lib/Services/Mfa/MfaService.ts b/packages/snjs/lib/Services/Mfa/MfaService.ts index a7225725e..b5f87c65e 100644 --- a/packages/snjs/lib/Services/Mfa/MfaService.ts +++ b/packages/snjs/lib/Services/Mfa/MfaService.ts @@ -16,11 +16,17 @@ export class SNMfaService extends AbstractService { } private async saveMfaSetting(secret: string): Promise { - return await this.settingsService.updateSetting(SettingName.MfaSecret, secret, true) + return await this.settingsService.updateSetting( + SettingName.create(SettingName.NAMES.MfaSecret).getValue(), + secret, + true, + ) } async isMfaActivated(): Promise { - const mfaSetting = await this.settingsService.getDoesSensitiveSettingExist(SettingName.MfaSecret) + const mfaSetting = await this.settingsService.getDoesSensitiveSettingExist( + SettingName.create(SettingName.NAMES.MfaSecret).getValue(), + ) return mfaSetting != false } @@ -43,7 +49,7 @@ export class SNMfaService extends AbstractService { } async disableMfa(): Promise { - return await this.settingsService.deleteSetting(SettingName.MfaSecret) + return await this.settingsService.deleteSetting(SettingName.create(SettingName.NAMES.MfaSecret).getValue()) } override deinit(): void { diff --git a/packages/snjs/lib/Services/Settings/SNSettingsService.ts b/packages/snjs/lib/Services/Settings/SNSettingsService.ts index 89f7632e0..c38799305 100644 --- a/packages/snjs/lib/Services/Settings/SNSettingsService.ts +++ b/packages/snjs/lib/Services/Settings/SNSettingsService.ts @@ -1,13 +1,7 @@ import { SNApiService } from '../Api/ApiService' import { SettingsGateway } from './SettingsGateway' import { SNSessionManager } from '../Session/SessionManager' -import { - CloudProvider, - EmailBackupFrequency, - SettingName, - SensitiveSettingName, - SubscriptionSettingName, -} from '@standardnotes/settings' +import { CloudProvider, EmailBackupFrequency, SettingName } from '@standardnotes/settings' import { ExtensionsServerURL } from '@Lib/Hosts' import { AbstractService, InternalEventBusInterface } from '@standardnotes/services' import { SettingsClientInterface } from './SettingsClientInterface' @@ -46,7 +40,7 @@ export class SNSettingsService extends AbstractService implements SettingsClient return this.provider.getSetting(name) } - async getSubscriptionSetting(name: SubscriptionSettingName) { + async getSubscriptionSetting(name: SettingName) { return this.provider.getSubscriptionSetting(name) } @@ -54,7 +48,7 @@ export class SNSettingsService extends AbstractService implements SettingsClient return this.provider.updateSetting(name, payload, sensitive) } - async getDoesSensitiveSettingExist(name: SensitiveSettingName) { + async getDoesSensitiveSettingExist(name: SettingName) { return this.provider.getDoesSensitiveSettingExist(name) } diff --git a/packages/snjs/lib/Services/Settings/SettingsClientInterface.ts b/packages/snjs/lib/Services/Settings/SettingsClientInterface.ts index 58e710a0a..0733ddc12 100644 --- a/packages/snjs/lib/Services/Settings/SettingsClientInterface.ts +++ b/packages/snjs/lib/Services/Settings/SettingsClientInterface.ts @@ -1,4 +1,4 @@ -import { SettingName, SensitiveSettingName, EmailBackupFrequency } from '@standardnotes/settings' +import { SettingName, EmailBackupFrequency } from '@standardnotes/settings' import { SettingsList } from './SettingsList' export interface SettingsClientInterface { @@ -6,7 +6,7 @@ export interface SettingsClientInterface { getSetting(name: SettingName): Promise - getDoesSensitiveSettingExist(name: SensitiveSettingName): Promise + getDoesSensitiveSettingExist(name: SettingName): Promise updateSetting(name: SettingName, payload: string, sensitive?: boolean): Promise diff --git a/packages/snjs/lib/Services/Settings/SettingsGateway.ts b/packages/snjs/lib/Services/Settings/SettingsGateway.ts index 227a12841..2fd15c175 100644 --- a/packages/snjs/lib/Services/Settings/SettingsGateway.ts +++ b/packages/snjs/lib/Services/Settings/SettingsGateway.ts @@ -1,5 +1,5 @@ import { SettingsList } from './SettingsList' -import { SettingName, SensitiveSettingName, SubscriptionSettingName } from '@standardnotes/settings' +import { SettingName } from '@standardnotes/settings' import { API_MESSAGE_INVALID_SESSION } from '@standardnotes/services' import { HttpStatusCode, isErrorResponse, User } from '@standardnotes/responses' import { SettingsServerInterface } from './SettingsServerInterface' @@ -46,7 +46,7 @@ export class SettingsGateway { } async getSetting(name: SettingName): Promise { - const response = await this.settingsApi.getSetting(this.userUuid, name) + const response = await this.settingsApi.getSetting(this.userUuid, name.value) if (response.status === HttpStatusCode.BadRequest) { return undefined @@ -59,8 +59,12 @@ export class SettingsGateway { return response?.data?.setting?.value ?? undefined } - async getSubscriptionSetting(name: SubscriptionSettingName): Promise { - const response = await this.settingsApi.getSubscriptionSetting(this.userUuid, name) + async getSubscriptionSetting(name: SettingName): Promise { + if (!name.isASubscriptionSetting()) { + throw new Error(`Setting ${name.value} is not a subscription setting`) + } + + const response = await this.settingsApi.getSubscriptionSetting(this.userUuid, name.value) if (response.status === HttpStatusCode.BadRequest) { return undefined @@ -73,8 +77,12 @@ export class SettingsGateway { return response?.data?.setting?.value ?? undefined } - async getDoesSensitiveSettingExist(name: SensitiveSettingName): Promise { - const response = await this.settingsApi.getSetting(this.userUuid, name) + async getDoesSensitiveSettingExist(name: SettingName): Promise { + if (!name.isSensitive()) { + throw new Error(`Setting ${name.value} is not sensitive`) + } + + const response = await this.settingsApi.getSetting(this.userUuid, name.value) if (response.status === HttpStatusCode.BadRequest) { return false @@ -88,14 +96,14 @@ export class SettingsGateway { } async updateSetting(name: SettingName, payload: string, sensitive: boolean): Promise { - const response = await this.settingsApi.updateSetting(this.userUuid, name, payload, sensitive) + const response = await this.settingsApi.updateSetting(this.userUuid, name.value, payload, sensitive) if (isErrorResponse(response)) { throw new Error(response.data?.error.message) } } async deleteSetting(name: SettingName): Promise { - const response = await this.settingsApi.deleteSetting(this.userUuid, name) + const response = await this.settingsApi.deleteSetting(this.userUuid, name.value) if (isErrorResponse(response)) { throw new Error(response.data?.error.message) } diff --git a/packages/snjs/lib/Services/Settings/SettingsList.ts b/packages/snjs/lib/Services/Settings/SettingsList.ts index 0b6bd32ec..3a0f08e83 100644 --- a/packages/snjs/lib/Services/Settings/SettingsList.ts +++ b/packages/snjs/lib/Services/Settings/SettingsList.ts @@ -28,16 +28,16 @@ type SettingType = | OneDriveBackupFrequency export class SettingsList { - private map: Partial> = {} + private map: Partial> = {} constructor(settings: SettingData[]) { for (const setting of settings) { - this.map[setting.name as SettingName] = setting + this.map[setting.name] = setting } } - getSettingValue(setting: SettingName, defaultValue: D): T { - const settingData = this.map[setting] + getSettingValue(settingName: SettingName, defaultValue: D): T { + const settingData = this.map[settingName.value] return (settingData?.value as unknown as T) || (defaultValue as unknown as T) } } diff --git a/packages/snjs/mocha/features.test.js b/packages/snjs/mocha/features.test.js index 31419d60d..7d438a5b3 100644 --- a/packages/snjs/mocha/features.test.js +++ b/packages/snjs/mocha/features.test.js @@ -194,7 +194,7 @@ describe('features', () => { return false }) - expect(await application.settings.getDoesSensitiveSettingExist(SettingName.ExtensionKey)).to.equal(false) + expect(await application.settings.getDoesSensitiveSettingExist(SettingName.create(SettingName.NAMES.ExtensionKey).getValue())).to.equal(false) const extensionKey = UuidGenerator.GenerateUuid().split('-').join('') diff --git a/packages/snjs/mocha/recovery.test.js b/packages/snjs/mocha/recovery.test.js index 8f6701932..a8f91dfea 100644 --- a/packages/snjs/mocha/recovery.test.js +++ b/packages/snjs/mocha/recovery.test.js @@ -26,13 +26,13 @@ describe('account recovery', function () { }) it('should get the same recovery code at each consecutive call', async () => { - let recoveryCodesSetting = await application.settings.getSetting(SettingName.RecoveryCodes) + let recoveryCodesSetting = await application.settings.getSetting(SettingName.create(SettingName.NAMES.RecoveryCodes).getValue()) expect(recoveryCodesSetting).to.equal(undefined) const generatedRecoveryCodesAfterFirstCall = await application.getRecoveryCodes.execute() expect(generatedRecoveryCodesAfterFirstCall.getValue().length).to.equal(49) - recoveryCodesSetting = await application.settings.getSetting(SettingName.RecoveryCodes) + recoveryCodesSetting = await application.settings.getSetting(SettingName.create(SettingName.NAMES.RecoveryCodes).getValue()) expect(recoveryCodesSetting).to.equal(generatedRecoveryCodesAfterFirstCall.getValue()) const fetchedRecoveryCodesOnTheSecondCall = await application.getRecoveryCodes.execute() diff --git a/packages/snjs/mocha/settings.test.js b/packages/snjs/mocha/settings.test.js index bbac19784..785942026 100644 --- a/packages/snjs/mocha/settings.test.js +++ b/packages/snjs/mocha/settings.test.js @@ -7,7 +7,7 @@ const expect = chai.expect describe('settings service', function () { this.timeout(Factory.ThirtySecondTimeout) - const validSetting = SettingName.GoogleDriveBackupFrequency + const validSetting = SettingName.create(SettingName.NAMES.GoogleDriveBackupFrequency).getValue() const fakePayload = 'Im so meta even this acronym' const updatedFakePayload = 'is meta' @@ -98,22 +98,22 @@ describe('settings service', function () { }) it('reads a nonexistent sensitive setting', async () => { - const setting = await application.settings.getDoesSensitiveSettingExist(SettingName.MfaSecret) + const setting = await application.settings.getDoesSensitiveSettingExist(SettingName.create(SettingName.NAMES.MfaSecret).getValue()) expect(setting).to.equal(false) }) it('creates and reads a sensitive setting', async () => { - await application.settings.updateSetting(SettingName.MfaSecret, 'fake_secret', true) - const setting = await application.settings.getDoesSensitiveSettingExist(SettingName.MfaSecret) + await application.settings.updateSetting(SettingName.create(SettingName.NAMES.MfaSecret).getValue(), 'fake_secret', true) + const setting = await application.settings.getDoesSensitiveSettingExist(SettingName.create(SettingName.NAMES.MfaSecret).getValue()) expect(setting).to.equal(true) }) it('creates and lists a sensitive setting', async () => { - await application.settings.updateSetting(SettingName.MfaSecret, 'fake_secret', true) - await application.settings.updateSetting(SettingName.MuteFailedBackupsEmails, MuteFailedBackupsEmailsOption.Muted) + await application.settings.updateSetting(SettingName.create(SettingName.NAMES.MfaSecret).getValue(), 'fake_secret', true) + await application.settings.updateSetting(SettingName.create(SettingName.NAMES.MuteFailedBackupsEmails).getValue(), MuteFailedBackupsEmailsOption.Muted) const settings = await application.settings.listSettings() - expect(settings.getSettingValue(SettingName.MuteFailedBackupsEmails)).to.eql(MuteFailedBackupsEmailsOption.Muted) - expect(settings.getSettingValue(SettingName.MfaSecret)).to.not.be.ok + expect(settings.getSettingValue(SettingName.create(SettingName.NAMES.MuteFailedBackupsEmails).getValue())).to.eql(MuteFailedBackupsEmailsOption.Muted) + expect(settings.getSettingValue(SettingName.create(SettingName.NAMES.MfaSecret).getValue())).to.not.be.ok }) it('reads a subscription setting', async () => { @@ -135,7 +135,7 @@ describe('settings service', function () { await Factory.sleep(2) - const setting = await application.settings.getSubscriptionSetting('FILE_UPLOAD_BYTES_LIMIT') + const setting = await application.settings.getSubscriptionSetting(SettingName.create(SettingName.NAMES.FileUploadBytesLimit).getValue()) expect(setting).to.be.a('string') }) @@ -166,10 +166,10 @@ describe('settings service', function () { await Factory.sleep(1) - const limitSettingBefore = await application.settings.getSubscriptionSetting('FILE_UPLOAD_BYTES_LIMIT') + const limitSettingBefore = await application.settings.getSubscriptionSetting(SettingName.create(SettingName.NAMES.FileUploadBytesLimit).getValue()) expect(limitSettingBefore).to.equal('107374182400') - const usedSettingBefore = await application.settings.getSubscriptionSetting('FILE_UPLOAD_BYTES_USED') + const usedSettingBefore = await application.settings.getSubscriptionSetting(SettingName.create(SettingName.NAMES.FileUploadBytesUsed).getValue()) expect(usedSettingBefore).to.equal('196') await Factory.publishMockedEvent('SUBSCRIPTION_EXPIRED', { @@ -202,10 +202,10 @@ describe('settings service', function () { }) await Factory.sleep(1) - const limitSettingAfter = await application.settings.getSubscriptionSetting('FILE_UPLOAD_BYTES_LIMIT') + const limitSettingAfter = await application.settings.getSubscriptionSetting(SettingName.create(SettingName.NAMES.FileUploadBytesLimit).getValue()) expect(limitSettingAfter).to.equal(limitSettingBefore) - const usedSettingAfter = await application.settings.getSubscriptionSetting('FILE_UPLOAD_BYTES_USED') + const usedSettingAfter = await application.settings.getSubscriptionSetting(SettingName.create(SettingName.NAMES.FileUploadBytesUsed).getValue()) expect(usedSettingAfter).to.equal(usedSettingBefore) }) }) diff --git a/packages/snjs/package.json b/packages/snjs/package.json index aa5166399..670243308 100644 --- a/packages/snjs/package.json +++ b/packages/snjs/package.json @@ -46,7 +46,7 @@ "@standardnotes/responses": "workspace:*", "@standardnotes/security": "^1.7.6", "@standardnotes/services": "workspace:*", - "@standardnotes/settings": "^1.19.1", + "@standardnotes/settings": "^1.20.0", "@standardnotes/sncrypto-common": "workspace:*", "@standardnotes/sncrypto-web": "workspace:*", "@standardnotes/utils": "workspace:*", diff --git a/packages/web/src/javascripts/Components/Preferences/Panes/Account/AccountPreferences.tsx b/packages/web/src/javascripts/Components/Preferences/Panes/Account/AccountPreferences.tsx index 41af64f33..8ffbce119 100644 --- a/packages/web/src/javascripts/Components/Preferences/Panes/Account/AccountPreferences.tsx +++ b/packages/web/src/javascripts/Components/Preferences/Panes/Account/AccountPreferences.tsx @@ -9,7 +9,7 @@ import SignOutWrapper from './SignOutView' import FilesSection from './Files' import PreferencesPane from '../../PreferencesComponents/PreferencesPane' import SubscriptionSharing from './SubscriptionSharing/SubscriptionSharing' -import Email from './Email' +import Email from './Email/Email' import DeleteAccount from '@/Components/Preferences/Panes/Account/DeleteAccount' type Props = { diff --git a/packages/web/src/javascripts/Components/Preferences/Panes/Account/Email.tsx b/packages/web/src/javascripts/Components/Preferences/Panes/Account/Email/Email.tsx similarity index 67% rename from packages/web/src/javascripts/Components/Preferences/Panes/Account/Email.tsx rename to packages/web/src/javascripts/Components/Preferences/Panes/Account/Email/Email.tsx index fa6306631..2bf94b62e 100644 --- a/packages/web/src/javascripts/Components/Preferences/Panes/Account/Email.tsx +++ b/packages/web/src/javascripts/Components/Preferences/Panes/Account/Email/Email.tsx @@ -1,4 +1,10 @@ -import { MuteMarketingEmailsOption, MuteSignInEmailsOption, SettingName } from '@standardnotes/snjs' +import { + FeatureIdentifier, + FeatureStatus, + MuteMarketingEmailsOption, + MuteSignInEmailsOption, + SettingName, +} from '@standardnotes/snjs' import { observer } from 'mobx-react-lite' import { FunctionComponent, useCallback, useEffect, useState } from 'react' @@ -10,6 +16,7 @@ import { STRING_FAILED_TO_UPDATE_USER_SETTING } from '@/Constants/Strings' import PreferencesGroup from '@/Components/Preferences/PreferencesComponents/PreferencesGroup' import PreferencesSegment from '@/Components/Preferences/PreferencesComponents/PreferencesSegment' import Spinner from '@/Components/Spinner/Spinner' +import NoProSubscription from '../NoProSubscription' type Props = { application: WebApplication @@ -20,6 +27,9 @@ const Email: FunctionComponent = ({ application }: Props) => { const [marketingEmailsMutedValue, setMarketingEmailsMutedValue] = useState(MuteMarketingEmailsOption.NotMuted) const [isLoading, setIsLoading] = useState(true) + const isMuteSignInEmailsFeatureAvailable = + application.features.getFeatureStatus(FeatureIdentifier.SignInAlerts) === FeatureStatus.Entitled + const updateSetting = async (settingName: SettingName, payload: string): Promise => { try { await application.settings.updateSetting(settingName, payload, false) @@ -40,13 +50,13 @@ const Email: FunctionComponent = ({ application }: Props) => { const userSettings = await application.settings.listSettings() setSignInEmailsMutedValue( userSettings.getSettingValue( - SettingName.MuteSignInEmails, + SettingName.create(SettingName.NAMES.MuteSignInEmails).getValue(), MuteSignInEmailsOption.NotMuted, ), ), setMarketingEmailsMutedValue( userSettings.getSettingValue( - SettingName.MuteMarketingEmails, + SettingName.create(SettingName.NAMES.MuteMarketingEmails).getValue(), MuteMarketingEmailsOption.NotMuted, ), ) @@ -67,7 +77,10 @@ const Email: FunctionComponent = ({ application }: Props) => { previousValue === MuteSignInEmailsOption.Muted ? MuteSignInEmailsOption.NotMuted : MuteSignInEmailsOption.Muted setSignInEmailsMutedValue(newValue) - const updateResult = await updateSetting(SettingName.MuteSignInEmails, newValue) + const updateResult = await updateSetting( + SettingName.create(SettingName.NAMES.MuteSignInEmails).getValue(), + newValue, + ) if (!updateResult) { setSignInEmailsMutedValue(previousValue) @@ -82,7 +95,10 @@ const Email: FunctionComponent = ({ application }: Props) => { : MuteMarketingEmailsOption.Muted setMarketingEmailsMutedValue(newValue) - const updateResult = await updateSetting(SettingName.MuteMarketingEmails, newValue) + const updateResult = await updateSetting( + SettingName.create(SettingName.NAMES.MuteMarketingEmails).getValue(), + newValue, + ) if (!updateResult) { setMarketingEmailsMutedValue(previousValue) @@ -96,25 +112,40 @@ const Email: FunctionComponent = ({ application }: Props) => {
- Disable sign-in notification emails - - Disables email notifications when a new sign-in occurs on your account. (Email notifications are - available only to paid subscribers). - + Sign-in notification emails + {isMuteSignInEmailsFeatureAvailable ? ( + + Disables email notifications when a new sign-in occurs on your account. (Email notifications are + available only to paid subscribers). + + ) : ( + + Sign-in notification emails are available only on a{' '} + subscription plan. Please upgrade in order to enable sign-in + notifications. + + } + /> + )}
{isLoading ? ( ) : ( - + isMuteSignInEmailsFeatureAvailable && ( + + ) )}
- Disable marketing notification emails + Marketing notification emails Disables email notifications with special deals and promotions.
{isLoading ? ( diff --git a/packages/web/src/javascripts/Components/Preferences/Panes/Account/Files.tsx b/packages/web/src/javascripts/Components/Preferences/Panes/Account/Files.tsx index 73d3bae55..19a415867 100644 --- a/packages/web/src/javascripts/Components/Preferences/Panes/Account/Files.tsx +++ b/packages/web/src/javascripts/Components/Preferences/Panes/Account/Files.tsx @@ -1,7 +1,7 @@ import { WebApplication } from '@/Application/Application' import Spinner from '@/Components/Spinner/Spinner' import { formatSizeToReadableString } from '@standardnotes/filepicker' -import { SubscriptionSettingName } from '@standardnotes/snjs' +import { SettingName } from '@standardnotes/snjs' import { FunctionComponent, useEffect, useState } from 'react' import { Subtitle, Title } from '../../PreferencesComponents/Content' import PreferencesGroup from '../../PreferencesComponents/PreferencesGroup' @@ -19,10 +19,10 @@ const FilesSection: FunctionComponent = ({ application }) => { useEffect(() => { const getFilesQuota = async () => { const filesQuotaUsed = await application.settings.getSubscriptionSetting( - SubscriptionSettingName.FileUploadBytesUsed, + SettingName.create(SettingName.NAMES.FileUploadBytesUsed).getValue(), ) const filesQuotaTotal = await application.settings.getSubscriptionSetting( - SubscriptionSettingName.FileUploadBytesLimit, + SettingName.create(SettingName.NAMES.FileUploadBytesLimit).getValue(), ) if (filesQuotaUsed) { diff --git a/packages/web/src/javascripts/Components/Preferences/Panes/Account/SubscriptionSharing/NoProSubscription.tsx b/packages/web/src/javascripts/Components/Preferences/Panes/Account/NoProSubscription.tsx similarity index 85% rename from packages/web/src/javascripts/Components/Preferences/Panes/Account/SubscriptionSharing/NoProSubscription.tsx rename to packages/web/src/javascripts/Components/Preferences/Panes/Account/NoProSubscription.tsx index 16ccbbe2b..c14b6dd31 100644 --- a/packages/web/src/javascripts/Components/Preferences/Panes/Account/SubscriptionSharing/NoProSubscription.tsx +++ b/packages/web/src/javascripts/Components/Preferences/Panes/Account/NoProSubscription.tsx @@ -1,13 +1,14 @@ -import { FunctionComponent, useState } from 'react' +import { FunctionComponent, ReactNode, useState } from 'react' import { LinkButton, Text } from '@/Components/Preferences/PreferencesComponents/Content' import Button from '@/Components/Button/Button' import { WebApplication } from '@/Application/Application' type Props = { application: WebApplication + text: ReactNode } -const NoProSubscription: FunctionComponent = ({ application }) => { +const NoProSubscription: FunctionComponent = ({ application, text }) => { const [isLoadingPurchaseFlow, setIsLoadingPurchaseFlow] = useState(false) const [purchaseFlowError, setPurchaseFlowError] = useState(undefined) @@ -29,10 +30,7 @@ const NoProSubscription: FunctionComponent = ({ application }) => { return ( <> - - Subscription sharing is available only on the Professional plan. Please - upgrade in order to share your subscription. - + {text} {isLoadingPurchaseFlow && Redirecting you to the subscription page...} {purchaseFlowError && {purchaseFlowError}} diff --git a/packages/web/src/javascripts/Components/Preferences/Panes/Account/SubscriptionSharing/SubscriptionSharing.tsx b/packages/web/src/javascripts/Components/Preferences/Panes/Account/SubscriptionSharing/SubscriptionSharing.tsx index e2417e2e6..24731225d 100644 --- a/packages/web/src/javascripts/Components/Preferences/Panes/Account/SubscriptionSharing/SubscriptionSharing.tsx +++ b/packages/web/src/javascripts/Components/Preferences/Panes/Account/SubscriptionSharing/SubscriptionSharing.tsx @@ -9,7 +9,7 @@ import PreferencesGroup from '@/Components/Preferences/PreferencesComponents/Pre import PreferencesSegment from '@/Components/Preferences/PreferencesComponents/PreferencesSegment' import HorizontalSeparator from '@/Components/Shared/HorizontalSeparator' -import NoProSubscription from './NoProSubscription' +import NoProSubscription from '../NoProSubscription' import InvitationsList from './InvitationsList' import Invite from './Invite/Invite' import Button from '@/Components/Button/Button' @@ -57,7 +57,15 @@ const SubscriptionSharing: FunctionComponent = ({ application, viewContro
) : ( - + + Subscription sharing is available only on the Professional plan. + Please upgrade in order to share your subscription. + + } + /> )}
diff --git a/packages/web/src/javascripts/Components/Preferences/Panes/Backups/CloudBackups/CloudBackupProvider.tsx b/packages/web/src/javascripts/Components/Preferences/Panes/Backups/CloudBackups/CloudBackupProvider.tsx index cbb651d68..79507e609 100644 --- a/packages/web/src/javascripts/Components/Preferences/Panes/Backups/CloudBackups/CloudBackupProvider.tsx +++ b/packages/web/src/javascripts/Components/Preferences/Panes/Backups/CloudBackups/CloudBackupProvider.tsx @@ -82,18 +82,18 @@ const CloudBackupProvider: FunctionComponent = ({ application, providerNa const backupSettingsData = { [CloudProvider.Dropbox]: { - backupTokenSettingName: SettingName.DropboxBackupToken, - backupFrequencySettingName: SettingName.DropboxBackupFrequency, + backupTokenSettingName: SettingName.create(SettingName.NAMES.DropboxBackupToken).getValue(), + backupFrequencySettingName: SettingName.create(SettingName.NAMES.DropboxBackupFrequency).getValue(), defaultBackupFrequency: DropboxBackupFrequency.Daily, }, [CloudProvider.Google]: { - backupTokenSettingName: SettingName.GoogleDriveBackupToken, - backupFrequencySettingName: SettingName.GoogleDriveBackupFrequency, + backupTokenSettingName: SettingName.create(SettingName.NAMES.GoogleDriveBackupToken).getValue(), + backupFrequencySettingName: SettingName.create(SettingName.NAMES.GoogleDriveBackupFrequency).getValue(), defaultBackupFrequency: GoogleDriveBackupFrequency.Daily, }, [CloudProvider.OneDrive]: { - backupTokenSettingName: SettingName.OneDriveBackupToken, - backupFrequencySettingName: SettingName.OneDriveBackupFrequency, + backupTokenSettingName: SettingName.create(SettingName.NAMES.OneDriveBackupToken).getValue(), + backupFrequencySettingName: SettingName.create(SettingName.NAMES.OneDriveBackupFrequency).getValue(), defaultBackupFrequency: OneDriveBackupFrequency.Daily, }, } diff --git a/packages/web/src/javascripts/Components/Preferences/Panes/Backups/CloudBackups/CloudBackups.tsx b/packages/web/src/javascripts/Components/Preferences/Panes/Backups/CloudBackups/CloudBackups.tsx index 2c2ee2863..1dff27e7a 100644 --- a/packages/web/src/javascripts/Components/Preferences/Panes/Backups/CloudBackups/CloudBackups.tsx +++ b/packages/web/src/javascripts/Components/Preferences/Panes/Backups/CloudBackups/CloudBackups.tsx @@ -41,7 +41,7 @@ const CloudLink: FunctionComponent = ({ application }) => { setIsFailedCloudBackupEmailMuted( convertStringifiedBooleanToBoolean( userSettings.getSettingValue( - SettingName.MuteFailedCloudBackupsEmails, + SettingName.create(SettingName.NAMES.MuteFailedCloudBackupsEmails).getValue(), MuteFailedCloudBackupsEmailsOption.NotMuted, ), ), @@ -83,7 +83,7 @@ const CloudLink: FunctionComponent = ({ application }) => { setIsFailedCloudBackupEmailMuted(!isFailedCloudBackupEmailMuted) const updateResult = await updateSetting( - SettingName.MuteFailedCloudBackupsEmails, + SettingName.create(SettingName.NAMES.MuteFailedCloudBackupsEmails).getValue(), `${!isFailedCloudBackupEmailMuted}`, ) if (!updateResult) { diff --git a/packages/web/src/javascripts/Components/Preferences/Panes/Backups/EmailBackups.tsx b/packages/web/src/javascripts/Components/Preferences/Panes/Backups/EmailBackups.tsx index ed81e20b4..a65e11e72 100644 --- a/packages/web/src/javascripts/Components/Preferences/Panes/Backups/EmailBackups.tsx +++ b/packages/web/src/javascripts/Components/Preferences/Panes/Backups/EmailBackups.tsx @@ -34,14 +34,14 @@ const EmailBackups = ({ application }: Props) => { const userSettings = await application.settings.listSettings() setEmailFrequency( userSettings.getSettingValue( - SettingName.EmailBackupFrequency, + SettingName.create(SettingName.NAMES.EmailBackupFrequency).getValue(), EmailBackupFrequency.Disabled, ), ) setIsFailedBackupEmailMuted( convertStringifiedBooleanToBoolean( userSettings.getSettingValue( - SettingName.MuteFailedBackupsEmails, + SettingName.create(SettingName.NAMES.MuteFailedBackupsEmails).getValue(), MuteFailedBackupsEmailsOption.NotMuted, ), ), @@ -81,7 +81,10 @@ const EmailBackups = ({ application }: Props) => { const previousFrequency = emailFrequency setEmailFrequency(frequency) - const updateResult = await updateSetting(SettingName.EmailBackupFrequency, frequency) + const updateResult = await updateSetting( + SettingName.create(SettingName.NAMES.EmailBackupFrequency).getValue(), + frequency, + ) if (!updateResult) { setEmailFrequency(previousFrequency) } @@ -91,7 +94,10 @@ const EmailBackups = ({ application }: Props) => { const previousValue = isFailedBackupEmailMuted setIsFailedBackupEmailMuted(!isFailedBackupEmailMuted) - const updateResult = await updateSetting(SettingName.MuteFailedBackupsEmails, `${!isFailedBackupEmailMuted}`) + const updateResult = await updateSetting( + SettingName.create(SettingName.NAMES.MuteFailedBackupsEmails).getValue(), + `${!isFailedBackupEmailMuted}`, + ) if (!updateResult) { setIsFailedBackupEmailMuted(previousValue) } diff --git a/packages/web/src/javascripts/Components/Preferences/Panes/Security/Privacy.tsx b/packages/web/src/javascripts/Components/Preferences/Panes/Security/Privacy.tsx index 68d9615bd..b14c9ebe1 100644 --- a/packages/web/src/javascripts/Components/Preferences/Panes/Security/Privacy.tsx +++ b/packages/web/src/javascripts/Components/Preferences/Panes/Security/Privacy.tsx @@ -39,7 +39,7 @@ const Privacy: FunctionComponent = ({ application }: Props) => { const userSettings = await application.settings.listSettings() setSessionUaLoggingValue( userSettings.getSettingValue( - SettingName.LogSessionUserAgent, + SettingName.create(SettingName.NAMES.LogSessionUserAgent).getValue(), LogSessionUserAgentOption.Enabled, ), ) @@ -62,7 +62,10 @@ const Privacy: FunctionComponent = ({ application }: Props) => { : LogSessionUserAgentOption.Enabled setSessionUaLoggingValue(newValue) - const updateResult = await updateSetting(SettingName.LogSessionUserAgent, newValue) + const updateResult = await updateSetting( + SettingName.create(SettingName.NAMES.LogSessionUserAgent).getValue(), + newValue, + ) if (!updateResult) { setSessionUaLoggingValue(previousValue) diff --git a/yarn.lock b/yarn.lock index b427f9943..5666fb233 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5317,12 +5317,13 @@ __metadata: languageName: unknown linkType: soft -"@standardnotes/settings@npm:^1.19.1": - version: 1.19.1 - resolution: "@standardnotes/settings@npm:1.19.1" +"@standardnotes/settings@npm:^1.20.0": + version: 1.20.0 + resolution: "@standardnotes/settings@npm:1.20.0" dependencies: + "@standardnotes/domain-core": ^1.11.3 reflect-metadata: ^0.1.13 - checksum: d99d49d4401ac8c973284d8637195c0441e6f73b7e01e9eb4ab14feb27c6d2e928a493d944ed67ea1d6f229bf5ea839b5dd667c373b917aed321bb32972daacb + checksum: 6e8c03107eec03e3d800bb9ced690dbade6713f7ef5e19364aaf06a86a92d2d58ac629d2e948775223ae9798be3ec60edfc5c24a8f7a4d57de959e5937727f44 languageName: node linkType: hard @@ -5403,7 +5404,7 @@ __metadata: "@standardnotes/responses": "workspace:*" "@standardnotes/security": ^1.7.6 "@standardnotes/services": "workspace:*" - "@standardnotes/settings": ^1.19.1 + "@standardnotes/settings": ^1.20.0 "@standardnotes/sncrypto-common": "workspace:*" "@standardnotes/sncrypto-web": "workspace:*" "@standardnotes/utils": "workspace:*"