Skip to content

Commit

Permalink
chore(IT Wallet): [SIW-1313] Add IT Wallet trial system status (#5932)
Browse files Browse the repository at this point in the history
## Short description
This PR allows the app to know if the user is enabled to use the IT
Wallet experimental features

## List of changes proposed in this pull request
- Fixed `trial_system` typo in type definitions script
- Added IT Wallet trial system status read at app boot 
- Added IT Wallet trial system playgrounds

## How to test
With the `io-dev-api-server`, go to **Profile > Playgrounds > IT Wallet
> Trial**. You should be able to enable, refresh and reset the IT Wallet
trial system.

## Preview


https://github.com/pagopa/io-app/assets/6160324/1c638850-2fda-42b9-9c8b-6a53b137dce6

---------

Co-authored-by: Mario Perrotta <[email protected]>
  • Loading branch information
mastro993 and hevelius committed Jul 15, 2024
1 parent eb7a0b1 commit ba90570
Show file tree
Hide file tree
Showing 9 changed files with 109 additions and 11 deletions.
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -81,7 +81,7 @@
"generate:services": "npm-run-all generate:services-api",
"generate:lollipop-api": "rimraf definitions/lollipop && mkdir -p definitions/lollipop && gen-api-models --api-spec $npm_package_lollipop_api --out-dir ./definitions/lollipop --no-strict --response-decoders --request-types --client",
"generate:fast-login-api": "rimraf definitions/fast_login && mkdir -p definitions/fast_login && gen-api-models --api-spec $npm_package_fast_login_api --out-dir ./definitions/fast_login --no-strict --response-decoders --request-types --client",
"generate:trial-system-api": "rimraf definitions/trial_systwem && mkdir -p definitions/trial_systwem && gen-api-models --api-spec $npm_package_trial_system --out-dir ./definitions/trial_systwem --no-strict --response-decoders --request-types --client",
"generate:trial-system-api": "rimraf definitions/trial_system && mkdir -p definitions/trial_system && gen-api-models --api-spec $npm_package_trial_system --out-dir ./definitions/trial_system --no-strict --response-decoders --request-types --client",
"generate:pagopa-walletv3-api": "rimraf definitions/pagopa/walletv3 && mkdir -p definitions/pagopa/walletv3 && gen-api-models --api-spec $npm_package_pagopa_api_walletv3 --out-dir ./definitions/pagopa/walletv3 --no-strict --response-decoders --request-types --client",
"generate:pagopa-ecommerce-api": "rimraf definitions/pagopa/ecommerce && mkdir -p definitions/pagopa/ecommerce && gen-api-models --api-spec $npm_package_pagopa_api_ecommerce --out-dir ./definitions/pagopa/ecommerce --no-strict --response-decoders --request-types --client",
"generate:pagopa-biz-events-api": "rimraf definitions/pagopa/biz-events && mkdir -p definitions/pagopa/biz-events && gen-api-models --api-spec $npm_package_pagopa_api_biz_events --out-dir ./definitions/pagopa/biz-events --no-strict --response-decoders --request-types --client",
Expand Down
7 changes: 6 additions & 1 deletion ts/features/itwallet/common/saga/index.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
import { SagaIterator } from "redux-saga";
import { fork, select } from "typed-redux-saga/macro";
import { fork, put, select } from "typed-redux-saga/macro";
import { isItWalletTestEnabledSelector } from "../../../../store/reducers/persistedPreferences";
import { trialSystemActivationStatus } from "../../../trialSystem/store/actions";
import { watchItwIdentificationSaga } from "../../identification/saga";
import { ITW_TRIAL_ID } from "../utils/itwTrialUtils";

export function* watchItwSaga(): SagaIterator {
const isItWalletTestEnabled: ReturnType<
Expand All @@ -14,4 +16,7 @@ export function* watchItwSaga(): SagaIterator {
}

yield* fork(watchItwIdentificationSaga);

// IT Wallet trial status refresh
yield* put(trialSystemActivationStatus.request(ITW_TRIAL_ID));
}
3 changes: 3 additions & 0 deletions ts/features/itwallet/common/utils/itwTrialUtils.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
import { TrialId } from "../../../../../definitions/trial_system/TrialId";

export const ITW_TRIAL_ID = "01J2GN4TA8FB6DPTAX3T3YD6M1" as TrialId;
Original file line number Diff line number Diff line change
@@ -0,0 +1,85 @@
import {
ButtonSolid,
ListItemHeader,
ListItemInfo,
VSpacer
} from "@pagopa/io-app-design-system";
import { constNull } from "fp-ts/lib/function";
import * as React from "react";
import { SubscriptionStateEnum } from "../../../../../definitions/trial_system/SubscriptionState";
import I18n from "../../../../i18n";
import { useIODispatch, useIOSelector } from "../../../../store/hooks";
import {
trialSystemActivationStatus,
trialSystemActivationStatusReset,
trialSystemActivationStatusUpsert
} from "../../../trialSystem/store/actions";
import {
isLoadingTrialStatusSelector,
isUpdatingTrialStatusSelector,
trialStatusSelector
} from "../../../trialSystem/store/reducers";
import { ITW_TRIAL_ID } from "../../common/utils/itwTrialUtils";

export const ItwTrialSystemSection = () => {
const dispatch = useIODispatch();
const status = useIOSelector(trialStatusSelector(ITW_TRIAL_ID));
const isLoading = useIOSelector(isLoadingTrialStatusSelector(ITW_TRIAL_ID));
const isUpdating = useIOSelector(isUpdatingTrialStatusSelector(ITW_TRIAL_ID));

const subscribe = () => {
dispatch(trialSystemActivationStatusUpsert.request(ITW_TRIAL_ID));
};

const refresh = () => {
dispatch(trialSystemActivationStatus.request(ITW_TRIAL_ID));
};

const reset = () => {
dispatch(trialSystemActivationStatusReset(ITW_TRIAL_ID));
};

return (
<>
<ListItemHeader label="Trial" />
<ListItemInfo label="Current status" value={status ?? "Not present"} />
<VSpacer size={8} />
<>
{status === undefined ||
status === SubscriptionStateEnum.UNSUBSCRIBED ? (
<ButtonSolid
loading={isUpdating}
disabled={isLoading}
fullWidth={true}
label={I18n.t("profile.main.trial.titleSection")}
onPress={subscribe}
/>
) : (
<ButtonSolid
disabled={isLoading}
fullWidth={true}
color="danger"
label={"Unsubscribe"}
onPress={constNull}
/>
)}
</>
<VSpacer size={8} />
<ButtonSolid
loading={isUpdating}
disabled={isLoading}
fullWidth={true}
label={"Refresh"}
onPress={refresh}
/>
<VSpacer size={8} />
<ButtonSolid
loading={isUpdating}
disabled={isLoading}
fullWidth={true}
label={"Reset"}
onPress={reset}
/>
</>
);
};
6 changes: 5 additions & 1 deletion ts/features/itwallet/playgrounds/screens/ItwPlayground.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -9,9 +9,10 @@ import {
import * as React from "react";
import { ScrollView } from "react-native-gesture-handler";
import { useHeaderSecondLevel } from "../../../../hooks/useHeaderSecondLevel";
import ItwMarkdown from "../../common/components/ItwMarkdown";
import { useIONavigation } from "../../../../navigation/params/AppParamsList";
import ItwMarkdown from "../../common/components/ItwMarkdown";
import { ITW_ROUTES } from "../../navigation/routes";
import { ItwTrialSystemSection } from "../components/ItwTrialSystemSection";

// Sample markdown text
const sampleMarkdown = `
Expand Down Expand Up @@ -134,6 +135,9 @@ const ItwPlayground = () => {
onPress={navigateToCredentialAuth}
/>
<VSpacer size={16} />
{/* F&F Experimentation */}
<ItwTrialSystemSection />
<VSpacer size={16} />
{/* Other Playgrounds */}
<ListItemHeader label="Miscellaneous" />
<H3>{"IT Wallet markdown preview"}</H3>
Expand Down
2 changes: 1 addition & 1 deletion ts/features/trialSystem/api/client.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { createClient } from "../../../../definitions/trial_systwem/client";
import { createClient } from "../../../../definitions/trial_system/client";
import { SessionToken } from "../../../types/SessionToken";
import { defaultRetryingFetch } from "../../../utils/fetch";

Expand Down
4 changes: 2 additions & 2 deletions ts/features/trialSystem/store/actions/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,8 @@ import {
createAsyncAction,
createStandardAction
} from "typesafe-actions";
import { TrialId } from "../../../../../definitions/trial_systwem/TrialId";
import { Subscription } from "../../../../../definitions/trial_systwem/Subscription";
import { TrialId } from "../../../../../definitions/trial_system/TrialId";
import { Subscription } from "../../../../../definitions/trial_system/Subscription";

type ErrorPayload = {
trialId: TrialId;
Expand Down
4 changes: 2 additions & 2 deletions ts/features/trialSystem/store/reducers/index.ts
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
import * as pot from "@pagopa/ts-commons/lib/pot";
import { getType } from "typesafe-actions";
import { pipe } from "fp-ts/lib/function";
import { TrialId } from "../../../../../definitions/trial_systwem/TrialId";
import { TrialId } from "../../../../../definitions/trial_system/TrialId";
import {
SubscriptionState,
SubscriptionStateEnum
} from "../../../../../definitions/trial_systwem/SubscriptionState";
} from "../../../../../definitions/trial_system/SubscriptionState";
import { Action } from "../../../../store/actions/types";
import {
trialSystemActivationStatus,
Expand Down
7 changes: 4 additions & 3 deletions ts/screens/profile/TrialSystemPlayground.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -14,15 +14,16 @@ import { useHeaderSecondLevel } from "../../hooks/useHeaderSecondLevel";
import { useIODispatch, useIOSelector } from "../../store/hooks";
import {
isLoadingTrialStatusSelector,
isUpdatingTrialStatusSelector,
trialStatusSelector
} from "../../features/trialSystem/store/reducers";
import { TrialId } from "../../../definitions/trial_systwem/TrialId";
import { TrialId } from "../../../definitions/trial_system/TrialId";
import {
trialSystemActivationStatus,
trialSystemActivationStatusUpsert
} from "../../features/trialSystem/store/actions";
import I18n from "../../i18n";
import { SubscriptionStateEnum } from "../../../definitions/trial_systwem/SubscriptionState";
import { SubscriptionStateEnum } from "../../../definitions/trial_system/SubscriptionState";

const styles = StyleSheet.create({
row: {
Expand All @@ -41,7 +42,7 @@ const TrialSystemPlayground = () => {
);

const isTrialStatusUpdating = useIOSelector(
isLoadingTrialStatusSelector(TRIAL_ID)
isUpdatingTrialStatusSelector(TRIAL_ID)
);

useEffect(() => {
Expand Down

0 comments on commit ba90570

Please sign in to comment.