From a1a67bc2da33f734c0abd79385de437f508b5e51 Mon Sep 17 00:00:00 2001 From: Hiddify Date: Thu, 22 Feb 2024 09:46:43 +0100 Subject: [PATCH] new: use timezone for location detector --- lib/features/intro/widget/intro_page.dart | 43 +++++++++++++++++------ 1 file changed, 32 insertions(+), 11 deletions(-) diff --git a/lib/features/intro/widget/intro_page.dart b/lib/features/intro/widget/intro_page.dart index 2cc23879..7b3bd359 100644 --- a/lib/features/intro/widget/intro_page.dart +++ b/lib/features/intro/widget/intro_page.dart @@ -1,5 +1,6 @@ import 'dart:convert'; import 'package:flutter/gestures.dart'; +import 'package:timezone_to_country/timezone_to_country.dart'; import 'package:flutter/material.dart'; import 'package:flutter_hooks/flutter_hooks.dart'; @@ -117,28 +118,48 @@ class IntroPage extends HookConsumerWidget with PresLogger { } Future autoSelectRegion(WidgetRef ref) async { - final response = await http.get(Uri.parse('https://ipapi.co/json/')); - - if (response.statusCode == 200) { - final jsonData = jsonDecode(response.body); - final regionLocale = - _getRegionLocale(jsonData['country']?.toString() ?? ""); - + try { + final countryCode = await TimeZoneToCountry.getLocalCountryCode(); + final regionLocale = _getRegionLocale(countryCode); loggy.debug( - 'Region: ${regionLocale.region} Locale: ${regionLocale.locale}',); + 'Timezone Region: ${regionLocale.region} Locale: ${regionLocale.locale}', + ); await ref .read(regionNotifierProvider.notifier) .update(regionLocale.region); await ref .read(localePreferencesProvider.notifier) .changeLocale(regionLocale.locale); - } else { - loggy.warning('Request failed with status: ${response.statusCode}'); + } catch (e) { + loggy.warning('Could not get the local country code based on timezone'); + } + try { + final response = await http.get(Uri.parse('https://api.ip.sb/json/')); + + if (response.statusCode == 200) { + final jsonData = jsonDecode(response.body); + final regionLocale = + _getRegionLocale(jsonData['country']?.toString() ?? ""); + + loggy.debug( + 'Region: ${regionLocale.region} Locale: ${regionLocale.locale}', + ); + await ref + .read(regionNotifierProvider.notifier) + .update(regionLocale.region); + await ref + .read(localePreferencesProvider.notifier) + .changeLocale(regionLocale.locale); + } else { + loggy.warning('Request failed with status: ${response.statusCode}'); + } + } catch (e) { + loggy.warning('Could not get the local country code from ip'); } } RegionLocale _getRegionLocale(String country) { - switch (country) { + switch (country.toUpperCase()) { case "IR": return RegionLocale(Region.ir, AppLocale.fa); case "CN":