Skip to content

Commit 8204432

Browse files
Merge pull request #37 from VPNclient/feat/vpn-link-selector
Feature: Add VPN link selector
2 parents f381149 + 71e181e commit 8204432

5 files changed

Lines changed: 92 additions & 24 deletions

File tree

ios/Podfile.lock

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,9 +26,9 @@ EXTERNAL SOURCES:
2626

2727
SPEC CHECKSUMS:
2828
Flutter: e0871f40cf51350855a761d2e70bf5af5b9b5de7
29-
flutter_native_splash: df59bb2e1421aa0282cb2e95618af4dcb0c56c29
30-
flutter_v2ray: 21ee520e013877941e2e67b3b48aed9c6870e8dc
31-
shared_preferences_foundation: fcdcbc04712aee1108ac7fda236f363274528f78
29+
flutter_native_splash: c32d145d68aeda5502d5f543ee38c192065986cf
30+
flutter_v2ray: 1190bb389b67a1dc9f28ece1d4b308101e38395e
31+
shared_preferences_foundation: 9e1978ff2562383bd5676f64ec4e9aa8fa06a6f7
3232

3333
PODFILE CHECKSUM: f8e15f817b1bf5846cb6aad560a31cf33c165196
3434

lib/main.dart

Lines changed: 66 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,28 @@
11
import 'package:flutter/material.dart';
2+
import 'package:flutter_localizations/flutter_localizations.dart';
3+
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
24
import 'package:provider/provider.dart';
5+
36
import 'package:vpn_client/pages/apps/apps_page.dart';
47
import 'package:vpn_client/pages/main/main_page.dart';
5-
import 'package:vpn_client/pages/servers/servers_page.dart';
68
import 'package:vpn_client/pages/settings/settings_page.dart';
7-
import 'package:vpn_client/pages/speed/speed_page.dart';
8-
import 'package:vpn_client/providers/vpn_provider.dart';
9+
import 'package:vpn_client/pages/servers/servers_page.dart';
910
import 'package:vpn_client/theme_provider.dart';
11+
import 'package:vpn_client/vpn_state.dart';
1012

1113
import 'design/colors.dart';
1214
import 'nav_bar.dart';
1315

1416
void main() {
15-
runApp(MultiProvider(providers: [ChangeNotifierProvider(create: (_) => ThemeProvider()), ChangeNotifierProvider(create: (_) => VPNProvider())], child: const App()));
17+
runApp(
18+
MultiProvider(
19+
providers: [
20+
ChangeNotifierProvider(create: (_) => ThemeProvider()),
21+
ChangeNotifierProvider(create: (_) => VpnState()),
22+
],
23+
child: const App(),
24+
),
25+
);
1626
}
1727

1828
class App extends StatelessWidget {
@@ -22,13 +32,54 @@ class App extends StatelessWidget {
2232
Widget build(BuildContext context) {
2333
final themeProvider = Provider.of<ThemeProvider>(context);
2434

35+
// If you want to override it manually, do it here (or leave as null to use system):
36+
// final Locale? manualLocale = const Locale('ru'); // ← override example
37+
final Locale? manualLocale = null; // ← use system by default
38+
2539
return MaterialApp(
2640
debugShowCheckedModeBanner: false,
2741
title: 'VPN Client',
2842
theme: lightTheme,
2943
darkTheme: darkTheme,
44+
locale: manualLocale,
45+
localeResolutionCallback: (locale, supportedLocales) {
46+
if (locale == null) return const Locale('en');
47+
48+
// Check for exact match
49+
for (var supportedLocale in supportedLocales) {
50+
if (supportedLocale.languageCode == locale.languageCode &&
51+
(supportedLocale.countryCode == null ||
52+
supportedLocale.countryCode == locale.countryCode)) {
53+
return supportedLocale;
54+
}
55+
}
56+
57+
// If Chinese variants are not supported, fallback to zh
58+
if (locale.languageCode == 'zh') {
59+
return supportedLocales.contains(const Locale('zh'))
60+
? const Locale('zh')
61+
: const Locale('en');
62+
}
63+
64+
// Fallback to 'en' if not found
65+
return const Locale('en');
66+
},
67+
3068
themeMode: themeProvider.themeMode,
3169
home: const MainScreen(),
70+
71+
localizationsDelegates: const [
72+
AppLocalizations.delegate,
73+
GlobalMaterialLocalizations.delegate,
74+
GlobalWidgetsLocalizations.delegate,
75+
GlobalCupertinoLocalizations.delegate,
76+
],
77+
supportedLocales: const [
78+
Locale('en'),
79+
Locale('ru'),
80+
Locale('th'),
81+
Locale('zh'),
82+
],
3283
);
3384
}
3485
}
@@ -51,7 +102,7 @@ class _MainScreenState extends State<MainScreen> {
51102
const AppsPage(),
52103
ServersPage(onNavBarTap: _handleNavBarTap),
53104
const MainPage(),
54-
const SpeedPage(),
105+
const PlaceholderPage(text: 'Speed Page'),
55106
const SettingsPage(),
56107
];
57108
}
@@ -69,8 +120,17 @@ class _MainScreenState extends State<MainScreen> {
69120
bottomNavigationBar: NavBar(
70121
initialIndex: _currentIndex,
71122
onItemTapped: _handleNavBarTap,
72-
selectedColor: Theme.of(context).colorScheme.primary,
73123
),
74124
);
75125
}
76126
}
127+
128+
class PlaceholderPage extends StatelessWidget {
129+
final String text;
130+
const PlaceholderPage({super.key, required this.text});
131+
132+
@override
133+
Widget build(BuildContext context) {
134+
return Center(child: Text(text));
135+
}
136+
}
Lines changed: 22 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,28 @@
11
import 'package:flutter/material.dart';
2+
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
23

3-
class SettingsPage extends StatelessWidget {
4-
const SettingsPage({Key? key}) : super(key: key);
4+
class SettingsPage extends StatefulWidget {
5+
const SettingsPage({super.key});
56

7+
@override
8+
_SettingsPageState createState() => _SettingsPageState();
9+
}
10+
11+
class _SettingsPageState extends State<SettingsPage> {
612
@override
713
Widget build(BuildContext context) {
8-
return const Center(child: Text('Settings Page'));
14+
return Scaffold(
15+
appBar: AppBar(
16+
title: Text(AppLocalizations.of(context)!.app_name),
17+
),
18+
body: Center(
19+
child: ElevatedButton(
20+
child: const Text("Help! Coding flutter requires a lot of work!"),
21+
onPressed: () {
22+
Navigator.pop(context);
23+
},
24+
),
25+
),
26+
);
927
}
10-
}
28+
}

macos/Podfile.lock

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,26 +3,20 @@ PODS:
33
- shared_preferences_foundation (0.0.1):
44
- Flutter
55
- FlutterMacOS
6-
- vpnclient_engine_flutter (0.0.1):
7-
- FlutterMacOS
86

97
DEPENDENCIES:
108
- FlutterMacOS (from `Flutter/ephemeral`)
119
- shared_preferences_foundation (from `Flutter/ephemeral/.symlinks/plugins/shared_preferences_foundation/darwin`)
12-
- vpnclient_engine_flutter (from `Flutter/ephemeral/.symlinks/plugins/vpnclient_engine_flutter/macos`)
1310

1411
EXTERNAL SOURCES:
1512
FlutterMacOS:
1613
:path: Flutter/ephemeral
1714
shared_preferences_foundation:
1815
:path: Flutter/ephemeral/.symlinks/plugins/shared_preferences_foundation/darwin
19-
vpnclient_engine_flutter:
20-
:path: Flutter/ephemeral/.symlinks/plugins/vpnclient_engine_flutter/macos
2116

2217
SPEC CHECKSUMS:
2318
FlutterMacOS: 8f6f14fa908a6fb3fba0cd85dbd81ec4b251fb24
24-
shared_preferences_foundation: fcdcbc04712aee1108ac7fda236f363274528f78
25-
vpnclient_engine_flutter: d018814c86b1c8e99306e2bb838df8dea9fb0971
19+
shared_preferences_foundation: 9e1978ff2562383bd5676f64ec4e9aa8fa06a6f7
2620

2721
PODFILE CHECKSUM: 7eb978b976557c8c1cd717d8185ec483fd090a82
2822

macos/Runner.xcodeproj/project.pbxproj

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -389,14 +389,10 @@
389389
inputFileListPaths = (
390390
"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist",
391391
);
392-
inputPaths = (
393-
);
394392
name = "[CP] Embed Pods Frameworks";
395393
outputFileListPaths = (
396394
"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist",
397395
);
398-
outputPaths = (
399-
);
400396
runOnlyForDeploymentPostprocessing = 0;
401397
shellPath = /bin/sh;
402398
shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n";

0 commit comments

Comments
 (0)