chore: fix feature roles
This commit is contained in:
@@ -13,7 +13,7 @@ type RoleFields = {
|
|||||||
|
|
||||||
/** Statically populated. Non-influencing; used as a reference by other static consumers (such as email service) */
|
/** Statically populated. Non-influencing; used as a reference by other static consumers (such as email service) */
|
||||||
availableInSubscriptions: SubscriptionName[]
|
availableInSubscriptions: SubscriptionName[]
|
||||||
availableInRoles?: string[]
|
availableInRoles: string[]
|
||||||
}
|
}
|
||||||
|
|
||||||
export type BaseFeatureDescription = RoleFields & {
|
export type BaseFeatureDescription = RoleFields & {
|
||||||
|
|||||||
@@ -2,11 +2,11 @@ import { SubscriptionName } from '@standardnotes/common'
|
|||||||
import { GetFeatures, GetFeaturesForSubscription } from './Features'
|
import { GetFeatures, GetFeaturesForSubscription } from './Features'
|
||||||
|
|
||||||
describe('features', () => {
|
describe('features', () => {
|
||||||
it('all features should have either availableInSubscriptions or availableInRoles populated', () => {
|
it('all features should have availableInRoles populated', () => {
|
||||||
const features = GetFeatures()
|
const features = GetFeatures()
|
||||||
|
|
||||||
for (const feature of features) {
|
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', () => {
|
it('gets features for plus plan', () => {
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ import { ServerFeatureDescription } from '../Feature/FeatureDescription'
|
|||||||
import { PermissionName } from '../Permission/PermissionName'
|
import { PermissionName } from '../Permission/PermissionName'
|
||||||
import { FeatureIdentifier } from '../Feature/FeatureIdentifier'
|
import { FeatureIdentifier } from '../Feature/FeatureIdentifier'
|
||||||
import { SubscriptionName } from '@standardnotes/common'
|
import { SubscriptionName } from '@standardnotes/common'
|
||||||
|
import { RoleName } from '@standardnotes/domain-core'
|
||||||
|
|
||||||
export function serverFeatures(): ServerFeatureDescription[] {
|
export function serverFeatures(): ServerFeatureDescription[] {
|
||||||
return [
|
return [
|
||||||
@@ -10,57 +11,67 @@ export function serverFeatures(): ServerFeatureDescription[] {
|
|||||||
name: 'Two factor authentication',
|
name: 'Two factor authentication',
|
||||||
identifier: FeatureIdentifier.TwoFactorAuth,
|
identifier: FeatureIdentifier.TwoFactorAuth,
|
||||||
permission_name: PermissionName.TwoFactorAuth,
|
permission_name: PermissionName.TwoFactorAuth,
|
||||||
|
availableInRoles: [RoleName.NAMES.PlusUser, RoleName.NAMES.ProUser],
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
availableInSubscriptions: [SubscriptionName.ProPlan],
|
availableInSubscriptions: [SubscriptionName.ProPlan],
|
||||||
name: 'U2F authentication',
|
name: 'U2F authentication',
|
||||||
identifier: FeatureIdentifier.UniversalSecondFactor,
|
identifier: FeatureIdentifier.UniversalSecondFactor,
|
||||||
permission_name: PermissionName.UniversalSecondFactor,
|
permission_name: PermissionName.UniversalSecondFactor,
|
||||||
|
availableInRoles: [RoleName.NAMES.ProUser],
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
availableInSubscriptions: [SubscriptionName.ProPlan],
|
availableInSubscriptions: [SubscriptionName.ProPlan],
|
||||||
name: 'Unlimited note history',
|
name: 'Unlimited note history',
|
||||||
identifier: FeatureIdentifier.NoteHistoryUnlimited,
|
identifier: FeatureIdentifier.NoteHistoryUnlimited,
|
||||||
permission_name: PermissionName.NoteHistoryUnlimited,
|
permission_name: PermissionName.NoteHistoryUnlimited,
|
||||||
|
availableInRoles: [RoleName.NAMES.ProUser],
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
availableInSubscriptions: [SubscriptionName.PlusPlan],
|
availableInSubscriptions: [SubscriptionName.PlusPlan],
|
||||||
name: '365 days note history',
|
name: '365 days note history',
|
||||||
identifier: FeatureIdentifier.NoteHistory365Days,
|
identifier: FeatureIdentifier.NoteHistory365Days,
|
||||||
permission_name: PermissionName.NoteHistory365Days,
|
permission_name: PermissionName.NoteHistory365Days,
|
||||||
|
availableInRoles: [RoleName.NAMES.PlusUser],
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
availableInSubscriptions: [SubscriptionName.PlusPlan, SubscriptionName.ProPlan],
|
availableInSubscriptions: [SubscriptionName.PlusPlan, SubscriptionName.ProPlan],
|
||||||
name: 'Email backups',
|
name: 'Email backups',
|
||||||
identifier: FeatureIdentifier.DailyEmailBackup,
|
identifier: FeatureIdentifier.DailyEmailBackup,
|
||||||
permission_name: PermissionName.DailyEmailBackup,
|
permission_name: PermissionName.DailyEmailBackup,
|
||||||
|
availableInRoles: [RoleName.NAMES.PlusUser, RoleName.NAMES.ProUser],
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
availableInSubscriptions: [SubscriptionName.PlusPlan, SubscriptionName.ProPlan],
|
availableInSubscriptions: [SubscriptionName.PlusPlan, SubscriptionName.ProPlan],
|
||||||
name: 'Sign-in email alerts',
|
name: 'Sign-in email alerts',
|
||||||
identifier: FeatureIdentifier.SignInAlerts,
|
identifier: FeatureIdentifier.SignInAlerts,
|
||||||
permission_name: PermissionName.SignInAlerts,
|
permission_name: PermissionName.SignInAlerts,
|
||||||
|
availableInRoles: [RoleName.NAMES.PlusUser, RoleName.NAMES.ProUser],
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
availableInSubscriptions: [SubscriptionName.ProPlan],
|
availableInSubscriptions: [SubscriptionName.ProPlan],
|
||||||
identifier: FeatureIdentifier.FilesMaximumStorageTier,
|
identifier: FeatureIdentifier.FilesMaximumStorageTier,
|
||||||
permission_name: PermissionName.FilesMaximumStorageTier,
|
permission_name: PermissionName.FilesMaximumStorageTier,
|
||||||
|
availableInRoles: [RoleName.NAMES.ProUser],
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
availableInSubscriptions: [SubscriptionName.PlusPlan],
|
availableInSubscriptions: [SubscriptionName.PlusPlan],
|
||||||
identifier: FeatureIdentifier.FilesLowStorageTier,
|
identifier: FeatureIdentifier.FilesLowStorageTier,
|
||||||
permission_name: PermissionName.FilesLowStorageTier,
|
permission_name: PermissionName.FilesLowStorageTier,
|
||||||
|
availableInRoles: [RoleName.NAMES.PlusUser],
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
availableInSubscriptions: [SubscriptionName.ProPlan],
|
availableInSubscriptions: [SubscriptionName.ProPlan],
|
||||||
identifier: FeatureIdentifier.SubscriptionSharing,
|
identifier: FeatureIdentifier.SubscriptionSharing,
|
||||||
permission_name: PermissionName.SubscriptionSharing,
|
permission_name: PermissionName.SubscriptionSharing,
|
||||||
|
availableInRoles: [RoleName.NAMES.ProUser],
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
availableInSubscriptions: [SubscriptionName.PlusPlan, SubscriptionName.ProPlan],
|
availableInSubscriptions: [SubscriptionName.PlusPlan, SubscriptionName.ProPlan],
|
||||||
name: 'Listed Custom Domain',
|
name: 'Listed Custom Domain',
|
||||||
identifier: FeatureIdentifier.ListedCustomDomain,
|
identifier: FeatureIdentifier.ListedCustomDomain,
|
||||||
permission_name: PermissionName.ListedCustomDomain,
|
permission_name: PermissionName.ListedCustomDomain,
|
||||||
|
availableInRoles: [RoleName.NAMES.PlusUser, RoleName.NAMES.ProUser],
|
||||||
},
|
},
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -83,13 +83,13 @@ const NoteListItem: FunctionComponent<DisplayableListItemProps<SNNote>> = ({
|
|||||||
onClick={onClick}
|
onClick={onClick}
|
||||||
>
|
>
|
||||||
{!hideIcon ? (
|
{!hideIcon ? (
|
||||||
<div className="mr-0 flex flex-col items-center gap-2 p-4 pr-4">
|
<div className="mr-0 flex flex-col items-center justify-between gap-2 p-4 pr-4">
|
||||||
|
<Icon type={icon} className={`text-accessory-tint-${tint}`} />
|
||||||
{item.pinned && (
|
{item.pinned && (
|
||||||
<div className="rounded-full bg-info p-1 text-info-contrast">
|
<div className="rounded-full bg-info p-1 text-info-contrast">
|
||||||
<Icon type="pin-filled" size="custom" className="h-3 w-3" />
|
<Icon type="pin-filled" size="custom" className="h-3 w-3" />
|
||||||
</div>
|
</div>
|
||||||
)}
|
)}
|
||||||
<Icon type={icon} className={`text-accessory-tint-${tint}`} />
|
|
||||||
</div>
|
</div>
|
||||||
) : (
|
) : (
|
||||||
<div className="pr-4" />
|
<div className="pr-4" />
|
||||||
|
|||||||
Reference in New Issue
Block a user