1- import 'dart:io' ;
2-
31import 'package:flutter/material.dart' ;
42import 'package:flutter_inappwebview/flutter_inappwebview.dart' ;
53
@@ -16,43 +14,26 @@ class DiscordLoginPage extends StatefulWidget {
1614}
1715
1816class _DiscordLoginPageState extends State <DiscordLoginPage > {
19- InAppWebViewController ? _controller;
17+ late InAppWebViewController _controller;
2018 bool _tokenExtracted = false ;
2119 bool _isLoading = true ;
2220 double _progress = 0.0 ;
2321
2422 Future <void > _extractToken () async {
25- if (! mounted || _tokenExtracted || _controller == null ) return ;
23+ if (! mounted || _tokenExtracted) return ;
2624
27- try {
28- await Future .delayed (const Duration (milliseconds: 1500 ));
25+ await Future .delayed (const Duration (seconds: 2 ));
2926
30- final result = await _controller! .evaluateJavascript (source: '''
27+ try {
28+ final result = await _controller.evaluateJavascript (source: '''
3129 (function() {
32- try {
33- var token = localStorage.getItem('token');
34- if (token) {
35- return token;
36- }
37- // Try alternative storage locations
38- for (var i = 0; i < localStorage.length; i++) {
39- var key = localStorage.key(i);
40- if (key && key.includes('token')) {
41- return localStorage.getItem(key);
42- }
43- }
44- return null;
45- } catch (e) {
46- return null;
47- }
30+ return window.LOCAL_STORAGE.getItem('token');
4831 })()
4932 ''' );
5033
51- if (result != null &&
52- result.toString () != 'null' &&
53- result.toString ().isNotEmpty) {
34+ if (result != null && result != 'null' ) {
5435 _tokenExtracted = true ;
55- final token = result.toString (). trim ().replaceAll ('"' , '' );
36+ final token = result.trim ().replaceAll ('"' , '' );
5637 widget.onTokenExtracted (token);
5738 if (mounted) {
5839 Navigator .of (context).pop ();
@@ -64,35 +45,24 @@ class _DiscordLoginPageState extends State<DiscordLoginPage> {
6445 }
6546
6647 Future <void > _clearDiscordData () async {
67- if (_controller == null ) return ;
68-
69- try {
70- await _controller! .evaluateJavascript (source: '''
71- (function() {
72- try {
73- localStorage.clear();
74- sessionStorage.clear();
75- } catch (e) {
76- console.log('Error clearing storage:', e);
77- }
78- })()
79- ''' );
80- } catch (e) {
81- print ('Error clearing data: $e ' );
82- }
48+ await _controller.evaluateJavascript (source: '''
49+ if (window.location.hostname === 'discord.com') {
50+ window.LOCAL_STORAGE.clear();
51+ window.sessionStorage.clear();
52+ }
53+ ''' );
8354 }
8455
8556 @override
8657 Widget build (BuildContext context) {
87- final isMobile = Platform .isAndroid || Platform .isIOS;
8858 return Scaffold (
8959 backgroundColor: const Color (0xFF313338 ),
9060 body: SafeArea (
9161 child: Column (
9262 children: [
63+ // Custom header
9364 Container (
94- padding: EdgeInsets .fromLTRB (
95- 8 , isMobile ? 12 : kToolbarHeight + 12 , 8 , 12 ),
65+ padding: const EdgeInsets .fromLTRB (8 , kToolbarHeight + 12 , 8 , 12 ),
9666 decoration: BoxDecoration (
9767 color: const Color (0xFF2B2D31 ),
9868 boxShadow: [
@@ -111,14 +81,15 @@ class _DiscordLoginPageState extends State<DiscordLoginPage> {
11181 tooltip: 'Close' ,
11282 ),
11383 const SizedBox (width: 8 ),
84+ // Discord logo icon
11485 Container (
11586 padding: const EdgeInsets .all (8 ),
11687 decoration: BoxDecoration (
11788 color: const Color (0xFF5865F2 ),
11889 borderRadius: BorderRadius .circular (8 ),
11990 ),
12091 child: const Icon (
121- Icons .discord_rounded ,
92+ Icons .discord ,
12293 color: Colors .white,
12394 size: 20 ,
12495 ),
@@ -190,37 +161,26 @@ class _DiscordLoginPageState extends State<DiscordLoginPage> {
190161 supportZoom: false ,
191162 useWideViewPort: true ,
192163 loadWithOverviewMode: true ,
193- allowsInlineMediaPlayback: true ,
194- mediaPlaybackRequiresUserGesture: false ,
195- cacheEnabled: true ,
196- clearCache: false ,
197- limitsNavigationsToAppBoundDomains: false ,
198- thirdPartyCookiesEnabled: true ,
199164 ),
200- onWebViewCreated: (controller) async {
201- _controller = controller;
202- await _clearDiscordData ();
203- },
204165 onLoadStart: (controller, url) async {
166+ await controller.evaluateJavascript (source: '''
167+ try {
168+ window.LOCAL_STORAGE = localStorage;
169+ } catch (e) {}
170+ ''' );
205171 if (mounted) {
206172 setState (() {
207173 _isLoading = true ;
208174 });
209175 }
210176 },
211- onLoadStop: (controller, url) async {
177+ onLoadStop: (controller, url) {
212178 if (mounted) {
213179 setState (() {
214180 _isLoading = false ;
215181 _progress = 1.0 ;
216182 });
217183 }
218-
219- final currentUrl = url.toString ();
220- if (currentUrl.contains ('discord.com/channels' ) ||
221- currentUrl.contains ('discord.com/app' )) {
222- await _extractToken ();
223- }
224184 },
225185 onProgressChanged: (controller, progress) {
226186 if (mounted) {
@@ -229,26 +189,20 @@ class _DiscordLoginPageState extends State<DiscordLoginPage> {
229189 });
230190 }
231191 },
192+ onWebViewCreated: (controller) {
193+ _controller = controller;
194+ _clearDiscordData ();
195+ },
232196 onUpdateVisitedHistory: (controller, url, isReload) async {
233- final urlString = url.toString ();
234- if (urlString.contains ('discord.com/channels' ) ||
235- urlString.contains ('discord.com/app' )) {
197+ if (url.toString () != 'https://discord.com/login' &&
198+ url.toString () != 'about:blank' ) {
236199 await _extractToken ();
237200 }
238201 },
239202 shouldOverrideUrlLoading:
240203 (controller, navigationAction) async {
241204 return NavigationActionPolicy .ALLOW ;
242205 },
243- onConsoleMessage: (controller, consoleMessage) {
244- print ('Console: ${consoleMessage .message }' );
245- },
246- onReceivedError: (controller, request, error) {
247- print ('WebView Error: ${error .description }' );
248- },
249- onReceivedHttpError: (controller, request, errorResponse) {
250- print ('HTTP Error: ${errorResponse .statusCode }' );
251- },
252206 ),
253207 ),
254208 ),
@@ -263,7 +217,6 @@ extension DiscordLoginNavigation on BuildContext {
263217 Future <void > showDiscordLogin (Function (String ) onTokenExtracted) async {
264218 await Navigator .of (this ).push (
265219 MaterialPageRoute (
266- fullscreenDialog: true ,
267220 builder: (context) => DiscordLoginPage (
268221 onTokenExtracted: onTokenExtracted,
269222 ),
0 commit comments