From 86015176441936e3966aa2e168713d3041a82c9b Mon Sep 17 00:00:00 2001 From: Ryan Miller Date: Mon, 27 Oct 2025 15:50:05 +1100 Subject: [PATCH 1/4] fix: non-originating cancel title --- .../user-settings/pages/user-pro/ProNonOriginatingPage.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ts/components/dialog/user-settings/pages/user-pro/ProNonOriginatingPage.tsx b/ts/components/dialog/user-settings/pages/user-pro/ProNonOriginatingPage.tsx index 9ab5918db..473d85e4a 100644 --- a/ts/components/dialog/user-settings/pages/user-pro/ProNonOriginatingPage.tsx +++ b/ts/components/dialog/user-settings/pages/user-pro/ProNonOriginatingPage.tsx @@ -323,7 +323,7 @@ function ProInfoBlockCancel() { const { data } = useProAccessDetails(); return ( Date: Mon, 27 Oct 2025 16:03:05 +1100 Subject: [PATCH 2/4] fix: pro dialog error message --- .../dialog/user-settings/pages/user-pro/ProSettingsPage.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ts/components/dialog/user-settings/pages/user-pro/ProSettingsPage.tsx b/ts/components/dialog/user-settings/pages/user-pro/ProSettingsPage.tsx index bf844151a..a07c4af53 100644 --- a/ts/components/dialog/user-settings/pages/user-pro/ProSettingsPage.tsx +++ b/ts/components/dialog/user-settings/pages/user-pro/ProSettingsPage.tsx @@ -899,7 +899,7 @@ function PageHero() { dispatch( updateLocalizedPopupDialog({ title: { token: 'proStatusError' }, - description: { token: 'proStatusNetworkErrorDescription' }, + description: { token: 'proStatusRefreshNetworkError' }, overrideButtons: backendErrorButtons, }) ); From dae873b99d50e57fc4644fda8b91a11216285c30 Mon Sep 17 00:00:00 2001 From: Ryan Miller Date: Mon, 27 Oct 2025 16:06:30 +1100 Subject: [PATCH 3/4] fix: pro renew screen roadmap link --- .../user-settings/pages/user-pro/ProNonOriginatingPage.tsx | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/ts/components/dialog/user-settings/pages/user-pro/ProNonOriginatingPage.tsx b/ts/components/dialog/user-settings/pages/user-pro/ProNonOriginatingPage.tsx index 473d85e4a..c166026e0 100644 --- a/ts/components/dialog/user-settings/pages/user-pro/ProNonOriginatingPage.tsx +++ b/ts/components/dialog/user-settings/pages/user-pro/ProNonOriginatingPage.tsx @@ -284,6 +284,7 @@ function ProInfoBlockUpdate() { } function ProInfoBlockRenew() { + const dispatch = useDispatch(); const { data } = useProAccessDetails(); return ( } + descriptionOnClick={() => + showLinkVisitWarningDialog('https://getsession.org/pro-roadmap', dispatch) + } subtitleElement={ {tr('proOptionsTwoRenewalSubtitle')} From 7c13328db06e92dad835f616b2b5cb8898a05fba Mon Sep 17 00:00:00 2001 From: Ryan Miller Date: Mon, 27 Oct 2025 17:01:17 +1100 Subject: [PATCH 4/4] chore: update expiry debug options to specific day amounts --- ts/components/dialog/debug/FeatureFlags.tsx | 14 ++++----- ts/hooks/useHasPro.ts | 30 +++++++++---------- .../ducks/types/releasedFeaturesReduxTypes.ts | 17 ++++++----- 3 files changed, 31 insertions(+), 30 deletions(-) diff --git a/ts/components/dialog/debug/FeatureFlags.tsx b/ts/components/dialog/debug/FeatureFlags.tsx index d1a898ae7..bdf3a9f6b 100644 --- a/ts/components/dialog/debug/FeatureFlags.tsx +++ b/ts/components/dialog/debug/FeatureFlags.tsx @@ -430,13 +430,13 @@ export const ProDebugSection = ({ forceUpdate }: { forceUpdate: () => void }) => label="Expiry" flag="mockProAccessExpiry" options={[ - { label: 'Soon', value: MockProAccessExpiryOptions.SOON }, - { label: 'Today', value: MockProAccessExpiryOptions.TODAY }, - { label: 'Tomorrow', value: MockProAccessExpiryOptions.TOMORROW }, - { label: '1 Week', value: MockProAccessExpiryOptions.WEEK }, - { label: '1 Month', value: MockProAccessExpiryOptions.MONTH }, - { label: '3 Months', value: MockProAccessExpiryOptions.THREE_MONTH }, - { label: '1 Year', value: MockProAccessExpiryOptions.YEAR }, + { label: '7 Days', value: MockProAccessExpiryOptions.P7D }, + { label: '29 Days', value: MockProAccessExpiryOptions.P29D }, + { label: '30 Days', value: MockProAccessExpiryOptions.P30D }, + { label: '30 Days 1 Second', value: MockProAccessExpiryOptions.P30DT1S }, + { label: '90 Days', value: MockProAccessExpiryOptions.P90D }, + { label: '300 Days', value: MockProAccessExpiryOptions.P300D }, + { label: '365 Days', value: MockProAccessExpiryOptions.P365D }, { label: '24 Days 1 Minute', value: MockProAccessExpiryOptions.P24DT1M }, { label: '24 Hours 1 Minute', value: MockProAccessExpiryOptions.PT24H1M }, { label: '23 Hours 59 Minutes', value: MockProAccessExpiryOptions.PT23H59M }, diff --git a/ts/hooks/useHasPro.ts b/ts/hooks/useHasPro.ts index eba3d0f32..2efd05b6e 100644 --- a/ts/hooks/useHasPro.ts +++ b/ts/hooks/useHasPro.ts @@ -147,25 +147,25 @@ function proAccessOriginatingPlatformToStrings( } function useMockProAccessExpiry() { - const variant = useDataFeatureFlag('mockProAccessExpiry') ?? MockProAccessExpiryOptions.MONTH; + const variant = useDataFeatureFlag('mockProAccessExpiry') ?? MockProAccessExpiryOptions.P30D; - // NOTE: for testing the expiry time should be pinned to x time after "now" - const now = variant ? Date.now() : 0; + // NOTE: for testing the expiry time should be pinned to x + 250ms after "now", the +250ms prevents render lag from changing the timestamp + const now = variant ? Date.now() + 250 : 0; switch (variant) { - case MockProAccessExpiryOptions.SOON: - return now + 600 * 1000; - case MockProAccessExpiryOptions.TODAY: - return now + 12 * 60 * 60 * 1000; - case MockProAccessExpiryOptions.TOMORROW: - return now + 26 * 60 * 60 * 1000; - case MockProAccessExpiryOptions.WEEK: - return now + 8 * 24 * 60 * 60 * 1000; - case MockProAccessExpiryOptions.MONTH: + case MockProAccessExpiryOptions.P7D: + return now + 7 * 24 * 60 * 60 * 1000; + case MockProAccessExpiryOptions.P29D: + return now + 29 * 24 * 60 * 60 * 1000; + case MockProAccessExpiryOptions.P30D: return now + 30 * 24 * 60 * 60 * 1000; - case MockProAccessExpiryOptions.THREE_MONTH: + case MockProAccessExpiryOptions.P30DT1S: + return now + 30 * 24 * 60 * 61 * 1000; + case MockProAccessExpiryOptions.P90D: return now + 90 * 24 * 60 * 60 * 1000; - case MockProAccessExpiryOptions.YEAR: - return now + 12 * 30 * 24 * 60 * 60 * 1000; + case MockProAccessExpiryOptions.P300D: + return now + 300 * 24 * 60 * 60 * 1000; + case MockProAccessExpiryOptions.P365D: + return now + 365 * 24 * 60 * 60 * 1000; case MockProAccessExpiryOptions.P24DT1M: return now + 24 * 24 * 60 * 60 * 1000 + 60 * 60 * 1000; case MockProAccessExpiryOptions.PT24H1M: diff --git a/ts/state/ducks/types/releasedFeaturesReduxTypes.ts b/ts/state/ducks/types/releasedFeaturesReduxTypes.ts index 7a002db48..b0875daaf 100644 --- a/ts/state/ducks/types/releasedFeaturesReduxTypes.ts +++ b/ts/state/ducks/types/releasedFeaturesReduxTypes.ts @@ -29,15 +29,16 @@ export type SessionFeatureFlags = { fsTTL30s: boolean; }; +// ISO8601 duration format export enum MockProAccessExpiryOptions { - SOON = 0, - TODAY = 1, - TOMORROW = 2, - WEEK = 3, - MONTH = 4, - THREE_MONTH = 5, - YEAR = 6, - // The following are test cases from the PRD in ISO8601 duration format + P7D = 0, + P29D = 1, + P30D = 2, + P30DT1S = 3, + P90D = 4, + P300D = 5, + P365D = 6, + // The following are test cases from the PRD P24DT1M = 7, PT24H1M = 8, PT23H59M = 9,