add country whitelist
This commit is contained in:
@@ -0,0 +1,37 @@
|
|||||||
|
import {type CountryCode} from '#/lib/international-telephone-codes'
|
||||||
|
import {IS_DEV} from '#/env'
|
||||||
|
import {useGeolocation} from '#/geolocation'
|
||||||
|
|
||||||
|
const FIND_CONTACTS_FEATURE_COUNTRY_WHITELIST = [
|
||||||
|
'US',
|
||||||
|
'GB',
|
||||||
|
'JP',
|
||||||
|
'CA',
|
||||||
|
'DE',
|
||||||
|
'FR',
|
||||||
|
'ES',
|
||||||
|
'BR',
|
||||||
|
'KR',
|
||||||
|
'NL',
|
||||||
|
'AU',
|
||||||
|
'SE',
|
||||||
|
'IT',
|
||||||
|
] satisfies CountryCode[] as string[]
|
||||||
|
|
||||||
|
export function isFindContactsFeatureEnabled(countryCode: string): boolean {
|
||||||
|
return FIND_CONTACTS_FEATURE_COUNTRY_WHITELIST.includes(
|
||||||
|
countryCode.toUpperCase(),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
export function useIsFindContactsFeatureEnabledBasedOnGeolocation() {
|
||||||
|
const location = useGeolocation()
|
||||||
|
|
||||||
|
if (IS_DEV) return true
|
||||||
|
|
||||||
|
// they can try, by they'll need a phone number
|
||||||
|
// from one of the whitelisted countries
|
||||||
|
if (!location.countryCode) return true
|
||||||
|
|
||||||
|
return isFindContactsFeatureEnabled(location.countryCode)
|
||||||
|
}
|
||||||
@@ -21,6 +21,7 @@ import {InlineLinkText} from '#/components/Link'
|
|||||||
import {Loader} from '#/components/Loader'
|
import {Loader} from '#/components/Loader'
|
||||||
import {Text} from '#/components/Typography'
|
import {Text} from '#/components/Typography'
|
||||||
import {useGeolocation} from '#/geolocation'
|
import {useGeolocation} from '#/geolocation'
|
||||||
|
import {isFindContactsFeatureEnabled} from '../country-whitelist'
|
||||||
import {
|
import {
|
||||||
getCountryCodeFromPastedNumber,
|
getCountryCodeFromPastedNumber,
|
||||||
processPhoneNumber,
|
processPhoneNumber,
|
||||||
@@ -87,7 +88,10 @@ export function PhoneInput({
|
|||||||
},
|
},
|
||||||
})
|
})
|
||||||
|
|
||||||
|
const isFeatureEnabled = isFindContactsFeatureEnabled(countryCode)
|
||||||
|
|
||||||
const onSubmitNumber = () => {
|
const onSubmitNumber = () => {
|
||||||
|
if (!isFeatureEnabled) return
|
||||||
const result = processPhoneNumber(phoneNumber, countryCode)
|
const result = processPhoneNumber(phoneNumber, countryCode)
|
||||||
if (result.valid) {
|
if (result.valid) {
|
||||||
setPhoneNumber(result.formatted)
|
setPhoneNumber(result.formatted)
|
||||||
@@ -150,7 +154,7 @@ export function PhoneInput({
|
|||||||
/>
|
/>
|
||||||
</View>
|
</View>
|
||||||
<View style={[a.flex_1]}>
|
<View style={[a.flex_1]}>
|
||||||
<TextField.Root isInvalid={!!formatError}>
|
<TextField.Root isInvalid={!!formatError || !isFeatureEnabled}>
|
||||||
<TextField.Input
|
<TextField.Input
|
||||||
label={_(msg`Phone number`)}
|
label={_(msg`Phone number`)}
|
||||||
value={phoneNumber}
|
value={phoneNumber}
|
||||||
@@ -179,6 +183,14 @@ export function PhoneInput({
|
|||||||
</View>
|
</View>
|
||||||
</View>
|
</View>
|
||||||
|
|
||||||
|
{!isFeatureEnabled && (
|
||||||
|
<ErrorText>
|
||||||
|
<Trans>
|
||||||
|
Support for this feature in your country has not been enabled yet!
|
||||||
|
Please check back later.
|
||||||
|
</Trans>
|
||||||
|
</ErrorText>
|
||||||
|
)}
|
||||||
{error && <ErrorText>{error}</ErrorText>}
|
{error && <ErrorText>{error}</ErrorText>}
|
||||||
{formatError && <ErrorText>{formatError}</ErrorText>}
|
{formatError && <ErrorText>{formatError}</ErrorText>}
|
||||||
|
|
||||||
@@ -248,7 +260,7 @@ function LegalDisclaimer() {
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
function ErrorText({children}: {children: string}) {
|
function ErrorText({children}: {children: React.ReactNode}) {
|
||||||
const t = useTheme()
|
const t = useTheme()
|
||||||
return (
|
return (
|
||||||
<Text
|
<Text
|
||||||
|
|||||||
@@ -37,6 +37,7 @@ import {atoms as a, platform, tokens, useBreakpoints, useTheme} from '#/alf'
|
|||||||
import {AgeAssuranceDismissibleNotice} from '#/components/ageAssurance/AgeAssuranceDismissibleNotice'
|
import {AgeAssuranceDismissibleNotice} from '#/components/ageAssurance/AgeAssuranceDismissibleNotice'
|
||||||
import {AvatarStackWithFetch} from '#/components/AvatarStack'
|
import {AvatarStackWithFetch} from '#/components/AvatarStack'
|
||||||
import {Button, ButtonText} from '#/components/Button'
|
import {Button, ButtonText} from '#/components/Button'
|
||||||
|
import {useIsFindContactsFeatureEnabledBasedOnGeolocation} from '#/components/contacts/country-whitelist'
|
||||||
import {useDialogControl} from '#/components/Dialog'
|
import {useDialogControl} from '#/components/Dialog'
|
||||||
import {SwitchAccountDialog} from '#/components/dialogs/SwitchAccount'
|
import {SwitchAccountDialog} from '#/components/dialogs/SwitchAccount'
|
||||||
import {Accessibility_Stroke2_Corner2_Rounded as AccessibilityIcon} from '#/components/icons/Accessibility'
|
import {Accessibility_Stroke2_Corner2_Rounded as AccessibilityIcon} from '#/components/icons/Accessibility'
|
||||||
@@ -90,6 +91,8 @@ export function SettingsScreen({}: Props) {
|
|||||||
const {pendingDid, onPressSwitchAccount} = useAccountSwitcher()
|
const {pendingDid, onPressSwitchAccount} = useAccountSwitcher()
|
||||||
const [showAccounts, setShowAccounts] = useState(false)
|
const [showAccounts, setShowAccounts] = useState(false)
|
||||||
const [showDevOptions, setShowDevOptions] = useState(false)
|
const [showDevOptions, setShowDevOptions] = useState(false)
|
||||||
|
const findContactsEnabled =
|
||||||
|
useIsFindContactsFeatureEnabledBasedOnGeolocation()
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Layout.Screen>
|
<Layout.Screen>
|
||||||
@@ -208,7 +211,7 @@ export function SettingsScreen({}: Props) {
|
|||||||
<Trans>Content and media</Trans>
|
<Trans>Content and media</Trans>
|
||||||
</SettingsList.ItemText>
|
</SettingsList.ItemText>
|
||||||
</SettingsList.LinkItem>
|
</SettingsList.LinkItem>
|
||||||
{isNative && (
|
{isNative && findContactsEnabled && (
|
||||||
<SettingsList.LinkItem
|
<SettingsList.LinkItem
|
||||||
to="/settings/find-contacts"
|
to="/settings/find-contacts"
|
||||||
label={_(msg`Find contacts`)}>
|
label={_(msg`Find contacts`)}>
|
||||||
|
|||||||
Reference in New Issue
Block a user