diff --git a/App.tsx b/App.tsx index 3539cdc8b..3f6c50570 100644 --- a/App.tsx +++ b/App.tsx @@ -12,7 +12,7 @@ import { OnboardingProvider, determineIsOnboardingComplete, } from "./src/OnboardingContext" -import { ConfigurationProvider } from "./src/ConfigurationContext" +import { ConfigurationProvider } from "./src/configuration/configurationProvider"; import { PermissionsProvider } from "./src/Device/PermissionsContext" import { initializei18next, loadUserLocale } from "./src/locales/languages" import Logger from "./src/logger" diff --git a/example.env.bt b/example.env.bt index c26673cd9..be6e7d817 100644 --- a/example.env.bt +++ b/example.env.bt @@ -78,6 +78,9 @@ DISPLAY_DEBUG_MENU=false DISPLAY_COVID_DATA=false STATE_ABBREVIATION= COVID_ACT_NOW_API_KEY= +EXTERNAL_COVID_DATA_LINK=https://google.com +EXTERNAL_COVID_DATA_LABEL=Covid Data Label +EXTERNAL_TRAVEL_GUIDENCE_LINK="https://maps.google.com // Age Verification DISPLAY_AGE_VERIFICATION=true diff --git a/src/Activation/AcceptTermsOfService.spec.tsx b/src/Activation/AcceptTermsOfService.spec.tsx index 3ef3a5598..91acb967c 100644 --- a/src/Activation/AcceptTermsOfService.spec.tsx +++ b/src/Activation/AcceptTermsOfService.spec.tsx @@ -4,7 +4,7 @@ import { useNavigation } from "@react-navigation/native" import { Linking } from "react-native" import AcceptTermsOfService from "./AcceptTermsOfService" -import { ConfigurationContext } from "../ConfigurationContext" +import { ConfigurationContext } from "../configuration" import { factories } from "../factories" import { OnboardingProvider } from "../OnboardingContext" diff --git a/src/Activation/AcceptTermsOfService.tsx b/src/Activation/AcceptTermsOfService.tsx index ab6008c92..989c0d529 100644 --- a/src/Activation/AcceptTermsOfService.tsx +++ b/src/Activation/AcceptTermsOfService.tsx @@ -12,7 +12,7 @@ import { SvgXml } from "react-native-svg" import { Icons } from "../assets" import { Text } from "../components" import { useStatusBarEffect } from "../navigation" -import { useConfigurationContext } from "../ConfigurationContext" +import { useConfigurationContext } from "../configuration" import { useActivationNavigation } from "./useActivationNavigation" import { diff --git a/src/Activation/ProductAnalyticsConsentForm.tsx b/src/Activation/ProductAnalyticsConsentForm.tsx index 33675ab8d..dc1d1128d 100644 --- a/src/Activation/ProductAnalyticsConsentForm.tsx +++ b/src/Activation/ProductAnalyticsConsentForm.tsx @@ -8,7 +8,7 @@ import { } from "react-native" import { useTranslation } from "react-i18next" -import { useConfigurationContext } from "../ConfigurationContext" +import { useConfigurationContext } from "../configuration" import { useProductAnalyticsContext } from "../ProductAnalytics/Context" import { useStatusBarEffect } from "../navigation" import { useCustomCopy } from "../configuration/useCustomCopy" diff --git a/src/Activation/useActivationNavigation.ts b/src/Activation/useActivationNavigation.ts index da9b8b367..4e60aa7cb 100644 --- a/src/Activation/useActivationNavigation.ts +++ b/src/Activation/useActivationNavigation.ts @@ -1,7 +1,7 @@ import { Platform } from "react-native" import { useNavigation } from "@react-navigation/native" -import { useConfigurationContext } from "../ConfigurationContext" +import { useConfigurationContext } from "../configuration" import { ENPermissionStatus, usePermissionsContext, diff --git a/src/AffectedUserFlow/CodeInput/CodeInputForm.tsx b/src/AffectedUserFlow/CodeInput/CodeInputForm.tsx index 4362733f6..241878a8d 100644 --- a/src/AffectedUserFlow/CodeInput/CodeInputForm.tsx +++ b/src/AffectedUserFlow/CodeInput/CodeInputForm.tsx @@ -27,7 +27,7 @@ import { AffectedUserFlowStackScreens, } from "../../navigation" import Logger from "../../logger" -import { useConfigurationContext } from "../../ConfigurationContext" +import { useConfigurationContext } from "../../configuration" import { Spacing, diff --git a/src/AffectedUserFlow/PublishConsent/PublishConsentScreen.tsx b/src/AffectedUserFlow/PublishConsent/PublishConsentScreen.tsx index 273fce56f..b6a26a875 100644 --- a/src/AffectedUserFlow/PublishConsent/PublishConsentScreen.tsx +++ b/src/AffectedUserFlow/PublishConsent/PublishConsentScreen.tsx @@ -6,7 +6,7 @@ import { useStatusBarEffect } from "../../navigation" import { useAffectedUserContext } from "../AffectedUserContext" import PublishConsentForm from "./PublishConsentForm" import { useExposureContext } from "../../ExposureContext" -import { useConfigurationContext } from "../../ConfigurationContext" +import { useConfigurationContext } from "../../configuration" import { Colors } from "../../styles" diff --git a/src/AffectedUserFlow/Start.tsx b/src/AffectedUserFlow/Start.tsx index 07ece3a5d..18b355471 100644 --- a/src/AffectedUserFlow/Start.tsx +++ b/src/AffectedUserFlow/Start.tsx @@ -19,7 +19,7 @@ import { Text } from "../components" import { Spacing, Colors, Typography, Buttons, Iconography } from "../styles" import { Icons, Images } from "../assets" -import { useConfigurationContext } from "../ConfigurationContext" +import { useConfigurationContext } from "../configuration" export const AffectedUserFlowIntro: FunctionComponent = () => { useStatusBarEffect("dark-content", Colors.background.primaryLight) diff --git a/src/AffectedUserFlow/SymptomOnsetDate.tsx b/src/AffectedUserFlow/SymptomOnsetDate.tsx index 5b779192a..c73b1239f 100644 --- a/src/AffectedUserFlow/SymptomOnsetDate.tsx +++ b/src/AffectedUserFlow/SymptomOnsetDate.tsx @@ -17,7 +17,7 @@ import StaticSafeAreaInsets from "react-native-static-safe-area-insets" import { AffectedUserFlowStackScreens, useStatusBarEffect } from "../navigation" import { useAffectedUserContext } from "./AffectedUserContext" -import Checkbox from "../components/Checkbox" +import { CheckBox } from "../components" import { Buttons, Colors, Forms, Spacing, Typography } from "../styles" import { Icons } from "../assets" @@ -131,14 +131,14 @@ const SymptomOnsetDate: FunctionComponent = () => { {t("export.symptom_onset.did_you_have_symptoms")} - - { displaySelfAssessment, displaySymptomHistory, emergencyPhoneNumber, + externalCovidDataLink, + externalCovidDataLabel, + externalTravelGuidanceLink, healthAuthorityHealthCheckUrl, verificationStrategy, } = useConfigurationContext() @@ -81,6 +85,22 @@ const Home: FunctionComponent = () => { )} {displayCovidDataWebView && } + {externalCovidDataLink && ( + + )} + {externalTravelGuidanceLink && ( + + )} {appDownloadUrl && } {env.VERIFICATION_CODE_INFO_URL && } {displaySelfAssessment && } diff --git a/src/Onboarding/useOnboardingNavigation.tsx b/src/Onboarding/useOnboardingNavigation.tsx index 665b0662d..f2c46558e 100644 --- a/src/Onboarding/useOnboardingNavigation.tsx +++ b/src/Onboarding/useOnboardingNavigation.tsx @@ -1,6 +1,6 @@ import { useNavigation } from "@react-navigation/native" -import { useConfigurationContext } from "../ConfigurationContext" +import { useConfigurationContext } from "../configuration" import { OnboardingRoutes, Stacks, diff --git a/src/SelfAssessment/Guidance.tsx b/src/SelfAssessment/Guidance.tsx index ce3152665..5f145ea34 100644 --- a/src/SelfAssessment/Guidance.tsx +++ b/src/SelfAssessment/Guidance.tsx @@ -13,7 +13,7 @@ import { SvgXml } from "react-native-svg" import { StatusBar, Text } from "../components" import { useSelfAssessmentContext } from "./Context" -import { useConfigurationContext } from "../ConfigurationContext" +import { useConfigurationContext } from "../configuration" import { SymptomGroup } from "./selfAssessment" import { Stack, Stacks, useStatusBarEffect } from "../navigation" diff --git a/src/SelfAssessment/SelfAssessmentIntro.tsx b/src/SelfAssessment/SelfAssessmentIntro.tsx index 7efdf5c15..57f38d7dd 100644 --- a/src/SelfAssessment/SelfAssessmentIntro.tsx +++ b/src/SelfAssessment/SelfAssessmentIntro.tsx @@ -14,7 +14,7 @@ import { SvgXml } from "react-native-svg" import { useCustomCopy } from "../configuration/useCustomCopy" import { SelfAssessmentStackScreens, useStatusBarEffect } from "../navigation" import { Text } from "../components" -import { useConfigurationContext } from "../ConfigurationContext" +import { useConfigurationContext } from "../configuration" import { Icons, Images } from "../assets" import { Buttons, Colors, Outlines, Spacing, Typography } from "../styles" diff --git a/src/Settings/DeleteConfirmation.tsx b/src/Settings/DeleteConfirmation.tsx index c48b36215..6b97c5f0d 100644 --- a/src/Settings/DeleteConfirmation.tsx +++ b/src/Settings/DeleteConfirmation.tsx @@ -13,7 +13,7 @@ import { showMessage } from "react-native-flash-message" import { useOnboardingContext } from "../OnboardingContext" import { useProductAnalyticsContext } from "../ProductAnalytics/Context" import { useSymptomHistoryContext } from "../SymptomHistory/SymptomHistoryContext" -import { useConfigurationContext } from "../ConfigurationContext" +import { useConfigurationContext } from "../configuration" import { useApplicationName } from "../Device/useApplicationInfo" import { resetUserLocale } from "../locales/languages" diff --git a/src/Settings/Legal.spec.tsx b/src/Settings/Legal.spec.tsx index 80fddcf5f..edf6c306f 100644 --- a/src/Settings/Legal.spec.tsx +++ b/src/Settings/Legal.spec.tsx @@ -6,7 +6,7 @@ import "@testing-library/jest-native/extend-expect" import { useNavigation, useFocusEffect } from "@react-navigation/native" import { useApplicationName } from "../Device/useApplicationInfo" -import { ConfigurationContext } from "../ConfigurationContext" +import { ConfigurationContext } from "../configuration" import { factories } from "../factories" import { loadAuthorityLinks, diff --git a/src/Settings/Legal.tsx b/src/Settings/Legal.tsx index b347e2bce..db2ce0fa0 100644 --- a/src/Settings/Legal.tsx +++ b/src/Settings/Legal.tsx @@ -3,7 +3,7 @@ import { ScrollView, StyleSheet } from "react-native" import { useTranslation } from "react-i18next" import { useApplicationName } from "../Device/useApplicationInfo" -import { useConfigurationContext } from "../ConfigurationContext" +import { useConfigurationContext } from "../configuration" import ExternalLink from "./ExternalLink" import { useCustomCopy } from "../configuration/useCustomCopy" import { diff --git a/src/Settings/ProductAnalyticsConsentScreen.tsx b/src/Settings/ProductAnalyticsConsentScreen.tsx index aa7e19e44..d26800ab3 100644 --- a/src/Settings/ProductAnalyticsConsentScreen.tsx +++ b/src/Settings/ProductAnalyticsConsentScreen.tsx @@ -9,7 +9,7 @@ import { import { useNavigation } from "@react-navigation/native" import { useTranslation } from "react-i18next" -import { useConfigurationContext } from "../ConfigurationContext" +import { useConfigurationContext } from "../configuration" import { useProductAnalyticsContext } from "../ProductAnalytics/Context" import { useStatusBarEffect } from "../navigation" import { useCustomCopy } from "../configuration/useCustomCopy" diff --git a/src/Settings/index.tsx b/src/Settings/index.tsx index 28ae9c50d..9afdcd88f 100644 --- a/src/Settings/index.tsx +++ b/src/Settings/index.tsx @@ -12,7 +12,7 @@ import { SettingsStackScreens, HowItWorksStackScreens, } from "../navigation" -import { useConfigurationContext } from "../ConfigurationContext" +import { useConfigurationContext } from "../configuration" import { Text, ListItem, ListItemSeparator, StatusBar } from "../components" import { useApplicationInfo } from "../Device/useApplicationInfo" import ExternalLink from "../Settings/ExternalLink" diff --git a/src/SymptomHistory/Form/SelectSymptoms.tsx b/src/SymptomHistory/Form/SelectSymptoms.tsx index 052727bf0..67c92871b 100644 --- a/src/SymptomHistory/Form/SelectSymptoms.tsx +++ b/src/SymptomHistory/Form/SelectSymptoms.tsx @@ -18,7 +18,7 @@ import { hasEmergencySymptoms, SymptomEntry, } from "../symptomHistory" -import Checkbox from "../../components/Checkbox" +import { CheckBox } from "../../components" import { Affordances, @@ -117,7 +117,7 @@ const SelectSymptomsForm: FunctionComponent = ({ {showNoSymptoms ? ( - = ({ {Symptom.all.map((symptom: Symptom.Symptom) => { const translation = Symptom.toTranslation(t, symptom) return ( - handleOnPressSymptom(symptom)} diff --git a/src/components/Checkbox.tsx b/src/components/CheckBox/index.tsx similarity index 87% rename from src/components/Checkbox.tsx rename to src/components/CheckBox/index.tsx index a6659bbcc..862f38a80 100644 --- a/src/components/Checkbox.tsx +++ b/src/components/CheckBox/index.tsx @@ -2,10 +2,10 @@ import React, { FunctionComponent, useState } from "react" import { View, StyleSheet, TouchableWithoutFeedback } from "react-native" import { SvgXml } from "react-native-svg" -import { Text } from "." +import { Text } from "../Text" -import { Colors, Iconography, Forms } from "../styles" -import { Icons } from "../assets" +import { Colors, Iconography, Forms } from "../../styles" +import { Icons } from "../../assets" interface CheckboxProps { label: string @@ -13,7 +13,7 @@ interface CheckboxProps { checked: boolean } -const Checkbox: FunctionComponent = ({ +const CheckBox: FunctionComponent = ({ label, onPress, checked, @@ -66,4 +66,4 @@ const style = StyleSheet.create({ }, }) -export default Checkbox +export { CheckBox } diff --git a/src/components/ExternalLink/index.tsx b/src/components/ExternalLink/index.tsx new file mode 100644 index 000000000..6242d92fc --- /dev/null +++ b/src/components/ExternalLink/index.tsx @@ -0,0 +1,78 @@ +import React, { FunctionComponent } from "react" +import { useTranslation } from "react-i18next" +import { Icons } from "../../assets" +import { SvgXml } from "react-native-svg" +import { Linking, Pressable, View, StyleSheet } from "react-native" + +import { Text } from "../Text" +import { + Spacing, + Colors, + Typography, + Outlines, + Iconography, + Affordances, +} from "../../styles" + +type Props = { + icon: string + label: string + link: string +} + +const ExternalLink: FunctionComponent = (props) => { + const { t } = useTranslation() + + const { icon, label, link } = props + + const handleOnPress = async () => { + Linking.openURL(link) + } + + return ( + + + + + {t(label)} + + + + ) +} + +const style = StyleSheet.create({ + container: { + ...Affordances.floatingContainer, + paddingVertical: Spacing.small, + flexDirection: "row", + alignItems: "center", + borderColor: Colors.primary.shade100, + borderWidth: Outlines.thin, + }, + textContainer: { + flex: 1, + marginLeft: Spacing.medium, + }, + shareText: { + ...Typography.body.x30, + ...Typography.style.medium, + color: Colors.text.primary, + }, +}) + +export { ExternalLink } diff --git a/src/components/ListItem.tsx b/src/components/ListItem/index.tsx similarity index 90% rename from src/components/ListItem.tsx rename to src/components/ListItem/index.tsx index 5b39faa0f..bf8b2b60e 100644 --- a/src/components/ListItem.tsx +++ b/src/components/ListItem/index.tsx @@ -2,9 +2,9 @@ import React, { FunctionComponent } from "react" import { View, StyleSheet, TouchableOpacity } from "react-native" import { SvgXml } from "react-native-svg" -import Text from "./Text" +import { Text } from "../Text" -import { Iconography, Spacing, Typography, Colors } from "../styles" +import { Iconography, Spacing, Typography, Colors } from "../../styles" interface ListItemProps { label: string @@ -57,4 +57,4 @@ const style = StyleSheet.create({ }, }) -export default ListItem +export { ListItem } diff --git a/src/components/ListItemSeparator.tsx b/src/components/ListItemSeparator/index.tsx similarity index 80% rename from src/components/ListItemSeparator.tsx rename to src/components/ListItemSeparator/index.tsx index 7c7583e4b..2447f4d8a 100644 --- a/src/components/ListItemSeparator.tsx +++ b/src/components/ListItemSeparator/index.tsx @@ -1,7 +1,7 @@ import React, { FunctionComponent } from "react" import { View, StyleSheet } from "react-native" -import { Outlines } from "../styles" +import { Outlines } from "../../styles" const ListItemSeparator: FunctionComponent = () => { return @@ -13,4 +13,4 @@ const style = StyleSheet.create({ }, }) -export default ListItemSeparator +export { ListItemSeparator } diff --git a/src/components/LoadingIndicator.tsx b/src/components/LoadingIndicator/index.tsx similarity index 93% rename from src/components/LoadingIndicator.tsx rename to src/components/LoadingIndicator/index.tsx index 622adbbef..5c587ccd6 100644 --- a/src/components/LoadingIndicator.tsx +++ b/src/components/LoadingIndicator/index.tsx @@ -2,7 +2,7 @@ import React, { FunctionComponent } from "react" import { ActivityIndicator, StyleSheet, View } from "react-native" import { useHeaderHeight } from "@react-navigation/stack" -import { Colors, Layout, Outlines } from "../styles" +import { Colors, Layout, Outlines } from "../../styles" const LoadingIndicator: FunctionComponent = () => { const headerHeight = useHeaderHeight() @@ -42,4 +42,4 @@ const createStyle = (headerHeight: number) => { }) } -export default LoadingIndicator +export { LoadingIndicator } diff --git a/src/components/StatusBar.tsx b/src/components/StatusBar/index.tsx similarity index 97% rename from src/components/StatusBar.tsx rename to src/components/StatusBar/index.tsx index f3cf21215..81f20e08a 100644 --- a/src/components/StatusBar.tsx +++ b/src/components/StatusBar/index.tsx @@ -32,4 +32,4 @@ const createStyle = ({ insets, backgroundColor }: StyleProps) => { }) } -export default StatusBar +export { StatusBar } diff --git a/src/components/SwitchListItem.tsx b/src/components/SwitchListItem/index.tsx similarity index 91% rename from src/components/SwitchListItem.tsx rename to src/components/SwitchListItem/index.tsx index ceac36f87..ba836b131 100644 --- a/src/components/SwitchListItem.tsx +++ b/src/components/SwitchListItem/index.tsx @@ -1,6 +1,6 @@ import React, { FunctionComponent } from "react" import { View, Text, Switch, StyleSheet } from "react-native" -import { Colors, Spacing, Typography } from "../styles" +import { Colors, Spacing, Typography } from "../../styles" type SwitchListItemProps = { label: string @@ -44,4 +44,4 @@ const style = StyleSheet.create({ }, }) -export default SwitchListItem +export { SwitchListItem } diff --git a/src/components/Text.tsx b/src/components/Text/index.tsx similarity index 98% rename from src/components/Text.tsx rename to src/components/Text/index.tsx index 435e36bcb..3688c42ab 100644 --- a/src/components/Text.tsx +++ b/src/components/Text/index.tsx @@ -43,4 +43,4 @@ export function useLanguageDirection(): TextDirection { return i18n.dir() } -export default Text +export { Text } diff --git a/src/components/index.ts b/src/components/index.ts deleted file mode 100644 index dfe043ab0..000000000 --- a/src/components/index.ts +++ /dev/null @@ -1,15 +0,0 @@ -import Text from "./Text" -import StatusBar from "./StatusBar" -import ListItem from "./ListItem" -import ListItemSeparator from "./ListItemSeparator" -import LoadingIndicator from "./LoadingIndicator" -import SwitchListItem from "./SwitchListItem" - -export { - Text, - StatusBar, - ListItem, - ListItemSeparator, - LoadingIndicator, - SwitchListItem, -} diff --git a/src/components/index.tsx b/src/components/index.tsx new file mode 100644 index 000000000..f3c048fa9 --- /dev/null +++ b/src/components/index.tsx @@ -0,0 +1,19 @@ +import { CheckBox } from "./CheckBox" +import { ExternalLink } from "./ExternalLink" +import { Text } from "./Text" +import { StatusBar } from "./StatusBar" +import { ListItem } from "./ListItem" +import { ListItemSeparator } from "./ListItemSeparator" +import { LoadingIndicator } from "./LoadingIndicator" +import { SwitchListItem } from "./SwitchListItem" + +export { + CheckBox, + ExternalLink, + ListItem, + ListItemSeparator, + LoadingIndicator, + StatusBar, + SwitchListItem, + Text, +} diff --git a/src/configuration/configurationContext.tsx b/src/configuration/configurationContext.tsx new file mode 100644 index 000000000..0b5444a16 --- /dev/null +++ b/src/configuration/configurationContext.tsx @@ -0,0 +1,50 @@ +import { createContext } from "react" + +import { Configuration } from "./configurationInterface" + +const initialState: Configuration = { + appDownloadUrl: null, + appPackageName: "", + cdcGuidanceUrl: null, + cdcSymptomsUrl: null, + displayAcceptTermsOfService: false, + displayAppTransition: false, + displayCallbackForm: false, + displayRequestCallbackUrl: false, + displayCallEmergencyServices: false, + displayCovidData: false, + displayCovidDataWebView: false, + displaySymptomHistory: false, + displaySelfAssessment: false, + displayAgeVerification: false, + emergencyPhoneNumber: "", + enableProductAnalytics: false, + externalCovidDataLabel: "home.covid_data", + externalCovidDataLink: null, + externalTravelGuidanceLink: null, + findATestCenterUrl: null, + healthAuthorityAdviceUrl: "", + healthAuthorityCovidDataUrl: null, + healthAuthorityCovidDataWebViewUrl: null, + healthAuthorityEulaUrl: null, + healthAuthorityHealthCheckUrl: null, + healthAuthorityLearnMoreUrl: "", + healthAuthorityLegalPrivacyPolicyUrl: "", + healthAuthorityPrivacyPolicyUrl: "", + healthAuthorityRequestCallbackNumber: "", + healthAuthorityVerificationCodeInfoUrl: null, + includeSymptomOnsetDate: false, + measurementSystem: "Imperial" as const, + minimumAge: "18", + minimumPhoneDigits: 0, + regionCodes: [], + remoteContentUrl: null, + quarantineLength: 14, + stateAbbreviation: "", + supportPhoneNumber: null, + verificationStrategy: "Simple", +} + +const ConfigurationContext = createContext(initialState) + +export { ConfigurationContext } diff --git a/src/configuration/configurationInterface.tsx b/src/configuration/configurationInterface.tsx new file mode 100644 index 000000000..b3989d270 --- /dev/null +++ b/src/configuration/configurationInterface.tsx @@ -0,0 +1,48 @@ +type MeasurementSystem = "Imperial" | "Metric" + +type VerificationStrategy = "Simple" | "Escrow" + +interface Configuration { + appDownloadUrl: string | null + appPackageName: string + cdcGuidanceUrl: string | null + cdcSymptomsUrl: string | null + displayAcceptTermsOfService: boolean + displayAppTransition: boolean + displayCallbackForm: boolean + displayRequestCallbackUrl: boolean + displayCallEmergencyServices: boolean + displayCovidData: boolean + displayCovidDataWebView: boolean + displaySymptomHistory: boolean + displaySelfAssessment: boolean + displayAgeVerification: boolean + enableProductAnalytics: boolean + emergencyPhoneNumber: string + externalCovidDataLink: string | null // link to show external covid data link on main page + externalCovidDataLabel: string // custom label for external covid data, will default to "Covid Data" + externalTravelGuidanceLink: string | null // link to external travel guidence link on main page + findATestCenterUrl: string | null + healthAuthorityAdviceUrl: string + healthAuthorityCovidDataUrl: string | null + healthAuthorityCovidDataWebViewUrl: string | null + healthAuthorityEulaUrl: string | null + healthAuthorityLearnMoreUrl: string + healthAuthorityLegalPrivacyPolicyUrl: string | null + healthAuthorityHealthCheckUrl: string | null + healthAuthorityPrivacyPolicyUrl: string | null + healthAuthorityRequestCallbackNumber: string | null + healthAuthorityVerificationCodeInfoUrl: string | null + includeSymptomOnsetDate: boolean + measurementSystem: MeasurementSystem + minimumAge: string + minimumPhoneDigits: number + quarantineLength: number + regionCodes: string[] + remoteContentUrl: string | null + stateAbbreviation: string | null + supportPhoneNumber: string | null + verificationStrategy: VerificationStrategy +} + +export type { Configuration, VerificationStrategy } diff --git a/src/ConfigurationContext.tsx b/src/configuration/configurationProvider.tsx similarity index 58% rename from src/ConfigurationContext.tsx rename to src/configuration/configurationProvider.tsx index 270402c4c..4696f030d 100644 --- a/src/ConfigurationContext.tsx +++ b/src/configuration/configurationProvider.tsx @@ -1,90 +1,8 @@ -import React, { FunctionComponent, createContext, useContext } from "react" +import React, { FunctionComponent } from "react" import { Platform } from "react-native" import env from "react-native-config" - -type MeasurementSystem = "Imperial" | "Metric" - -export interface Configuration { - appDownloadUrl: string | null - appPackageName: string - cdcGuidanceUrl: string | null - cdcSymptomsUrl: string | null - displayAcceptTermsOfService: boolean - displayAppTransition: boolean - displayCallbackForm: boolean - displayRequestCallbackUrl: boolean - displayCallEmergencyServices: boolean - displayCovidData: boolean - displayCovidDataWebView: boolean - displaySymptomHistory: boolean - displaySelfAssessment: boolean - displayAgeVerification: boolean - enableProductAnalytics: boolean - emergencyPhoneNumber: string - findATestCenterUrl: string | null - healthAuthorityAdviceUrl: string - healthAuthorityCovidDataUrl: string | null - healthAuthorityCovidDataWebViewUrl: string | null - healthAuthorityEulaUrl: string | null - healthAuthorityLearnMoreUrl: string - healthAuthorityLegalPrivacyPolicyUrl: string | null - healthAuthorityHealthCheckUrl: string | null - healthAuthorityPrivacyPolicyUrl: string | null - healthAuthorityRequestCallbackNumber: string | null - healthAuthorityVerificationCodeInfoUrl: string | null - includeSymptomOnsetDate: boolean - measurementSystem: MeasurementSystem - minimumAge: string - minimumPhoneDigits: number - quarantineLength: number - regionCodes: string[] - remoteContentUrl: string | null - stateAbbreviation: string | null - supportPhoneNumber: string | null - verificationStrategy: VerificationStrategy -} - -const initialState: Configuration = { - appDownloadUrl: null, - appPackageName: "", - cdcGuidanceUrl: null, - cdcSymptomsUrl: null, - displayAcceptTermsOfService: false, - displayAppTransition: false, - displayCallbackForm: false, - displayRequestCallbackUrl: false, - displayCallEmergencyServices: false, - displayCovidData: false, - displayCovidDataWebView: false, - displaySymptomHistory: false, - displaySelfAssessment: false, - displayAgeVerification: false, - emergencyPhoneNumber: "", - enableProductAnalytics: false, - findATestCenterUrl: null, - healthAuthorityAdviceUrl: "", - healthAuthorityCovidDataUrl: null, - healthAuthorityCovidDataWebViewUrl: null, - healthAuthorityEulaUrl: null, - healthAuthorityHealthCheckUrl: null, - healthAuthorityLearnMoreUrl: "", - healthAuthorityLegalPrivacyPolicyUrl: "", - healthAuthorityPrivacyPolicyUrl: "", - healthAuthorityRequestCallbackNumber: "", - healthAuthorityVerificationCodeInfoUrl: null, - includeSymptomOnsetDate: false, - measurementSystem: "Imperial" as const, - minimumAge: "18", - minimumPhoneDigits: 0, - regionCodes: [], - remoteContentUrl: null, - quarantineLength: 14, - stateAbbreviation: "", - supportPhoneNumber: null, - verificationStrategy: "Simple", -} - -type VerificationStrategy = "Simple" | "Escrow" +import { VerificationStrategy } from "./configurationInterface" +import { ConfigurationContext } from "./configurationContext" const toVerificationStrategy = (strategy: string): VerificationStrategy => { switch (strategy) { @@ -99,8 +17,6 @@ const toVerificationStrategy = (strategy: string): VerificationStrategy => { const DEFAULT_QUARANTINE_LENGTH = 14 -const ConfigurationContext = createContext(initialState) - const ConfigurationProvider: FunctionComponent = ({ children }) => { const { AUTHORITY_ADVICE_URL: healthAuthorityAdviceUrl, @@ -168,6 +84,12 @@ const ConfigurationProvider: FunctionComponent = ({ children }) => { ? DEFAULT_QUARANTINE_LENGTH : envQuarantineLength + //Added for LA + const externalCovidDataLink = env.EXTERNAL_COVID_DATA_LINK || null + const externalCovidDataLabel = + env.EXTERNAL_COVID_DATA_LABEL || "home.covid_data" + const externalTravelGuidanceLink = env.EXTERNAL_TRAVEL_GUIDENCE_LINK || null + return ( { displayAgeVerification, enableProductAnalytics, emergencyPhoneNumber, + externalCovidDataLabel, + externalCovidDataLink, + externalTravelGuidanceLink, findATestCenterUrl, healthAuthorityAdviceUrl, healthAuthorityCovidDataUrl, @@ -215,12 +140,4 @@ const ConfigurationProvider: FunctionComponent = ({ children }) => { ) } -const useConfigurationContext = (): Configuration => { - const context = useContext(ConfigurationContext) - if (context === undefined) { - throw new Error("ConfigurationContext must be used with a provider") - } - return context -} - -export { ConfigurationContext, ConfigurationProvider, useConfigurationContext } +export { ConfigurationProvider } diff --git a/src/configuration/index.tsx b/src/configuration/index.tsx new file mode 100644 index 000000000..8f878751d --- /dev/null +++ b/src/configuration/index.tsx @@ -0,0 +1,5 @@ +import { ConfigurationContext } from "./configurationContext" +import { ConfigurationProvider } from "./configurationProvider" +import { useConfigurationContext } from "./useConfigurationContext" + +export { ConfigurationContext, ConfigurationProvider, useConfigurationContext } diff --git a/src/configuration/useConfigurationContext.tsx b/src/configuration/useConfigurationContext.tsx new file mode 100644 index 000000000..7a8fa97d5 --- /dev/null +++ b/src/configuration/useConfigurationContext.tsx @@ -0,0 +1,14 @@ +import { useContext } from "react" + +import { Configuration } from "./configurationInterface" +import { ConfigurationContext } from "./configurationContext" + +const useConfigurationContext = (): Configuration => { + const context = useContext(ConfigurationContext) + if (context === undefined) { + throw new Error("ConfigurationContext must be used with a provider") + } + return context +} + +export { useConfigurationContext } diff --git a/src/configuration/useCustomCopy.ts b/src/configuration/useCustomCopy.ts index a7d679bed..ea6e29a52 100644 --- a/src/configuration/useCustomCopy.ts +++ b/src/configuration/useCustomCopy.ts @@ -3,7 +3,7 @@ import { useTranslation } from "react-i18next" import * as Locale from "../locales/locale" import copy from "../../config/copy.json" -import { useConfigurationContext } from "../ConfigurationContext" +import { useConfigurationContext } from "../configuration" import * as API from "./remoteContentAPI" const DEFAULT_LOCALE = "en" diff --git a/src/factories/configurationContext.ts b/src/factories/configurationContext.ts index 80a657a55..31dc0a54b 100644 --- a/src/factories/configurationContext.ts +++ b/src/factories/configurationContext.ts @@ -1,5 +1,5 @@ import { Factory } from "fishery" -import { Configuration } from "../ConfigurationContext" +import { Configuration } from "../configuration/configurationInterface" export default Factory.define(() => ({ appDownloadUrl: "appDownloadUrl", @@ -17,6 +17,9 @@ export default Factory.define(() => ({ displaySelfAssessment: false, displayAgeVerification: false, enableProductAnalytics: false, + externalCovidDataLabel: "home.covid_data", + externalCovidDataLink: null, + externalTravelGuidanceLink: null, emergencyPhoneNumber: "emergencyPhoneNumber", findATestCenterUrl: "findATestCenterUrl", healthAuthorityAdviceUrl: "authorityAdviceUrl", diff --git a/src/locales/en.json b/src/locales/en.json index 49e47c90b..b5c12fa01 100644 --- a/src/locales/en.json +++ b/src/locales/en.json @@ -287,6 +287,8 @@ "complete_healthcheck": "Complete Healthcheck", "could_not_open_link": "Could not open link: {{url}}. Please try to open the url in your phone's browser.", "covid_data": "Covid Data", + "covid_data_specific": "{{label}} COVID Data", + "safe_travel_guidence": "Safe Travel Guidence", "enter_symptoms": "Enter symptoms", "error": { "share_link_failed": "Failed to open link to share" diff --git a/src/modals/AgeVerification.tsx b/src/modals/AgeVerification.tsx index fd64e170a..c0fcd2690 100644 --- a/src/modals/AgeVerification.tsx +++ b/src/modals/AgeVerification.tsx @@ -3,7 +3,7 @@ import { TouchableOpacity, ScrollView, StyleSheet } from "react-native" import { useNavigation } from "@react-navigation/native" import { useTranslation } from "react-i18next" -import { useConfigurationContext } from "../ConfigurationContext" +import { useConfigurationContext } from "../configuration" import { useApplicationInfo } from "../Device/useApplicationInfo" import { useStatusBarEffect } from "../navigation" import { Text } from "../components" diff --git a/src/modals/CovidDataWebView.tsx b/src/modals/CovidDataWebView.tsx index ef63c60f9..e03f4a1a2 100644 --- a/src/modals/CovidDataWebView.tsx +++ b/src/modals/CovidDataWebView.tsx @@ -2,7 +2,7 @@ import React, { FunctionComponent } from "react" import { View, StyleSheet } from "react-native" import WebView from "react-native-webview" -import { useConfigurationContext } from "../ConfigurationContext" +import { useConfigurationContext } from "../configuration" import { useStatusBarEffect } from "../navigation" import { Text } from "../components" diff --git a/src/navigation/MainTabNavigator.tsx b/src/navigation/MainTabNavigator.tsx index ac05c53b3..649b9f779 100644 --- a/src/navigation/MainTabNavigator.tsx +++ b/src/navigation/MainTabNavigator.tsx @@ -12,7 +12,7 @@ import ExposureHistoryStack from "./ExposureHistoryStack" import HomeStack from "./HomeStack" import SymptomHistoryStack from "./SymptomHistoryStack" import SettingsStack from "./SettingsStack" -import { useConfigurationContext } from "../ConfigurationContext" +import { useConfigurationContext } from "../configuration" import { TabRoute, TabRoutes } from "./index" import { TabBarIcons } from "../assets/svgs/TabBarNav" import { Text } from "../components"