added resulting listview for when emails are searched, (when each individual email is clicked it is not applied)
This commit is contained in:
parent
36c161cb55
commit
61c91b633b
@ -67,20 +67,34 @@ class ApiService {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<List<String>> sonicSearch(
|
Future<List<SerializableMessage>> sonicSearch(
|
||||||
String list, int limit, int offset, String query) async {
|
String list, int limit, int offset, String query) async {
|
||||||
try {
|
try {
|
||||||
var url = Uri.http('127.0.0.1:3001', 'search',
|
var url = Uri.http('127.0.0.1:3001', 'search', {
|
||||||
{'list': list, 'limit': limit.toString(), 'offset': offset.toString(), 'query': query});
|
'list': list,
|
||||||
|
'limit': limit.toString(),
|
||||||
|
'offset': offset.toString(),
|
||||||
|
'query': query
|
||||||
|
});
|
||||||
var response = await http.get(url);
|
var response = await http.get(url);
|
||||||
|
|
||||||
if (response.statusCode == 200) {
|
if (response.statusCode == 200) {
|
||||||
List<String> matches = List<String>.from(json.decode(response.body));
|
List<dynamic> messagesJson = json.decode(response.body);
|
||||||
print(matches);
|
List<SerializableMessage> messages =
|
||||||
return matches;
|
messagesJson.map((mj) => SerializableMessage.fromJson(mj)).toList();
|
||||||
|
|
||||||
|
// messages[0].id;
|
||||||
|
// List<SerializableMessage> messages =
|
||||||
|
// List<SerializableMessage>.from(json.decode(response.body));
|
||||||
|
// List<SerializableMessage> messages =
|
||||||
|
// - messagesJson.map((mj) => SerializableMessage.fromJson(mj)).toList();
|
||||||
|
// print("above mess");
|
||||||
|
|
||||||
|
print(messages[0].uid);
|
||||||
|
return messages;
|
||||||
}
|
}
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
print(e);
|
print("caught $e");
|
||||||
}
|
}
|
||||||
return [];
|
return [];
|
||||||
}
|
}
|
||||||
|
@ -1,8 +1,10 @@
|
|||||||
import 'package:crab_ui/folder_drawer.dart';
|
import 'package:crab_ui/folder_drawer.dart';
|
||||||
|
import 'package:crab_ui/structs.dart';
|
||||||
import 'package:flutter/widgets.dart';
|
import 'package:flutter/widgets.dart';
|
||||||
import 'api_service.dart';
|
import 'api_service.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'email.dart';
|
import 'email.dart';
|
||||||
|
// import 'serialize.dart';
|
||||||
|
|
||||||
class HomeScreen extends StatefulWidget {
|
class HomeScreen extends StatefulWidget {
|
||||||
@override
|
@override
|
||||||
@ -34,8 +36,7 @@ class _HomeScreenState extends State<HomeScreen> with TickerProviderStateMixin {
|
|||||||
setState(() {
|
setState(() {
|
||||||
if (!_tabs.contains(query)) {
|
if (!_tabs.contains(query)) {
|
||||||
_tabs.add(query);
|
_tabs.add(query);
|
||||||
_tabWidgets[query] = _buildSearchResultsWidget(
|
_tabWidgets[query] = _buildSearchResultsWidget(query); // Store a different widget for this tab
|
||||||
query); // Store a different widget for this tab
|
|
||||||
_tabController = TabController(length: _tabs.length, vsync: this);
|
_tabController = TabController(length: _tabs.length, vsync: this);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@ -56,16 +57,91 @@ class _HomeScreenState extends State<HomeScreen> with TickerProviderStateMixin {
|
|||||||
|
|
||||||
// Build a custom widget for each search query
|
// Build a custom widget for each search query
|
||||||
Widget _buildSearchResultsWidget(String query) {
|
Widget _buildSearchResultsWidget(String query) {
|
||||||
return Center(
|
// Future<List<SerializableMessage>> result = apiService.sonicSearch("INBOX", 10, 0, query);
|
||||||
child: Column(
|
// return Center(
|
||||||
mainAxisAlignment: MainAxisAlignment.center,
|
// child: Column(
|
||||||
children: [
|
// mainAxisAlignment: MainAxisAlignment.center,
|
||||||
Text("Results for: $query", style: TextStyle(fontSize: 24)),
|
// children: [
|
||||||
// You can add a list or any custom widget here
|
// // Text("Results for: $query", style: TextStyle(fontSize: 24)),
|
||||||
Text("Here you can display search results or other content."),
|
// // // You can add a list or any custom widget here
|
||||||
],
|
// // Text("Here you can display search results or other content."),
|
||||||
),
|
// // Text(result[0].messages.toString()),
|
||||||
);
|
// Text(query),
|
||||||
|
// Text(result[0].name),
|
||||||
|
// ],
|
||||||
|
// ),
|
||||||
|
// );
|
||||||
|
return FutureBuilder<List<SerializableMessage>>(
|
||||||
|
future: apiService.sonicSearch("INBOX", 10, 0, query),
|
||||||
|
builder: (BuildContext context, AsyncSnapshot<List<SerializableMessage>> 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<SerializableMessage> result = snapshot.data!;
|
||||||
|
return Scaffold(
|
||||||
|
body: ListView.separated(
|
||||||
|
itemCount: result.length,
|
||||||
|
itemBuilder: (context, index){
|
||||||
|
final 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 {
|
||||||
|
String emailContent = await apiService.fetchEmailContent(email.id as List<String>);
|
||||||
|
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
|
@override
|
||||||
@ -84,31 +160,7 @@ class _HomeScreenState extends State<HomeScreen> with TickerProviderStateMixin {
|
|||||||
_emailPageKey.currentState?.updateSelectedFolder(folder);
|
_emailPageKey.currentState?.updateSelectedFolder(folder);
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
// appBar: AppBar(
|
|
||||||
// title: Text('Search with Tabs'),
|
|
||||||
// bottom: _tabs.isNotEmpty
|
|
||||||
// ? TabBar(
|
|
||||||
// controller: _tabController,
|
|
||||||
// isScrollable: true,
|
|
||||||
// tabs: _tabs
|
|
||||||
// .asMap()
|
|
||||||
// .entries
|
|
||||||
// .map((entry) => Tab(
|
|
||||||
// child: Row(
|
|
||||||
// children: [
|
|
||||||
// Text(entry.value),
|
|
||||||
// SizedBox(width: 8),
|
|
||||||
// GestureDetector(
|
|
||||||
// onTap: () => _removeTab(entry.key),
|
|
||||||
// child: Icon(Icons.close, size: 16),
|
|
||||||
// ),
|
|
||||||
// ],
|
|
||||||
// ),
|
|
||||||
// ))
|
|
||||||
// .toList(),
|
|
||||||
// )
|
|
||||||
// : null,
|
|
||||||
// ),
|
|
||||||
body: Stack(
|
body: Stack(
|
||||||
children: [
|
children: [
|
||||||
Row(
|
Row(
|
||||||
@ -264,7 +316,7 @@ class _HomeScreenState extends State<HomeScreen> with TickerProviderStateMixin {
|
|||||||
controller: _tabController,
|
controller: _tabController,
|
||||||
children: _tabs.map((tab) {
|
children: _tabs.map((tab) {
|
||||||
return _tabWidgets[tab] ??
|
return _tabWidgets[tab] ??
|
||||||
Center(child: Text("No content found"));
|
Center(child: Text("No content found"));
|
||||||
// return Center(
|
// return Center(
|
||||||
// child: EmailPage(
|
// child: EmailPage(
|
||||||
// key: _emailPageKey,
|
// key: _emailPageKey,
|
||||||
|
85
lib/serialize.dart
Normal file
85
lib/serialize.dart
Normal file
@ -0,0 +1,85 @@
|
|||||||
|
import 'package:flutter/material.dart';
|
||||||
|
import 'api_service.dart';
|
||||||
|
import 'structs.dart';
|
||||||
|
|
||||||
|
class SerializableMessageListScreen extends StatefulWidget {
|
||||||
|
@override
|
||||||
|
_SerializableMessageListScreenState createState() => _SerializableMessageListScreenState();
|
||||||
|
}
|
||||||
|
|
||||||
|
class _SerializableMessageListScreenState extends State<SerializableMessageListScreen> {
|
||||||
|
List<SerializableMessage>? messages;
|
||||||
|
bool isLoading = true;
|
||||||
|
bool hasError = false;
|
||||||
|
|
||||||
|
final ApiService apiService = ApiService();
|
||||||
|
|
||||||
|
@override
|
||||||
|
void initState() {
|
||||||
|
super.initState();
|
||||||
|
_fetchMessages();
|
||||||
|
}
|
||||||
|
|
||||||
|
Future<void> _fetchMessages() async {
|
||||||
|
try {
|
||||||
|
List<SerializableMessage> 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]);
|
||||||
|
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(),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
@ -52,52 +52,52 @@ class MailAddress {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
// //old data structure
|
// //old data structure
|
||||||
// class SerializableMessage {
|
class SerializableMessage {
|
||||||
// final String name;
|
final String name;
|
||||||
// final String from;
|
final String from;
|
||||||
// final List<MailAddress> to;
|
final List<MailAddress> to;
|
||||||
// final List<MailAddress> cc;
|
final List<MailAddress> cc;
|
||||||
// final String hash;
|
final String hash;
|
||||||
|
|
||||||
// final String subject;
|
final String subject;
|
||||||
// final String date;
|
final String date;
|
||||||
// final int uid;
|
final int uid;
|
||||||
// final String list;
|
final String list;
|
||||||
// final String id;
|
final String id;
|
||||||
// final String in_reply_to;
|
final String in_reply_to;
|
||||||
|
|
||||||
// SerializableMessage({
|
SerializableMessage({
|
||||||
// required this.name,
|
required this.name,
|
||||||
// required this.from,
|
required this.from,
|
||||||
// required this.to,
|
required this.to,
|
||||||
// required this.cc,
|
required this.cc,
|
||||||
// required this.hash,
|
required this.hash,
|
||||||
// required this.subject,
|
required this.subject,
|
||||||
// required this.date,
|
required this.date,
|
||||||
// required this.uid,
|
required this.uid,
|
||||||
// required this.list,
|
required this.list,
|
||||||
// required this.id,
|
required this.id,
|
||||||
// required this.in_reply_to,
|
required this.in_reply_to,
|
||||||
// });
|
});
|
||||||
|
|
||||||
// factory SerializableMessage.fromJson(Map<String, dynamic> json) {
|
factory SerializableMessage.fromJson(Map<String, dynamic> json) {
|
||||||
// var toList = json['to'] as List;
|
var toList = json['to'] as List;
|
||||||
// var ccList = json['cc'] as List;
|
var ccList = json['cc'] as List;
|
||||||
|
|
||||||
// return SerializableMessage(
|
return SerializableMessage(
|
||||||
// name: json['name'],
|
name: json['name'],
|
||||||
// from: json['from'],
|
from: json['from'],
|
||||||
// // to: json['name', 'address']
|
// to: json['name', 'address']
|
||||||
// to: toList.map((i) => MailAddress.fromJson(i)).toList(),
|
to: toList.map((i) => MailAddress.fromJson(i)).toList(),
|
||||||
// cc: ccList.map((i) => MailAddress.fromJson(i)).toList(),
|
cc: ccList.map((i) => MailAddress.fromJson(i)).toList(),
|
||||||
// // path: json['path'],
|
// path: json['path'],
|
||||||
// hash: json['hash'],
|
hash: json['hash'],
|
||||||
// subject: json['subject'],
|
subject: json['subject'],
|
||||||
// date: json['date'],
|
date: json['date'],
|
||||||
// uid: json['uid'],
|
uid: json['uid'],
|
||||||
// list: json['list'],
|
list: json['list'],
|
||||||
// id: json['id'],
|
id: json['id'],
|
||||||
// in_reply_to: json['in_reply_to'],
|
in_reply_to: json['in_reply_to'],
|
||||||
// );
|
);
|
||||||
// }
|
}
|
||||||
// }
|
}
|
Loading…
Reference in New Issue
Block a user