From 2b493e290645c8d397aab6d6724987ee60b42726 Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Thu, 19 Feb 2026 17:01:18 +1100 Subject: [PATCH 1/2] chore: bump libsession to expose refund urls --- package.json | 2 +- pnpm-lock.yaml | 12 ++++++------ 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/package.json b/package.json index dbbf2fc12..4996d1618 100644 --- a/package.json +++ b/package.json @@ -95,7 +95,7 @@ "framer-motion": "^12.5.0", "fs-extra": "11.3.0", "image-type": "^4.1.0", - "libsession_util_nodejs": "https://github.com/session-foundation/libsession-util-nodejs/releases/download/v0.6.11/libsession_util_nodejs-v0.6.11.tar.gz", + "libsession_util_nodejs": "https://github.com/session-foundation/libsession-util-nodejs/releases/download/v0.6.12/libsession_util_nodejs-v0.6.12.tar.gz", "libsodium-wrappers-sumo": "^0.7.15", "linkify-it": "^5.0.0", "lodash": "^4.17.21", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index a9d521f72..3a2ce8383 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -96,8 +96,8 @@ importers: specifier: ^4.1.0 version: 4.1.0 libsession_util_nodejs: - specifier: https://github.com/session-foundation/libsession-util-nodejs/releases/download/v0.6.11/libsession_util_nodejs-v0.6.11.tar.gz - version: https://github.com/session-foundation/libsession-util-nodejs/releases/download/v0.6.11/libsession_util_nodejs-v0.6.11.tar.gz + specifier: https://github.com/session-foundation/libsession-util-nodejs/releases/download/v0.6.12/libsession_util_nodejs-v0.6.12.tar.gz + version: https://github.com/session-foundation/libsession-util-nodejs/releases/download/v0.6.12/libsession_util_nodejs-v0.6.12.tar.gz libsodium-wrappers-sumo: specifier: ^0.7.15 version: 0.7.15 @@ -4013,9 +4013,9 @@ packages: resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} engines: {node: '>= 0.8.0'} - libsession_util_nodejs@https://github.com/session-foundation/libsession-util-nodejs/releases/download/v0.6.11/libsession_util_nodejs-v0.6.11.tar.gz: - resolution: {integrity: sha512-nzL+wJmiVHlTehTqmmQRuRaB+nA/AC93Aa05vmGtxosHLnIfkKI7PKk9JRWsQ6GW39NeDo/UWnWQW+GGuz8jEw==, tarball: https://github.com/session-foundation/libsession-util-nodejs/releases/download/v0.6.11/libsession_util_nodejs-v0.6.11.tar.gz} - version: 0.6.11 + libsession_util_nodejs@https://github.com/session-foundation/libsession-util-nodejs/releases/download/v0.6.12/libsession_util_nodejs-v0.6.12.tar.gz: + resolution: {integrity: sha512-aHPiHREn5AwVo3JPSIdA1q3/L7WpDlwu5Z90KuD7WFHIDOSoJbnxv+0kv/SwawRr4AiSMiRGgfsxq6iRwxh9gQ==, tarball: https://github.com/session-foundation/libsession-util-nodejs/releases/download/v0.6.12/libsession_util_nodejs-v0.6.12.tar.gz} + version: 0.6.12 libsodium-sumo@0.7.15: resolution: {integrity: sha512-5tPmqPmq8T8Nikpm1Nqj0hBHvsLFCXvdhBFV7SGOitQPZAA6jso8XoL0r4L7vmfKXr486fiQInvErHtEvizFMw==} @@ -10114,7 +10114,7 @@ snapshots: prelude-ls: 1.2.1 type-check: 0.4.0 - libsession_util_nodejs@https://github.com/session-foundation/libsession-util-nodejs/releases/download/v0.6.11/libsession_util_nodejs-v0.6.11.tar.gz: + libsession_util_nodejs@https://github.com/session-foundation/libsession-util-nodejs/releases/download/v0.6.12/libsession_util_nodejs-v0.6.12.tar.gz: dependencies: cmake-js: 7.3.1 node-addon-api: 8.5.0 From 59da5124eb88d4c0b7a24bfc1f5acd04cfb4e1bd Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Fri, 20 Feb 2026 14:25:03 +1100 Subject: [PATCH 2/2] feat: add and show the "refund requested" dialog --- .../pages/user-pro/ProNonOriginatingPage.tsx | 80 +++++++++++++++---- .../pages/user-pro/ProSettingsPage.tsx | 70 ++++++++++------ ts/react.d.ts | 1 + ts/state/selectors/proBackendData.ts | 4 + ts/types/ReduxTypes.d.ts | 8 +- 5 files changed, 123 insertions(+), 40 deletions(-) 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 1ac1ce41b..3d2d251fd 100644 --- a/ts/components/dialog/user-settings/pages/user-pro/ProNonOriginatingPage.tsx +++ b/ts/components/dialog/user-settings/pages/user-pro/ProNonOriginatingPage.tsx @@ -26,6 +26,7 @@ import { useProBackendProDetails, type ProcessedProDetails, } from '../../../../../state/selectors/proBackendData'; +import { userSettingsModal } from '../../../../../state/ducks/modalDialog'; type VariantPageProps = { variant: ProNonOriginatingPageVariant; @@ -69,6 +70,8 @@ function ProPageHero({ variant }: VariantPageProps) { return ; case 'refund': return ; + case 'refundRequested': + return ; default: return assertUnreachable(variant, `Unknown pro non originating page variant: ${variant}`); } @@ -404,16 +407,16 @@ const ProInfoBlockRefundTitle = styled.div` font-weight: 700; padding-top: var(--margins-xs); `; +const containerStyle = { + paddingBlock: 'var(--margins-md)', + paddingInline: 'var(--margins-lg)', + gap: 'var(--margins-sm)', + lineHeight: '120%', +}; function ProInfoBlockRefundSessionSupport() { return ( - + @@ -429,13 +432,7 @@ function ProInfoBlockRefundSessionSupport() { function ProInfoBlockRefundGooglePlay() { const { data } = useProBackendProDetailsLocal(); return ( - + @@ -508,6 +505,36 @@ function ProInfoBlockRefund() { } } +function ProInfoBlockRefundRequested() { + const { data } = useProBackendProDetailsLocal(); + const dispatch = getAppDispatch(); + + return ( + + + + + + + + + + + showLinkVisitWarningDialog(data.providerConstants.refund_status_url, dispatch) + } + style={{ cursor: 'pointer' }} + > + + + + ); +} + function ProInfoBlock({ variant }: VariantPageProps) { switch (variant) { case 'upgrade': @@ -518,6 +545,8 @@ function ProInfoBlock({ variant }: VariantPageProps) { return ; case 'refund': return ; + case 'refundRequested': + return ; case 'renew': return ; default: @@ -589,6 +618,27 @@ function ProPageButtonRefund() { ); } +function ProPageButtonRefundRequested() { + const dispatch = getAppDispatch(); + + return ( + { + dispatch( + userSettingsModal({ + userSettingsPage: 'pro', + }) + ); + }} + dataTestId="pro-refund-return-button" + > + + + ); +} + function ProPageButton({ variant }: VariantPageProps) { switch (variant) { case 'upgrade': @@ -600,6 +650,8 @@ function ProPageButton({ variant }: VariantPageProps) { return ; case 'refund': return ; + case 'refundRequested': + return ; default: return assertUnreachable(variant, `Unknown pro non originating page variant: ${variant}`); } 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 b3172433e..9f300bfd5 100644 --- a/ts/components/dialog/user-settings/pages/user-pro/ProSettingsPage.tsx +++ b/ts/components/dialog/user-settings/pages/user-pro/ProSettingsPage.tsx @@ -464,12 +464,18 @@ function ProSettings({ state }: SectionProps) { title: { token: 'proAccessLoading' }, description: { token: 'proAccessLoadingDescription' }, }) - : userSettingsModal({ - userSettingsPage: 'proNonOriginating', - nonOriginatingVariant: 'update', - overrideBackAction: returnToThisModalAction, - centerAlign, - }) + : data.isProcessingRefund + ? userSettingsModal({ + userSettingsPage: 'proNonOriginating', + nonOriginatingVariant: 'refundRequested', + overrideBackAction: state.returnToThisModalAction, + }) + : userSettingsModal({ + userSettingsPage: 'proNonOriginating', + nonOriginatingVariant: 'update', + overrideBackAction: returnToThisModalAction, + centerAlign, + }) ); }; @@ -481,29 +487,43 @@ function ProSettings({ state }: SectionProps) { return null; } + let subText: TrArgs; + if (isError) { + subText = { token: 'errorLoadingProAccess' }; + } else if (isLoading) { + subText = { token: 'proAccessLoadingEllipsis' }; + } else if (data.isProcessingRefund) { + subText = { token: 'processingRefundRequest', platform: data.providerConstants.platform }; + } else if (data.inGracePeriod) { + subText = { token: 'proRenewalUnsuccessful' }; + } else if (data.autoRenew) { + subText = { token: 'proAutoRenewTime', time: data.expiryTimeRelativeString }; + } else { + subText = { token: 'proExpiringTime', time: data.expiryTimeRelativeString }; + } + return ( - + {data.isProcessingRefund ? ( + } + rowReverse + /> + ) : ( + + )} = beginAutoRenew && now < expiryTimeMs; } + const isProcessingRefund = !!data?.refund_requested_unix_ts_ms; + return { data: { currentStatus: data?.status ?? defaultProAccessDetailsSourceData.currentStatus, autoRenew, inGracePeriod, + isProcessingRefund, variant, variantString: proAccessVariantToString(variant), expiryTimeMs, diff --git a/ts/types/ReduxTypes.d.ts b/ts/types/ReduxTypes.d.ts index 076f76d97..d1ac0e7f3 100644 --- a/ts/types/ReduxTypes.d.ts +++ b/ts/types/ReduxTypes.d.ts @@ -7,7 +7,13 @@ export type PasswordAction = 'set' | 'change' | 'remove'; -export type ProNonOriginatingPageVariant = 'upgrade' | 'update' | 'cancel' | 'refund' | 'renew'; +export type ProNonOriginatingPageVariant = + | 'upgrade' + | 'update' + | 'cancel' + | 'refund' + | 'refundRequested' + | 'renew'; export type EditProfilePictureModalProps = { conversationId: string;