Skip to content

Commit

Permalink
Merge branch 'master' into IOPID-1550-user-data
Browse files Browse the repository at this point in the history
  • Loading branch information
shadowsheep1 committed Jul 5, 2024
2 parents e84d54a + bb96fd2 commit 43aa9c2
Show file tree
Hide file tree
Showing 13 changed files with 106 additions and 138 deletions.
19 changes: 19 additions & 0 deletions ts/components/SectionStatus/StatusContent.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import {
} from "@pagopa/io-app-design-system";
import { WithTestID } from "../../types/WithTestID";
import { Label } from "../core/typography/Label";
import { LevelEnum } from "../../../definitions/content/SectionStatus";

const iconSize = 24;

Expand Down Expand Up @@ -38,6 +39,24 @@ type Props = WithTestID<{
labelPaddingVertical?: number;
}>;

export const statusColorMap: Record<LevelEnum, IOColors> = {
[LevelEnum.normal]: "aqua",
[LevelEnum.critical]: "red",
[LevelEnum.warning]: "orange"
};

export const statusIconMap: Record<LevelEnum, IOIcons> = {
[LevelEnum.normal]: "ok",
[LevelEnum.critical]: "notice",
[LevelEnum.warning]: "info"
};

// map the text background color with the relative text color
export const getStatusTextColor = (
level: LevelEnum
): "bluegreyDark" | "white" =>
level === LevelEnum.normal ? "bluegreyDark" : "white";

const StatusContent = forwardRef<View, React.PropsWithChildren<Props>>(
(
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -68,21 +68,22 @@ describe("SectionStatusComponent", () => {
});

[
[LevelEnum.normal, IOColors.aqua],
[LevelEnum.warning, IOColors.orange],
[LevelEnum.critical, IOColors.red]
[LevelEnum.normal, IOColors["info-100"]],
[LevelEnum.warning, IOColors["warning-100"]],
[LevelEnum.critical, IOColors["error-100"]]
].forEach(([level, color]) => {
describe(`given the level ${level}`, () => {
const store = mockStore(
mockSectionStatusState("messages", {
...sectionStatus,
web_url: undefined,
level: level as LevelEnum
})
);

it(`should apply background color ${color} to the status content`, () => {
const component = getComponent("messages", store);
const view = component.getByTestId("SectionStatusContent");
const view = component.getByTestId("SectionStatusComponentContent");
expect(view).toHaveStyle({ backgroundColor: color });
});
});
Expand All @@ -101,15 +102,7 @@ describe("SectionStatusComponent", () => {
const component = getComponent("messages");
const view = component.getByTestId("SectionStatusComponentPressable");
expect(view.props.accessible).toBe(true);
expect(view.props.accessibilityLabel).toMatch(
`${sectionStatus.message["it-IT"]}, ${I18n.t(
"global.sectionStatus.moreInfo"
)}`
);
expect(view.props.accessibilityHint).toMatch(
I18n.t("global.accessibility.linkHint")
);
expect(view.props.accessibilityRole).toBe("link");
expect(view.props.accessibilityRole).toBe("button");
});

it("should render the touchable wrapper which opens the correct url", () => {
Expand All @@ -135,14 +128,9 @@ describe("SectionStatusComponent", () => {
it("should set the correct a11y properties to the status content", () => {
setLocale("it");
const component = getComponent("messages", store);
const view = component.getByTestId("SectionStatusContent");
expect(view.props.accessible).toBe(true);
expect(view.props.accessibilityRole).toBeUndefined();
expect(view.props.accessibilityLabel).toMatch(
`${sectionStatus.message["it-IT"]}, ${I18n.t(
"global.accessibility.alert"
)}`
);
const view = component.getByTestId("SectionStatusComponentContent");
expect(view.props.accessible).toBe(false);
expect(view.props.accessibilityRole).toBe("alert");
});

it("should display the accessibility alert text", () => {
Expand Down
89 changes: 25 additions & 64 deletions ts/components/SectionStatus/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,10 @@ import { useNavigation } from "@react-navigation/native";
import { pipe } from "fp-ts/lib/function";
import * as O from "fp-ts/lib/Option";
import _ from "lodash";
import React, { useCallback } from "react";
import { Pressable, View } from "react-native";
import React, { ComponentProps, useCallback } from "react";
import { View } from "react-native";
import { connect } from "react-redux";
import type { IOColors, IOIcons } from "@pagopa/io-app-design-system";
import { Alert } from "@pagopa/io-app-design-system";
import { LevelEnum } from "../../../definitions/content/SectionStatus";
import I18n from "../../i18n";
import {
Expand All @@ -16,8 +16,6 @@ import { GlobalState } from "../../store/reducers/types";
import { getFullLocale } from "../../utils/locale";
import { maybeNotNullyString } from "../../utils/strings";
import { openWebUrl } from "../../utils/url";
import { Link } from "../core/typography/Link";
import StatusContent from "./StatusContent";

type OwnProps = {
sectionKey: SectionStatusKey;
Expand All @@ -26,41 +24,28 @@ type OwnProps = {

type Props = OwnProps & ReturnType<typeof mapStateToProps>;

export const statusColorMap: Record<LevelEnum, IOColors> = {
[LevelEnum.normal]: "aqua",
[LevelEnum.critical]: "red",
[LevelEnum.warning]: "orange"
export const statusVariantMap: Record<
LevelEnum,
ComponentProps<typeof Alert>["variant"]
> = {
[LevelEnum.normal]: "info",
[LevelEnum.critical]: "error",
[LevelEnum.warning]: "warning"
};

export const statusIconMap: Record<LevelEnum, IOIcons> = {
[LevelEnum.normal]: "ok",
[LevelEnum.critical]: "notice",
[LevelEnum.warning]: "info"
};

// map the text background color with the relative text color
export const getStatusTextColor = (
level: LevelEnum
): "bluegreyDark" | "white" =>
level === LevelEnum.normal ? "bluegreyDark" : "white";

export const InnerSectionStatus = (
props: Omit<Props, "sectionStatus"> & {
sectionStatus: NonNullable<Props["sectionStatus"]>;
}
) => {
const viewRef = React.createRef<View>();
const { sectionStatus, onSectionRef } = props;
const iconName = statusIconMap[sectionStatus.level];
const backgroundColor = statusColorMap[sectionStatus.level];
const locale = getFullLocale();
const maybeWebUrl = maybeNotNullyString(
sectionStatus.web_url && sectionStatus.web_url[locale]
);
const navigation = useNavigation();

const color = getStatusTextColor(sectionStatus.level);

const handleOnSectionRef = useCallback(() => {
if (viewRef.current) {
onSectionRef?.(viewRef);
Expand All @@ -78,49 +63,25 @@ export const InnerSectionStatus = (
O.fold(
() => (
// render text only
<StatusContent
accessibilityLabel={`${sectionStatus.message[locale]}, ${I18n.t(
"global.accessibility.alert"
)}`}
backgroundColor={backgroundColor}
iconName={iconName}
<Alert
testID={"SectionStatusComponentContent"}
ref={viewRef}
foregroundColor={color}
>
{`${sectionStatus.message[locale]} `}
</StatusContent>
fullWidth
content={`${sectionStatus.message[locale]}`}
variant={statusVariantMap[sectionStatus.level]}
viewRef={viewRef}
/>
),

// render a pressable element with the link
webUrl => (
<Pressable
accessibilityHint={I18n.t("global.accessibility.linkHint")}
accessibilityLabel={`${sectionStatus.message[locale]}, ${I18n.t(
"global.sectionStatus.moreInfo"
)}`}
accessibilityRole={"link"}
onPress={() => openWebUrl(webUrl)}
// render a pressable element with the link
<Alert
testID={"SectionStatusComponentPressable"}
>
<StatusContent
// disable accessibility to prevent the override of the container
accessible={false}
backgroundColor={backgroundColor}
iconName={iconName}
ref={viewRef}
foregroundColor={color}
>
{`${sectionStatus.message[locale]} `}
<Link
testID={"SectionStatusComponentMoreInfo"}
color={backgroundColor === "aqua" ? "bluegreyDark" : "white"}
weight={"Bold"}
>
{I18n.t("global.sectionStatus.moreInfo")}
</Link>
</StatusContent>
</Pressable>
fullWidth
content={`${sectionStatus.message[locale]} `}
variant={statusVariantMap[sectionStatus.level]}
action={I18n.t("global.sectionStatus.moreInfo")}
onPress={() => openWebUrl(webUrl)}
viewRef={viewRef}
/>
)
)
);
Expand Down
11 changes: 3 additions & 8 deletions ts/features/design-system/core/DSLegacyAlert.tsx
Original file line number Diff line number Diff line change
@@ -1,11 +1,10 @@
import { VSpacer } from "@pagopa/io-app-design-system";
import * as React from "react";
import SectionStatusComponent, {
getStatusTextColor,
import StatusContent, {
statusColorMap,
getStatusTextColor,
statusIconMap
} from "../../../components/SectionStatus";
import StatusContent from "../../../components/SectionStatus/StatusContent";
} from "../../../components/SectionStatus/StatusContent";
import { DSFullWidthComponent } from "../components/DSFullWidthComponent";

/* Types */
Expand All @@ -28,10 +27,6 @@ export const DSLegacyAlert = () => (
</StatusContent>
</DSFullWidthComponent>
<VSpacer size={16} />
<DSFullWidthComponent>
<SectionStatusComponent sectionKey={"favourite_language"} />
</DSFullWidthComponent>
<VSpacer size={16} />
<DSFullWidthComponent>
<StatusContent
accessibilityLabel={`Accessibility text for the advice component`}
Expand Down
2 changes: 2 additions & 0 deletions ts/features/itwallet/navigation/ItwParamsList.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,4 +14,6 @@ export type ItwParamsList = {
[ITW_ROUTES.ISSUANCE.CREDENTIAL_PREVIEW]: undefined;
// PRESENTATION
[ITW_ROUTES.PRESENTATION.EID_DETAIL]: undefined;
// PLAYGROUNDS
[ITW_ROUTES.PLAYGROUNDS]: undefined;
};
3 changes: 3 additions & 0 deletions ts/features/itwallet/navigation/ItwStackNavigator.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ import { ItwIssuanceCredentialPreviewScreen } from "../issuance/screens/ItwIssua
import { ItwIssuanceEidPreviewScreen } from "../issuance/screens/ItwIssuanceEidPreviewScreen";
import { ItwIssuanceEidResultScreen } from "../issuance/screens/ItwIssuanceEidResultScreen";
import { ItwPresentationEidDetailScreen } from "../presentation/screens/ItwPresentationEidDetailScreen";
import ItwPlayground from "../playgrounds/screens/ItwPlayground";
import { ItwParamsList } from "./ItwParamsList";
import { ITW_ROUTES } from "./routes";

Expand Down Expand Up @@ -64,5 +65,7 @@ export const ItwStackNavigator = () => (
component={ItwPresentationEidDetailScreen}
options={{ headerShown: false }}
/>
{/* PLAYGROUNDS */}
<Stack.Screen name={ITW_ROUTES.PLAYGROUNDS} component={ItwPlayground} />
</Stack.Navigator>
);
3 changes: 2 additions & 1 deletion ts/features/itwallet/navigation/routes.ts
Original file line number Diff line number Diff line change
Expand Up @@ -16,5 +16,6 @@ export const ITW_ROUTES = {
} as const,
PRESENTATION: {
EID_DETAIL: "ITW_PRESENTATION_EID_DETAIL"
} as const
} as const,
PLAYGROUNDS: "ITW_PLAYGROUNDS" as const
};
Loading

0 comments on commit 43aa9c2

Please sign in to comment.