feat: replace mail protocol with smolmail and rebuild the UI
This commit is contained in:
parent
cb24b68069
commit
e94e4158cc
93 changed files with 6387 additions and 3479 deletions
|
|
@ -1,40 +1,57 @@
|
|||
import "package:flutter_riverpod/flutter_riverpod.dart";
|
||||
import "package:dio/dio.dart";
|
||||
|
||||
import "package:flash_mail/data/api/api_client.dart";
|
||||
import "package:flash_mail/data/models/message/message.dart";
|
||||
import "package:flash_mail/data/models/message_detail/message_detail.dart";
|
||||
import "package:flash_mail/data/notifiers/account_notifier.dart";
|
||||
import "package:smol_mail/smol/client.dart";
|
||||
import "package:smol_mail/smol/proto.dart";
|
||||
import "package:smol_mail/smol/store.dart";
|
||||
|
||||
final emailProvider = StateProvider<String?>((ref) => null);
|
||||
final passwordProvider = StateProvider<String?>((ref) => null);
|
||||
/// Overridden in main() with the Hive-backed store opened at boot.
|
||||
final storeProvider = Provider<SmolStore>((ref) => throw UnimplementedError());
|
||||
|
||||
final dioProvider = Provider<Dio>(
|
||||
(ref) => Dio(
|
||||
BaseOptions(
|
||||
baseUrl: "https://api.mail.tm",
|
||||
connectTimeout: 2000,
|
||||
),
|
||||
),
|
||||
final clientProvider = Provider<SmolClient>(
|
||||
(ref) => SmolClient(ref.watch(storeProvider)),
|
||||
);
|
||||
|
||||
final clientProvider = Provider<ApiClient>(
|
||||
(ref) => ApiClient(ref.read(dioProvider), ref),
|
||||
);
|
||||
/// Hive gives no change notifications; every mail or state mutation bumps this,
|
||||
/// which is what the list, badge, identity and account providers watch.
|
||||
class Revision extends Notifier<int> {
|
||||
@override
|
||||
int build() => 0;
|
||||
|
||||
final accountProvider = StateNotifierProvider<AccountNotifier, AccountState>(
|
||||
(ref) => AccountNotifier(ref),
|
||||
);
|
||||
void bump() => state++;
|
||||
}
|
||||
|
||||
final tokenProvider = StateProvider<String?>((ref) => null);
|
||||
final revisionProvider = NotifierProvider<Revision, int>(Revision.new);
|
||||
|
||||
final messagesProvider = FutureProvider.autoDispose<List<TMMessage>>((ref) {
|
||||
final email = ref.read(emailProvider);
|
||||
final password = ref.read(passwordProvider);
|
||||
|
||||
return ref.read(clientProvider).fetchMessages(email!, password!);
|
||||
final identityProvider = Provider<SmolIdentity?>((ref) {
|
||||
ref.watch(revisionProvider);
|
||||
return ref.watch(storeProvider).identity();
|
||||
});
|
||||
|
||||
final messageDetailProvider = FutureProvider.family<TMMessageDetail, String>(
|
||||
(ref, id) => ref.read(clientProvider).fetchMessageDetail(id),
|
||||
);
|
||||
final accountProvider = Provider<SmolAddress?>((ref) {
|
||||
ref.watch(revisionProvider);
|
||||
return ref.watch(clientProvider).accountAddress();
|
||||
});
|
||||
|
||||
class Folder extends Notifier<String> {
|
||||
@override
|
||||
String build() => "inbox";
|
||||
|
||||
void select(String folder) => state = folder;
|
||||
}
|
||||
|
||||
final folderProvider = NotifierProvider<Folder, String>(Folder.new);
|
||||
|
||||
final messagesProvider = Provider<List<MailRecord>>((ref) {
|
||||
ref.watch(revisionProvider);
|
||||
return ref.watch(storeProvider).listMessages(ref.watch(folderProvider));
|
||||
});
|
||||
|
||||
final unreadProvider = Provider<int>((ref) {
|
||||
ref.watch(revisionProvider);
|
||||
return ref.watch(storeProvider).unreadCount();
|
||||
});
|
||||
|
||||
final contactsProvider = Provider<List<(String, StoredContact)>>((ref) {
|
||||
ref.watch(revisionProvider);
|
||||
return ref.watch(storeProvider).allContacts();
|
||||
});
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue