JumpButton(BuildContext context) async {
// FocusNode textFieldFocusNode = FocusNode();
- AugmentClasses.disableIframePointerEvents();
+ // AugmentClasses.disableIframePointerEvents();
await showDialog(
barrierDismissible: true,
// barrierColor: Colors.yellow,
@@ -439,7 +604,7 @@ class AugmentClasses {
],
),
).then((_) {
- AugmentClasses.enableIframePointerEvents();
+ // AugmentClasses.enableIframePointerEvents();
});
}
@@ -449,7 +614,7 @@ class AugmentClasses {
bool blankLines = false;
bool numbering = false;
bool statementSignatures = false;
- AugmentClasses.disableIframePointerEvents();
+ // AugmentClasses.disableIframePointerEvents();
await showDialog(
context: context,
builder: (context) => Container(
@@ -560,7 +725,7 @@ class AugmentClasses {
ElevatedButton(onPressed: () {}, child: Text('OK')),
ElevatedButton(
onPressed: () {
- AugmentClasses.disableIframePointerEvents();
+ // AugmentClasses.disableIframePointerEvents();
Navigator.of(context).pop();
},
child: Text('Cancel')),
@@ -574,7 +739,7 @@ class AugmentClasses {
),
),
)).then((_) {
- AugmentClasses.enableIframePointerEvents(); // may be useless?
+ // AugmentClasses.enableIframePointerEvents(); // may be useless?
});
}
@@ -584,7 +749,7 @@ class AugmentClasses {
//idea is to search in file, extract the tags that contain these
//words and highlight, then when zoom, you just jump to that paragraph
- AugmentClasses.disableIframePointerEvents();
+ // AugmentClasses.disableIframePointerEvents();
await showDialog(
context: context,
builder: (context) => Container(
@@ -612,22 +777,27 @@ class AugmentClasses {
)))));
}
- static void disableIframePointerEvents() {
- //pretty sure these dont work
- final iframes = html.document.getElementsByTagName('iframe');
- for (var iframe in iframes) {
- if (iframe is html.Element) {
- iframe.style.pointerEvents = 'none'; // Disable pointer events
- }
- }
- }
+ // static void disableIframePointerEvents() {
+ // //pretty sure these dont work
+ // // final iframes = html.document.getElementsByTagName('iframe');
+ // final iframes = web.document.getElementsByTagName('iframe');
+ // for (var iframe in iframes) {
+ // // if (iframe is html.Element) {
+ // // iframe.style.pointerEvents = 'none'; // Disable pointer events
+ // if (iframe is web.Element) {
+ // iframe.
+ // }
+ // }
+ // }
- static void enableIframePointerEvents() {
- final iframes = html.document.getElementsByTagName('iframe');
- for (var iframe in iframes) {
- if (iframe is html.Element) {
- iframe.style.pointerEvents = 'auto'; // Re-enable pointer events
- }
- }
- }
+ // static void enableIframePointerEvents() {
+ // // final iframes = html.document.getElementsByTagName('iframe');
+ // final iframes = html.document.getElementsByTagName('iframe');
+
+ // for (var iframe in iframes) {
+ // if (iframe is html.Element) {
+ // iframe.style.pointerEvents = 'auto'; // Re-enable pointer events
+ // }
+ // }
+ // }
}
diff --git a/lib/collapsableEmails.dart b/lib/collapsableEmails.dart
new file mode 100644
index 0000000..ceed92a
--- /dev/null
+++ b/lib/collapsableEmails.dart
@@ -0,0 +1,132 @@
+import 'dart:js_interop';
+import 'package:web/web.dart' as web;
+import 'package:flutter/material.dart';
+import 'dart:ui_web' as ui;
+import 'api_service.dart';
+import 'structs.dart';
+
+class CollapsableEmails extends StatefulWidget {
+ final List thread; // email id's in the form xyz@gmail.com
+ final List threadHTML;
+ final String threadIDs;
+
+ CollapsableEmails(
+ {required this.thread,
+ required this.threadHTML,
+ required this.threadIDs});
+
+ @override
+ State createState() => _CollapsableEmailsState();
+}
+
+class _CollapsableEmailsState extends State {
+ List emailsHTML = []; //html of the emails in the thread
+ // build attachments with the forldar name and id
+ Set _expandedEmails = {}; //open emails
+ List viewtypeIDs = []; //IDs of the viewtypes, order matters
+ List heightOfViewTypes = []; //the height of each viewtype
+ List emailsInThread = [];
+ bool _isLoaded = false;
+
+ @override
+ void initState() {
+ // TODO: implement initState
+ super.initState();
+ _registerViewFactory(widget.threadHTML);
+ _serializableData(widget.threadIDs);
+ }
+
+ void _registerViewFactory(List currentContent) async {
+ // setState(() { //update to do item per item
+ // each item to have itsviewtype ID
+ // is this necessarey here??
+
+ //could just move to collapsable
+
+ for (var emailHTML in widget.threadHTML) {
+ String viewTypeId = 'email-${DateTime.now().millisecondsSinceEpoch}';
+
+ final ghost = web.document.createElement('div') as web.HTMLDivElement
+ ..style.visibility = 'hidden'
+ ..style.position = 'absolute'
+ ..style.width = '100%'
+ ..style.overflow = 'auto'
+ ..innerHTML = emailHTML
+ .toJS; // temporarily index because it has to do all of them
+ web.document.body?.append(ghost);
+ await Future.delayed(Duration(milliseconds: 10));
+
+ final heightOfEmail = ghost.scrollHeight;
+ ghost.remove();
+
+ final HTMLsnippet = web.document.createElement('div')
+ as web.HTMLDivElement
+ ..id = viewTypeId
+ ..innerHTML = emailHTML
+ .toJS; // temporarily index because it has to do all of them
+ HTMLsnippet.style
+ ..width = '100%'
+ ..height = '${heightOfEmail}px'
+ ..overflow = 'auto'
+ ..scrollBehavior = 'smooth';
+
+ ui.platformViewRegistry.registerViewFactory(
+ viewTypeId,
+ (int viewId) => HTMLsnippet,
+ );
+ viewtypeIDs.add(viewTypeId);
+ heightOfViewTypes.add(heightOfEmail);
+ }
+ }
+
+ void _serializableData(String threadID) async {
+ emailsInThread = await ApiService().threadsInSerializable(threadID);
+ print("done thread serializable");
+ if (!mounted) return;
+ setState(() {
+ _isLoaded = true;
+ });
+ }
+
+ @override
+ Widget build(BuildContext context) {
+ return _isLoaded
+ ?Column(children: [
+ Expanded(
+ child: ListView.builder(
+ itemCount: widget.thread.length,
+ itemBuilder: (context, index) {
+ final isExpanded =
+ _expandedEmails.contains(index); //check if email is expanded
+ return Column(
+ children: [
+ ListTile(
+ title: Text(emailsInThread[index].from),
+ trailing: Text(emailsInThread[index].date),
+ onTap: () {
+ setState(() {
+ if (isExpanded) {
+ _expandedEmails.remove(index);
+ } else {
+ _expandedEmails.add(index);
+ }
+ });
+ },
+ ),
+ if (isExpanded)
+ // if(viewtypeIDs[index] == null || heightOfViewTypes[index] == null)
+ // const SizedBox(height: 100, child: Center(child: CircularProgressIndicator())),
+ SizedBox(
+ height: heightOfViewTypes[index].toDouble(),
+ child: HtmlElementView(
+ key: UniqueKey(), viewType: viewtypeIDs[index]),
+ ),
+ Divider(),
+ ],
+ );
+ },
+ ),
+ )
+ ]): const Center(child:CircularProgressIndicator());
+ }
+}
diff --git a/lib/email.dart b/lib/email.dart
index e289526..5dbf1a6 100644
--- a/lib/email.dart
+++ b/lib/email.dart
@@ -1,136 +1,148 @@
-import 'package:flutter/material.dart';
-import 'api_service.dart';
-import 'structs.dart';
-
-class EmailListScreen extends StatelessWidget {
- final List emails;
- final Future Function(List, String) getEmailContent;
- final String folder;
-
-
- EmailListScreen({required this.emails, required this.getEmailContent, required this.folder});
-//fix the email list
- @override
- Widget build(BuildContext context) {
- return Scaffold(
- body: ListView.separated(
- itemCount: emails.length,
- itemBuilder: (context, index) {
- final email = emails[index];
- return ListTile(
- title: Text(email.from_name,
- style: TextStyle(fontWeight: FontWeight.bold)),
- subtitle: Column(
- crossAxisAlignment: CrossAxisAlignment.start,
- children: [Text(email.subject)],
- ),
- trailing: Text(email.date.toString()),
- onTap: () async {
- String emailContent = await getEmailContent(email.messages, folder);
- Navigator.push(
- context,
- MaterialPageRoute(
- builder: (context) => EmailView(
- emailContent: emailContent,
- from: email.from_address,
- name: email.from_name,
- to: email.to.toString(),
- subject: email.subject,
- date: email.date.toString(),
- id: email.id.toString(),
- ),
- ),
- );
- },
- );
- },
- separatorBuilder: (context, index) => Divider(),
- ),
- );
- }
-}
-
-// ignore: must_be_immutable
-class EmailPage extends StatefulWidget {
- EmailPage({Key? key}) : super(key: key);
- String selectedFolder = "INBOX"; //starter
- int offset = 0;
- int page = 1;
-
- @override
- EmailPageState createState() => EmailPageState();
-}
-
-class EmailPageState extends State {
- final ApiService apiService = ApiService();
- List emails = [];
- int page = 1;
- bool isBackDisabled = false;
-
- @override
- void initState() {
- super.initState();
- widget.page = page;
- isBackDisabled = true;
- }
-
- void updateSelectedFolder(String folder) {
- setState(() {
- widget.selectedFolder = folder;
- });
- print(folder);
- _fetchEmails();
- }
-
- String getPage() {
- return widget.page.toString();
- }
-
- void updatePagenation(String option) {
- if (option == "next") {
- setState(() {
- widget.offset += 50;
- widget.page += 1;
- isBackDisabled = false;
- });
- } else if (option == "back") {
- setState(() {
- widget.offset -= 50;
- widget.page -= 1;
- if (widget.page == 1) {
- isBackDisabled = true;
- print("back dis");
- }
- });
- }
- // print(currentPage);
- _fetchEmails();
- }
-
- void _fetchEmails() async {
- // print(selectedFolder)
- try {
- List fetchedEmails = await apiService
- .fetchEmailsFromFolder(widget.selectedFolder, widget.offset);
- if (!mounted) return;
-
- setState(() {
- emails = fetchedEmails; // Update the list of emails
- });
- } catch (e) {
- print('Error fetching emails: $e');
- }
- }
-
- @override
- Widget build(BuildContext context) {
- _fetchEmails();
- return Scaffold(
- body: EmailListScreen(
- emails: emails,
- getEmailContent: apiService.fetchEmailContent,
- folder: widget.selectedFolder,//try to grab from it directly
- ),
- );
- }
-}
+import 'package:flutter/material.dart';
+import 'package:flutter/widgets.dart';
+import 'api_service.dart';
+import 'structs.dart';
+
+class EmailListScreen extends StatelessWidget {
+ final List emails;
+ final Future> Function(List, String) getEmailContent;
+ final String folder;
+
+ EmailListScreen(
+ {required this.emails,
+ required this.getEmailContent,
+ required this.folder});
+//fix the email list
+ @override
+ Widget build(BuildContext context) {
+ return Scaffold(
+ body: ListView.separated(
+ itemCount: emails.length,
+ itemBuilder: (context, index) {
+ final email = emails[index];
+ return ListTile(
+ title: Text(email.from_name,
+ style: TextStyle(fontWeight: FontWeight.bold)),
+ subtitle: Column(
+ crossAxisAlignment: CrossAxisAlignment.start,
+ children: [Text(email.subject)],
+ ),
+ trailing: Text(email.date.toString()),
+ onTap: () async {
+ List emailContent = // list of the html
+ await getEmailContent(email.messages, folder);
+ // print("this is what email.messages look like in email.dart ${email.messages}");
+ // List emailIds = email.messages;
+
+ print(email.messages); //email ids of the thread
+ Navigator.push(
+ context,
+ MaterialPageRoute(
+ // could call collapsable and inside collable each calls email view?
+ builder: (context) => EmailView(
+ emailContent: emailContent,
+ from: email.from_address,
+ name: email.from_name,
+ to: email.to.toString(),
+ subject: email.subject,
+ date: email.date.toString(),
+ id: email.id.toString(), //i think this is thread id?
+ messages: email.messages,
+ ),
+ ),
+ );
+ },
+ );
+ },
+ separatorBuilder: (context, index) => Divider(),
+ ),
+ );
+ }
+}
+
+// ignore: must_be_immutable
+class EmailPage extends StatefulWidget {
+ EmailPage({Key? key}) : super(key: key);
+ String selectedFolder = "INBOX"; //starter
+ int offset = 0;
+ int page = 1;
+
+ @override
+ EmailPageState createState() => EmailPageState();
+}
+
+class EmailPageState extends State {
+ final ApiService apiService = ApiService();
+ List emails = [];
+ ValueNotifier currentPageNotifier = ValueNotifier(1);
+ int page = 1;
+ bool isBackDisabled = false;
+
+ @override
+ void initState() {
+ super.initState();
+ widget.page = page;
+ isBackDisabled = true;
+ _fetchEmails();
+ }
+
+ String getPage() => widget.page.toString();
+ bool get backDisabled => isBackDisabled;
+
+ void updateSelectedFolder(String folder) {
+ setState(() {
+ widget.selectedFolder = folder;
+ });
+ print(folder);
+ _fetchEmails();
+ }
+
+ void updatePagenation(String option) {
+ if (option == "next") {
+ setState(() {
+ widget.offset += 50;
+ widget.page += 1;
+ currentPageNotifier.value = widget.page;
+ isBackDisabled = false;
+ });
+ } else if (option == "back") {
+ setState(() {
+ widget.offset -= 50;
+ widget.page -= 1;
+ currentPageNotifier.value = widget.page;
+ if (widget.page == 1) {
+ isBackDisabled = true;
+ print("back disabled");
+ }
+ });
+ }
+ // print(currentPage);
+ print(widget.page);
+ _fetchEmails();
+ }
+
+ void _fetchEmails() async {
+ try {
+ List fetchedEmails = await apiService
+ .fetchEmailsFromFolder(widget.selectedFolder, widget.offset);
+ if (!mounted) return;
+
+ setState(() {
+ emails = fetchedEmails; // Update the list of emails
+ });
+ } catch (e) {
+ print('Error fetching emails: $e');
+ }
+ }
+
+ @override
+ Widget build(BuildContext context) {
+ return Scaffold(
+ body: EmailListScreen(
+ emails: emails,
+ getEmailContent: apiService.fetchEmailContent,
+ folder: widget.selectedFolder, //try to grab from it directly
+ ),
+ );
+ }
+}
diff --git a/lib/folder_drawer.dart b/lib/folder_drawer.dart
index 62b0a42..2743fe3 100644
--- a/lib/folder_drawer.dart
+++ b/lib/folder_drawer.dart
@@ -16,6 +16,7 @@ class FolderDrawer extends StatefulWidget {
class _FolderDrawerState extends State {
List folders = [];
+ final TextEditingController _renameController = TextEditingController();
@override
void initState() {
@@ -48,7 +49,7 @@ class _FolderDrawerState extends State {
icon: Icon(Icons.more_vert),
onPressed: () => {
///show options
- _showOptions(context)
+ _showOptions(context, folder)
},
),
onTap: () {
@@ -65,7 +66,7 @@ class _FolderDrawerState extends State {
showDialog(
context: context,
builder: (BuildContext context) {
- return NewMailbox(apiService: widget.apiService);
+ return NewMailbox(apiService: widget.apiService);
},
);
// Navigator.of(context).pop();
@@ -76,46 +77,114 @@ class _FolderDrawerState extends State {
title: Text('Refresh Folders'),
onTap: () {
_fetchFolders(); // Refresh folders when this tile is tapped
- Navigator.pop(context); // Close the drawer after refresh
+ // rebuild
+
+ // Navigator.pop(context); // Close the drawer after refresh
},
),
],
),
);
}
- void _showOptions(BuildContext context) async {
- final RenderBox overlay = Overlay.of(context).context.findRenderObject() as RenderBox;
-
- await showMenu(
- context: context,
- position: RelativeRect.fromLTRB(100, 100, overlay.size.width, overlay.size.height),
- items: >[
- PopupMenuItem(
- value: 'Rename',
- child: Text('Rename Folder'),
- ),
- PopupMenuItem(
- value: 'Delete',
- child: Text('Delete Folder'),
- ),
- ],
- ).then((value) {
- // Handle the action based on the selected menu item
- if (value == 'Rename') {
- // Logic for renaming the folder
- print('Rename folder');
- } else if (value == 'Delete') {
- // Logic for deleting the folder
- print('Delete folder');
- }
- });
-}
+ Future _renameDialog(String oldFolder) async {
+ showDialog(
+ context: context,
+ builder: (BuildContext context) {
+ return AlertDialog(
+ title: Text("Rename Mailbox"),
+ content: TextField(
+ controller: _renameController,
+ decoration: const InputDecoration(
+ hintText: "New Name",
+ ),
+ ),
+ actions: [
+ TextButton(
+ onPressed: () {
+ String newfolderName = _renameController.text;
+ if (newfolderName.isNotEmpty) {
+ //make an and to make sure there's two folders with the same name
+ ApiService().renameFolder(oldFolder, newfolderName);
+ }
+ Navigator.of(context).pop();
+ },
+ child: const Text("Rename"),
+ ),
+ TextButton(
+ onPressed: () {
+ Navigator.of(context).pop();
+ },
+ child: const Text("Cancel"),
+ )
+ ],
+ );
+ });
+
+ return false;
+ }
+
+ Future doubleCheckDelete(String folderTobeDeleted) async {
+ return showDialog(
+ context: context,
+ barrierDismissible: false,
+ builder: (BuildContext context) {
+ return AlertDialog(
+ title: Text("Confirm delete of: $folderTobeDeleted"),
+ actions: [
+ TextButton(
+ onPressed: () {
+ ApiService().deleteFolder(folderTobeDeleted);
+ Navigator.of(context).pop();
+ },
+ child: Text("Yes")),
+ TextButton(
+ onPressed: () {
+ Navigator.of(context).pop();
+ },
+ child: Text("No")),
+ ],
+ );
+ });
+ }
+
+ void _showOptions(BuildContext context, String folderName) async {
+ final RenderBox overlay =
+ Overlay.of(context).context.findRenderObject() as RenderBox;
+ print(folderName);
+ await showMenu(
+ context: context,
+ position: RelativeRect.fromLTRB(
+ 100, 100, overlay.size.width, overlay.size.height),
+ items: >[
+ PopupMenuItem(
+ value: 'Rename',
+ child: Text('Rename Folder'),
+ ),
+ PopupMenuItem(
+ value: 'Delete',
+ child: Text('Delete Folder'),
+ ),
+ ],
+ ).then((value) {
+ // Handle the action based on the selected menu item
+ if (value == 'Rename') {
+ // Logic for renaming the folder
+ print('Rename folder $folderName');
+ _renameDialog(folderName);
+ } else if (value == 'Delete') {
+ // Logic for deleting the folder
+ print("Deleting $folderName");
+ doubleCheckDelete(folderName);
+ // ApiService().deleteFolder(folderName);
+ print('Deleted folder');
+ }
+ });
+ }
}
class NewMailbox extends StatelessWidget {
final ApiService apiService;
- // final Function(String) onFolderCreated;
final TextEditingController _textFieldController = TextEditingController();
NewMailbox({required this.apiService});
@@ -127,7 +196,7 @@ class NewMailbox extends StatelessWidget {
content: TextField(
controller: _textFieldController,
decoration: const InputDecoration(
- hintText: "EPIC FOLDER", // Your custom hint text here
+ hintText: "New Folder",
),
),
actions: [
@@ -138,13 +207,17 @@ class NewMailbox extends StatelessWidget {
if (folderName.isNotEmpty) {
apiService.createFolder(folderName);
- // onFolderCreated(folderName);
}
- // apiService.createFolder(_textFieldController.text);
Navigator.of(context).pop();
},
child: const Text("Approve"),
),
+ TextButton(
+ onPressed: () {
+ Navigator.of(context).pop();
+ },
+ child: const Text("Cancel"),
+ )
],
);
}
diff --git a/lib/home_page.dart b/lib/home_page.dart
index 5badb9f..b4878b0 100644
--- a/lib/home_page.dart
+++ b/lib/home_page.dart
@@ -1,440 +1,465 @@
-import 'folder_drawer.dart';
-import 'structs.dart';
-import 'package:flutter/widgets.dart';
-import 'api_service.dart';
-import 'package:flutter/material.dart';
-import 'email.dart';
-// import 'package:shared_preferences/shared_preferences.dart';
-// import 'serialize.dart';
-
-class HomeScreen extends StatefulWidget {
- @override
- _HomeScreenState createState() => _HomeScreenState();
-}
-
-class _HomeScreenState extends State with TickerProviderStateMixin {
- final GlobalKey _scaffoldKey = GlobalKey();
- final GlobalKey _emailPageKey = GlobalKey();
- ApiService apiService = ApiService();
- bool _isSidebarOpen = true;
- bool querySearches = false;
- String? _selectedOption = "INBOX";
-
- List _tabs = ['Emails'];
- Map _tabWidgets = {};
- TabController? _tabController;
-
- @override
- void initState() {
- super.initState();
- _tabController = TabController(length: _tabs.length, vsync: this);
- _tabWidgets['Emails'] = EmailPage(
- key: _emailPageKey,
- );
- }
-
- // Add a new tab based on the search
- void _performSearch(String query, String? list) {
- setState(() {
- if (!_tabs.contains(query)) {
- _tabs.add(query);
- _tabWidgets[query] = _buildSearchResultsWidget(
- query, list); // Store a different widget for this tab
- _tabController = TabController(length: _tabs.length, vsync: this);
- }
- });
- }
-
- void _showOptionsSearchDialog () async {
- List folders = await apiService.fetchFolders();
-
- if (mounted) {
- showDialog(
- context: context,
- builder: (BuildContext context) {
- return AlertDialog(
- title: Text('Choose an Option'),
- content: Column(
- mainAxisSize: MainAxisSize.min,
- children: folders.map((option) {
- return ListTile(
- title: Text(option),
- leading: Radio(
- value: option,
- groupValue: _selectedOption, // Bind with _selectedOption
- onChanged: (String? value) {
- setState(() {
- _selectedOption = value;
- });
- Navigator.of(context).pop(); // Close the dialog on selection
- },
- ),
- );
- }).toList(),
- ),
- actions: [
- ElevatedButton(
- child: Text('Submit'),
- onPressed: () {
- Navigator.of(context).pop(); // Close the dialog
- ScaffoldMessenger.of(context).showSnackBar(SnackBar(
- content: Text('You selected: $_selectedOption'),
- ));
- },
- ),
- ],
- );
- },
- );}
- }
-
-
- // Remove a tab
- void _removeTab(int index) {
- if (_tabs[index] != 'Emails') {
- setState(() {
- String tabToRemove = _tabs[index];
- _tabs.removeAt(index);
- _tabWidgets
- .remove(tabToRemove); // Remove widget associated with the tab
- _tabController = TabController(length: _tabs.length, vsync: this);
- });
- }
- }
-
- // Build a custom widget for each search query
- Widget _buildSearchResultsWidget(String query, String? list) {
- return FutureBuilder>(
- future: apiService.sonicSearch(list ?? "INBOX", 50, 0, query),
- builder: (BuildContext context,
- AsyncSnapshot> snapshot) {
- if (snapshot.connectionState == ConnectionState.waiting) {
- return Center(child: CircularProgressIndicator());
- } else if (snapshot.hasError) {
- return Center(child: Text('Error: ${snapshot.error}'));
- } else if (!snapshot.hasData || snapshot.data!.isEmpty) {
- return Center(child: Text('No results found for: $query'));
- } else {
- List result = snapshot.data!;
- return Scaffold(
- body: ListView.separated(
- itemCount: result.length,
- itemBuilder: (context, index) {
- final SerializableMessage email = result[index];
- return ListTile(
- title: Text(email.from,
- style: TextStyle(fontWeight: FontWeight.bold)),
- subtitle: Column(
- crossAxisAlignment: CrossAxisAlignment.start,
- children: [Text(email.subject)],
- ),
- trailing: Text(email.date.toString()),
- onTap: () async {
- // print('tapped');
- String emailContent =
- await apiService.fetchEmailContent([email.id], email.list);
- // print('content below');
- // print(emailContent);
- Navigator.push(
- context,
- MaterialPageRoute(
- builder: (context) => EmailView(
- emailContent: emailContent,
- from: email.from,
- name: email.name,
- to: email.to.toString(),
- subject: email.subject,
- date: email.date.toString(),
- id: email.id.toString(),
- ),
- ),
- );
- },
- );
- },
- separatorBuilder: (context, index) => Divider(),
- ),
- // child: Column(
- // mainAxisAlignment: MainAxisAlignment.center,
- // children: [
- // Text("Results for: $query", style: TextStyle(fontSize: 24)),
- // // Display the actual data
- // Text(result[0].name), // Accessing the first result safely
- // Text(result[0].from), // Displaying the 'from' field as an example
- // Text(result[0].hash),
- // Text(result[0].subject),
- // Text(result[0].uid.toString()),
- // Text(result[0].list),
- // Text(result[0].id),
-
- // // Add more fields or customize the display
- // // SerializableEmailListScreen(emails: result, getEmailContent: getEmailContent)
- // // Expanded(
-
- // // child:
- // // ),
- // ],
- );
- // );
- }
- },
- );
- }
-
- @override
- void dispose() {
- _tabController?.dispose();
- super.dispose();
- }
-
- @override
- Widget build(BuildContext context) {
- return Scaffold(
- key: _scaffoldKey,
- drawer: FolderDrawer(
- apiService: apiService,
- onFolderTap: (folder) {
- _emailPageKey.currentState?.updateSelectedFolder(folder);
- },
- ),
- body: Stack(
- children: [
- Row(
- children: [
- // Sidebar
- if (_isSidebarOpen)
- Container(
- width: 70,
- color: Color.fromARGB(17, 96, 122, 135),
- child: Column(
- crossAxisAlignment: CrossAxisAlignment.start,
- children: [
- ListTile(
- leading: Icon(Icons.home),
- onTap: () {
- // Navigate to Home
- },
- ),
- ListTile(
- leading: Icon(Icons.settings),
- onTap: () {
- // Navigate to Settings
- },
- ),
- ListTile(
- leading: Icon(Icons.email),
- onTap: () {
- _scaffoldKey.currentState?.openDrawer();
- },
- ),
- Spacer(),
- Padding(
- padding: const EdgeInsets.all(8.0),
- child: Align(
- alignment: Alignment.bottomLeft,
- child: IconButton(
- icon: Icon(Icons.close, color: Colors.white),
- onPressed: () {
- setState(() {
- _isSidebarOpen = false;
- });
- },
- ),
- ),
- ),
- ],
- ),
- ),
- // Main content
- Expanded(
- child: Column(
- children: [
- Container(
- padding: EdgeInsets.fromLTRB(8.0, 8.0, 8.0, 4.0),
- color: Color.fromARGB(42, 36, 102, 132),
- child: Row(
- mainAxisAlignment: MainAxisAlignment.center,
- children: [
- Container(
- width: 800,
- height: 40,
- child: TextField(
- decoration: InputDecoration(
- hintText: 'Search...',
- border: OutlineInputBorder(),
- prefixIcon: Icon(Icons.search),
- ),
- onSubmitted: (value) {
- if (value.isNotEmpty) {
- _performSearch(value, _selectedOption);
- }
- //this is the input box i mentioned
- // if (value == '') {
- // setState(() {
- // querySearches = false;
- // });
- // }
- // Future> results = apiService
- // .sonicSearch('INBOX', 20, 0, value);
- // // print(value);
- // print(results);
- // setState(() {
- // querySearches = true;
- // });
- },
- ),
- ),
- SizedBox(
- width: 16,
- ),
- Container(
- width: 80,
- height: 40,
- child: ElevatedButton(
- onPressed: _showOptionsSearchDialog,
- child: Icon(Icons.manage_search),
- ),
- )
- ],
- ),
- ),
- Container(
- padding: EdgeInsets.all(0.0),
- color: Color.fromARGB(42, 36, 102, 132),
- child: Row(
- children: [
- Container(
- height: 2,
- )
- ],
- ),
- ),
- Container(
- color: Color.fromARGB(255, 131, 110, 143),
- child: TabBar(
- controller: _tabController,
- isScrollable: true,
- tabs: _tabs
- .asMap()
- .entries
- .map((entry) => Tab(
- child: Row(
- children: [
- Text(entry.value),
- if (entry.value != 'Emails')
- GestureDetector(
- onTap: () => _removeTab(entry.key),
- child: Icon(Icons.close, size: 16),
- ),
- ],
- ),
- ))
- .toList(),
- labelColor: Colors.white,
- indicatorColor: Colors.white,
- ),
- ),
- Container(
- // alignment: Alignment.topLeft,
- padding: EdgeInsets.all(8.0),
- color: Colors.white,
- child: Row(
- children: [
- ElevatedButton(
- onPressed: () {
- _emailPageKey.currentState!.isBackDisabled ? null: _emailPageKey.currentState
- ?.updatePagenation('back');
- },
- child: Icon(Icons.navigate_before),
- ),
- Text(_emailPageKey.currentState?.getPage() ?? '1'),
- ElevatedButton(
- onPressed: () {
- _emailPageKey.currentState
- ?.updatePagenation('next');
- },
- child: Icon(Icons.navigate_next),
- ),
- ],
- ),
- ),
- Expanded(
- child: TabBarView(
- controller: _tabController,
- children: _tabs.map((tab) {
- return _tabWidgets[tab] ??
- Center(child: Text("No content found"));
- // return Center(
- // child: EmailPage(
- // key: _emailPageKey,
- // ));
- }).toList(),
- ),
- ),
-
- // if (_tabs.isEmpty)
- // Expanded(
- // child: EmailPage(key: _emailPageKey),
- // ),
- // if (_tabs.isNotEmpty)
- // Expanded(
- // // child: Text('supposed to be mails'),
- // child: TabBarView(
- // controller: _tabController,
- // children: _tabs
- // .map((tab) => Center(child: Text('Results for $tab')))
- // .toList(),
- // ),
- // ),
- ],
- ),
- ),
- ],
- ),
- if (!_isSidebarOpen)
- Positioned(
- bottom: 16,
- left: 16,
- child: FloatingActionButton(
- child: Icon(Icons.menu),
- onPressed: () {
- setState(() {
- _isSidebarOpen = true;
- });
- },
- ),
- ),
- ],
- ),
- );
- }
-}
-// void _showPopupMenu(BuildContext context, Offset position) async {
-// final RenderBox overlay =
-// Overlay.of(context).context.findRenderObject() as RenderBox;
-
-// await showMenu(
-// context: context,
-// position: RelativeRect.fromLTRB(
-// position.dx,
-// position.dy,
-// overlay.size.width - position.dx,
-// overlay.size.height - position.dy,
-// ),
-// items: >[
-// PopupMenuItem(
-// value: 'Open',
-// child: Text('Open'),
-// ),
-// PopupMenuItem(
-// value: 'Reply',
-// child: Text('Reply'),
-// ),
-// PopupMenuItem(
-// value: 'Delete',
-// child: Text('Delete'),
-// ),
-// ],
-// );
-// }
-// }
+import 'package:crab_ui/sonicEmailView.dart';
+
+import 'folder_drawer.dart';
+import 'structs.dart';
+import 'package:flutter/widgets.dart';
+import 'api_service.dart';
+import 'package:flutter/material.dart';
+import 'email.dart';
+// import 'package:shared_preferences/shared_preferences.dart';
+// import 'serialize.dart';
+
+class HomeScreen extends StatefulWidget {
+ @override
+ _HomeScreenState createState() => _HomeScreenState();
+}
+
+class _HomeScreenState extends State with TickerProviderStateMixin {
+ final GlobalKey _scaffoldKey = GlobalKey();
+ final GlobalKey _emailPageKey = GlobalKey();
+ ApiService apiService = ApiService();
+ bool _isSidebarOpen = true;
+ bool querySearches = false;
+ String? _selectedOption = "INBOX";
+
+ List _tabs = ['Emails'];
+ Map _tabWidgets = {};
+ TabController? _tabController;
+
+ @override
+ void initState() {
+ super.initState();
+ _tabController = TabController(length: _tabs.length, vsync: this);
+ _tabWidgets['Emails'] = EmailPage(
+ key: _emailPageKey,
+ );
+ }
+
+ // Add a new tab based on the search
+ void _performSearch(String query, String? list) {
+ setState(() {
+ if (!_tabs.contains(query)) {
+ _tabs.add(query);
+ _tabWidgets[query] = _buildSearchResultsWidget(
+ query, list); // Store a different widget for this tab
+ _tabController = TabController(length: _tabs.length, vsync: this);
+ }
+ });
+ }
+
+ void _showOptionsSearchDialog () async {
+ List folders = await apiService.fetchFolders();
+
+ if (mounted) {
+ showDialog(
+ context: context,
+ builder: (BuildContext context) {
+ return AlertDialog(
+ title: Text('Choose an Option'),
+ content: Column(
+ mainAxisSize: MainAxisSize.min,
+ children: folders.map((option) {
+ return ListTile(
+ title: Text(option),
+ leading: Radio(
+ value: option,
+ groupValue: _selectedOption, // Bind with _selectedOption
+ onChanged: (String? value) {
+ setState(() {
+ _selectedOption = value;
+ });
+ Navigator.of(context).pop(); // Close the dialog on selection
+ },
+ ),
+ );
+ }).toList(),
+ ),
+ actions: [
+ ElevatedButton(
+ child: Text('Submit'),
+ onPressed: () {
+ Navigator.of(context).pop(); // Close the dialog
+ ScaffoldMessenger.of(context).showSnackBar(SnackBar(
+ content: Text('You selected: $_selectedOption'),
+ ));
+ },
+ ),
+ ],
+ );
+ },
+ );}
+ }
+
+
+ // Remove a tab
+ void _removeTab(int index) {
+ if (_tabs[index] != 'Emails') {
+ setState(() {
+ String tabToRemove = _tabs[index];
+ _tabs.removeAt(index);
+ _tabWidgets
+ .remove(tabToRemove); // Remove widget associated with the tab
+ _tabController = TabController(length: _tabs.length, vsync: this);
+ });
+ }
+ }
+
+ // Build a custom widget for each search query
+ Widget _buildSearchResultsWidget(String query, String? list) {
+ return FutureBuilder>(
+ future: apiService.sonicSearch(list ?? "INBOX", 50, 0, query),
+ builder: (BuildContext context,
+ AsyncSnapshot> snapshot) {
+ if (snapshot.connectionState == ConnectionState.waiting) {
+ return Center(child: CircularProgressIndicator());
+ } else if (snapshot.hasError) {
+ return Center(child: Text('Error: ${snapshot.error}'));
+ } else if (!snapshot.hasData || snapshot.data!.isEmpty) {
+ return Center(child: Text('No results found for: $query'));
+ } else {
+ List result = snapshot.data!;
+ return Scaffold(
+ body: ListView.separated(
+ itemCount: result.length,
+ itemBuilder: (context, index) {
+ final SerializableMessage email = result[index];
+ return ListTile(
+ title: Text(email.from,
+ style: TextStyle(fontWeight: FontWeight.bold)),
+ subtitle: Column(
+ crossAxisAlignment: CrossAxisAlignment.start,
+ children: [Text(email.subject)],
+ ),
+ trailing: Text(email.date.toString()),
+ onTap: () async {
+ // print('tapped');
+ // List emailContent =
+ // await apiService.fetchEmailContent([email.id], email.list);
+ //call the foldable
+
+ List emailContent = // list of the html
+ await apiService.fetchEmailContent([email.id], email.list);
+ // List emailIds = email.messages;
+
+
+ Navigator.push(
+ context,
+ MaterialPageRoute(
+ builder: (context) =>SonicEmailView(
+ email: email,
+ emailHTML: emailContent[0])
+ // builder: (context) => EmailView(
+ // emailContent: emailContent,
+ // from: email.from,
+ // name: email.name,
+ // to: email.to.toString(),
+ // subject: email.subject,
+ // date: email.date.toString(),
+ // id: email.id.toString(),
+ // messages: [email.id],
+ // ),
+ ),
+ );
+ },
+ );
+ },
+ separatorBuilder: (context, index) => Divider(),
+ ),
+ // child: Column(
+ // mainAxisAlignment: MainAxisAlignment.center,
+ // children: [
+ // Text("Results for: $query", style: TextStyle(fontSize: 24)),
+ // // Display the actual data
+ // Text(result[0].name), // Accessing the first result safely
+ // Text(result[0].from), // Displaying the 'from' field as an example
+ // Text(result[0].hash),
+ // Text(result[0].subject),
+ // Text(result[0].uid.toString()),
+ // Text(result[0].list),
+ // Text(result[0].id),
+
+ // // Add more fields or customize the display
+ // // SerializableEmailListScreen(emails: result, getEmailContent: getEmailContent)
+ // // Expanded(
+
+ // // child:
+ // // ),
+ // ],
+ );
+ // );
+ }
+ },
+ );
+ }
+
+ @override
+ void dispose() {
+ _tabController?.dispose();
+ super.dispose();
+ }
+
+ @override
+ Widget build(BuildContext context) {
+ return Scaffold(
+ key: _scaffoldKey,
+ drawer: FolderDrawer(
+ apiService: apiService,
+ onFolderTap: (folder) {
+ _emailPageKey.currentState?.updateSelectedFolder(folder);
+ },
+ ),
+ body: Stack(
+ children: [
+ Row(
+ children: [
+ // Sidebar
+ if (_isSidebarOpen)
+ Container(
+ width: 70,
+ color: Color.fromARGB(17, 96, 122, 135),
+ child: Column(
+ crossAxisAlignment: CrossAxisAlignment.start,
+ children: [
+ ListTile(
+ leading: Icon(Icons.home),
+ onTap: () {
+ // Navigate to Home
+ },
+ ),
+ ListTile(
+ leading: Icon(Icons.settings),
+ onTap: () {
+ // Navigate to Settings
+ },
+ ),
+ ListTile(
+ leading: Icon(Icons.email),
+ onTap: () {
+ _scaffoldKey.currentState?.openDrawer();
+ },
+ ),
+ Spacer(),
+ Padding(
+ padding: const EdgeInsets.all(8.0),
+ child: Align(
+ alignment: Alignment.bottomLeft,
+ child: IconButton(
+ icon: Icon(Icons.close, color: Colors.white),
+ onPressed: () {
+ setState(() {
+ _isSidebarOpen = false;
+ });
+ },
+ ),
+ ),
+ ),
+ ],
+ ),
+ ),
+ // Main content
+ Expanded(
+ child: Column(
+ children: [
+ Container(
+ padding: EdgeInsets.fromLTRB(8.0, 8.0, 8.0, 4.0),
+ color: Color.fromARGB(42, 36, 102, 132),
+ child: Row(
+ mainAxisAlignment: MainAxisAlignment.center,
+ children: [
+ Container(
+ width: 800,
+ height: 40,
+ child: TextField(
+ decoration: InputDecoration(
+ hintText: 'Search...',
+ border: OutlineInputBorder(),
+ prefixIcon: Icon(Icons.search),
+ ),
+ onSubmitted: (value) {
+ if (value.isNotEmpty) {
+ _performSearch(value, _selectedOption);
+ }
+ //this is the input box i mentioned
+ // if (value == '') {
+ // setState(() {
+ // querySearches = false;
+ // });
+ // }
+ // Future> results = apiService
+ // .sonicSearch('INBOX', 20, 0, value);
+ // // print(value);
+ // print(results);
+ // setState(() {
+ // querySearches = true;
+ // });
+ },
+ ),
+ ),
+ SizedBox(
+ width: 16,
+ ),
+ Container(
+ width: 80,
+ height: 40,
+ child: ElevatedButton(
+ onPressed: _showOptionsSearchDialog,
+ child: Icon(Icons.manage_search),
+ ),
+ )
+ ],
+ ),
+ ),
+ Container(
+ padding: EdgeInsets.all(0.0),
+ color: Color.fromARGB(42, 36, 102, 132),
+ child: Row(
+ children: [
+ Container(
+ height: 2,
+ )
+ ],
+ ),
+ ),
+ Container(
+ color: Color.fromARGB(255, 131, 110, 143),
+ child: TabBar(
+ controller: _tabController,
+ isScrollable: true,
+ tabs: _tabs
+ .asMap()
+ .entries
+ .map((entry) => Tab(
+ child: Row(
+ children: [
+ Text(entry.value),
+ if (entry.value != 'Emails')
+ GestureDetector(
+ onTap: () => _removeTab(entry.key),
+ child: Icon(Icons.close, size: 16),
+ ),
+ ],
+ ),
+ ))
+ .toList(),
+ labelColor: Colors.white,
+ indicatorColor: Colors.white,
+ ),
+ ),
+ Container(
+ // alignment: Alignment.topLeft,
+ padding: EdgeInsets.all(8.0),
+ color: Colors.white,
+ child: Row(
+ children: [
+ ElevatedButton(
+ onPressed: () {
+ _emailPageKey.currentState!.isBackDisabled ? null: _emailPageKey.currentState
+ ?.updatePagenation('back');
+ },
+ child: Icon(Icons.navigate_before),
+ ),
+ Builder(
+ builder: (context) {
+ final emailState = _emailPageKey.currentState;
+ if (emailState == null) {
+ // Schedule a rebuild once the state is available
+ Future.microtask(() => setState(() {}));
+ return Text('Loading...');
+ }
+
+ return ValueListenableBuilder(
+ valueListenable: emailState.currentPageNotifier,
+ builder: (context, value, _) => Text('$value'),
+ );
+ },
+ ),
+ ElevatedButton(
+ onPressed: () {
+ _emailPageKey.currentState
+ ?.updatePagenation('next');
+ },
+ child: Icon(Icons.navigate_next),
+ ),
+ ],
+ ),
+ ),
+ Expanded(
+ child: TabBarView(
+ controller: _tabController,
+ children: _tabs.map((tab) {
+ return _tabWidgets[tab] ??
+ Center(child: Text("No content found"));
+ // return Center(
+ // child: EmailPage(
+ // key: _emailPageKey,
+ // ));
+ }).toList(),
+ ),
+ ),
+
+ // if (_tabs.isEmpty)
+ // Expanded(
+ // child: EmailPage(key: _emailPageKey),
+ // ),
+ // if (_tabs.isNotEmpty)
+ // Expanded(
+ // // child: Text('supposed to be mails'),
+ // child: TabBarView(
+ // controller: _tabController,
+ // children: _tabs
+ // .map((tab) => Center(child: Text('Results for $tab')))
+ // .toList(),
+ // ),
+ // ),
+ ],
+ ),
+ ),
+ ],
+ ),
+ if (!_isSidebarOpen)
+ Positioned(
+ bottom: 16,
+ left: 16,
+ child: FloatingActionButton(
+ child: Icon(Icons.menu),
+ onPressed: () {
+ setState(() {
+ _isSidebarOpen = true;
+ });
+ },
+ ),
+ ),
+ ],
+ ),
+ );
+ }
+}
+// void _showPopupMenu(BuildContext context, Offset position) async {
+// final RenderBox overlay =
+// Overlay.of(context).context.findRenderObject() as RenderBox;
+
+// await showMenu(
+// context: context,
+// position: RelativeRect.fromLTRB(
+// position.dx,
+// position.dy,
+// overlay.size.width - position.dx,
+// overlay.size.height - position.dy,
+// ),
+// items: >[
+// PopupMenuItem(
+// value: 'Open',
+// child: Text('Open'),
+// ),
+// PopupMenuItem(
+// value: 'Reply',
+// child: Text('Reply'),
+// ),
+// PopupMenuItem(
+// value: 'Delete',
+// child: Text('Delete'),
+// ),
+// ],
+// );
+// }
+// }
diff --git a/lib/serialize.dart b/lib/serialize.dart
deleted file mode 100644
index 4ba21f1..0000000
--- a/lib/serialize.dart
+++ /dev/null
@@ -1,85 +0,0 @@
-import 'package:flutter/material.dart';
-import 'api_service.dart';
-import 'structs.dart';
-
-class SerializableMessageListScreen extends StatefulWidget {
- @override
- _SerializableMessageListScreenState createState() => _SerializableMessageListScreenState();
-}
-
-class _SerializableMessageListScreenState extends State {
- List? messages;
- bool isLoading = true;
- bool hasError = false;
-
- final ApiService apiService = ApiService();
-
- @override
- void initState() {
- super.initState();
- _fetchMessages();
- }
-
- Future _fetchMessages() async {
- try {
- List fetchedMessages = await apiService.sonicSearch("INBOX", 10, 0, "searchQuery");
- setState(() {
- messages = fetchedMessages;
- isLoading = false;
- });
- } catch (e) {
- setState(() {
- hasError = true;
- isLoading = false;
- });
- }
- }
-
- @override
- Widget build(BuildContext context) {
- if (isLoading) {
- return Center(child: CircularProgressIndicator());
- }
-
- if (hasError) {
- return Center(child: Text("Error fetching messages."));
- }
-
- if (messages == null || messages!.isEmpty) {
- return Center(child: Text("No messages found."));
- }
-
- return ListView.separated(
- itemCount: messages!.length,
- itemBuilder: (context, index) {
- final message = messages![index];
- return ListTile(
- title: Text(message.name, style: TextStyle(fontWeight: FontWeight.bold)),
- subtitle: Column(
- crossAxisAlignment: CrossAxisAlignment.start,
- children: [Text(message.subject)],
- ),
- trailing: Text(message.date),
- onTap: () async {
- String emailContent = await apiService.fetchEmailContent([message.id], message.list);
- Navigator.push(
- context,
- MaterialPageRoute(
- builder: (context) => EmailView(
- emailContent: emailContent,
- from: message.from,
- name: message.name,
- to: message.to.toString(),
- subject: message.subject,
- date: message.date,
- id: message.id,
- ),
- ),
- );
- },
- );
- },
- separatorBuilder: (context, index) => Divider(),
- );
- }
-}
diff --git a/lib/sonicEmailView.dart b/lib/sonicEmailView.dart
new file mode 100644
index 0000000..bfe0bbe
--- /dev/null
+++ b/lib/sonicEmailView.dart
@@ -0,0 +1,145 @@
+import 'package:crab_ui/augment.dart';
+import 'package:web/web.dart' as web;
+import 'dart:ui_web' as ui;
+import 'dart:js_interop';
+import 'structs.dart';
+import 'package:flutter/material.dart';
+
+class SonicEmailView extends StatefulWidget {
+ SerializableMessage email;
+ String emailHTML;
+
+ SonicEmailView({required this.email, required this.emailHTML});
+
+ @override
+ _SonicEmailViewState createState() => _SonicEmailViewState();
+}
+
+class _SonicEmailViewState extends State {
+ String viewTypeIDs = "";
+ int heightOFViewtype = 0;
+ bool _isLoaded = false;
+
+ void _scrollToNumber(String spanId) {
+ AugmentClasses.handleJump(spanId);
+ }
+
+ @override
+ void initState() {
+ super.initState();
+ _init();
+ }
+
+ Future _init() async {
+ await _registerViewFactory(widget.emailHTML);
+ if (!mounted) return;
+ setState(() {
+ _isLoaded = true;
+ });
+ }
+
+ Future _registerViewFactory(String currentContent) async {
+ // setState(() { //update to do item per item
+ // each item to have itsviewtype ID
+ // is this necessarey here??
+
+ //could just move to collapsable
+
+ // for (var emailHTML in widget.threadHTML) {
+ String viewTypeId = 'email-${DateTime.now().millisecondsSinceEpoch}';
+
+ final ghost = web.document.createElement('div') as web.HTMLDivElement
+ ..style.visibility = 'hidden'
+ ..style.position = 'absolute'
+ ..style.width = '100%'
+ ..style.overflow = 'auto'
+ ..innerHTML = currentContent.toJS;
+ web.document.body?.append(ghost);
+ await Future.delayed(Duration(milliseconds: 10));
+
+ final heightOfEmail = ghost.scrollHeight;
+ ghost.remove();
+
+ final HTMLsnippet = web.document.createElement('div') as web.HTMLDivElement
+ ..id = viewTypeId
+ ..innerHTML = widget
+ .emailHTML.toJS; // temporarily index because it has to do all of them
+ HTMLsnippet.style
+ ..width = '100%'
+ ..height = '${heightOfEmail}px'
+ ..overflow = 'auto'
+ ..scrollBehavior = 'smooth';
+
+ ui.platformViewRegistry.registerViewFactory(
+ viewTypeId,
+ (int viewId) => HTMLsnippet,
+ );
+ this.viewTypeIDs = viewTypeId;
+ this.heightOFViewtype = heightOfEmail;
+ print(viewTypeIDs);
+ }
+
+ @override
+ Widget build(BuildContext context) {
+ return _isLoaded
+ ? Scaffold(
+ appBar: AppBar(title: Text(widget.email.subject)),
+ body: Stack(
+ children: [
+ Column(
+ children: [
+ EmailToolbar(
+ onButtonPressed: () => {},
+ onJumpToSpan: _scrollToNumber),
+ Row(
+ // title of email
+ children: [
+ Text(
+ widget.email.subject,
+ style: TextStyle(fontSize: 30),
+ ),
+ ],
+ ),
+ Row(
+ children: [
+ Text(
+ 'from ${widget.email.name}',
+ style: TextStyle(fontSize: 18),
+ ),
+ Text(
+ '<${widget.email.from}>',
+ style: TextStyle(fontSize: 18),
+ ),
+ Spacer(),
+ Text(
+ '${widget.email.date}',
+ textAlign: TextAlign.right,
+ )
+ ],
+ ),
+ // TODO: make a case where if one of these is the user's email it just says me :)))))
+ Row(
+ children: [
+ Text(
+ 'to ${widget.email.to.toString()}',
+ style: TextStyle(fontSize: 15),
+ )
+ ],
+ ),
+ Expanded(
+ // child: SizedBox(
+ // height: heightOFViewtype.toDouble(),
+ child: HtmlElementView(
+ key: UniqueKey(), viewType: this.viewTypeIDs,
+ // ),
+ ))
+ ],
+ ),
+ ],
+ ),
+ )
+ : const Center(
+ child: CircularProgressIndicator(),
+ );
+ }
+}
diff --git a/linux/.gitignore:Zone.Identifier b/linux/.gitignore:Zone.Identifier
deleted file mode 100644
index b0a0755..0000000
--- a/linux/.gitignore:Zone.Identifier
+++ /dev/null
@@ -1,3 +0,0 @@
-[ZoneTransfer]
-ZoneId=3
-ReferrerUrl=C:\Users\juana\Flutter\flutter_windows_3.22.2-stable.zip
diff --git a/linux/flutter/CMakeLists.txt:Zone.Identifier b/linux/flutter/CMakeLists.txt:Zone.Identifier
deleted file mode 100644
index b0a0755..0000000
--- a/linux/flutter/CMakeLists.txt:Zone.Identifier
+++ /dev/null
@@ -1,3 +0,0 @@
-[ZoneTransfer]
-ZoneId=3
-ReferrerUrl=C:\Users\juana\Flutter\flutter_windows_3.22.2-stable.zip
diff --git a/linux/main.cc:Zone.Identifier b/linux/main.cc:Zone.Identifier
deleted file mode 100644
index b0a0755..0000000
--- a/linux/main.cc:Zone.Identifier
+++ /dev/null
@@ -1,3 +0,0 @@
-[ZoneTransfer]
-ZoneId=3
-ReferrerUrl=C:\Users\juana\Flutter\flutter_windows_3.22.2-stable.zip
diff --git a/linux/my_application.h:Zone.Identifier b/linux/my_application.h:Zone.Identifier
deleted file mode 100644
index b0a0755..0000000
--- a/linux/my_application.h:Zone.Identifier
+++ /dev/null
@@ -1,3 +0,0 @@
-[ZoneTransfer]
-ZoneId=3
-ReferrerUrl=C:\Users\juana\Flutter\flutter_windows_3.22.2-stable.zip
diff --git a/macos/.gitignore:Zone.Identifier b/macos/.gitignore:Zone.Identifier
deleted file mode 100644
index b0a0755..0000000
--- a/macos/.gitignore:Zone.Identifier
+++ /dev/null
@@ -1,3 +0,0 @@
-[ZoneTransfer]
-ZoneId=3
-ReferrerUrl=C:\Users\juana\Flutter\flutter_windows_3.22.2-stable.zip
diff --git a/macos/Flutter/Flutter-Debug.xcconfig:Zone.Identifier b/macos/Flutter/Flutter-Debug.xcconfig:Zone.Identifier
deleted file mode 100644
index b0a0755..0000000
--- a/macos/Flutter/Flutter-Debug.xcconfig:Zone.Identifier
+++ /dev/null
@@ -1,3 +0,0 @@
-[ZoneTransfer]
-ZoneId=3
-ReferrerUrl=C:\Users\juana\Flutter\flutter_windows_3.22.2-stable.zip
diff --git a/macos/Flutter/Flutter-Release.xcconfig:Zone.Identifier b/macos/Flutter/Flutter-Release.xcconfig:Zone.Identifier
deleted file mode 100644
index b0a0755..0000000
--- a/macos/Flutter/Flutter-Release.xcconfig:Zone.Identifier
+++ /dev/null
@@ -1,3 +0,0 @@
-[ZoneTransfer]
-ZoneId=3
-ReferrerUrl=C:\Users\juana\Flutter\flutter_windows_3.22.2-stable.zip
diff --git a/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist:Zone.Identifier b/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist:Zone.Identifier
deleted file mode 100644
index b0a0755..0000000
--- a/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist:Zone.Identifier
+++ /dev/null
@@ -1,3 +0,0 @@
-[ZoneTransfer]
-ZoneId=3
-ReferrerUrl=C:\Users\juana\Flutter\flutter_windows_3.22.2-stable.zip
diff --git a/macos/Runner.xcworkspace/contents.xcworkspacedata:Zone.Identifier b/macos/Runner.xcworkspace/contents.xcworkspacedata:Zone.Identifier
deleted file mode 100644
index b0a0755..0000000
--- a/macos/Runner.xcworkspace/contents.xcworkspacedata:Zone.Identifier
+++ /dev/null
@@ -1,3 +0,0 @@
-[ZoneTransfer]
-ZoneId=3
-ReferrerUrl=C:\Users\juana\Flutter\flutter_windows_3.22.2-stable.zip
diff --git a/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist:Zone.Identifier b/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist:Zone.Identifier
deleted file mode 100644
index b0a0755..0000000
--- a/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist:Zone.Identifier
+++ /dev/null
@@ -1,3 +0,0 @@
-[ZoneTransfer]
-ZoneId=3
-ReferrerUrl=C:\Users\juana\Flutter\flutter_windows_3.22.2-stable.zip
diff --git a/macos/Runner/AppDelegate.swift:Zone.Identifier b/macos/Runner/AppDelegate.swift:Zone.Identifier
deleted file mode 100644
index b0a0755..0000000
--- a/macos/Runner/AppDelegate.swift:Zone.Identifier
+++ /dev/null
@@ -1,3 +0,0 @@
-[ZoneTransfer]
-ZoneId=3
-ReferrerUrl=C:\Users\juana\Flutter\flutter_windows_3.22.2-stable.zip
diff --git a/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json:Zone.Identifier b/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json:Zone.Identifier
deleted file mode 100644
index b0a0755..0000000
--- a/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json:Zone.Identifier
+++ /dev/null
@@ -1,3 +0,0 @@
-[ZoneTransfer]
-ZoneId=3
-ReferrerUrl=C:\Users\juana\Flutter\flutter_windows_3.22.2-stable.zip
diff --git a/macos/Runner/Base.lproj/MainMenu.xib:Zone.Identifier b/macos/Runner/Base.lproj/MainMenu.xib:Zone.Identifier
deleted file mode 100644
index b0a0755..0000000
--- a/macos/Runner/Base.lproj/MainMenu.xib:Zone.Identifier
+++ /dev/null
@@ -1,3 +0,0 @@
-[ZoneTransfer]
-ZoneId=3
-ReferrerUrl=C:\Users\juana\Flutter\flutter_windows_3.22.2-stable.zip
diff --git a/macos/Runner/Configs/Debug.xcconfig:Zone.Identifier b/macos/Runner/Configs/Debug.xcconfig:Zone.Identifier
deleted file mode 100644
index b0a0755..0000000
--- a/macos/Runner/Configs/Debug.xcconfig:Zone.Identifier
+++ /dev/null
@@ -1,3 +0,0 @@
-[ZoneTransfer]
-ZoneId=3
-ReferrerUrl=C:\Users\juana\Flutter\flutter_windows_3.22.2-stable.zip
diff --git a/macos/Runner/Configs/Release.xcconfig:Zone.Identifier b/macos/Runner/Configs/Release.xcconfig:Zone.Identifier
deleted file mode 100644
index b0a0755..0000000
--- a/macos/Runner/Configs/Release.xcconfig:Zone.Identifier
+++ /dev/null
@@ -1,3 +0,0 @@
-[ZoneTransfer]
-ZoneId=3
-ReferrerUrl=C:\Users\juana\Flutter\flutter_windows_3.22.2-stable.zip
diff --git a/macos/Runner/Configs/Warnings.xcconfig:Zone.Identifier b/macos/Runner/Configs/Warnings.xcconfig:Zone.Identifier
deleted file mode 100644
index b0a0755..0000000
--- a/macos/Runner/Configs/Warnings.xcconfig:Zone.Identifier
+++ /dev/null
@@ -1,3 +0,0 @@
-[ZoneTransfer]
-ZoneId=3
-ReferrerUrl=C:\Users\juana\Flutter\flutter_windows_3.22.2-stable.zip
diff --git a/macos/Runner/DebugProfile.entitlements:Zone.Identifier b/macos/Runner/DebugProfile.entitlements:Zone.Identifier
deleted file mode 100644
index b0a0755..0000000
--- a/macos/Runner/DebugProfile.entitlements:Zone.Identifier
+++ /dev/null
@@ -1,3 +0,0 @@
-[ZoneTransfer]
-ZoneId=3
-ReferrerUrl=C:\Users\juana\Flutter\flutter_windows_3.22.2-stable.zip
diff --git a/macos/Runner/Info.plist:Zone.Identifier b/macos/Runner/Info.plist:Zone.Identifier
deleted file mode 100644
index b0a0755..0000000
--- a/macos/Runner/Info.plist:Zone.Identifier
+++ /dev/null
@@ -1,3 +0,0 @@
-[ZoneTransfer]
-ZoneId=3
-ReferrerUrl=C:\Users\juana\Flutter\flutter_windows_3.22.2-stable.zip
diff --git a/macos/Runner/MainFlutterWindow.swift:Zone.Identifier b/macos/Runner/MainFlutterWindow.swift:Zone.Identifier
deleted file mode 100644
index b0a0755..0000000
--- a/macos/Runner/MainFlutterWindow.swift:Zone.Identifier
+++ /dev/null
@@ -1,3 +0,0 @@
-[ZoneTransfer]
-ZoneId=3
-ReferrerUrl=C:\Users\juana\Flutter\flutter_windows_3.22.2-stable.zip
diff --git a/macos/Runner/Release.entitlements:Zone.Identifier b/macos/Runner/Release.entitlements:Zone.Identifier
deleted file mode 100644
index b0a0755..0000000
--- a/macos/Runner/Release.entitlements:Zone.Identifier
+++ /dev/null
@@ -1,3 +0,0 @@
-[ZoneTransfer]
-ZoneId=3
-ReferrerUrl=C:\Users\juana\Flutter\flutter_windows_3.22.2-stable.zip
diff --git a/pubspec.lock b/pubspec.lock
index 2454c65..f4b7708 100644
--- a/pubspec.lock
+++ b/pubspec.lock
@@ -9,6 +9,14 @@ packages:
url: "https://pub.dev"
source: hosted
version: "2.5.0"
+ asn1lib:
+ dependency: transitive
+ description:
+ name: asn1lib
+ sha256: "4bae5ae63e6d6dd17c4aac8086f3dec26c0236f6a0f03416c6c19d830c367cf5"
+ url: "https://pub.dev"
+ source: hosted
+ version: "1.5.8"
async:
dependency: transitive
description:
@@ -97,14 +105,22 @@ packages:
url: "https://pub.dev"
source: hosted
version: "1.18.0"
+ convert:
+ dependency: transitive
+ description:
+ name: convert
+ sha256: b30acd5944035672bc15c6b7a8b47d773e41e2f17de064350988c5d02adb1c68
+ url: "https://pub.dev"
+ source: hosted
+ version: "3.1.2"
crypto:
dependency: transitive
description:
name: crypto
- sha256: ff625774173754681d66daaf4a448684fb04b78f902da9cb3d308c19cc5e8bab
+ sha256: "1e445881f28f22d6140f181e07737b22f1e099a5e1ff94b0af2f9e4a463f4855"
url: "https://pub.dev"
source: hosted
- version: "3.0.3"
+ version: "3.0.6"
csslib:
dependency: transitive
description:
@@ -121,6 +137,30 @@ packages:
url: "https://pub.dev"
source: hosted
version: "1.0.8"
+ dio:
+ dependency: transitive
+ description:
+ name: dio
+ sha256: "253a18bbd4851fecba42f7343a1df3a9a4c1d31a2c1b37e221086b4fa8c8dbc9"
+ url: "https://pub.dev"
+ source: hosted
+ version: "5.8.0+1"
+ dio_web_adapter:
+ dependency: transitive
+ description:
+ name: dio_web_adapter
+ sha256: "7586e476d70caecaf1686d21eee7247ea43ef5c345eab9e0cc3583ff13378d78"
+ url: "https://pub.dev"
+ source: hosted
+ version: "2.1.1"
+ encrypt:
+ dependency: "direct main"
+ description:
+ name: encrypt
+ sha256: "62d9aa4670cc2a8798bab89b39fc71b6dfbacf615de6cf5001fb39f7e4a996a2"
+ url: "https://pub.dev"
+ source: hosted
+ version: "5.0.3"
english_words:
dependency: "direct main"
description:
@@ -141,10 +181,10 @@ packages:
dependency: transitive
description:
name: ffi
- sha256: "493f37e7df1804778ff3a53bd691d8692ddf69702cf4c1c1096a2e41b4779e21"
+ sha256: "16ed7b077ef01ad6170a3d0c57caa4a112a38d7a2ed5602e0aca9ca6f3d98da6"
url: "https://pub.dev"
source: hosted
- version: "2.1.2"
+ version: "2.1.3"
file:
dependency: transitive
description:
@@ -153,6 +193,14 @@ packages:
url: "https://pub.dev"
source: hosted
version: "7.0.0"
+ file_saver:
+ dependency: "direct main"
+ description:
+ name: file_saver
+ sha256: "017a127de686af2d2fbbd64afea97052d95f2a0f87d19d25b87e097407bf9c1e"
+ url: "https://pub.dev"
+ source: hosted
+ version: "0.2.14"
fixnum:
dependency: transitive
description:
@@ -368,6 +416,14 @@ packages:
url: "https://pub.dev"
source: hosted
version: "4.0.2"
+ intl:
+ dependency: "direct main"
+ description:
+ name: intl
+ sha256: d6f56758b7d3014a48af9701c085700aac781a92a87a62b1333b46d8879661cf
+ url: "https://pub.dev"
+ source: hosted
+ version: "0.19.0"
js:
dependency: transitive
description:
@@ -464,6 +520,14 @@ packages:
url: "https://pub.dev"
source: hosted
version: "1.12.0"
+ mime:
+ dependency: "direct main"
+ description:
+ name: mime
+ sha256: "801fd0b26f14a4a58ccb09d5892c3fbdeff209594300a542492cf13fba9d247a"
+ url: "https://pub.dev"
+ source: hosted
+ version: "1.0.6"
nested:
dependency: transitive
description:
@@ -500,10 +564,10 @@ packages:
dependency: transitive
description:
name: path_provider
- sha256: fec0d61223fba3154d87759e3cc27fe2c8dc498f6386c6d6fc80d1afdd1bf378
+ sha256: "50c5dd5b6e1aaf6fb3a78b33f6aa3afca52bf903a8a5298f53101fdaee55bbcd"
url: "https://pub.dev"
source: hosted
- version: "2.1.4"
+ version: "2.1.5"
path_provider_android:
dependency: transitive
description:
@@ -544,6 +608,14 @@ packages:
url: "https://pub.dev"
source: hosted
version: "2.3.0"
+ pdfrx:
+ dependency: "direct main"
+ description:
+ name: pdfrx
+ sha256: "29c7b03d27d647c80da8cc08bd1256c74df90e5640fdd676646e4bd04f90553a"
+ url: "https://pub.dev"
+ source: hosted
+ version: "1.0.94"
petitparser:
dependency: transitive
description:
@@ -552,6 +624,14 @@ packages:
url: "https://pub.dev"
source: hosted
version: "6.0.2"
+ photo_view:
+ dependency: "direct main"
+ description:
+ name: photo_view
+ sha256: "1fc3d970a91295fbd1364296575f854c9863f225505c28c46e0a03e48960c75e"
+ url: "https://pub.dev"
+ source: hosted
+ version: "0.15.0"
platform:
dependency: transitive
description:
@@ -568,6 +648,46 @@ packages:
url: "https://pub.dev"
source: hosted
version: "2.1.8"
+ pointer_interceptor:
+ dependency: "direct main"
+ description:
+ name: pointer_interceptor
+ sha256: "57210410680379aea8b1b7ed6ae0c3ad349bfd56fe845b8ea934a53344b9d523"
+ url: "https://pub.dev"
+ source: hosted
+ version: "0.10.1+2"
+ pointer_interceptor_ios:
+ dependency: transitive
+ description:
+ name: pointer_interceptor_ios
+ sha256: a6906772b3205b42c44614fcea28f818b1e5fdad73a4ca742a7bd49818d9c917
+ url: "https://pub.dev"
+ source: hosted
+ version: "0.10.1"
+ pointer_interceptor_platform_interface:
+ dependency: transitive
+ description:
+ name: pointer_interceptor_platform_interface
+ sha256: "0597b0560e14354baeb23f8375cd612e8bd4841bf8306ecb71fcd0bb78552506"
+ url: "https://pub.dev"
+ source: hosted
+ version: "0.10.0+1"
+ pointer_interceptor_web:
+ dependency: transitive
+ description:
+ name: pointer_interceptor_web
+ sha256: "7a7087782110f8c1827170660b09f8aa893e0e9a61431dbbe2ac3fc482e8c044"
+ url: "https://pub.dev"
+ source: hosted
+ version: "0.10.2+1"
+ pointycastle:
+ dependency: "direct main"
+ description:
+ name: pointycastle
+ sha256: "4be0097fcf3fd3e8449e53730c631200ebc7b88016acecab2b0da2f0149222fe"
+ url: "https://pub.dev"
+ source: hosted
+ version: "3.9.1"
provider:
dependency: "direct main"
description:
@@ -592,6 +712,62 @@ packages:
url: "https://pub.dev"
source: hosted
version: "0.27.7"
+ shared_preferences:
+ dependency: "direct main"
+ description:
+ name: shared_preferences
+ sha256: "95f9997ca1fb9799d494d0cb2a780fd7be075818d59f00c43832ed112b158a82"
+ url: "https://pub.dev"
+ source: hosted
+ version: "2.3.3"
+ shared_preferences_android:
+ dependency: transitive
+ description:
+ name: shared_preferences_android
+ sha256: "480ba4345773f56acda9abf5f50bd966f581dac5d514e5fc4a18c62976bbba7e"
+ url: "https://pub.dev"
+ source: hosted
+ version: "2.3.2"
+ shared_preferences_foundation:
+ dependency: transitive
+ description:
+ name: shared_preferences_foundation
+ sha256: "6a52cfcdaeac77cad8c97b539ff688ccfc458c007b4db12be584fbe5c0e49e03"
+ url: "https://pub.dev"
+ source: hosted
+ version: "2.5.4"
+ shared_preferences_linux:
+ dependency: transitive
+ description:
+ name: shared_preferences_linux
+ sha256: "580abfd40f415611503cae30adf626e6656dfb2f0cee8f465ece7b6defb40f2f"
+ url: "https://pub.dev"
+ source: hosted
+ version: "2.4.1"
+ shared_preferences_platform_interface:
+ dependency: transitive
+ description:
+ name: shared_preferences_platform_interface
+ sha256: "57cbf196c486bc2cf1f02b85784932c6094376284b3ad5779d1b1c6c6a816b80"
+ url: "https://pub.dev"
+ source: hosted
+ version: "2.4.1"
+ shared_preferences_web:
+ dependency: transitive
+ description:
+ name: shared_preferences_web
+ sha256: d2ca4132d3946fec2184261726b355836a82c33d7d5b67af32692aff18a4684e
+ url: "https://pub.dev"
+ source: hosted
+ version: "2.4.2"
+ shared_preferences_windows:
+ dependency: transitive
+ description:
+ name: shared_preferences_windows
+ sha256: "94ef0f72b2d71bc3e700e025db3710911bd51a71cefb65cc609dd0d9a982e3c1"
+ url: "https://pub.dev"
+ source: hosted
+ version: "2.4.1"
sky_engine:
dependency: transitive
description: flutter
@@ -697,10 +873,10 @@ packages:
dependency: transitive
description:
name: url_launcher
- sha256: "21b704ce5fa560ea9f3b525b43601c678728ba46725bab9b01187b4831377ed3"
+ sha256: "9d06212b1362abc2f0f0d78e6f09f726608c74e3b9462e8368bb03314aa8d603"
url: "https://pub.dev"
source: hosted
- version: "6.3.0"
+ version: "6.3.1"
url_launcher_android:
dependency: transitive
description:
@@ -886,13 +1062,13 @@ packages:
source: hosted
version: "0.2.1"
web:
- dependency: transitive
+ dependency: "direct main"
description:
name: web
- sha256: d43c1d6b787bf0afad444700ae7f4db8827f701bc61c255ac8d328c6f4d52062
+ sha256: "868d88a33d8a87b18ffc05f9f030ba328ffefba92d6c127917a2ba740f9cfe4a"
url: "https://pub.dev"
source: hosted
- version: "1.0.0"
+ version: "1.1.1"
webview_flutter:
dependency: transitive
description:
diff --git a/pubspec.yaml b/pubspec.yaml
index 3f94c16..8de6880 100644
--- a/pubspec.yaml
+++ b/pubspec.yaml
@@ -27,6 +27,7 @@ dependencies:
intl: ^0.19.0
pdfrx: ^1.0.94
photo_view: ^0.15.0
+ web: ^1.1.1
dev_dependencies:
flutter_test:
diff --git a/web/favicon.png:Zone.Identifier b/web/favicon.png:Zone.Identifier
deleted file mode 100644
index b0a0755..0000000
--- a/web/favicon.png:Zone.Identifier
+++ /dev/null
@@ -1,3 +0,0 @@
-[ZoneTransfer]
-ZoneId=3
-ReferrerUrl=C:\Users\juana\Flutter\flutter_windows_3.22.2-stable.zip
diff --git a/web/icons/Icon-192.png:Zone.Identifier b/web/icons/Icon-192.png:Zone.Identifier
deleted file mode 100644
index b0a0755..0000000
--- a/web/icons/Icon-192.png:Zone.Identifier
+++ /dev/null
@@ -1,3 +0,0 @@
-[ZoneTransfer]
-ZoneId=3
-ReferrerUrl=C:\Users\juana\Flutter\flutter_windows_3.22.2-stable.zip
diff --git a/web/icons/Icon-512.png:Zone.Identifier b/web/icons/Icon-512.png:Zone.Identifier
deleted file mode 100644
index b0a0755..0000000
--- a/web/icons/Icon-512.png:Zone.Identifier
+++ /dev/null
@@ -1,3 +0,0 @@
-[ZoneTransfer]
-ZoneId=3
-ReferrerUrl=C:\Users\juana\Flutter\flutter_windows_3.22.2-stable.zip
diff --git a/windows/.gitignore:Zone.Identifier b/windows/.gitignore:Zone.Identifier
deleted file mode 100644
index b0a0755..0000000
--- a/windows/.gitignore:Zone.Identifier
+++ /dev/null
@@ -1,3 +0,0 @@
-[ZoneTransfer]
-ZoneId=3
-ReferrerUrl=C:\Users\juana\Flutter\flutter_windows_3.22.2-stable.zip
diff --git a/windows/flutter/CMakeLists.txt:Zone.Identifier b/windows/flutter/CMakeLists.txt:Zone.Identifier
deleted file mode 100644
index b0a0755..0000000
--- a/windows/flutter/CMakeLists.txt:Zone.Identifier
+++ /dev/null
@@ -1,3 +0,0 @@
-[ZoneTransfer]
-ZoneId=3
-ReferrerUrl=C:\Users\juana\Flutter\flutter_windows_3.22.2-stable.zip
diff --git a/windows/runner/CMakeLists.txt:Zone.Identifier b/windows/runner/CMakeLists.txt:Zone.Identifier
deleted file mode 100644
index b0a0755..0000000
--- a/windows/runner/CMakeLists.txt:Zone.Identifier
+++ /dev/null
@@ -1,3 +0,0 @@
-[ZoneTransfer]
-ZoneId=3
-ReferrerUrl=C:\Users\juana\Flutter\flutter_windows_3.22.2-stable.zip
diff --git a/windows/runner/flutter_window.cpp:Zone.Identifier b/windows/runner/flutter_window.cpp:Zone.Identifier
deleted file mode 100644
index b0a0755..0000000
--- a/windows/runner/flutter_window.cpp:Zone.Identifier
+++ /dev/null
@@ -1,3 +0,0 @@
-[ZoneTransfer]
-ZoneId=3
-ReferrerUrl=C:\Users\juana\Flutter\flutter_windows_3.22.2-stable.zip
diff --git a/windows/runner/flutter_window.h:Zone.Identifier b/windows/runner/flutter_window.h:Zone.Identifier
deleted file mode 100644
index b0a0755..0000000
--- a/windows/runner/flutter_window.h:Zone.Identifier
+++ /dev/null
@@ -1,3 +0,0 @@
-[ZoneTransfer]
-ZoneId=3
-ReferrerUrl=C:\Users\juana\Flutter\flutter_windows_3.22.2-stable.zip
diff --git a/windows/runner/resource.h:Zone.Identifier b/windows/runner/resource.h:Zone.Identifier
deleted file mode 100644
index b0a0755..0000000
--- a/windows/runner/resource.h:Zone.Identifier
+++ /dev/null
@@ -1,3 +0,0 @@
-[ZoneTransfer]
-ZoneId=3
-ReferrerUrl=C:\Users\juana\Flutter\flutter_windows_3.22.2-stable.zip
diff --git a/windows/runner/runner.exe.manifest:Zone.Identifier b/windows/runner/runner.exe.manifest:Zone.Identifier
deleted file mode 100644
index b0a0755..0000000
--- a/windows/runner/runner.exe.manifest:Zone.Identifier
+++ /dev/null
@@ -1,3 +0,0 @@
-[ZoneTransfer]
-ZoneId=3
-ReferrerUrl=C:\Users\juana\Flutter\flutter_windows_3.22.2-stable.zip
diff --git a/windows/runner/utils.cpp:Zone.Identifier b/windows/runner/utils.cpp:Zone.Identifier
deleted file mode 100644
index b0a0755..0000000
--- a/windows/runner/utils.cpp:Zone.Identifier
+++ /dev/null
@@ -1,3 +0,0 @@
-[ZoneTransfer]
-ZoneId=3
-ReferrerUrl=C:\Users\juana\Flutter\flutter_windows_3.22.2-stable.zip
diff --git a/windows/runner/utils.h:Zone.Identifier b/windows/runner/utils.h:Zone.Identifier
deleted file mode 100644
index b0a0755..0000000
--- a/windows/runner/utils.h:Zone.Identifier
+++ /dev/null
@@ -1,3 +0,0 @@
-[ZoneTransfer]
-ZoneId=3
-ReferrerUrl=C:\Users\juana\Flutter\flutter_windows_3.22.2-stable.zip
diff --git a/windows/runner/win32_window.cpp:Zone.Identifier b/windows/runner/win32_window.cpp:Zone.Identifier
deleted file mode 100644
index b0a0755..0000000
--- a/windows/runner/win32_window.cpp:Zone.Identifier
+++ /dev/null
@@ -1,3 +0,0 @@
-[ZoneTransfer]
-ZoneId=3
-ReferrerUrl=C:\Users\juana\Flutter\flutter_windows_3.22.2-stable.zip
diff --git a/windows/runner/win32_window.h:Zone.Identifier b/windows/runner/win32_window.h:Zone.Identifier
deleted file mode 100644
index b0a0755..0000000
--- a/windows/runner/win32_window.h:Zone.Identifier
+++ /dev/null
@@ -1,3 +0,0 @@
-[ZoneTransfer]
-ZoneId=3
-ReferrerUrl=C:\Users\juana\Flutter\flutter_windows_3.22.2-stable.zip