diff --git a/fluxer_app/src/features/app/components/dialogs/components/FeatureComparisonTable.tsx b/fluxer_app/src/features/app/components/dialogs/components/FeatureComparisonTable.tsx index 490eb761d..304df825a 100644 --- a/fluxer_app/src/features/app/components/dialogs/components/FeatureComparisonTable.tsx +++ b/fluxer_app/src/features/app/components/dialogs/components/FeatureComparisonTable.tsx @@ -139,8 +139,10 @@ export const FeatureComparisonTable = observer(() => { ); @@ -157,9 +159,11 @@ export const FeatureComparisonTable = observer(() => { ); } if (isTextTierPerk(perk)) { - const restrictedLabel = + const lowLabel = perkLabels[perk.restrictedValueI18nKey as keyof typeof perkLabels] || perk.restrictedValueI18nKey; - const stockLabel = perkLabels[perk.stockValueI18nKey as keyof typeof perkLabels] || perk.stockValueI18nKey; + const highLabel = perkLabels[perk.stockValueI18nKey as keyof typeof perkLabels] || perk.stockValueI18nKey; + const restrictedLabel = perk.limitKey && Limits.hasRestrictedFeature(perk.limitKey, false) ? highLabel : lowLabel; + const stockLabel = !perk.limitKey || Limits.hasStockFeature(perk.limitKey, true) ? highLabel : lowLabel; return ( 0; + } + + hasRestrictedFeature(key: LimitKey, fallback: boolean): boolean { + return this.getRestrictedValue(key, fallback ? 1 : 0) > 0; + } + getPremiumValue(key: LimitKey, fallback: number): number { return this.getStockValue(key, fallback); } diff --git a/fluxer_app/src/features/premium/components/plutonium_page/PlutoniumPageComparison.tsx b/fluxer_app/src/features/premium/components/plutonium_page/PlutoniumPageComparison.tsx index 0e0fb0f00..f9937413d 100644 --- a/fluxer_app/src/features/premium/components/plutonium_page/PlutoniumPageComparison.tsx +++ b/fluxer_app/src/features/premium/components/plutonium_page/PlutoniumPageComparison.tsx @@ -127,8 +127,16 @@ function buildRows(locale: string, translate: (descriptor: MessageDescriptor) => id: perk.id, icon: definition.icon, label: definition.label, - free: {kind: 'boolean', value: perk.restrictedValue}, - premium: {kind: 'boolean', value: perk.stockValue}, + free: { + kind: 'boolean', + value: perk.limitKey + ? Limits.hasRestrictedFeature(perk.limitKey, perk.restrictedValue) + : perk.restrictedValue, + }, + premium: { + kind: 'boolean', + value: perk.limitKey ? Limits.hasStockFeature(perk.limitKey, perk.stockValue) : perk.stockValue, + }, }); continue; } @@ -142,12 +150,24 @@ function buildRows(locale: string, translate: (descriptor: MessageDescriptor) => }); continue; } + const freeHasHighQuality = perk.limitKey ? Limits.hasRestrictedFeature(perk.limitKey, false) : false; + const premiumHasHighQuality = perk.limitKey ? Limits.hasStockFeature(perk.limitKey, true) : true; rows.push({ id: perk.id, icon: definition.icon, label: definition.label, - free: {kind: 'text', value: translate(PERK_VIDEO_QUALITY_FREE_DESCRIPTOR)}, - premium: {kind: 'text', value: translate(PERK_VIDEO_QUALITY_PREMIUM_DESCRIPTOR)}, + free: { + kind: 'text', + value: translate( + freeHasHighQuality ? PERK_VIDEO_QUALITY_PREMIUM_DESCRIPTOR : PERK_VIDEO_QUALITY_FREE_DESCRIPTOR, + ), + }, + premium: { + kind: 'text', + value: translate( + premiumHasHighQuality ? PERK_VIDEO_QUALITY_PREMIUM_DESCRIPTOR : PERK_VIDEO_QUALITY_FREE_DESCRIPTOR, + ), + }, }); } return rows; diff --git a/packages/constants/src/LimitTierPerks.ts b/packages/constants/src/LimitTierPerks.ts index dcc2e0f79..247db0b17 100644 --- a/packages/constants/src/LimitTierPerks.ts +++ b/packages/constants/src/LimitTierPerks.ts @@ -16,6 +16,7 @@ export interface BooleanTierPerk extends BasePerk { type: 'boolean'; restrictedValue: boolean; stockValue: boolean; + limitKey?: LimitKey; } export interface NumericTierPerk extends BasePerk { @@ -30,6 +31,7 @@ export interface TextTierPerk extends BasePerk { type: 'text'; restrictedValueI18nKey: string; stockValueI18nKey: string; + limitKey?: LimitKey; } export type LimitTierPerk = BooleanTierPerk | NumericTierPerk | TextTierPerk; @@ -54,6 +56,7 @@ export const LIMIT_TIER_PERKS: ReadonlyArray = [ i18nKey: 'custom_4_digit_username_tag', restrictedValue: false, stockValue: true, + limitKey: 'feature_custom_discriminator', }, { id: 'per_guild_profiles', @@ -62,6 +65,7 @@ export const LIMIT_TIER_PERKS: ReadonlyArray = [ i18nKey: 'per_community_profiles', restrictedValue: false, stockValue: true, + limitKey: 'feature_per_guild_profiles', }, { id: 'profile_badge', @@ -88,6 +92,7 @@ export const LIMIT_TIER_PERKS: ReadonlyArray = [ i18nKey: 'entrance_sounds', restrictedValue: false, stockValue: true, + limitKey: 'feature_voice_entrance_sounds', }, { id: 'max_guilds', @@ -154,6 +159,7 @@ export const LIMIT_TIER_PERKS: ReadonlyArray = [ i18nKey: 'global_emoji_sticker_access', restrictedValue: false, stockValue: true, + limitKey: 'feature_global_expressions', }, { id: 'video_quality', @@ -162,6 +168,7 @@ export const LIMIT_TIER_PERKS: ReadonlyArray = [ i18nKey: 'video_quality', restrictedValueI18nKey: 'video_quality_restricted', stockValueI18nKey: 'video_quality_stock', + limitKey: 'feature_higher_video_quality', }, { id: 'animated_profile', @@ -170,6 +177,7 @@ export const LIMIT_TIER_PERKS: ReadonlyArray = [ i18nKey: 'animated_avatars_and_banners', restrictedValue: false, stockValue: true, + limitKey: 'feature_animated_avatar', }, { id: 'early_access', @@ -178,6 +186,7 @@ export const LIMIT_TIER_PERKS: ReadonlyArray = [ i18nKey: 'early_access', restrictedValue: false, stockValue: true, + limitKey: 'feature_early_access', }, { id: 'custom_themes',