diff --git a/packages/features/src/Domain/Feature/FeatureDescription.ts b/packages/features/src/Domain/Feature/FeatureDescription.ts index adafc6b05..36c00ae54 100644 --- a/packages/features/src/Domain/Feature/FeatureDescription.ts +++ b/packages/features/src/Domain/Feature/FeatureDescription.ts @@ -13,7 +13,7 @@ type RoleFields = { /** Statically populated. Non-influencing; used as a reference by other static consumers (such as email service) */ availableInSubscriptions: SubscriptionName[] - availableInRoles?: string[] + availableInRoles: string[] } export type BaseFeatureDescription = RoleFields & { diff --git a/packages/features/src/Domain/Feature/Features.spec.ts b/packages/features/src/Domain/Feature/Features.spec.ts index f70180f80..e3582cf6d 100644 --- a/packages/features/src/Domain/Feature/Features.spec.ts +++ b/packages/features/src/Domain/Feature/Features.spec.ts @@ -2,11 +2,11 @@ import { SubscriptionName } from '@standardnotes/common' import { GetFeatures, GetFeaturesForSubscription } from './Features' describe('features', () => { - it('all features should have either availableInSubscriptions or availableInRoles populated', () => { + it('all features should have availableInRoles populated', () => { const features = GetFeatures() for (const feature of features) { - expect(feature.availableInSubscriptions.length > 0 || feature.availableInRoles !== undefined && feature.availableInRoles.length > 0).toBeTruthy() + expect(feature.availableInRoles !== undefined && feature.availableInRoles.length > 0).toBeTruthy() } }) it('gets features for plus plan', () => { diff --git a/packages/features/src/Domain/Lists/ServerFeatures.ts b/packages/features/src/Domain/Lists/ServerFeatures.ts index ad2f794d7..3dd3b0288 100644 --- a/packages/features/src/Domain/Lists/ServerFeatures.ts +++ b/packages/features/src/Domain/Lists/ServerFeatures.ts @@ -2,6 +2,7 @@ import { ServerFeatureDescription } from '../Feature/FeatureDescription' import { PermissionName } from '../Permission/PermissionName' import { FeatureIdentifier } from '../Feature/FeatureIdentifier' import { SubscriptionName } from '@standardnotes/common' +import { RoleName } from '@standardnotes/domain-core' export function serverFeatures(): ServerFeatureDescription[] { return [ @@ -10,57 +11,67 @@ export function serverFeatures(): ServerFeatureDescription[] { name: 'Two factor authentication', identifier: FeatureIdentifier.TwoFactorAuth, permission_name: PermissionName.TwoFactorAuth, + availableInRoles: [RoleName.NAMES.PlusUser, RoleName.NAMES.ProUser], }, { availableInSubscriptions: [SubscriptionName.ProPlan], name: 'U2F authentication', identifier: FeatureIdentifier.UniversalSecondFactor, permission_name: PermissionName.UniversalSecondFactor, + availableInRoles: [RoleName.NAMES.ProUser], }, { availableInSubscriptions: [SubscriptionName.ProPlan], name: 'Unlimited note history', identifier: FeatureIdentifier.NoteHistoryUnlimited, permission_name: PermissionName.NoteHistoryUnlimited, + availableInRoles: [RoleName.NAMES.ProUser], }, { availableInSubscriptions: [SubscriptionName.PlusPlan], name: '365 days note history', identifier: FeatureIdentifier.NoteHistory365Days, permission_name: PermissionName.NoteHistory365Days, + availableInRoles: [RoleName.NAMES.PlusUser], }, { availableInSubscriptions: [SubscriptionName.PlusPlan, SubscriptionName.ProPlan], name: 'Email backups', identifier: FeatureIdentifier.DailyEmailBackup, permission_name: PermissionName.DailyEmailBackup, + availableInRoles: [RoleName.NAMES.PlusUser, RoleName.NAMES.ProUser], }, { availableInSubscriptions: [SubscriptionName.PlusPlan, SubscriptionName.ProPlan], name: 'Sign-in email alerts', identifier: FeatureIdentifier.SignInAlerts, permission_name: PermissionName.SignInAlerts, + availableInRoles: [RoleName.NAMES.PlusUser, RoleName.NAMES.ProUser], }, { availableInSubscriptions: [SubscriptionName.ProPlan], identifier: FeatureIdentifier.FilesMaximumStorageTier, permission_name: PermissionName.FilesMaximumStorageTier, + availableInRoles: [RoleName.NAMES.ProUser], }, { availableInSubscriptions: [SubscriptionName.PlusPlan], identifier: FeatureIdentifier.FilesLowStorageTier, permission_name: PermissionName.FilesLowStorageTier, + availableInRoles: [RoleName.NAMES.PlusUser], }, { availableInSubscriptions: [SubscriptionName.ProPlan], identifier: FeatureIdentifier.SubscriptionSharing, permission_name: PermissionName.SubscriptionSharing, + availableInRoles: [RoleName.NAMES.ProUser], }, { availableInSubscriptions: [SubscriptionName.PlusPlan, SubscriptionName.ProPlan], name: 'Listed Custom Domain', identifier: FeatureIdentifier.ListedCustomDomain, permission_name: PermissionName.ListedCustomDomain, + availableInRoles: [RoleName.NAMES.PlusUser, RoleName.NAMES.ProUser], }, ] } diff --git a/packages/web/src/javascripts/Components/ContentListView/NoteListItem.tsx b/packages/web/src/javascripts/Components/ContentListView/NoteListItem.tsx index 2ef590981..be4b27423 100644 --- a/packages/web/src/javascripts/Components/ContentListView/NoteListItem.tsx +++ b/packages/web/src/javascripts/Components/ContentListView/NoteListItem.tsx @@ -83,13 +83,13 @@ const NoteListItem: FunctionComponent> = ({ onClick={onClick} > {!hideIcon ? ( -
+
+ {item.pinned && (
)} -
) : (