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"