import { useState, useEffect, ChangeEvent, useCallback } from 'react' import { Box, Flex, Label, Select } from 'theme-ui' import Page from 'popup/components/Page' import Checkbox from 'popup/components/CheckBox' import DebouncedInput from 'popup/components/DebouncedInput' import detachDebugger from 'utils/detachDebugger' import countryLocales from 'utils/countryLocales' import configurations from 'utils/configurations' import getIp from 'utils/getIp' import { ipData } from 'types' import { RotateCw } from 'react-feather' interface LocationPageProps { tab: string } const LocationPage = ({ tab }: LocationPageProps) => { const [browserDefault, setBrowserDefault] = useState(true) const [ipData, setIpData] = useState() const [ipInfo, setIpInfo] = useState('loading...') const [timezone, setTimezone] = useState('') const [locale, setLocale] = useState('') const [lat, setLatitude] = useState('') const [lon, setLongitude] = useState('') const [configuration, setConfiguration] = useState('custom') const reloadIp = useCallback(() => { setIpInfo('loading...') getIp() .then((ipDataRes) => { setIpData(ipDataRes) setIpInfo(`${getFlagEmoji(ipDataRes.countryCode)} ${ipDataRes.query}`) }) .catch(() => { setIpInfo('error') }) }, []) useEffect(() => { reloadIp() }, [reloadIp]) useEffect(() => { chrome.storage.local.get( [ 'locationBrowserDefault', 'configuration', 'timezone', 'locale', 'lat', 'lon', ], (storage) => { storage.configuration && setConfiguration(storage.configuration) storage.locationBrowserDefault !== undefined && setBrowserDefault(storage.locationBrowserDefault) if (storage.configuration === 'matchIp' && ipData) { setTimezone(ipData.timezone) setLocale(countryLocales[ipData.countryCode].locale) setLatitude(`${ipData.lat}`) setLongitude(`${ipData.lon}`) chrome.storage.local.set({ timezone: ipData.timezone, locale: countryLocales[ipData.countryCode].locale, lat: ipData.lat, lon: ipData.lon, }) } else { storage.timezone && setTimezone(storage.timezone) storage.locale && setLocale(storage.locale) storage.lat && setLatitude(storage.lat) storage.lon && setLongitude(storage.lon) } } ) }, [ipData]) const changeBrowserDefault = () => { detachDebugger() chrome.storage.local.set({ locationBrowserDefault: !browserDefault, }) setBrowserDefault(!browserDefault) } const changeConfiguration = (e: ChangeEvent) => { detachDebugger() setConfiguration(e.target.value) chrome.storage.local.set({ configuration: e.target.value, }) if (e.target.value === 'matchIp') { if (ipData) { setTimezone(ipData.timezone) setLocale(countryLocales[ipData.countryCode].locale) setLatitude(`${ipData.lat}`) setLongitude(`${ipData.lon}`) chrome.storage.local.set({ timezone: ipData.timezone, locale: countryLocales[ipData.countryCode].locale, lat: ipData.lat, lon: ipData.lon, }) } } else if (e.target.value === 'custom') { setTimezone('') setLocale('') setLatitude('') setLongitude('') chrome.storage.local.set({ timezone: '', locale: '', lat: '', lon: '', }) } else { setTimezone(configurations[e.target.value].timezone) setLocale(configurations[e.target.value].locale) setLatitude(configurations[e.target.value].lat) setLongitude(configurations[e.target.value].lon) chrome.storage.local.set({ timezone: configurations[e.target.value].timezone, locale: configurations[e.target.value].locale, lat: configurations[e.target.value].lat, lon: configurations[e.target.value].lon, }) } } const changeInputText = () => { if (configuration !== 'custom') { setConfiguration('custom') chrome.storage.local.set({ configuration: 'custom', }) } } const getFlagEmoji = (countryCode: string) => { const codePoints = countryCode .toUpperCase() .split('') .map((char) => 127397 + char.charCodeAt(0)) return String.fromCodePoint(...codePoints) } return ( IP Address {ipInfo} { reloadIp() }} /> Vytal does not change your IP address. To change your IP address you will need a VPN or proxy. ) } export default LocationPage