increase min sdk and apply new formatter
This commit is contained in:
@@ -2,30 +2,24 @@ import 'package:exceptions/exceptions.dart';
|
||||
import 'package:http/http.dart';
|
||||
import 'package:universal_io/io.dart';
|
||||
|
||||
ErrorMessage handleHttpError(
|
||||
Exception exception,
|
||||
StackTrace stackTrace,
|
||||
) {
|
||||
ErrorMessage handleHttpError(Exception exception, StackTrace stackTrace) {
|
||||
return switch (exception) {
|
||||
SocketException() => const ErrorMessage(
|
||||
source: 'http',
|
||||
message: 'Could not contact remote service',
|
||||
),
|
||||
source: 'http',
|
||||
message: 'Could not contact remote service',
|
||||
),
|
||||
HttpException() => const ErrorMessage(
|
||||
source: 'http',
|
||||
message: 'Web request returned error',
|
||||
),
|
||||
source: 'http',
|
||||
message: 'Web request returned error',
|
||||
),
|
||||
FormatException() => const ErrorMessage(
|
||||
source: 'http',
|
||||
message: 'Bad response format',
|
||||
),
|
||||
source: 'http',
|
||||
message: 'Bad response format',
|
||||
),
|
||||
ClientException() => const ErrorMessage(
|
||||
source: 'http',
|
||||
message: 'Could not contact remote service',
|
||||
),
|
||||
_ => ErrorMessage.fromException(
|
||||
exception,
|
||||
stackTrace,
|
||||
)
|
||||
source: 'http',
|
||||
message: 'Could not contact remote service',
|
||||
),
|
||||
_ => ErrorMessage.fromException(exception, stackTrace),
|
||||
};
|
||||
}
|
||||
|
||||
@@ -29,9 +29,10 @@ String _$embeddingModelHash() => r'40111a5f08b43afe6edd399ff0e6c022b3387265';
|
||||
final embeddingModelProvider = Provider<OpenAIEmbeddings>.internal(
|
||||
embeddingModel,
|
||||
name: r'embeddingModelProvider',
|
||||
debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product')
|
||||
? null
|
||||
: _$embeddingModelHash,
|
||||
debugGetCreateSourceHash:
|
||||
const bool.fromEnvironment('dart.vm.product')
|
||||
? null
|
||||
: _$embeddingModelHash,
|
||||
dependencies: null,
|
||||
allTransitiveDependencies: null,
|
||||
);
|
||||
@@ -47,9 +48,10 @@ String _$embeddingDimensionsHash() =>
|
||||
final embeddingDimensionsProvider = Provider<int>.internal(
|
||||
embeddingDimensions,
|
||||
name: r'embeddingDimensionsProvider',
|
||||
debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product')
|
||||
? null
|
||||
: _$embeddingDimensionsHash,
|
||||
debugGetCreateSourceHash:
|
||||
const bool.fromEnvironment('dart.vm.product')
|
||||
? null
|
||||
: _$embeddingDimensionsHash,
|
||||
dependencies: null,
|
||||
allTransitiveDependencies: null,
|
||||
);
|
||||
|
||||
@@ -8,10 +8,7 @@ part 'providers.g.dart';
|
||||
|
||||
@Riverpod(keepAlive: true)
|
||||
GoRouter router(Ref ref) {
|
||||
return GoRouter(
|
||||
debugLogDiagnostics: true,
|
||||
routes: $appRoutes,
|
||||
);
|
||||
return GoRouter(debugLogDiagnostics: true, routes: $appRoutes);
|
||||
}
|
||||
|
||||
@Riverpod()
|
||||
|
||||
@@ -28,14 +28,15 @@ String _$willAcceptDropHash() => r'97b47784ef9101757602b4408d1f545ef2308830';
|
||||
@ProviderFor(WillAcceptDrop)
|
||||
final willAcceptDropProvider =
|
||||
AutoDisposeNotifierProvider<WillAcceptDrop, DropTargetData?>.internal(
|
||||
WillAcceptDrop.new,
|
||||
name: r'willAcceptDropProvider',
|
||||
debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product')
|
||||
? null
|
||||
: _$willAcceptDropHash,
|
||||
dependencies: null,
|
||||
allTransitiveDependencies: null,
|
||||
);
|
||||
WillAcceptDrop.new,
|
||||
name: r'willAcceptDropProvider',
|
||||
debugGetCreateSourceHash:
|
||||
const bool.fromEnvironment('dart.vm.product')
|
||||
? null
|
||||
: _$willAcceptDropHash,
|
||||
dependencies: null,
|
||||
allTransitiveDependencies: null,
|
||||
);
|
||||
|
||||
typedef _$WillAcceptDrop = AutoDisposeNotifier<DropTargetData?>;
|
||||
// ignore_for_file: type=lint
|
||||
|
||||
@@ -27,14 +27,14 @@ class DialogPage<T> extends Page<T> {
|
||||
|
||||
@override
|
||||
Route<T> createRoute(BuildContext context) => DialogRoute<T>(
|
||||
context: context,
|
||||
settings: this,
|
||||
builder: builder,
|
||||
anchorPoint: anchorPoint,
|
||||
barrierColor: barrierColor,
|
||||
barrierDismissible: barrierDismissible,
|
||||
barrierLabel: barrierLabel,
|
||||
useSafeArea: useSafeArea,
|
||||
themes: themes,
|
||||
);
|
||||
context: context,
|
||||
settings: this,
|
||||
builder: builder,
|
||||
anchorPoint: anchorPoint,
|
||||
barrierColor: barrierColor,
|
||||
barrierDismissible: barrierDismissible,
|
||||
barrierLabel: barrierLabel,
|
||||
useSafeArea: useSafeArea,
|
||||
themes: themes,
|
||||
);
|
||||
}
|
||||
|
||||
@@ -30,22 +30,10 @@ part 'routes.g.dart';
|
||||
name: 'BrowserRoute',
|
||||
path: '/',
|
||||
routes: [
|
||||
TypedGoRoute<WebPageRoute>(
|
||||
name: 'WebPageRoute',
|
||||
path: 'page/:url',
|
||||
),
|
||||
TypedGoRoute<AboutRoute>(
|
||||
name: 'AboutRoute',
|
||||
path: 'about',
|
||||
),
|
||||
TypedGoRoute<UserAuthRoute>(
|
||||
name: 'UserAuthRoute',
|
||||
path: 'userAuth',
|
||||
),
|
||||
TypedGoRoute<SearchRoute>(
|
||||
name: 'SearchRoute',
|
||||
path: 'search/:searchText',
|
||||
),
|
||||
TypedGoRoute<WebPageRoute>(name: 'WebPageRoute', path: 'page/:url'),
|
||||
TypedGoRoute<AboutRoute>(name: 'AboutRoute', path: 'about'),
|
||||
TypedGoRoute<UserAuthRoute>(name: 'UserAuthRoute', path: 'userAuth'),
|
||||
TypedGoRoute<SearchRoute>(name: 'SearchRoute', path: 'search/:searchText'),
|
||||
TypedGoRoute<BangCategoriesRoute>(
|
||||
name: 'BangRoute',
|
||||
path: 'bangs',
|
||||
@@ -97,10 +85,11 @@ class WebPageRoute extends GoRouteData {
|
||||
@override
|
||||
Page<void> buildPage(BuildContext context, GoRouterState state) {
|
||||
return DialogPage(
|
||||
builder: (_) => WebPageDialog(
|
||||
url: Uri.parse(url),
|
||||
precachedInfo: state.extra as WebPageInfo?,
|
||||
),
|
||||
builder:
|
||||
(_) => WebPageDialog(
|
||||
url: Uri.parse(url),
|
||||
precachedInfo: state.extra as WebPageInfo?,
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -130,9 +119,10 @@ class SearchRoute extends GoRouteData {
|
||||
@override
|
||||
Widget build(BuildContext context, GoRouterState state) {
|
||||
return SearchScreen(
|
||||
initialSearchText: (searchText.isEmpty || searchText == emptySearchText)
|
||||
? null
|
||||
: searchText,
|
||||
initialSearchText:
|
||||
(searchText.isEmpty || searchText == emptySearchText)
|
||||
? null
|
||||
: searchText,
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -181,9 +171,10 @@ class BangSearchRoute extends GoRouteData {
|
||||
@override
|
||||
Widget build(BuildContext context, GoRouterState state) {
|
||||
return BangSearchScreen(
|
||||
initialSearchText: (searchText.isEmpty || searchText == emptySearchText)
|
||||
? null
|
||||
: searchText,
|
||||
initialSearchText:
|
||||
(searchText.isEmpty || searchText == emptySearchText)
|
||||
? null
|
||||
: searchText,
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -221,10 +212,7 @@ class ContainerCreateRoute extends GoRouteData {
|
||||
name: 'GeneralSettingsRoute',
|
||||
path: 'general',
|
||||
),
|
||||
TypedGoRoute<BangSettingsRoute>(
|
||||
name: 'BangSettingsRoute',
|
||||
path: 'bang',
|
||||
),
|
||||
TypedGoRoute<BangSettingsRoute>(name: 'BangSettingsRoute', path: 'bang'),
|
||||
TypedGoRoute<WebEngineSettingsRoute>(
|
||||
name: 'WebEngineSettingsRoute',
|
||||
path: 'web_engine',
|
||||
@@ -328,10 +316,7 @@ class ChatArchiveDetailRoute extends GoRouteData {
|
||||
}
|
||||
}
|
||||
|
||||
@TypedGoRoute<TorProxyRoute>(
|
||||
name: 'TorProxyRoute',
|
||||
path: '/tor_proxy',
|
||||
)
|
||||
@TypedGoRoute<TorProxyRoute>(name: 'TorProxyRoute', path: '/tor_proxy')
|
||||
class TorProxyRoute extends GoRouteData {
|
||||
@override
|
||||
Widget build(BuildContext context, GoRouterState state) {
|
||||
|
||||
+150
-189
@@ -7,87 +7,85 @@ part of 'routes.dart';
|
||||
// **************************************************************************
|
||||
|
||||
List<RouteBase> get $appRoutes => [
|
||||
$browserRoute,
|
||||
$settingsRoute,
|
||||
$chatArchiveListRoute,
|
||||
$torProxyRoute,
|
||||
];
|
||||
$browserRoute,
|
||||
$settingsRoute,
|
||||
$chatArchiveListRoute,
|
||||
$torProxyRoute,
|
||||
];
|
||||
|
||||
RouteBase get $browserRoute => GoRouteData.$route(
|
||||
path: '/',
|
||||
name: 'BrowserRoute',
|
||||
factory: $BrowserRouteExtension._fromState,
|
||||
path: '/',
|
||||
name: 'BrowserRoute',
|
||||
factory: $BrowserRouteExtension._fromState,
|
||||
routes: [
|
||||
GoRouteData.$route(
|
||||
path: 'page/:url',
|
||||
name: 'WebPageRoute',
|
||||
factory: $WebPageRouteExtension._fromState,
|
||||
),
|
||||
GoRouteData.$route(
|
||||
path: 'about',
|
||||
name: 'AboutRoute',
|
||||
factory: $AboutRouteExtension._fromState,
|
||||
),
|
||||
GoRouteData.$route(
|
||||
path: 'userAuth',
|
||||
name: 'UserAuthRoute',
|
||||
factory: $UserAuthRouteExtension._fromState,
|
||||
),
|
||||
GoRouteData.$route(
|
||||
path: 'search/:searchText',
|
||||
name: 'SearchRoute',
|
||||
factory: $SearchRouteExtension._fromState,
|
||||
),
|
||||
GoRouteData.$route(
|
||||
path: 'bangs',
|
||||
name: 'BangRoute',
|
||||
factory: $BangCategoriesRouteExtension._fromState,
|
||||
routes: [
|
||||
GoRouteData.$route(
|
||||
path: 'page/:url',
|
||||
name: 'WebPageRoute',
|
||||
factory: $WebPageRouteExtension._fromState,
|
||||
),
|
||||
GoRouteData.$route(
|
||||
path: 'about',
|
||||
name: 'AboutRoute',
|
||||
factory: $AboutRouteExtension._fromState,
|
||||
),
|
||||
GoRouteData.$route(
|
||||
path: 'userAuth',
|
||||
name: 'UserAuthRoute',
|
||||
factory: $UserAuthRouteExtension._fromState,
|
||||
),
|
||||
GoRouteData.$route(
|
||||
path: 'search/:searchText',
|
||||
name: 'SearchRoute',
|
||||
factory: $SearchRouteExtension._fromState,
|
||||
name: 'BangSearchRoute',
|
||||
factory: $BangSearchRouteExtension._fromState,
|
||||
),
|
||||
GoRouteData.$route(
|
||||
path: 'bangs',
|
||||
name: 'BangRoute',
|
||||
factory: $BangCategoriesRouteExtension._fromState,
|
||||
path: 'category/:category',
|
||||
name: 'BangCategoryRoute',
|
||||
factory: $BangCategoryRouteExtension._fromState,
|
||||
routes: [
|
||||
GoRouteData.$route(
|
||||
path: 'search/:searchText',
|
||||
name: 'BangSearchRoute',
|
||||
factory: $BangSearchRouteExtension._fromState,
|
||||
),
|
||||
GoRouteData.$route(
|
||||
path: 'category/:category',
|
||||
name: 'BangCategoryRoute',
|
||||
factory: $BangCategoryRouteExtension._fromState,
|
||||
routes: [
|
||||
GoRouteData.$route(
|
||||
path: ':subCategory',
|
||||
name: 'BangSubCategoryRoute',
|
||||
factory: $BangSubCategoryRouteExtension._fromState,
|
||||
),
|
||||
],
|
||||
),
|
||||
],
|
||||
),
|
||||
GoRouteData.$route(
|
||||
path: 'containers',
|
||||
name: 'ContainerListRoute',
|
||||
factory: $ContainerListRouteExtension._fromState,
|
||||
routes: [
|
||||
GoRouteData.$route(
|
||||
path: 'create',
|
||||
name: 'ContainerCreateRoute',
|
||||
factory: $ContainerCreateRouteExtension._fromState,
|
||||
),
|
||||
GoRouteData.$route(
|
||||
path: 'edit',
|
||||
name: 'ContainerEditRoute',
|
||||
factory: $ContainerEditRouteExtension._fromState,
|
||||
path: ':subCategory',
|
||||
name: 'BangSubCategoryRoute',
|
||||
factory: $BangSubCategoryRouteExtension._fromState,
|
||||
),
|
||||
],
|
||||
),
|
||||
],
|
||||
);
|
||||
),
|
||||
GoRouteData.$route(
|
||||
path: 'containers',
|
||||
name: 'ContainerListRoute',
|
||||
factory: $ContainerListRouteExtension._fromState,
|
||||
routes: [
|
||||
GoRouteData.$route(
|
||||
path: 'create',
|
||||
name: 'ContainerCreateRoute',
|
||||
factory: $ContainerCreateRouteExtension._fromState,
|
||||
),
|
||||
GoRouteData.$route(
|
||||
path: 'edit',
|
||||
name: 'ContainerEditRoute',
|
||||
factory: $ContainerEditRouteExtension._fromState,
|
||||
),
|
||||
],
|
||||
),
|
||||
],
|
||||
);
|
||||
|
||||
extension $BrowserRouteExtension on BrowserRoute {
|
||||
static BrowserRoute _fromState(GoRouterState state) => BrowserRoute();
|
||||
|
||||
String get location => GoRouteData.$location(
|
||||
'/',
|
||||
);
|
||||
String get location => GoRouteData.$location('/');
|
||||
|
||||
void go(BuildContext context) => context.go(location);
|
||||
|
||||
@@ -100,13 +98,11 @@ extension $BrowserRouteExtension on BrowserRoute {
|
||||
}
|
||||
|
||||
extension $WebPageRouteExtension on WebPageRoute {
|
||||
static WebPageRoute _fromState(GoRouterState state) => WebPageRoute(
|
||||
url: state.pathParameters['url']!,
|
||||
);
|
||||
static WebPageRoute _fromState(GoRouterState state) =>
|
||||
WebPageRoute(url: state.pathParameters['url']!);
|
||||
|
||||
String get location => GoRouteData.$location(
|
||||
'/page/${Uri.encodeComponent(url)}',
|
||||
);
|
||||
String get location =>
|
||||
GoRouteData.$location('/page/${Uri.encodeComponent(url)}');
|
||||
|
||||
void go(BuildContext context) => context.go(location);
|
||||
|
||||
@@ -121,9 +117,7 @@ extension $WebPageRouteExtension on WebPageRoute {
|
||||
extension $AboutRouteExtension on AboutRoute {
|
||||
static AboutRoute _fromState(GoRouterState state) => AboutRoute();
|
||||
|
||||
String get location => GoRouteData.$location(
|
||||
'/about',
|
||||
);
|
||||
String get location => GoRouteData.$location('/about');
|
||||
|
||||
void go(BuildContext context) => context.go(location);
|
||||
|
||||
@@ -138,9 +132,7 @@ extension $AboutRouteExtension on AboutRoute {
|
||||
extension $UserAuthRouteExtension on UserAuthRoute {
|
||||
static UserAuthRoute _fromState(GoRouterState state) => UserAuthRoute();
|
||||
|
||||
String get location => GoRouteData.$location(
|
||||
'/userAuth',
|
||||
);
|
||||
String get location => GoRouteData.$location('/userAuth');
|
||||
|
||||
void go(BuildContext context) => context.go(location);
|
||||
|
||||
@@ -154,13 +146,12 @@ extension $UserAuthRouteExtension on UserAuthRoute {
|
||||
|
||||
extension $SearchRouteExtension on SearchRoute {
|
||||
static SearchRoute _fromState(GoRouterState state) => SearchRoute(
|
||||
searchText:
|
||||
state.pathParameters['searchText']! ?? SearchRoute.emptySearchText,
|
||||
);
|
||||
searchText:
|
||||
state.pathParameters['searchText']! ?? SearchRoute.emptySearchText,
|
||||
);
|
||||
|
||||
String get location => GoRouteData.$location(
|
||||
'/search/${Uri.encodeComponent(searchText)}',
|
||||
);
|
||||
String get location =>
|
||||
GoRouteData.$location('/search/${Uri.encodeComponent(searchText)}');
|
||||
|
||||
void go(BuildContext context) => context.go(location);
|
||||
|
||||
@@ -176,9 +167,7 @@ extension $BangCategoriesRouteExtension on BangCategoriesRoute {
|
||||
static BangCategoriesRoute _fromState(GoRouterState state) =>
|
||||
BangCategoriesRoute();
|
||||
|
||||
String get location => GoRouteData.$location(
|
||||
'/bangs',
|
||||
);
|
||||
String get location => GoRouteData.$location('/bangs');
|
||||
|
||||
void go(BuildContext context) => context.go(location);
|
||||
|
||||
@@ -192,13 +181,12 @@ extension $BangCategoriesRouteExtension on BangCategoriesRoute {
|
||||
|
||||
extension $BangSearchRouteExtension on BangSearchRoute {
|
||||
static BangSearchRoute _fromState(GoRouterState state) => BangSearchRoute(
|
||||
searchText: state.pathParameters['searchText']! ??
|
||||
BangSearchRoute.emptySearchText,
|
||||
);
|
||||
searchText:
|
||||
state.pathParameters['searchText']! ?? BangSearchRoute.emptySearchText,
|
||||
);
|
||||
|
||||
String get location => GoRouteData.$location(
|
||||
'/bangs/search/${Uri.encodeComponent(searchText)}',
|
||||
);
|
||||
String get location =>
|
||||
GoRouteData.$location('/bangs/search/${Uri.encodeComponent(searchText)}');
|
||||
|
||||
void go(BuildContext context) => context.go(location);
|
||||
|
||||
@@ -211,13 +199,11 @@ extension $BangSearchRouteExtension on BangSearchRoute {
|
||||
}
|
||||
|
||||
extension $BangCategoryRouteExtension on BangCategoryRoute {
|
||||
static BangCategoryRoute _fromState(GoRouterState state) => BangCategoryRoute(
|
||||
category: state.pathParameters['category']!,
|
||||
);
|
||||
static BangCategoryRoute _fromState(GoRouterState state) =>
|
||||
BangCategoryRoute(category: state.pathParameters['category']!);
|
||||
|
||||
String get location => GoRouteData.$location(
|
||||
'/bangs/category/${Uri.encodeComponent(category)}',
|
||||
);
|
||||
String get location =>
|
||||
GoRouteData.$location('/bangs/category/${Uri.encodeComponent(category)}');
|
||||
|
||||
void go(BuildContext context) => context.go(location);
|
||||
|
||||
@@ -237,8 +223,8 @@ extension $BangSubCategoryRouteExtension on BangSubCategoryRoute {
|
||||
);
|
||||
|
||||
String get location => GoRouteData.$location(
|
||||
'/bangs/category/${Uri.encodeComponent(category)}/${Uri.encodeComponent(subCategory)}',
|
||||
);
|
||||
'/bangs/category/${Uri.encodeComponent(category)}/${Uri.encodeComponent(subCategory)}',
|
||||
);
|
||||
|
||||
void go(BuildContext context) => context.go(location);
|
||||
|
||||
@@ -254,9 +240,7 @@ extension $ContainerListRouteExtension on ContainerListRoute {
|
||||
static ContainerListRoute _fromState(GoRouterState state) =>
|
||||
ContainerListRoute();
|
||||
|
||||
String get location => GoRouteData.$location(
|
||||
'/containers',
|
||||
);
|
||||
String get location => GoRouteData.$location('/containers');
|
||||
|
||||
void go(BuildContext context) => context.go(location);
|
||||
|
||||
@@ -272,9 +256,7 @@ extension $ContainerCreateRouteExtension on ContainerCreateRoute {
|
||||
static ContainerCreateRoute _fromState(GoRouterState state) =>
|
||||
ContainerCreateRoute();
|
||||
|
||||
String get location => GoRouteData.$location(
|
||||
'/containers/create',
|
||||
);
|
||||
String get location => GoRouteData.$location('/containers/create');
|
||||
|
||||
void go(BuildContext context) => context.go(location);
|
||||
|
||||
@@ -290,9 +272,7 @@ extension $ContainerEditRouteExtension on ContainerEditRoute {
|
||||
static ContainerEditRoute _fromState(GoRouterState state) =>
|
||||
ContainerEditRoute();
|
||||
|
||||
String get location => GoRouteData.$location(
|
||||
'/containers/edit',
|
||||
);
|
||||
String get location => GoRouteData.$location('/containers/edit');
|
||||
|
||||
void go(BuildContext context) => context.go(location);
|
||||
|
||||
@@ -305,48 +285,46 @@ extension $ContainerEditRouteExtension on ContainerEditRoute {
|
||||
}
|
||||
|
||||
RouteBase get $settingsRoute => GoRouteData.$route(
|
||||
path: '/settings',
|
||||
name: 'SettingsRoute',
|
||||
factory: $SettingsRouteExtension._fromState,
|
||||
path: '/settings',
|
||||
name: 'SettingsRoute',
|
||||
factory: $SettingsRouteExtension._fromState,
|
||||
routes: [
|
||||
GoRouteData.$route(
|
||||
path: 'general',
|
||||
name: 'GeneralSettingsRoute',
|
||||
factory: $GeneralSettingsRouteExtension._fromState,
|
||||
),
|
||||
GoRouteData.$route(
|
||||
path: 'bang',
|
||||
name: 'BangSettingsRoute',
|
||||
factory: $BangSettingsRouteExtension._fromState,
|
||||
),
|
||||
GoRouteData.$route(
|
||||
path: 'web_engine',
|
||||
name: 'WebEngineSettingsRoute',
|
||||
factory: $WebEngineSettingsRouteExtension._fromState,
|
||||
routes: [
|
||||
GoRouteData.$route(
|
||||
path: 'general',
|
||||
name: 'GeneralSettingsRoute',
|
||||
factory: $GeneralSettingsRouteExtension._fromState,
|
||||
),
|
||||
GoRouteData.$route(
|
||||
path: 'bang',
|
||||
name: 'BangSettingsRoute',
|
||||
factory: $BangSettingsRouteExtension._fromState,
|
||||
),
|
||||
GoRouteData.$route(
|
||||
path: 'web_engine',
|
||||
name: 'WebEngineSettingsRoute',
|
||||
factory: $WebEngineSettingsRouteExtension._fromState,
|
||||
path: 'hardening',
|
||||
name: 'WebEngineHardeningRoute',
|
||||
factory: $WebEngineHardeningRouteExtension._fromState,
|
||||
routes: [
|
||||
GoRouteData.$route(
|
||||
path: 'hardening',
|
||||
name: 'WebEngineHardeningRoute',
|
||||
factory: $WebEngineHardeningRouteExtension._fromState,
|
||||
routes: [
|
||||
GoRouteData.$route(
|
||||
path: 'group/:group',
|
||||
name: 'WebEngineHardeningGroupRoute',
|
||||
factory: $WebEngineHardeningGroupRouteExtension._fromState,
|
||||
),
|
||||
],
|
||||
path: 'group/:group',
|
||||
name: 'WebEngineHardeningGroupRoute',
|
||||
factory: $WebEngineHardeningGroupRouteExtension._fromState,
|
||||
),
|
||||
],
|
||||
),
|
||||
],
|
||||
);
|
||||
),
|
||||
],
|
||||
);
|
||||
|
||||
extension $SettingsRouteExtension on SettingsRoute {
|
||||
static SettingsRoute _fromState(GoRouterState state) => SettingsRoute();
|
||||
|
||||
String get location => GoRouteData.$location(
|
||||
'/settings',
|
||||
);
|
||||
String get location => GoRouteData.$location('/settings');
|
||||
|
||||
void go(BuildContext context) => context.go(location);
|
||||
|
||||
@@ -362,9 +340,7 @@ extension $GeneralSettingsRouteExtension on GeneralSettingsRoute {
|
||||
static GeneralSettingsRoute _fromState(GoRouterState state) =>
|
||||
GeneralSettingsRoute();
|
||||
|
||||
String get location => GoRouteData.$location(
|
||||
'/settings/general',
|
||||
);
|
||||
String get location => GoRouteData.$location('/settings/general');
|
||||
|
||||
void go(BuildContext context) => context.go(location);
|
||||
|
||||
@@ -380,9 +356,7 @@ extension $BangSettingsRouteExtension on BangSettingsRoute {
|
||||
static BangSettingsRoute _fromState(GoRouterState state) =>
|
||||
BangSettingsRoute();
|
||||
|
||||
String get location => GoRouteData.$location(
|
||||
'/settings/bang',
|
||||
);
|
||||
String get location => GoRouteData.$location('/settings/bang');
|
||||
|
||||
void go(BuildContext context) => context.go(location);
|
||||
|
||||
@@ -398,9 +372,7 @@ extension $WebEngineSettingsRouteExtension on WebEngineSettingsRoute {
|
||||
static WebEngineSettingsRoute _fromState(GoRouterState state) =>
|
||||
WebEngineSettingsRoute();
|
||||
|
||||
String get location => GoRouteData.$location(
|
||||
'/settings/web_engine',
|
||||
);
|
||||
String get location => GoRouteData.$location('/settings/web_engine');
|
||||
|
||||
void go(BuildContext context) => context.go(location);
|
||||
|
||||
@@ -416,9 +388,8 @@ extension $WebEngineHardeningRouteExtension on WebEngineHardeningRoute {
|
||||
static WebEngineHardeningRoute _fromState(GoRouterState state) =>
|
||||
WebEngineHardeningRoute();
|
||||
|
||||
String get location => GoRouteData.$location(
|
||||
'/settings/web_engine/hardening',
|
||||
);
|
||||
String get location =>
|
||||
GoRouteData.$location('/settings/web_engine/hardening');
|
||||
|
||||
void go(BuildContext context) => context.go(location);
|
||||
|
||||
@@ -433,13 +404,11 @@ extension $WebEngineHardeningRouteExtension on WebEngineHardeningRoute {
|
||||
extension $WebEngineHardeningGroupRouteExtension
|
||||
on WebEngineHardeningGroupRoute {
|
||||
static WebEngineHardeningGroupRoute _fromState(GoRouterState state) =>
|
||||
WebEngineHardeningGroupRoute(
|
||||
group: state.pathParameters['group']!,
|
||||
);
|
||||
WebEngineHardeningGroupRoute(group: state.pathParameters['group']!);
|
||||
|
||||
String get location => GoRouteData.$location(
|
||||
'/settings/web_engine/hardening/group/${Uri.encodeComponent(group)}',
|
||||
);
|
||||
'/settings/web_engine/hardening/group/${Uri.encodeComponent(group)}',
|
||||
);
|
||||
|
||||
void go(BuildContext context) => context.go(location);
|
||||
|
||||
@@ -452,30 +421,28 @@ extension $WebEngineHardeningGroupRouteExtension
|
||||
}
|
||||
|
||||
RouteBase get $chatArchiveListRoute => GoRouteData.$route(
|
||||
path: '/chat_archive',
|
||||
name: 'ChatArchiveListRoute',
|
||||
factory: $ChatArchiveListRouteExtension._fromState,
|
||||
routes: [
|
||||
GoRouteData.$route(
|
||||
path: 'search',
|
||||
name: 'ChatArchiveSearchRoute',
|
||||
factory: $ChatArchiveSearchRouteExtension._fromState,
|
||||
),
|
||||
GoRouteData.$route(
|
||||
path: 'detail/:fileName',
|
||||
name: 'ChatArchiveDetailRoute',
|
||||
factory: $ChatArchiveDetailRouteExtension._fromState,
|
||||
),
|
||||
],
|
||||
);
|
||||
path: '/chat_archive',
|
||||
name: 'ChatArchiveListRoute',
|
||||
factory: $ChatArchiveListRouteExtension._fromState,
|
||||
routes: [
|
||||
GoRouteData.$route(
|
||||
path: 'search',
|
||||
name: 'ChatArchiveSearchRoute',
|
||||
factory: $ChatArchiveSearchRouteExtension._fromState,
|
||||
),
|
||||
GoRouteData.$route(
|
||||
path: 'detail/:fileName',
|
||||
name: 'ChatArchiveDetailRoute',
|
||||
factory: $ChatArchiveDetailRouteExtension._fromState,
|
||||
),
|
||||
],
|
||||
);
|
||||
|
||||
extension $ChatArchiveListRouteExtension on ChatArchiveListRoute {
|
||||
static ChatArchiveListRoute _fromState(GoRouterState state) =>
|
||||
ChatArchiveListRoute();
|
||||
|
||||
String get location => GoRouteData.$location(
|
||||
'/chat_archive',
|
||||
);
|
||||
String get location => GoRouteData.$location('/chat_archive');
|
||||
|
||||
void go(BuildContext context) => context.go(location);
|
||||
|
||||
@@ -491,9 +458,7 @@ extension $ChatArchiveSearchRouteExtension on ChatArchiveSearchRoute {
|
||||
static ChatArchiveSearchRoute _fromState(GoRouterState state) =>
|
||||
ChatArchiveSearchRoute();
|
||||
|
||||
String get location => GoRouteData.$location(
|
||||
'/chat_archive/search',
|
||||
);
|
||||
String get location => GoRouteData.$location('/chat_archive/search');
|
||||
|
||||
void go(BuildContext context) => context.go(location);
|
||||
|
||||
@@ -507,13 +472,11 @@ extension $ChatArchiveSearchRouteExtension on ChatArchiveSearchRoute {
|
||||
|
||||
extension $ChatArchiveDetailRouteExtension on ChatArchiveDetailRoute {
|
||||
static ChatArchiveDetailRoute _fromState(GoRouterState state) =>
|
||||
ChatArchiveDetailRoute(
|
||||
fileName: state.pathParameters['fileName']!,
|
||||
);
|
||||
ChatArchiveDetailRoute(fileName: state.pathParameters['fileName']!);
|
||||
|
||||
String get location => GoRouteData.$location(
|
||||
'/chat_archive/detail/${Uri.encodeComponent(fileName)}',
|
||||
);
|
||||
'/chat_archive/detail/${Uri.encodeComponent(fileName)}',
|
||||
);
|
||||
|
||||
void go(BuildContext context) => context.go(location);
|
||||
|
||||
@@ -526,17 +489,15 @@ extension $ChatArchiveDetailRouteExtension on ChatArchiveDetailRoute {
|
||||
}
|
||||
|
||||
RouteBase get $torProxyRoute => GoRouteData.$route(
|
||||
path: '/tor_proxy',
|
||||
name: 'TorProxyRoute',
|
||||
factory: $TorProxyRouteExtension._fromState,
|
||||
);
|
||||
path: '/tor_proxy',
|
||||
name: 'TorProxyRoute',
|
||||
factory: $TorProxyRouteExtension._fromState,
|
||||
);
|
||||
|
||||
extension $TorProxyRouteExtension on TorProxyRoute {
|
||||
static TorProxyRoute _fromState(GoRouterState state) => TorProxyRoute();
|
||||
|
||||
String get location => GoRouteData.$location(
|
||||
'/tor_proxy',
|
||||
);
|
||||
String get location => GoRouteData.$location('/tor_proxy');
|
||||
|
||||
void go(BuildContext context) => context.go(location);
|
||||
|
||||
|
||||
@@ -5,17 +5,14 @@ class EquatableCollection<T> with FastEquatable {
|
||||
final bool immutable;
|
||||
|
||||
EquatableCollection(this.collection, {required this.immutable})
|
||||
: assert(
|
||||
collection is Map || collection is Iterable || collection == null,
|
||||
'Collection type not supported',
|
||||
);
|
||||
: assert(
|
||||
collection is Map || collection is Iterable || collection == null,
|
||||
'Collection type not supported',
|
||||
);
|
||||
|
||||
@override
|
||||
bool get cacheHash => immutable;
|
||||
|
||||
@override
|
||||
List<Object?> get hashParameters => [
|
||||
collection,
|
||||
immutable,
|
||||
];
|
||||
List<Object?> get hashParameters => [collection, immutable];
|
||||
}
|
||||
|
||||
@@ -12,9 +12,5 @@ class WebPageInfo {
|
||||
bool get isPageInfoComplete =>
|
||||
(title?.isNotEmpty ?? false) && favicon != null;
|
||||
|
||||
WebPageInfo({
|
||||
required this.url,
|
||||
this.title,
|
||||
this.favicon,
|
||||
});
|
||||
WebPageInfo({required this.url, this.title, this.favicon});
|
||||
}
|
||||
|
||||
@@ -19,11 +19,7 @@ abstract class _$WebPageInfoCWProxy {
|
||||
/// ```dart
|
||||
/// WebPageInfo(...).copyWith(id: 12, name: "My name")
|
||||
/// ````
|
||||
WebPageInfo call({
|
||||
Uri url,
|
||||
String? title,
|
||||
BrowserIcon? favicon,
|
||||
});
|
||||
WebPageInfo call({Uri url, String? title, BrowserIcon? favicon});
|
||||
}
|
||||
|
||||
/// Proxy class for `copyWith` functionality. This is a callable class and can be used as follows: `instanceOfWebPageInfo.copyWith(...)`. Additionally contains functions for specific fields e.g. `instanceOfWebPageInfo.copyWith.fieldName(...)`
|
||||
@@ -42,7 +38,6 @@ class _$WebPageInfoCWProxyImpl implements _$WebPageInfoCWProxy {
|
||||
WebPageInfo favicon(BrowserIcon? favicon) => this(favicon: favicon);
|
||||
|
||||
@override
|
||||
|
||||
/// This function **does support** nullification of nullable fields. All `null` values passed to `non-nullable` fields will be ignored. You can also use `WebPageInfo(...).copyWith.fieldName(...)` to override fields one at a time with nullification support.
|
||||
///
|
||||
/// Usage
|
||||
@@ -55,18 +50,21 @@ class _$WebPageInfoCWProxyImpl implements _$WebPageInfoCWProxy {
|
||||
Object? favicon = const $CopyWithPlaceholder(),
|
||||
}) {
|
||||
return WebPageInfo(
|
||||
url: url == const $CopyWithPlaceholder()
|
||||
? _value.url
|
||||
// ignore: cast_nullable_to_non_nullable
|
||||
: url as Uri,
|
||||
title: title == const $CopyWithPlaceholder()
|
||||
? _value.title
|
||||
// ignore: cast_nullable_to_non_nullable
|
||||
: title as String?,
|
||||
favicon: favicon == const $CopyWithPlaceholder()
|
||||
? _value.favicon
|
||||
// ignore: cast_nullable_to_non_nullable
|
||||
: favicon as BrowserIcon?,
|
||||
url:
|
||||
url == const $CopyWithPlaceholder()
|
||||
? _value.url
|
||||
// ignore: cast_nullable_to_non_nullable
|
||||
: url as Uri,
|
||||
title:
|
||||
title == const $CopyWithPlaceholder()
|
||||
? _value.title
|
||||
// ignore: cast_nullable_to_non_nullable
|
||||
: title as String?,
|
||||
favicon:
|
||||
favicon == const $CopyWithPlaceholder()
|
||||
? _value.favicon
|
||||
// ignore: cast_nullable_to_non_nullable
|
||||
: favicon as BrowserIcon?,
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -6,10 +6,7 @@ class EquatableImage {
|
||||
final Image value;
|
||||
final int? _imageHash;
|
||||
|
||||
EquatableImage(
|
||||
this.value, {
|
||||
required int? hash,
|
||||
}) : _imageHash = hash;
|
||||
EquatableImage(this.value, {required int? hash}) : _imageHash = hash;
|
||||
|
||||
static Future<EquatableImage> calculate(Image image) async {
|
||||
final imageHash = await image.calculateHash();
|
||||
|
||||
@@ -18,25 +18,21 @@ class AppInitializationService extends _$AppInitializationService {
|
||||
|
||||
Future<void> _initPackageInfo() {
|
||||
//Ensure Package info is loaded
|
||||
state = Result.success(
|
||||
(
|
||||
initialized: false,
|
||||
stage: 'Loading Package Info...',
|
||||
errors: List.empty(),
|
||||
),
|
||||
);
|
||||
state = Result.success((
|
||||
initialized: false,
|
||||
stage: 'Loading Package Info...',
|
||||
errors: List.empty(),
|
||||
));
|
||||
|
||||
return ref.read(packageInfoProvider.future);
|
||||
}
|
||||
|
||||
Future<Map<BangGroup, Result<void>>> _initBangs() {
|
||||
state = Result.success(
|
||||
(
|
||||
initialized: false,
|
||||
stage: 'Synchronizing Bangs...',
|
||||
errors: List.empty(),
|
||||
),
|
||||
);
|
||||
state = Result.success((
|
||||
initialized: false,
|
||||
stage: 'Synchronizing Bangs...',
|
||||
errors: List.empty(),
|
||||
));
|
||||
|
||||
return ref
|
||||
.read(bangSyncRepositoryProvider.notifier)
|
||||
@@ -60,9 +56,11 @@ class AppInitializationService extends _$AppInitializationService {
|
||||
|
||||
@override
|
||||
Result<({bool initialized, String? stage, List<ErrorMessage> errors})>
|
||||
build() {
|
||||
return Result.success(
|
||||
(initialized: false, stage: null, errors: List.empty()),
|
||||
);
|
||||
build() {
|
||||
return Result.success((
|
||||
initialized: false,
|
||||
stage: null,
|
||||
errors: List.empty(),
|
||||
));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -12,23 +12,22 @@ String _$appInitializationServiceHash() =>
|
||||
/// See also [AppInitializationService].
|
||||
@ProviderFor(AppInitializationService)
|
||||
final appInitializationServiceProvider = NotifierProvider<
|
||||
AppInitializationService,
|
||||
Result<
|
||||
({
|
||||
bool initialized,
|
||||
String? stage,
|
||||
List<ErrorMessage> errors
|
||||
})>>.internal(
|
||||
AppInitializationService,
|
||||
Result<({bool initialized, String? stage, List<ErrorMessage> errors})>
|
||||
>.internal(
|
||||
AppInitializationService.new,
|
||||
name: r'appInitializationServiceProvider',
|
||||
debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product')
|
||||
? null
|
||||
: _$appInitializationServiceHash,
|
||||
debugGetCreateSourceHash:
|
||||
const bool.fromEnvironment('dart.vm.product')
|
||||
? null
|
||||
: _$appInitializationServiceHash,
|
||||
dependencies: null,
|
||||
allTransitiveDependencies: null,
|
||||
);
|
||||
|
||||
typedef _$AppInitializationService = Notifier<
|
||||
Result<({bool initialized, String? stage, List<ErrorMessage> errors})>>;
|
||||
typedef _$AppInitializationService =
|
||||
Notifier<
|
||||
Result<({bool initialized, String? stage, List<ErrorMessage> errors})>
|
||||
>;
|
||||
// ignore_for_file: type=lint
|
||||
// ignore_for_file: subtype_of_sealed_class, invalid_use_of_internal_member, invalid_use_of_visible_for_testing_member, deprecated_member_use_from_same_package
|
||||
|
||||
@@ -65,8 +65,8 @@ class GenericWebsiteService extends _$GenericWebsiteService {
|
||||
final LRUCache<String, BrowserIcon> _browserIconCache;
|
||||
|
||||
GenericWebsiteService()
|
||||
: _iconsService = GeckoIconService(),
|
||||
_browserIconCache = LRUCache(50);
|
||||
: _iconsService = GeckoIconService(),
|
||||
_browserIconCache = LRUCache(50);
|
||||
|
||||
@override
|
||||
void build() {
|
||||
@@ -89,9 +89,10 @@ class GenericWebsiteService extends _$GenericWebsiteService {
|
||||
url: resource['url'] as String,
|
||||
type: resource['type'] as IconType,
|
||||
mimeType: resource['mimeType'] as String?,
|
||||
sizes: (resource['sizes'] as List<List<int>>)
|
||||
.map((s) => ResourceSize(height: s[0], width: s[1]))
|
||||
.toList(),
|
||||
sizes:
|
||||
(resource['sizes'] as List<List<int>>)
|
||||
.map((s) => ResourceSize(height: s[0], width: s[1]))
|
||||
.toList(),
|
||||
maskable: resource['maskable'] as bool,
|
||||
);
|
||||
}
|
||||
@@ -187,45 +188,39 @@ class GenericWebsiteService extends _$GenericWebsiteService {
|
||||
}
|
||||
|
||||
Future<Result<WebPageInfo>> fetchPageInfo(Uri url) async {
|
||||
return Result.fromAsync(
|
||||
() async {
|
||||
final response =
|
||||
await _client.get(url).timeout(const Duration(seconds: 10));
|
||||
return Result.fromAsync(() async {
|
||||
final response = await _client
|
||||
.get(url)
|
||||
.timeout(const Duration(seconds: 10));
|
||||
|
||||
final result = await compute(
|
||||
(args) async {
|
||||
final document = html_parser.parse(args[0]);
|
||||
final baseUri = Uri.parse(args[1]);
|
||||
final result = await compute((args) async {
|
||||
final document = html_parser.parse(args[0]);
|
||||
final baseUri = Uri.parse(args[1]);
|
||||
|
||||
final title = document.querySelector('title')?.text;
|
||||
final resources = _extractIcons(baseUri, document);
|
||||
final title = document.querySelector('title')?.text;
|
||||
final resources = _extractIcons(baseUri, document);
|
||||
|
||||
return {
|
||||
'title': title,
|
||||
'resources': resources.map(_serializeResource).toList(),
|
||||
};
|
||||
},
|
||||
[response.body, url.toString()],
|
||||
);
|
||||
return {
|
||||
'title': title,
|
||||
'resources': resources.map(_serializeResource).toList(),
|
||||
};
|
||||
}, [response.body, url.toString()]);
|
||||
|
||||
final resources = (result['resources']! as List<Map<String, dynamic>>)
|
||||
.map(_deserializeResource)
|
||||
.toList();
|
||||
final resources =
|
||||
(result['resources']! as List<Map<String, dynamic>>)
|
||||
.map(_deserializeResource)
|
||||
.toList();
|
||||
|
||||
final favicon = await getCachedIcon(url) ??
|
||||
await loadIcon(
|
||||
url: url,
|
||||
resources: resources,
|
||||
);
|
||||
final favicon =
|
||||
await getCachedIcon(url) ??
|
||||
await loadIcon(url: url, resources: resources);
|
||||
|
||||
return WebPageInfo(
|
||||
url: url,
|
||||
title: result['title'] as String?,
|
||||
favicon: favicon,
|
||||
);
|
||||
},
|
||||
exceptionHandler: handleHttpError,
|
||||
);
|
||||
return WebPageInfo(
|
||||
url: url,
|
||||
title: result['title'] as String?,
|
||||
favicon: favicon,
|
||||
);
|
||||
}, exceptionHandler: handleHttpError);
|
||||
}
|
||||
|
||||
Future<BrowserIcon?> getCachedIcon(Uri url) async {
|
||||
@@ -281,9 +276,9 @@ class GenericWebsiteService extends _$GenericWebsiteService {
|
||||
return cachedIcon;
|
||||
}
|
||||
|
||||
return fetchPageInfo(url).then(
|
||||
(result) => result.flatMap((pageInfo) => pageInfo.favicon!).value,
|
||||
);
|
||||
return fetchPageInfo(
|
||||
url,
|
||||
).then((result) => result.flatMap((pageInfo) => pageInfo.favicon!).value);
|
||||
}
|
||||
|
||||
// Future<Uri?> tryUpgradeToHttps(Uri httpUri) async {
|
||||
|
||||
@@ -13,14 +13,15 @@ String _$genericWebsiteServiceHash() =>
|
||||
@ProviderFor(GenericWebsiteService)
|
||||
final genericWebsiteServiceProvider =
|
||||
NotifierProvider<GenericWebsiteService, void>.internal(
|
||||
GenericWebsiteService.new,
|
||||
name: r'genericWebsiteServiceProvider',
|
||||
debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product')
|
||||
? null
|
||||
: _$genericWebsiteServiceHash,
|
||||
dependencies: null,
|
||||
allTransitiveDependencies: null,
|
||||
);
|
||||
GenericWebsiteService.new,
|
||||
name: r'genericWebsiteServiceProvider',
|
||||
debugGetCreateSourceHash:
|
||||
const bool.fromEnvironment('dart.vm.product')
|
||||
? null
|
||||
: _$genericWebsiteServiceHash,
|
||||
dependencies: null,
|
||||
allTransitiveDependencies: null,
|
||||
);
|
||||
|
||||
typedef _$GenericWebsiteService = Notifier<void>;
|
||||
// ignore_for_file: type=lint
|
||||
|
||||
@@ -12,13 +12,12 @@ FutureOr<bool> widgetPinnable(Ref ref) async {
|
||||
}
|
||||
|
||||
@Riverpod()
|
||||
Raw<Stream<ReceivedParameter>> appWidgetLaunchStream(
|
||||
Ref ref,
|
||||
) {
|
||||
Raw<Stream<ReceivedParameter>> appWidgetLaunchStream(Ref ref) {
|
||||
// ignore: discarded_futures
|
||||
final initialStream = HomeWidget.initiallyLaunchedFromHomeWidget().asStream();
|
||||
|
||||
return ConcatStream([initialStream, HomeWidget.widgetClicked])
|
||||
.whereNotNull()
|
||||
.map((uri) => ReceivedParameter(null, uri.host));
|
||||
return ConcatStream([
|
||||
initialStream,
|
||||
HomeWidget.widgetClicked,
|
||||
]).whereNotNull().map((uri) => ReceivedParameter(null, uri.host));
|
||||
}
|
||||
|
||||
@@ -13,9 +13,10 @@ String _$widgetPinnableHash() => r'f91041f0f051ad0f00dd765cafea5571ca8c8088';
|
||||
final widgetPinnableProvider = FutureProvider<bool>.internal(
|
||||
widgetPinnable,
|
||||
name: r'widgetPinnableProvider',
|
||||
debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product')
|
||||
? null
|
||||
: _$widgetPinnableHash,
|
||||
debugGetCreateSourceHash:
|
||||
const bool.fromEnvironment('dart.vm.product')
|
||||
? null
|
||||
: _$widgetPinnableHash,
|
||||
dependencies: null,
|
||||
allTransitiveDependencies: null,
|
||||
);
|
||||
@@ -30,18 +31,19 @@ String _$appWidgetLaunchStreamHash() =>
|
||||
@ProviderFor(appWidgetLaunchStream)
|
||||
final appWidgetLaunchStreamProvider =
|
||||
AutoDisposeProvider<Raw<Stream<ReceivedParameter>>>.internal(
|
||||
appWidgetLaunchStream,
|
||||
name: r'appWidgetLaunchStreamProvider',
|
||||
debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product')
|
||||
? null
|
||||
: _$appWidgetLaunchStreamHash,
|
||||
dependencies: null,
|
||||
allTransitiveDependencies: null,
|
||||
);
|
||||
appWidgetLaunchStream,
|
||||
name: r'appWidgetLaunchStreamProvider',
|
||||
debugGetCreateSourceHash:
|
||||
const bool.fromEnvironment('dart.vm.product')
|
||||
? null
|
||||
: _$appWidgetLaunchStreamHash,
|
||||
dependencies: null,
|
||||
allTransitiveDependencies: null,
|
||||
);
|
||||
|
||||
@Deprecated('Will be removed in 3.0. Use Ref instead')
|
||||
// ignore: unused_element
|
||||
typedef AppWidgetLaunchStreamRef
|
||||
= AutoDisposeProviderRef<Raw<Stream<ReceivedParameter>>>;
|
||||
typedef AppWidgetLaunchStreamRef =
|
||||
AutoDisposeProviderRef<Raw<Stream<ReceivedParameter>>>;
|
||||
// ignore_for_file: type=lint
|
||||
// ignore_for_file: subtype_of_sealed_class, invalid_use_of_internal_member, invalid_use_of_visible_for_testing_member, deprecated_member_use_from_same_package
|
||||
|
||||
@@ -95,13 +95,9 @@ class BangDao extends DatabaseAccessor<BangDatabase> with _$BangDaoMixin {
|
||||
final ftsQuery = db.buildFtsQuery(searchString);
|
||||
|
||||
if (ftsQuery.isNotEmpty) {
|
||||
return db.queryBangs(
|
||||
query: ftsQuery,
|
||||
);
|
||||
return db.queryBangs(query: ftsQuery);
|
||||
} else {
|
||||
return db.queryBangsBasic(
|
||||
query: db.buildLikeQuery(searchString),
|
||||
);
|
||||
return db.queryBangsBasic(query: db.buildLikeQuery(searchString));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -9,19 +9,17 @@ class SyncDao extends DatabaseAccessor<BangDatabase> with _$SyncDaoMixin {
|
||||
SyncDao(super.db);
|
||||
|
||||
SingleOrNullSelectable<DateTime?> lastSyncOfGroup(BangGroup group) {
|
||||
final query = selectOnly(db.bangSync)
|
||||
..addColumns([db.bangSync.lastSync])
|
||||
..where(db.bangSync.group.equalsValue(group));
|
||||
final query =
|
||||
selectOnly(db.bangSync)
|
||||
..addColumns([db.bangSync.lastSync])
|
||||
..where(db.bangSync.group.equalsValue(group));
|
||||
|
||||
return query.map((row) => row.read(db.bangSync.lastSync));
|
||||
}
|
||||
|
||||
Future<void> upsertLastSyncOfGroup(BangGroup group, DateTime lastSync) {
|
||||
return db.bangSync.insertOne(
|
||||
BangSyncCompanion.insert(
|
||||
group: Value(group),
|
||||
lastSync: lastSync,
|
||||
),
|
||||
BangSyncCompanion.insert(group: Value(group), lastSync: lastSync),
|
||||
onConflict: DoUpdate(
|
||||
(old) => BangSyncCompanion.custom(lastSync: Variable(lastSync)),
|
||||
),
|
||||
@@ -33,11 +31,9 @@ class SyncDao extends DatabaseAccessor<BangDatabase> with _$SyncDaoMixin {
|
||||
}
|
||||
|
||||
Future<void> replaceBangs(Iterable<Bang> bangs) {
|
||||
return batch(
|
||||
(batch) {
|
||||
batch.replaceAll(db.bang, bangs);
|
||||
},
|
||||
);
|
||||
return batch((batch) {
|
||||
batch.replaceAll(db.bang, bangs);
|
||||
});
|
||||
}
|
||||
|
||||
Future<int> deleteBangs(Iterable<String> triggers) {
|
||||
@@ -50,36 +46,34 @@ class SyncDao extends DatabaseAccessor<BangDatabase> with _$SyncDaoMixin {
|
||||
required Iterable<Bang> remoteBangs,
|
||||
required DateTime syncTime,
|
||||
}) async {
|
||||
final remoteBangMap =
|
||||
Map.fromEntries(remoteBangs.map((e) => MapEntry(e.trigger, e)));
|
||||
final localBangMap =
|
||||
await db.bangDao.getBangList(groups: [group]).get().then(
|
||||
(bangs) =>
|
||||
Map.fromEntries(bangs.map((e) => MapEntry(e.trigger, e))),
|
||||
);
|
||||
final remoteBangMap = Map.fromEntries(
|
||||
remoteBangs.map((e) => MapEntry(e.trigger, e)),
|
||||
);
|
||||
final localBangMap = await db.bangDao
|
||||
.getBangList(groups: [group])
|
||||
.get()
|
||||
.then(
|
||||
(bangs) => Map.fromEntries(bangs.map((e) => MapEntry(e.trigger, e))),
|
||||
);
|
||||
|
||||
final remoteBangTriggers = remoteBangMap.keys.toSet();
|
||||
final localBangTriggers = localBangMap.keys.toSet();
|
||||
|
||||
final removedBangs = localBangTriggers.difference(remoteBangTriggers);
|
||||
final addedBangs = remoteBangTriggers.difference(localBangTriggers).map(
|
||||
(e) => remoteBangMap[e]!,
|
||||
);
|
||||
final addedBangs = remoteBangTriggers
|
||||
.difference(localBangTriggers)
|
||||
.map((e) => remoteBangMap[e]!);
|
||||
|
||||
final changedBangs = remoteBangTriggers
|
||||
.intersection(localBangTriggers)
|
||||
.where((e) => remoteBangMap[e] != localBangMap[e])
|
||||
.map(
|
||||
(e) => remoteBangMap[e]!,
|
||||
);
|
||||
.map((e) => remoteBangMap[e]!);
|
||||
|
||||
await db.transaction(
|
||||
() async {
|
||||
await deleteBangs(removedBangs);
|
||||
await insertBangs(addedBangs);
|
||||
await replaceBangs(changedBangs);
|
||||
await upsertLastSyncOfGroup(group, syncTime);
|
||||
},
|
||||
);
|
||||
await db.transaction(() async {
|
||||
await deleteBangs(removedBangs);
|
||||
await insertBangs(addedBangs);
|
||||
await replaceBangs(changedBangs);
|
||||
await upsertLastSyncOfGroup(group, syncTime);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
@@ -9,10 +9,7 @@ import 'package:lensai/features/search/domain/fts_tokenizer.dart';
|
||||
|
||||
part 'database.g.dart';
|
||||
|
||||
@DriftDatabase(
|
||||
include: {'database.drift'},
|
||||
daos: [BangDao, SyncDao],
|
||||
)
|
||||
@DriftDatabase(include: {'database.drift'}, daos: [BangDao, SyncDao])
|
||||
class BangDatabase extends _$BangDatabase with PrefixQueryBuilderMixin {
|
||||
@override
|
||||
final int schemaVersion = 1;
|
||||
@@ -24,10 +21,10 @@ class BangDatabase extends _$BangDatabase with PrefixQueryBuilderMixin {
|
||||
|
||||
@override
|
||||
MigrationStrategy get migration => MigrationStrategy(
|
||||
beforeOpen: (details) async {
|
||||
await customStatement('PRAGMA foreign_keys = ON;');
|
||||
},
|
||||
);
|
||||
beforeOpen: (details) async {
|
||||
await customStatement('PRAGMA foreign_keys = ON;');
|
||||
},
|
||||
);
|
||||
|
||||
BangDatabase(super.e);
|
||||
}
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -8,9 +8,7 @@ import 'package:lensai/features/bangs/data/database/database.dart'
|
||||
part 'bang.g.dart';
|
||||
|
||||
enum BangGroup {
|
||||
general(
|
||||
'https://raw.githubusercontent.com/FaFre/bangs/main/data/bangs.json',
|
||||
),
|
||||
general('https://raw.githubusercontent.com/FaFre/bangs/main/data/bangs.json'),
|
||||
assistant(
|
||||
'https://raw.githubusercontent.com/FaFre/bangs/main/data/assistant_bangs.json',
|
||||
),
|
||||
@@ -90,16 +88,19 @@ class Bang with FastEquatable implements Insertable<Bang> {
|
||||
}
|
||||
|
||||
Uri getUrl(String? query) {
|
||||
final url = (query != null)
|
||||
? urlTemplate.replaceAll(_templateQueryPlaceholder, formatQuery(query))
|
||||
: urlTemplate;
|
||||
final url =
|
||||
(query != null)
|
||||
? urlTemplate.replaceAll(
|
||||
_templateQueryPlaceholder,
|
||||
formatQuery(query),
|
||||
)
|
||||
: urlTemplate;
|
||||
|
||||
var template = Uri.parse(url);
|
||||
if (!template.hasScheme || template.origin.isEmpty) {
|
||||
template = Uri.https(domain).replace(
|
||||
path: template.path,
|
||||
query: template.query,
|
||||
);
|
||||
template = Uri.https(
|
||||
domain,
|
||||
).replace(path: template.path, query: template.query);
|
||||
}
|
||||
|
||||
return template;
|
||||
@@ -133,15 +134,15 @@ class Bang with FastEquatable implements Insertable<Bang> {
|
||||
|
||||
@override
|
||||
List<Object?> get hashParameters => [
|
||||
group,
|
||||
websiteName,
|
||||
domain,
|
||||
trigger,
|
||||
urlTemplate,
|
||||
category,
|
||||
subCategory,
|
||||
format,
|
||||
];
|
||||
group,
|
||||
websiteName,
|
||||
domain,
|
||||
trigger,
|
||||
urlTemplate,
|
||||
category,
|
||||
subCategory,
|
||||
format,
|
||||
];
|
||||
|
||||
@override
|
||||
Map<String, Expression<Object>> toColumns(bool nullToAbsent) {
|
||||
|
||||
@@ -72,7 +72,6 @@ class _$BangCWProxyImpl implements _$BangCWProxy {
|
||||
Bang format(Set<BangFormat>? format) => this(format: format);
|
||||
|
||||
@override
|
||||
|
||||
/// This function **does support** nullification of nullable fields. All `null` values passed to `non-nullable` fields will be ignored. You can also use `Bang(...).copyWith.fieldName(...)` to override fields one at a time with nullification support.
|
||||
///
|
||||
/// Usage
|
||||
@@ -90,38 +89,46 @@ class _$BangCWProxyImpl implements _$BangCWProxy {
|
||||
Object? format = const $CopyWithPlaceholder(),
|
||||
}) {
|
||||
return Bang(
|
||||
websiteName: websiteName == const $CopyWithPlaceholder()
|
||||
? _value.websiteName
|
||||
// ignore: cast_nullable_to_non_nullable
|
||||
: websiteName as String,
|
||||
domain: domain == const $CopyWithPlaceholder()
|
||||
? _value.domain
|
||||
// ignore: cast_nullable_to_non_nullable
|
||||
: domain as String,
|
||||
trigger: trigger == const $CopyWithPlaceholder()
|
||||
? _value.trigger
|
||||
// ignore: cast_nullable_to_non_nullable
|
||||
: trigger as String,
|
||||
urlTemplate: urlTemplate == const $CopyWithPlaceholder()
|
||||
? _value.urlTemplate
|
||||
// ignore: cast_nullable_to_non_nullable
|
||||
: urlTemplate as String,
|
||||
group: group == const $CopyWithPlaceholder()
|
||||
? _value.group
|
||||
// ignore: cast_nullable_to_non_nullable
|
||||
: group as BangGroup?,
|
||||
category: category == const $CopyWithPlaceholder()
|
||||
? _value.category
|
||||
// ignore: cast_nullable_to_non_nullable
|
||||
: category as String?,
|
||||
subCategory: subCategory == const $CopyWithPlaceholder()
|
||||
? _value.subCategory
|
||||
// ignore: cast_nullable_to_non_nullable
|
||||
: subCategory as String?,
|
||||
format: format == const $CopyWithPlaceholder()
|
||||
? _value.format
|
||||
// ignore: cast_nullable_to_non_nullable
|
||||
: format as Set<BangFormat>?,
|
||||
websiteName:
|
||||
websiteName == const $CopyWithPlaceholder()
|
||||
? _value.websiteName
|
||||
// ignore: cast_nullable_to_non_nullable
|
||||
: websiteName as String,
|
||||
domain:
|
||||
domain == const $CopyWithPlaceholder()
|
||||
? _value.domain
|
||||
// ignore: cast_nullable_to_non_nullable
|
||||
: domain as String,
|
||||
trigger:
|
||||
trigger == const $CopyWithPlaceholder()
|
||||
? _value.trigger
|
||||
// ignore: cast_nullable_to_non_nullable
|
||||
: trigger as String,
|
||||
urlTemplate:
|
||||
urlTemplate == const $CopyWithPlaceholder()
|
||||
? _value.urlTemplate
|
||||
// ignore: cast_nullable_to_non_nullable
|
||||
: urlTemplate as String,
|
||||
group:
|
||||
group == const $CopyWithPlaceholder()
|
||||
? _value.group
|
||||
// ignore: cast_nullable_to_non_nullable
|
||||
: group as BangGroup?,
|
||||
category:
|
||||
category == const $CopyWithPlaceholder()
|
||||
? _value.category
|
||||
// ignore: cast_nullable_to_non_nullable
|
||||
: category as String?,
|
||||
subCategory:
|
||||
subCategory == const $CopyWithPlaceholder()
|
||||
? _value.subCategory
|
||||
// ignore: cast_nullable_to_non_nullable
|
||||
: subCategory as String?,
|
||||
format:
|
||||
format == const $CopyWithPlaceholder()
|
||||
? _value.format
|
||||
// ignore: cast_nullable_to_non_nullable
|
||||
: format as Set<BangFormat>?,
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -137,26 +144,27 @@ extension $BangCopyWith on Bang {
|
||||
// **************************************************************************
|
||||
|
||||
Bang _$BangFromJson(Map<String, dynamic> json) => Bang(
|
||||
websiteName: json['s'] as String,
|
||||
domain: json['d'] as String,
|
||||
trigger: json['t'] as String,
|
||||
urlTemplate: json['u'] as String,
|
||||
category: json['c'] as String?,
|
||||
subCategory: json['sc'] as String?,
|
||||
format: (json['fmt'] as List<dynamic>?)
|
||||
websiteName: json['s'] as String,
|
||||
domain: json['d'] as String,
|
||||
trigger: json['t'] as String,
|
||||
urlTemplate: json['u'] as String,
|
||||
category: json['c'] as String?,
|
||||
subCategory: json['sc'] as String?,
|
||||
format:
|
||||
(json['fmt'] as List<dynamic>?)
|
||||
?.map((e) => $enumDecode(_$BangFormatEnumMap, e))
|
||||
.toSet(),
|
||||
);
|
||||
);
|
||||
|
||||
Map<String, dynamic> _$BangToJson(Bang instance) => <String, dynamic>{
|
||||
's': instance.websiteName,
|
||||
'd': instance.domain,
|
||||
't': instance.trigger,
|
||||
'u': instance.urlTemplate,
|
||||
'c': instance.category,
|
||||
'sc': instance.subCategory,
|
||||
'fmt': instance.format?.map((e) => _$BangFormatEnumMap[e]!).toList(),
|
||||
};
|
||||
's': instance.websiteName,
|
||||
'd': instance.domain,
|
||||
't': instance.trigger,
|
||||
'u': instance.urlTemplate,
|
||||
'c': instance.category,
|
||||
'sc': instance.subCategory,
|
||||
'fmt': instance.format?.map((e) => _$BangFormatEnumMap[e]!).toList(),
|
||||
};
|
||||
|
||||
const _$BangFormatEnumMap = {
|
||||
BangFormat.openBasePath: 'open_base_path',
|
||||
|
||||
@@ -29,9 +29,9 @@ class BangData extends Bang {
|
||||
|
||||
@override
|
||||
List<Object?> get hashParameters => [
|
||||
...super.hashParameters,
|
||||
frequency,
|
||||
lastUsed,
|
||||
icon,
|
||||
];
|
||||
...super.hashParameters,
|
||||
frequency,
|
||||
lastUsed,
|
||||
icon,
|
||||
];
|
||||
}
|
||||
|
||||
@@ -84,7 +84,6 @@ class _$BangDataCWProxyImpl implements _$BangDataCWProxy {
|
||||
BangData icon(BrowserIcon? icon) => this(icon: icon);
|
||||
|
||||
@override
|
||||
|
||||
/// This function **does support** nullification of nullable fields. All `null` values passed to `non-nullable` fields will be ignored. You can also use `BangData(...).copyWith.fieldName(...)` to override fields one at a time with nullification support.
|
||||
///
|
||||
/// Usage
|
||||
@@ -104,46 +103,56 @@ class _$BangDataCWProxyImpl implements _$BangDataCWProxy {
|
||||
Object? icon = const $CopyWithPlaceholder(),
|
||||
}) {
|
||||
return BangData(
|
||||
websiteName: websiteName == const $CopyWithPlaceholder()
|
||||
? _value.websiteName
|
||||
// ignore: cast_nullable_to_non_nullable
|
||||
: websiteName as String,
|
||||
domain: domain == const $CopyWithPlaceholder()
|
||||
? _value.domain
|
||||
// ignore: cast_nullable_to_non_nullable
|
||||
: domain as String,
|
||||
trigger: trigger == const $CopyWithPlaceholder()
|
||||
? _value.trigger
|
||||
// ignore: cast_nullable_to_non_nullable
|
||||
: trigger as String,
|
||||
urlTemplate: urlTemplate == const $CopyWithPlaceholder()
|
||||
? _value.urlTemplate
|
||||
// ignore: cast_nullable_to_non_nullable
|
||||
: urlTemplate as String,
|
||||
category: category == const $CopyWithPlaceholder()
|
||||
? _value.category
|
||||
// ignore: cast_nullable_to_non_nullable
|
||||
: category as String?,
|
||||
subCategory: subCategory == const $CopyWithPlaceholder()
|
||||
? _value.subCategory
|
||||
// ignore: cast_nullable_to_non_nullable
|
||||
: subCategory as String?,
|
||||
format: format == const $CopyWithPlaceholder()
|
||||
? _value.format
|
||||
// ignore: cast_nullable_to_non_nullable
|
||||
: format as Set<BangFormat>?,
|
||||
frequency: frequency == const $CopyWithPlaceholder()
|
||||
? _value.frequency
|
||||
// ignore: cast_nullable_to_non_nullable
|
||||
: frequency as int?,
|
||||
lastUsed: lastUsed == const $CopyWithPlaceholder()
|
||||
? _value.lastUsed
|
||||
// ignore: cast_nullable_to_non_nullable
|
||||
: lastUsed as DateTime?,
|
||||
icon: icon == const $CopyWithPlaceholder()
|
||||
? _value.icon
|
||||
// ignore: cast_nullable_to_non_nullable
|
||||
: icon as BrowserIcon?,
|
||||
websiteName:
|
||||
websiteName == const $CopyWithPlaceholder()
|
||||
? _value.websiteName
|
||||
// ignore: cast_nullable_to_non_nullable
|
||||
: websiteName as String,
|
||||
domain:
|
||||
domain == const $CopyWithPlaceholder()
|
||||
? _value.domain
|
||||
// ignore: cast_nullable_to_non_nullable
|
||||
: domain as String,
|
||||
trigger:
|
||||
trigger == const $CopyWithPlaceholder()
|
||||
? _value.trigger
|
||||
// ignore: cast_nullable_to_non_nullable
|
||||
: trigger as String,
|
||||
urlTemplate:
|
||||
urlTemplate == const $CopyWithPlaceholder()
|
||||
? _value.urlTemplate
|
||||
// ignore: cast_nullable_to_non_nullable
|
||||
: urlTemplate as String,
|
||||
category:
|
||||
category == const $CopyWithPlaceholder()
|
||||
? _value.category
|
||||
// ignore: cast_nullable_to_non_nullable
|
||||
: category as String?,
|
||||
subCategory:
|
||||
subCategory == const $CopyWithPlaceholder()
|
||||
? _value.subCategory
|
||||
// ignore: cast_nullable_to_non_nullable
|
||||
: subCategory as String?,
|
||||
format:
|
||||
format == const $CopyWithPlaceholder()
|
||||
? _value.format
|
||||
// ignore: cast_nullable_to_non_nullable
|
||||
: format as Set<BangFormat>?,
|
||||
frequency:
|
||||
frequency == const $CopyWithPlaceholder()
|
||||
? _value.frequency
|
||||
// ignore: cast_nullable_to_non_nullable
|
||||
: frequency as int?,
|
||||
lastUsed:
|
||||
lastUsed == const $CopyWithPlaceholder()
|
||||
? _value.lastUsed
|
||||
// ignore: cast_nullable_to_non_nullable
|
||||
: lastUsed as DateTime?,
|
||||
icon:
|
||||
icon == const $CopyWithPlaceholder()
|
||||
? _value.icon
|
||||
// ignore: cast_nullable_to_non_nullable
|
||||
: icon as BrowserIcon?,
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -15,9 +15,5 @@ class SearchHistoryEntry with FastEquatable {
|
||||
bool get cacheHash => true;
|
||||
|
||||
@override
|
||||
List<Object?> get hashParameters => [
|
||||
searchQuery,
|
||||
trigger,
|
||||
searchDate,
|
||||
];
|
||||
List<Object?> get hashParameters => [searchQuery, trigger, searchDate];
|
||||
}
|
||||
|
||||
@@ -19,25 +19,22 @@ class BangSourceService extends _$BangSourceService {
|
||||
}
|
||||
|
||||
Future<Result<List<Bang>>> getBangs(Uri url, BangGroup? group) async {
|
||||
return Result.fromAsync(
|
||||
() async {
|
||||
final response = await _client.get(url);
|
||||
return await compute(
|
||||
(args) => jsonDecode(utf8.decode(args[0])) as List,
|
||||
[response.bodyBytes],
|
||||
).then(
|
||||
(json) => json.map((e) {
|
||||
var bang = Bang.fromJson(e as Map<String, dynamic>);
|
||||
return Result.fromAsync(() async {
|
||||
final response = await _client.get(url);
|
||||
return await compute((args) => jsonDecode(utf8.decode(args[0])) as List, [
|
||||
response.bodyBytes,
|
||||
]).then(
|
||||
(json) =>
|
||||
json.map((e) {
|
||||
var bang = Bang.fromJson(e as Map<String, dynamic>);
|
||||
|
||||
if (group != null) {
|
||||
bang = bang.copyWith.group(group);
|
||||
}
|
||||
if (group != null) {
|
||||
bang = bang.copyWith.group(group);
|
||||
}
|
||||
|
||||
return bang;
|
||||
}).toList(),
|
||||
);
|
||||
},
|
||||
exceptionHandler: handleHttpError,
|
||||
);
|
||||
return bang;
|
||||
}).toList(),
|
||||
);
|
||||
}, exceptionHandler: handleHttpError);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -12,14 +12,15 @@ String _$bangSourceServiceHash() => r'2f734d563fa20de306a72013526ef1f72f910fe1';
|
||||
@ProviderFor(BangSourceService)
|
||||
final bangSourceServiceProvider =
|
||||
AutoDisposeNotifierProvider<BangSourceService, void>.internal(
|
||||
BangSourceService.new,
|
||||
name: r'bangSourceServiceProvider',
|
||||
debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product')
|
||||
? null
|
||||
: _$bangSourceServiceHash,
|
||||
dependencies: null,
|
||||
allTransitiveDependencies: null,
|
||||
);
|
||||
BangSourceService.new,
|
||||
name: r'bangSourceServiceProvider',
|
||||
debugGetCreateSourceHash:
|
||||
const bool.fromEnvironment('dart.vm.product')
|
||||
? null
|
||||
: _$bangSourceServiceHash,
|
||||
dependencies: null,
|
||||
allTransitiveDependencies: null,
|
||||
);
|
||||
|
||||
typedef _$BangSourceService = AutoDisposeNotifier<void>;
|
||||
// ignore_for_file: type=lint
|
||||
|
||||
@@ -34,7 +34,8 @@ Stream<List<BangData>> bangDataList(
|
||||
String? domain,
|
||||
({String category, String? subCategory})? categoryFilter,
|
||||
bool? orderMostFrequentFirst,
|
||||
})? filter,
|
||||
})?
|
||||
filter,
|
||||
}) {
|
||||
final repository = ref.watch(bangDataRepositoryProvider.notifier);
|
||||
return repository.watchBangs(
|
||||
@@ -58,19 +59,13 @@ Stream<List<SearchHistoryEntry>> searchHistory(Ref ref) {
|
||||
}
|
||||
|
||||
@Riverpod()
|
||||
Stream<DateTime?> lastSyncOfGroup(
|
||||
Ref ref,
|
||||
BangGroup group,
|
||||
) {
|
||||
Stream<DateTime?> lastSyncOfGroup(Ref ref, BangGroup group) {
|
||||
final repository = ref.watch(bangSyncRepositoryProvider.notifier);
|
||||
return repository.watchLastSyncOfGroup(group);
|
||||
}
|
||||
|
||||
@Riverpod()
|
||||
Stream<int> bangCountOfGroup(
|
||||
Ref ref,
|
||||
BangGroup group,
|
||||
) {
|
||||
Stream<int> bangCountOfGroup(Ref ref, BangGroup group) {
|
||||
final repository = ref.watch(bangDataRepositoryProvider.notifier);
|
||||
return repository.watchBangCount(group);
|
||||
}
|
||||
|
||||
@@ -39,21 +39,13 @@ class BangDataFamily extends Family<AsyncValue<BangData?>> {
|
||||
const BangDataFamily();
|
||||
|
||||
/// See also [bangData].
|
||||
BangDataProvider call(
|
||||
String? trigger,
|
||||
) {
|
||||
return BangDataProvider(
|
||||
trigger,
|
||||
);
|
||||
BangDataProvider call(String? trigger) {
|
||||
return BangDataProvider(trigger);
|
||||
}
|
||||
|
||||
@override
|
||||
BangDataProvider getProviderOverride(
|
||||
covariant BangDataProvider provider,
|
||||
) {
|
||||
return call(
|
||||
provider.trigger,
|
||||
);
|
||||
BangDataProvider getProviderOverride(covariant BangDataProvider provider) {
|
||||
return call(provider.trigger);
|
||||
}
|
||||
|
||||
static const Iterable<ProviderOrFamily>? _dependencies = null;
|
||||
@@ -74,23 +66,19 @@ class BangDataFamily extends Family<AsyncValue<BangData?>> {
|
||||
/// See also [bangData].
|
||||
class BangDataProvider extends AutoDisposeStreamProvider<BangData?> {
|
||||
/// See also [bangData].
|
||||
BangDataProvider(
|
||||
String? trigger,
|
||||
) : this._internal(
|
||||
(ref) => bangData(
|
||||
ref as BangDataRef,
|
||||
trigger,
|
||||
),
|
||||
from: bangDataProvider,
|
||||
name: r'bangDataProvider',
|
||||
debugGetCreateSourceHash:
|
||||
const bool.fromEnvironment('dart.vm.product')
|
||||
? null
|
||||
: _$bangDataHash,
|
||||
dependencies: BangDataFamily._dependencies,
|
||||
allTransitiveDependencies: BangDataFamily._allTransitiveDependencies,
|
||||
trigger: trigger,
|
||||
);
|
||||
BangDataProvider(String? trigger)
|
||||
: this._internal(
|
||||
(ref) => bangData(ref as BangDataRef, trigger),
|
||||
from: bangDataProvider,
|
||||
name: r'bangDataProvider',
|
||||
debugGetCreateSourceHash:
|
||||
const bool.fromEnvironment('dart.vm.product')
|
||||
? null
|
||||
: _$bangDataHash,
|
||||
dependencies: BangDataFamily._dependencies,
|
||||
allTransitiveDependencies: BangDataFamily._allTransitiveDependencies,
|
||||
trigger: trigger,
|
||||
);
|
||||
|
||||
BangDataProvider._internal(
|
||||
super._createNotifier, {
|
||||
@@ -149,7 +137,8 @@ mixin BangDataRef on AutoDisposeStreamProviderRef<BangData?> {
|
||||
}
|
||||
|
||||
class _BangDataProviderElement
|
||||
extends AutoDisposeStreamProviderElement<BangData?> with BangDataRef {
|
||||
extends AutoDisposeStreamProviderElement<BangData?>
|
||||
with BangDataRef {
|
||||
_BangDataProviderElement(super.provider);
|
||||
|
||||
@override
|
||||
@@ -164,9 +153,10 @@ String _$defaultSearchBangDataHash() =>
|
||||
final defaultSearchBangDataProvider = StreamProvider<BangData?>.internal(
|
||||
defaultSearchBangData,
|
||||
name: r'defaultSearchBangDataProvider',
|
||||
debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product')
|
||||
? null
|
||||
: _$defaultSearchBangDataHash,
|
||||
debugGetCreateSourceHash:
|
||||
const bool.fromEnvironment('dart.vm.product')
|
||||
? null
|
||||
: _$defaultSearchBangDataHash,
|
||||
dependencies: null,
|
||||
allTransitiveDependencies: null,
|
||||
);
|
||||
@@ -180,19 +170,20 @@ String _$bangCategoriesHash() => r'947fcfd2dffcc7f585c6ed7379d319f4fe72293a';
|
||||
@ProviderFor(bangCategories)
|
||||
final bangCategoriesProvider =
|
||||
AutoDisposeStreamProvider<Map<String, List<String>>>.internal(
|
||||
bangCategories,
|
||||
name: r'bangCategoriesProvider',
|
||||
debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product')
|
||||
? null
|
||||
: _$bangCategoriesHash,
|
||||
dependencies: null,
|
||||
allTransitiveDependencies: null,
|
||||
);
|
||||
bangCategories,
|
||||
name: r'bangCategoriesProvider',
|
||||
debugGetCreateSourceHash:
|
||||
const bool.fromEnvironment('dart.vm.product')
|
||||
? null
|
||||
: _$bangCategoriesHash,
|
||||
dependencies: null,
|
||||
allTransitiveDependencies: null,
|
||||
);
|
||||
|
||||
@Deprecated('Will be removed in 3.0. Use Ref instead')
|
||||
// ignore: unused_element
|
||||
typedef BangCategoriesRef
|
||||
= AutoDisposeStreamProviderRef<Map<String, List<String>>>;
|
||||
typedef BangCategoriesRef =
|
||||
AutoDisposeStreamProviderRef<Map<String, List<String>>>;
|
||||
String _$bangDataListHash() => r'cd034fdf046b156ac452edd0857ac054ab477917';
|
||||
|
||||
/// See also [bangDataList].
|
||||
@@ -210,21 +201,18 @@ class BangDataListFamily extends Family<AsyncValue<List<BangData>>> {
|
||||
({String category, String? subCategory})? categoryFilter,
|
||||
String? domain,
|
||||
Iterable<BangGroup>? groups,
|
||||
bool? orderMostFrequentFirst
|
||||
})? filter,
|
||||
bool? orderMostFrequentFirst,
|
||||
})?
|
||||
filter,
|
||||
}) {
|
||||
return BangDataListProvider(
|
||||
filter: filter,
|
||||
);
|
||||
return BangDataListProvider(filter: filter);
|
||||
}
|
||||
|
||||
@override
|
||||
BangDataListProvider getProviderOverride(
|
||||
covariant BangDataListProvider provider,
|
||||
) {
|
||||
return call(
|
||||
filter: provider.filter,
|
||||
);
|
||||
return call(filter: provider.filter);
|
||||
}
|
||||
|
||||
static const Iterable<ProviderOrFamily>? _dependencies = null;
|
||||
@@ -250,24 +238,22 @@ class BangDataListProvider extends AutoDisposeStreamProvider<List<BangData>> {
|
||||
({String category, String? subCategory})? categoryFilter,
|
||||
String? domain,
|
||||
Iterable<BangGroup>? groups,
|
||||
bool? orderMostFrequentFirst
|
||||
})? filter,
|
||||
bool? orderMostFrequentFirst,
|
||||
})?
|
||||
filter,
|
||||
}) : this._internal(
|
||||
(ref) => bangDataList(
|
||||
ref as BangDataListRef,
|
||||
filter: filter,
|
||||
),
|
||||
from: bangDataListProvider,
|
||||
name: r'bangDataListProvider',
|
||||
debugGetCreateSourceHash:
|
||||
const bool.fromEnvironment('dart.vm.product')
|
||||
? null
|
||||
: _$bangDataListHash,
|
||||
dependencies: BangDataListFamily._dependencies,
|
||||
allTransitiveDependencies:
|
||||
BangDataListFamily._allTransitiveDependencies,
|
||||
filter: filter,
|
||||
);
|
||||
(ref) => bangDataList(ref as BangDataListRef, filter: filter),
|
||||
from: bangDataListProvider,
|
||||
name: r'bangDataListProvider',
|
||||
debugGetCreateSourceHash:
|
||||
const bool.fromEnvironment('dart.vm.product')
|
||||
? null
|
||||
: _$bangDataListHash,
|
||||
dependencies: BangDataListFamily._dependencies,
|
||||
allTransitiveDependencies:
|
||||
BangDataListFamily._allTransitiveDependencies,
|
||||
filter: filter,
|
||||
);
|
||||
|
||||
BangDataListProvider._internal(
|
||||
super._createNotifier, {
|
||||
@@ -283,8 +269,9 @@ class BangDataListProvider extends AutoDisposeStreamProvider<List<BangData>> {
|
||||
({String category, String? subCategory})? categoryFilter,
|
||||
String? domain,
|
||||
Iterable<BangGroup>? groups,
|
||||
bool? orderMostFrequentFirst
|
||||
})? filter;
|
||||
bool? orderMostFrequentFirst,
|
||||
})?
|
||||
filter;
|
||||
|
||||
@override
|
||||
Override overrideWith(
|
||||
@@ -331,8 +318,9 @@ mixin BangDataListRef on AutoDisposeStreamProviderRef<List<BangData>> {
|
||||
({String category, String? subCategory})? categoryFilter,
|
||||
String? domain,
|
||||
Iterable<BangGroup>? groups,
|
||||
bool? orderMostFrequentFirst
|
||||
})? get filter;
|
||||
bool? orderMostFrequentFirst,
|
||||
})?
|
||||
get filter;
|
||||
}
|
||||
|
||||
class _BangDataListProviderElement
|
||||
@@ -345,8 +333,9 @@ class _BangDataListProviderElement
|
||||
({String category, String? subCategory})? categoryFilter,
|
||||
String? domain,
|
||||
Iterable<BangGroup>? groups,
|
||||
bool? orderMostFrequentFirst
|
||||
})? get filter => (origin as BangDataListProvider).filter;
|
||||
bool? orderMostFrequentFirst,
|
||||
})?
|
||||
get filter => (origin as BangDataListProvider).filter;
|
||||
}
|
||||
|
||||
String _$frequentBangDataListHash() =>
|
||||
@@ -356,14 +345,15 @@ String _$frequentBangDataListHash() =>
|
||||
@ProviderFor(frequentBangDataList)
|
||||
final frequentBangDataListProvider =
|
||||
AutoDisposeStreamProvider<List<BangData>>.internal(
|
||||
frequentBangDataList,
|
||||
name: r'frequentBangDataListProvider',
|
||||
debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product')
|
||||
? null
|
||||
: _$frequentBangDataListHash,
|
||||
dependencies: null,
|
||||
allTransitiveDependencies: null,
|
||||
);
|
||||
frequentBangDataList,
|
||||
name: r'frequentBangDataListProvider',
|
||||
debugGetCreateSourceHash:
|
||||
const bool.fromEnvironment('dart.vm.product')
|
||||
? null
|
||||
: _$frequentBangDataListHash,
|
||||
dependencies: null,
|
||||
allTransitiveDependencies: null,
|
||||
);
|
||||
|
||||
@Deprecated('Will be removed in 3.0. Use Ref instead')
|
||||
// ignore: unused_element
|
||||
@@ -374,19 +364,20 @@ String _$searchHistoryHash() => r'7b97798729643de8e44fd8024cdc02f35124b08b';
|
||||
@ProviderFor(searchHistory)
|
||||
final searchHistoryProvider =
|
||||
AutoDisposeStreamProvider<List<SearchHistoryEntry>>.internal(
|
||||
searchHistory,
|
||||
name: r'searchHistoryProvider',
|
||||
debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product')
|
||||
? null
|
||||
: _$searchHistoryHash,
|
||||
dependencies: null,
|
||||
allTransitiveDependencies: null,
|
||||
);
|
||||
searchHistory,
|
||||
name: r'searchHistoryProvider',
|
||||
debugGetCreateSourceHash:
|
||||
const bool.fromEnvironment('dart.vm.product')
|
||||
? null
|
||||
: _$searchHistoryHash,
|
||||
dependencies: null,
|
||||
allTransitiveDependencies: null,
|
||||
);
|
||||
|
||||
@Deprecated('Will be removed in 3.0. Use Ref instead')
|
||||
// ignore: unused_element
|
||||
typedef SearchHistoryRef
|
||||
= AutoDisposeStreamProviderRef<List<SearchHistoryEntry>>;
|
||||
typedef SearchHistoryRef =
|
||||
AutoDisposeStreamProviderRef<List<SearchHistoryEntry>>;
|
||||
String _$lastSyncOfGroupHash() => r'23d07f3132ba9bb35a31f74e3a69698d31d4c569';
|
||||
|
||||
/// See also [lastSyncOfGroup].
|
||||
@@ -399,21 +390,15 @@ class LastSyncOfGroupFamily extends Family<AsyncValue<DateTime?>> {
|
||||
const LastSyncOfGroupFamily();
|
||||
|
||||
/// See also [lastSyncOfGroup].
|
||||
LastSyncOfGroupProvider call(
|
||||
BangGroup group,
|
||||
) {
|
||||
return LastSyncOfGroupProvider(
|
||||
group,
|
||||
);
|
||||
LastSyncOfGroupProvider call(BangGroup group) {
|
||||
return LastSyncOfGroupProvider(group);
|
||||
}
|
||||
|
||||
@override
|
||||
LastSyncOfGroupProvider getProviderOverride(
|
||||
covariant LastSyncOfGroupProvider provider,
|
||||
) {
|
||||
return call(
|
||||
provider.group,
|
||||
);
|
||||
return call(provider.group);
|
||||
}
|
||||
|
||||
static const Iterable<ProviderOrFamily>? _dependencies = null;
|
||||
@@ -434,24 +419,20 @@ class LastSyncOfGroupFamily extends Family<AsyncValue<DateTime?>> {
|
||||
/// See also [lastSyncOfGroup].
|
||||
class LastSyncOfGroupProvider extends AutoDisposeStreamProvider<DateTime?> {
|
||||
/// See also [lastSyncOfGroup].
|
||||
LastSyncOfGroupProvider(
|
||||
BangGroup group,
|
||||
) : this._internal(
|
||||
(ref) => lastSyncOfGroup(
|
||||
ref as LastSyncOfGroupRef,
|
||||
group,
|
||||
),
|
||||
from: lastSyncOfGroupProvider,
|
||||
name: r'lastSyncOfGroupProvider',
|
||||
debugGetCreateSourceHash:
|
||||
const bool.fromEnvironment('dart.vm.product')
|
||||
? null
|
||||
: _$lastSyncOfGroupHash,
|
||||
dependencies: LastSyncOfGroupFamily._dependencies,
|
||||
allTransitiveDependencies:
|
||||
LastSyncOfGroupFamily._allTransitiveDependencies,
|
||||
group: group,
|
||||
);
|
||||
LastSyncOfGroupProvider(BangGroup group)
|
||||
: this._internal(
|
||||
(ref) => lastSyncOfGroup(ref as LastSyncOfGroupRef, group),
|
||||
from: lastSyncOfGroupProvider,
|
||||
name: r'lastSyncOfGroupProvider',
|
||||
debugGetCreateSourceHash:
|
||||
const bool.fromEnvironment('dart.vm.product')
|
||||
? null
|
||||
: _$lastSyncOfGroupHash,
|
||||
dependencies: LastSyncOfGroupFamily._dependencies,
|
||||
allTransitiveDependencies:
|
||||
LastSyncOfGroupFamily._allTransitiveDependencies,
|
||||
group: group,
|
||||
);
|
||||
|
||||
LastSyncOfGroupProvider._internal(
|
||||
super._createNotifier, {
|
||||
@@ -530,21 +511,15 @@ class BangCountOfGroupFamily extends Family<AsyncValue<int>> {
|
||||
const BangCountOfGroupFamily();
|
||||
|
||||
/// See also [bangCountOfGroup].
|
||||
BangCountOfGroupProvider call(
|
||||
BangGroup group,
|
||||
) {
|
||||
return BangCountOfGroupProvider(
|
||||
group,
|
||||
);
|
||||
BangCountOfGroupProvider call(BangGroup group) {
|
||||
return BangCountOfGroupProvider(group);
|
||||
}
|
||||
|
||||
@override
|
||||
BangCountOfGroupProvider getProviderOverride(
|
||||
covariant BangCountOfGroupProvider provider,
|
||||
) {
|
||||
return call(
|
||||
provider.group,
|
||||
);
|
||||
return call(provider.group);
|
||||
}
|
||||
|
||||
static const Iterable<ProviderOrFamily>? _dependencies = null;
|
||||
@@ -565,24 +540,20 @@ class BangCountOfGroupFamily extends Family<AsyncValue<int>> {
|
||||
/// See also [bangCountOfGroup].
|
||||
class BangCountOfGroupProvider extends AutoDisposeStreamProvider<int> {
|
||||
/// See also [bangCountOfGroup].
|
||||
BangCountOfGroupProvider(
|
||||
BangGroup group,
|
||||
) : this._internal(
|
||||
(ref) => bangCountOfGroup(
|
||||
ref as BangCountOfGroupRef,
|
||||
group,
|
||||
),
|
||||
from: bangCountOfGroupProvider,
|
||||
name: r'bangCountOfGroupProvider',
|
||||
debugGetCreateSourceHash:
|
||||
const bool.fromEnvironment('dart.vm.product')
|
||||
? null
|
||||
: _$bangCountOfGroupHash,
|
||||
dependencies: BangCountOfGroupFamily._dependencies,
|
||||
allTransitiveDependencies:
|
||||
BangCountOfGroupFamily._allTransitiveDependencies,
|
||||
group: group,
|
||||
);
|
||||
BangCountOfGroupProvider(BangGroup group)
|
||||
: this._internal(
|
||||
(ref) => bangCountOfGroup(ref as BangCountOfGroupRef, group),
|
||||
from: bangCountOfGroupProvider,
|
||||
name: r'bangCountOfGroupProvider',
|
||||
debugGetCreateSourceHash:
|
||||
const bool.fromEnvironment('dart.vm.product')
|
||||
? null
|
||||
: _$bangCountOfGroupHash,
|
||||
dependencies: BangCountOfGroupFamily._dependencies,
|
||||
allTransitiveDependencies:
|
||||
BangCountOfGroupFamily._allTransitiveDependencies,
|
||||
group: group,
|
||||
);
|
||||
|
||||
BangCountOfGroupProvider._internal(
|
||||
super._createNotifier, {
|
||||
@@ -641,11 +612,13 @@ mixin BangCountOfGroupRef on AutoDisposeStreamProviderRef<int> {
|
||||
}
|
||||
|
||||
class _BangCountOfGroupProviderElement
|
||||
extends AutoDisposeStreamProviderElement<int> with BangCountOfGroupRef {
|
||||
extends AutoDisposeStreamProviderElement<int>
|
||||
with BangCountOfGroupRef {
|
||||
_BangCountOfGroupProviderElement(super.provider);
|
||||
|
||||
@override
|
||||
BangGroup get group => (origin as BangCountOfGroupProvider).group;
|
||||
}
|
||||
|
||||
// ignore_for_file: type=lint
|
||||
// ignore_for_file: subtype_of_sealed_class, invalid_use_of_internal_member, invalid_use_of_visible_for_testing_member, deprecated_member_use_from_same_package
|
||||
|
||||
@@ -39,24 +39,15 @@ class TriggerBangSearchFamily extends Family<AsyncValue<Uri>> {
|
||||
const TriggerBangSearchFamily();
|
||||
|
||||
/// See also [triggerBangSearch].
|
||||
TriggerBangSearchProvider call(
|
||||
BangData bang,
|
||||
String searchQuery,
|
||||
) {
|
||||
return TriggerBangSearchProvider(
|
||||
bang,
|
||||
searchQuery,
|
||||
);
|
||||
TriggerBangSearchProvider call(BangData bang, String searchQuery) {
|
||||
return TriggerBangSearchProvider(bang, searchQuery);
|
||||
}
|
||||
|
||||
@override
|
||||
TriggerBangSearchProvider getProviderOverride(
|
||||
covariant TriggerBangSearchProvider provider,
|
||||
) {
|
||||
return call(
|
||||
provider.bang,
|
||||
provider.searchQuery,
|
||||
);
|
||||
return call(provider.bang, provider.searchQuery);
|
||||
}
|
||||
|
||||
static const Iterable<ProviderOrFamily>? _dependencies = null;
|
||||
@@ -77,27 +68,22 @@ class TriggerBangSearchFamily extends Family<AsyncValue<Uri>> {
|
||||
/// See also [triggerBangSearch].
|
||||
class TriggerBangSearchProvider extends AutoDisposeFutureProvider<Uri> {
|
||||
/// See also [triggerBangSearch].
|
||||
TriggerBangSearchProvider(
|
||||
BangData bang,
|
||||
String searchQuery,
|
||||
) : this._internal(
|
||||
(ref) => triggerBangSearch(
|
||||
ref as TriggerBangSearchRef,
|
||||
bang,
|
||||
searchQuery,
|
||||
),
|
||||
from: triggerBangSearchProvider,
|
||||
name: r'triggerBangSearchProvider',
|
||||
debugGetCreateSourceHash:
|
||||
const bool.fromEnvironment('dart.vm.product')
|
||||
? null
|
||||
: _$triggerBangSearchHash,
|
||||
dependencies: TriggerBangSearchFamily._dependencies,
|
||||
allTransitiveDependencies:
|
||||
TriggerBangSearchFamily._allTransitiveDependencies,
|
||||
bang: bang,
|
||||
searchQuery: searchQuery,
|
||||
);
|
||||
TriggerBangSearchProvider(BangData bang, String searchQuery)
|
||||
: this._internal(
|
||||
(ref) =>
|
||||
triggerBangSearch(ref as TriggerBangSearchRef, bang, searchQuery),
|
||||
from: triggerBangSearchProvider,
|
||||
name: r'triggerBangSearchProvider',
|
||||
debugGetCreateSourceHash:
|
||||
const bool.fromEnvironment('dart.vm.product')
|
||||
? null
|
||||
: _$triggerBangSearchHash,
|
||||
dependencies: TriggerBangSearchFamily._dependencies,
|
||||
allTransitiveDependencies:
|
||||
TriggerBangSearchFamily._allTransitiveDependencies,
|
||||
bang: bang,
|
||||
searchQuery: searchQuery,
|
||||
);
|
||||
|
||||
TriggerBangSearchProvider._internal(
|
||||
super._createNotifier, {
|
||||
@@ -165,7 +151,8 @@ mixin TriggerBangSearchRef on AutoDisposeFutureProviderRef<Uri> {
|
||||
}
|
||||
|
||||
class _TriggerBangSearchProviderElement
|
||||
extends AutoDisposeFutureProviderElement<Uri> with TriggerBangSearchRef {
|
||||
extends AutoDisposeFutureProviderElement<Uri>
|
||||
with TriggerBangSearchRef {
|
||||
_TriggerBangSearchProviderElement(super.provider);
|
||||
|
||||
@override
|
||||
@@ -173,5 +160,6 @@ class _TriggerBangSearchProviderElement
|
||||
@override
|
||||
String get searchQuery => (origin as TriggerBangSearchProvider).searchQuery;
|
||||
}
|
||||
|
||||
// ignore_for_file: type=lint
|
||||
// ignore_for_file: subtype_of_sealed_class, invalid_use_of_internal_member, invalid_use_of_visible_for_testing_member, deprecated_member_use_from_same_package
|
||||
|
||||
@@ -27,11 +27,9 @@ class BangDataRepository extends _$BangDataRepository {
|
||||
}
|
||||
|
||||
Stream<Map<String, List<String>>> watchCategories() {
|
||||
return ref
|
||||
.read(bangDatabaseProvider)
|
||||
.categoriesJson()
|
||||
.watchSingle()
|
||||
.map((json) {
|
||||
return ref.read(bangDatabaseProvider).categoriesJson().watchSingle().map((
|
||||
json,
|
||||
) {
|
||||
final decoded = jsonDecode(json) as Map<String, dynamic>;
|
||||
return decoded.map(
|
||||
(key, value) => MapEntry(key, (value as List<dynamic>).cast()),
|
||||
@@ -43,7 +41,8 @@ class BangDataRepository extends _$BangDataRepository {
|
||||
return ref
|
||||
.read(bangDatabaseProvider)
|
||||
.bangDao
|
||||
.getBangCount(groups: [group]).watchSingle();
|
||||
.getBangCount(groups: [group])
|
||||
.watchSingle();
|
||||
}
|
||||
|
||||
Stream<List<BangData>> watchBangs({
|
||||
@@ -94,12 +93,10 @@ class BangDataRepository extends _$BangDataRepository {
|
||||
}) {
|
||||
final db = ref.read(bangDatabaseProvider);
|
||||
//Pack in a transaction to bundle rebuilds of watch() queries
|
||||
return db.transaction(
|
||||
() async {
|
||||
await db.bangDao.addSearchEntry(trigger, searchQuery);
|
||||
await db.evictHistoryEntries(limit: maxEntryCount);
|
||||
},
|
||||
);
|
||||
return db.transaction(() async {
|
||||
await db.bangDao.addSearchEntry(trigger, searchQuery);
|
||||
await db.evictHistoryEntries(limit: maxEntryCount);
|
||||
});
|
||||
}
|
||||
|
||||
Future<void> removeSearchEntry(String searchQuery) {
|
||||
|
||||
@@ -13,14 +13,15 @@ String _$bangDataRepositoryHash() =>
|
||||
@ProviderFor(BangDataRepository)
|
||||
final bangDataRepositoryProvider =
|
||||
NotifierProvider<BangDataRepository, void>.internal(
|
||||
BangDataRepository.new,
|
||||
name: r'bangDataRepositoryProvider',
|
||||
debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product')
|
||||
? null
|
||||
: _$bangDataRepositoryHash,
|
||||
dependencies: null,
|
||||
allTransitiveDependencies: null,
|
||||
);
|
||||
BangDataRepository.new,
|
||||
name: r'bangDataRepositoryProvider',
|
||||
debugGetCreateSourceHash:
|
||||
const bool.fromEnvironment('dart.vm.product')
|
||||
? null
|
||||
: _$bangDataRepositoryHash,
|
||||
dependencies: null,
|
||||
allTransitiveDependencies: null,
|
||||
);
|
||||
|
||||
typedef _$BangDataRepository = Notifier<void>;
|
||||
// ignore_for_file: type=lint
|
||||
|
||||
@@ -12,13 +12,15 @@ String _$bangSearchHash() => r'abf9ff5badf2ecfbcbde148fd2c849beac83bec4';
|
||||
@ProviderFor(BangSearch)
|
||||
final bangSearchProvider =
|
||||
AutoDisposeStreamNotifierProvider<BangSearch, List<BangData>>.internal(
|
||||
BangSearch.new,
|
||||
name: r'bangSearchProvider',
|
||||
debugGetCreateSourceHash:
|
||||
const bool.fromEnvironment('dart.vm.product') ? null : _$bangSearchHash,
|
||||
dependencies: null,
|
||||
allTransitiveDependencies: null,
|
||||
);
|
||||
BangSearch.new,
|
||||
name: r'bangSearchProvider',
|
||||
debugGetCreateSourceHash:
|
||||
const bool.fromEnvironment('dart.vm.product')
|
||||
? null
|
||||
: _$bangSearchHash,
|
||||
dependencies: null,
|
||||
allTransitiveDependencies: null,
|
||||
);
|
||||
|
||||
typedef _$BangSearch = AutoDisposeStreamNotifier<List<BangData>>;
|
||||
String _$seamlessBangProviderHash() =>
|
||||
@@ -27,17 +29,20 @@ String _$seamlessBangProviderHash() =>
|
||||
/// See also [SeamlessBangProvider].
|
||||
@ProviderFor(SeamlessBangProvider)
|
||||
final seamlessBangProviderProvider = AutoDisposeNotifierProvider<
|
||||
SeamlessBangProvider, AsyncValue<List<BangData>>>.internal(
|
||||
SeamlessBangProvider,
|
||||
AsyncValue<List<BangData>>
|
||||
>.internal(
|
||||
SeamlessBangProvider.new,
|
||||
name: r'seamlessBangProviderProvider',
|
||||
debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product')
|
||||
? null
|
||||
: _$seamlessBangProviderHash,
|
||||
debugGetCreateSourceHash:
|
||||
const bool.fromEnvironment('dart.vm.product')
|
||||
? null
|
||||
: _$seamlessBangProviderHash,
|
||||
dependencies: null,
|
||||
allTransitiveDependencies: null,
|
||||
);
|
||||
|
||||
typedef _$SeamlessBangProvider
|
||||
= AutoDisposeNotifier<AsyncValue<List<BangData>>>;
|
||||
typedef _$SeamlessBangProvider =
|
||||
AutoDisposeNotifier<AsyncValue<List<BangData>>>;
|
||||
// ignore_for_file: type=lint
|
||||
// ignore_for_file: subtype_of_sealed_class, invalid_use_of_internal_member, invalid_use_of_visible_for_testing_member, deprecated_member_use_from_same_package
|
||||
|
||||
@@ -29,16 +29,14 @@ class BangSyncRepository extends _$BangSyncRepository {
|
||||
}
|
||||
|
||||
final result = await sourceService.getBangs(url, group);
|
||||
return result.flatMapAsync(
|
||||
(remoteBangs) async {
|
||||
await db.syncDao.syncBangs(
|
||||
group: group,
|
||||
remoteBangs: remoteBangs,
|
||||
syncTime: DateTime.now(),
|
||||
);
|
||||
await db.optimizeFtsIndex();
|
||||
},
|
||||
);
|
||||
return result.flatMapAsync((remoteBangs) async {
|
||||
await db.syncDao.syncBangs(
|
||||
group: group,
|
||||
remoteBangs: remoteBangs,
|
||||
syncTime: DateTime.now(),
|
||||
);
|
||||
await db.optimizeFtsIndex();
|
||||
});
|
||||
}
|
||||
|
||||
Future<Result<void>> syncBangGroup(
|
||||
@@ -47,7 +45,9 @@ class BangSyncRepository extends _$BangSyncRepository {
|
||||
) async {
|
||||
try {
|
||||
return Result.success(
|
||||
await ref.read(bangDatabaseProvider).computeWithDatabase(
|
||||
await ref
|
||||
.read(bangDatabaseProvider)
|
||||
.computeWithDatabase(
|
||||
connect: BangDatabase.new,
|
||||
computation: (db) async {
|
||||
final ref = ProviderContainer();
|
||||
@@ -92,8 +92,10 @@ class BangSyncRepository extends _$BangSyncRepository {
|
||||
|
||||
//Run isolated operations
|
||||
final futures = groups.map(
|
||||
(source) => syncBangGroup(source, syncInterval)
|
||||
.then((result) => MapEntry(source, result)),
|
||||
(source) => syncBangGroup(
|
||||
source,
|
||||
syncInterval,
|
||||
).then((result) => MapEntry(source, result)),
|
||||
);
|
||||
|
||||
return Map.fromEntries(await Future.wait(futures));
|
||||
|
||||
@@ -13,14 +13,15 @@ String _$bangSyncRepositoryHash() =>
|
||||
@ProviderFor(BangSyncRepository)
|
||||
final bangSyncRepositoryProvider =
|
||||
NotifierProvider<BangSyncRepository, void>.internal(
|
||||
BangSyncRepository.new,
|
||||
name: r'bangSyncRepositoryProvider',
|
||||
debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product')
|
||||
? null
|
||||
: _$bangSyncRepositoryHash,
|
||||
dependencies: null,
|
||||
allTransitiveDependencies: null,
|
||||
);
|
||||
BangSyncRepository.new,
|
||||
name: r'bangSyncRepositoryProvider',
|
||||
debugGetCreateSourceHash:
|
||||
const bool.fromEnvironment('dart.vm.product')
|
||||
? null
|
||||
: _$bangSyncRepositoryHash,
|
||||
dependencies: null,
|
||||
allTransitiveDependencies: null,
|
||||
);
|
||||
|
||||
typedef _$BangSyncRepository = Notifier<void>;
|
||||
// ignore_for_file: type=lint
|
||||
|
||||
@@ -45,38 +45,43 @@ class BangCategoriesScreen extends HookConsumerWidget {
|
||||
expanded.value = {...expanded.value}..remove(key);
|
||||
}
|
||||
},
|
||||
children: categories.entries
|
||||
.map(
|
||||
(category) => ExpansionPanel(
|
||||
canTapOnHeader: true,
|
||||
isExpanded: expanded.value.contains(category.key),
|
||||
headerBuilder: (context, isExpanded) => ListTile(
|
||||
title: Text(category.key),
|
||||
),
|
||||
body: Padding(
|
||||
padding: const EdgeInsets.only(left: 16.0),
|
||||
child: Column(
|
||||
mainAxisSize: MainAxisSize.min,
|
||||
children: category.value
|
||||
.map(
|
||||
(subCategory) => ListTile(
|
||||
title: Text(subCategory),
|
||||
onTap: () async {
|
||||
await context.push(
|
||||
BangSubCategoryRoute(
|
||||
category: category.key,
|
||||
subCategory: subCategory,
|
||||
).location,
|
||||
);
|
||||
},
|
||||
),
|
||||
)
|
||||
.toList(),
|
||||
children:
|
||||
categories.entries
|
||||
.map(
|
||||
(category) => ExpansionPanel(
|
||||
canTapOnHeader: true,
|
||||
isExpanded: expanded.value.contains(
|
||||
category.key,
|
||||
),
|
||||
headerBuilder:
|
||||
(context, isExpanded) =>
|
||||
ListTile(title: Text(category.key)),
|
||||
body: Padding(
|
||||
padding: const EdgeInsets.only(left: 16.0),
|
||||
child: Column(
|
||||
mainAxisSize: MainAxisSize.min,
|
||||
children:
|
||||
category.value
|
||||
.map(
|
||||
(subCategory) => ListTile(
|
||||
title: Text(subCategory),
|
||||
onTap: () async {
|
||||
await context.push(
|
||||
BangSubCategoryRoute(
|
||||
category: category.key,
|
||||
subCategory:
|
||||
subCategory,
|
||||
).location,
|
||||
);
|
||||
},
|
||||
),
|
||||
)
|
||||
.toList(),
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
)
|
||||
.toList(),
|
||||
)
|
||||
.toList(),
|
||||
);
|
||||
},
|
||||
),
|
||||
@@ -84,12 +89,13 @@ class BangCategoriesScreen extends HookConsumerWidget {
|
||||
},
|
||||
);
|
||||
},
|
||||
error: (error, stackTrace) => Center(
|
||||
child: FailureWidget(
|
||||
title: 'Failed to load Bang Categories',
|
||||
exception: error,
|
||||
),
|
||||
),
|
||||
error:
|
||||
(error, stackTrace) => Center(
|
||||
child: FailureWidget(
|
||||
title: 'Failed to load Bang Categories',
|
||||
exception: error,
|
||||
),
|
||||
),
|
||||
loading: () => const Center(child: CircularProgressIndicator()),
|
||||
),
|
||||
);
|
||||
|
||||
@@ -35,9 +35,7 @@ class BangListScreen extends HookConsumerWidget {
|
||||
return Scaffold(
|
||||
body: CustomScrollView(
|
||||
slivers: [
|
||||
SliverAppBar.medium(
|
||||
title: Text('$category: $subCategory'),
|
||||
),
|
||||
SliverAppBar.medium(title: Text('$category: $subCategory')),
|
||||
bangsAsync.when(
|
||||
data: (bangs) {
|
||||
return SliverList.builder(
|
||||
@@ -53,10 +51,10 @@ class BangListScreen extends HookConsumerWidget {
|
||||
|
||||
if (ref.read(bottomSheetControllerProvider)
|
||||
is! CreateTabSheet) {
|
||||
ref.read(bottomSheetControllerProvider.notifier).show(
|
||||
CreateTabSheet(
|
||||
preferredTool: KagiTool.search,
|
||||
),
|
||||
ref
|
||||
.read(bottomSheetControllerProvider.notifier)
|
||||
.show(
|
||||
CreateTabSheet(preferredTool: KagiTool.search),
|
||||
);
|
||||
}
|
||||
|
||||
@@ -66,17 +64,19 @@ class BangListScreen extends HookConsumerWidget {
|
||||
},
|
||||
);
|
||||
},
|
||||
error: (error, stackTrace) => SliverToBoxAdapter(
|
||||
child: Center(
|
||||
child: FailureWidget(
|
||||
title: 'Failed to load Bangs',
|
||||
exception: error,
|
||||
error:
|
||||
(error, stackTrace) => SliverToBoxAdapter(
|
||||
child: Center(
|
||||
child: FailureWidget(
|
||||
title: 'Failed to load Bangs',
|
||||
exception: error,
|
||||
),
|
||||
),
|
||||
),
|
||||
loading:
|
||||
() => const SliverToBoxAdapter(
|
||||
child: Center(child: CircularProgressIndicator()),
|
||||
),
|
||||
),
|
||||
),
|
||||
loading: () => const SliverToBoxAdapter(
|
||||
child: Center(child: CircularProgressIndicator()),
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
|
||||
@@ -22,8 +22,9 @@ class BangSearchScreen extends HookConsumerWidget {
|
||||
final resultsAsync = ref.watch(bangSearchProvider);
|
||||
final incognitoEnabled = ref.watch(incognitoModeEnabledProvider);
|
||||
|
||||
final textEditingController =
|
||||
useTextEditingController(text: initialSearchText);
|
||||
final textEditingController = useTextEditingController(
|
||||
text: initialSearchText,
|
||||
);
|
||||
|
||||
useListenableCallback(textEditingController, () async {
|
||||
unawaited(
|
||||
@@ -57,42 +58,44 @@ class BangSearchScreen extends HookConsumerWidget {
|
||||
),
|
||||
body: resultsAsync.when(
|
||||
skipLoadingOnReload: true,
|
||||
data: (bangs) => FadingScroll(
|
||||
fadingSize: 25,
|
||||
builder: (context, controller) {
|
||||
return ListView.builder(
|
||||
controller: controller,
|
||||
itemCount: bangs.length,
|
||||
itemBuilder: (context, index) {
|
||||
final bang = bangs[index];
|
||||
return BangDetails(
|
||||
bang,
|
||||
onTap: () {
|
||||
ref
|
||||
.read(selectedBangTriggerProvider().notifier)
|
||||
.setTrigger(bang.trigger);
|
||||
data:
|
||||
(bangs) => FadingScroll(
|
||||
fadingSize: 25,
|
||||
builder: (context, controller) {
|
||||
return ListView.builder(
|
||||
controller: controller,
|
||||
itemCount: bangs.length,
|
||||
itemBuilder: (context, index) {
|
||||
final bang = bangs[index];
|
||||
return BangDetails(
|
||||
bang,
|
||||
onTap: () {
|
||||
ref
|
||||
.read(selectedBangTriggerProvider().notifier)
|
||||
.setTrigger(bang.trigger);
|
||||
|
||||
// if (ref.read(bottomSheetControllerProvider)
|
||||
// is! CreateTabSheet) {
|
||||
// ref.read(bottomSheetControllerProvider.notifier).show(
|
||||
// CreateTabSheet(preferredTool: KagiTool.search),
|
||||
// );
|
||||
// }
|
||||
// if (ref.read(bottomSheetControllerProvider)
|
||||
// is! CreateTabSheet) {
|
||||
// ref.read(bottomSheetControllerProvider.notifier).show(
|
||||
// CreateTabSheet(preferredTool: KagiTool.search),
|
||||
// );
|
||||
// }
|
||||
|
||||
// context.go(BrowserRoute().location);
|
||||
context.pop();
|
||||
// context.go(BrowserRoute().location);
|
||||
context.pop();
|
||||
},
|
||||
);
|
||||
},
|
||||
);
|
||||
},
|
||||
);
|
||||
},
|
||||
),
|
||||
error: (error, stackTrace) => Center(
|
||||
child: FailureWidget(
|
||||
title: 'Bang Search failed',
|
||||
exception: error,
|
||||
),
|
||||
),
|
||||
),
|
||||
error:
|
||||
(error, stackTrace) => Center(
|
||||
child: FailureWidget(
|
||||
title: 'Bang Search failed',
|
||||
exception: error,
|
||||
),
|
||||
),
|
||||
loading: () => const SizedBox.shrink(),
|
||||
),
|
||||
);
|
||||
|
||||
@@ -63,8 +63,9 @@ class BangDetails extends HookConsumerWidget {
|
||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||
children: [
|
||||
FilledButton.tonalIcon(
|
||||
style:
|
||||
const ButtonStyle(visualDensity: VisualDensity.compact),
|
||||
style: const ButtonStyle(
|
||||
visualDensity: VisualDensity.compact,
|
||||
),
|
||||
onPressed: () async {
|
||||
final url = Uri.parse(bangData.getUrl('').origin);
|
||||
|
||||
@@ -79,9 +80,7 @@ class BangDetails extends HookConsumerWidget {
|
||||
label: Text(bangData.domain),
|
||||
icon: const Icon(Icons.open_in_new),
|
||||
),
|
||||
const SizedBox(
|
||||
width: 8,
|
||||
),
|
||||
const SizedBox(width: 8),
|
||||
Expanded(
|
||||
child: Text(
|
||||
'!${bangData.trigger}',
|
||||
|
||||
@@ -30,14 +30,11 @@ class SiteSearch extends HookConsumerWidget {
|
||||
|
||||
final searchTextController = useTextEditingController();
|
||||
|
||||
useListenableCallback(
|
||||
searchTextController,
|
||||
() async {
|
||||
ref
|
||||
.read(searchSuggestionsProvider().notifier)
|
||||
.addQuery(searchTextController.text);
|
||||
},
|
||||
);
|
||||
useListenableCallback(searchTextController, () async {
|
||||
ref
|
||||
.read(searchSuggestionsProvider().notifier)
|
||||
.addQuery(searchTextController.text);
|
||||
});
|
||||
|
||||
final selectedBang = ref.watch(selectedBangDataProvider(domain: domain));
|
||||
|
||||
@@ -73,15 +70,11 @@ class SiteSearch extends HookConsumerWidget {
|
||||
selectedItem: selectedBang,
|
||||
onSelected: (bang) {
|
||||
ref
|
||||
.read(
|
||||
selectedBangTriggerProvider(domain: domain).notifier,
|
||||
)
|
||||
.read(selectedBangTriggerProvider(domain: domain).notifier)
|
||||
.setTrigger(bang.trigger);
|
||||
},
|
||||
onDeleted: (bang) {
|
||||
if (ref.read(
|
||||
selectedBangTriggerProvider(domain: domain),
|
||||
) ==
|
||||
if (ref.read(selectedBangTriggerProvider(domain: domain)) ==
|
||||
bang.trigger) {
|
||||
ref
|
||||
.read(
|
||||
|
||||
@@ -13,9 +13,7 @@ class MessagesDao extends DatabaseAccessor<ChatDatabase>
|
||||
MessagesDao(super.db);
|
||||
|
||||
Selectable<int> messageCount({required String chatId}) {
|
||||
return db.chatMessage.count(
|
||||
where: (row) => row.chatId.equals(chatId),
|
||||
);
|
||||
return db.chatMessage.count(where: (row) => row.chatId.equals(chatId));
|
||||
}
|
||||
|
||||
Selectable<ChatMessageData> chatMessages({required String chatId}) {
|
||||
@@ -29,9 +27,9 @@ class MessagesDao extends DatabaseAccessor<ChatDatabase>
|
||||
db.chatMessage.select()..where((row) => row.messageId.equals(messageId)),
|
||||
);
|
||||
|
||||
return db.selectExpressions([existsExpression]).map(
|
||||
(row) => row.read(existsExpression)!,
|
||||
);
|
||||
return db
|
||||
.selectExpressions([existsExpression])
|
||||
.map((row) => row.read(existsExpression)!);
|
||||
}
|
||||
|
||||
SingleOrNullSelectable<int> messageIndex({
|
||||
@@ -52,39 +50,39 @@ class MessagesDao extends DatabaseAccessor<ChatDatabase>
|
||||
return null;
|
||||
}
|
||||
|
||||
return db.transaction(
|
||||
() async {
|
||||
final String orderKey;
|
||||
if (index != null) {
|
||||
if (index <= 0) {
|
||||
orderKey =
|
||||
await db.leadingOrderKey(bucket: 0, chatId: chatId).getSingle();
|
||||
} else {
|
||||
orderKey = await db
|
||||
.orderKeyBeforeIndex(chatId: chatId, rowIdx: index + 1)
|
||||
.getSingle();
|
||||
}
|
||||
return db.transaction(() async {
|
||||
final String orderKey;
|
||||
if (index != null) {
|
||||
if (index <= 0) {
|
||||
orderKey =
|
||||
await db.leadingOrderKey(bucket: 0, chatId: chatId).getSingle();
|
||||
} else {
|
||||
orderKey =
|
||||
await db.trailingOrderKey(bucket: 0, chatId: chatId).getSingle();
|
||||
await db
|
||||
.orderKeyBeforeIndex(chatId: chatId, rowIdx: index + 1)
|
||||
.getSingle();
|
||||
}
|
||||
} else {
|
||||
orderKey =
|
||||
await db.trailingOrderKey(bucket: 0, chatId: chatId).getSingle();
|
||||
}
|
||||
|
||||
await db.chatMessage.insertOne(
|
||||
ChatMessageCompanion.insert(
|
||||
messageId: message.id,
|
||||
chatId: chatId,
|
||||
orderKey: orderKey,
|
||||
messageJson: jsonEncode(message.toJson()),
|
||||
),
|
||||
);
|
||||
await db.chatMessage.insertOne(
|
||||
ChatMessageCompanion.insert(
|
||||
messageId: message.id,
|
||||
chatId: chatId,
|
||||
orderKey: orderKey,
|
||||
messageJson: jsonEncode(message.toJson()),
|
||||
),
|
||||
);
|
||||
|
||||
final rowIdx = await db
|
||||
.messageIndex(chatId: chatId, messageId: message.id)
|
||||
.getSingle();
|
||||
final rowIdx =
|
||||
await db
|
||||
.messageIndex(chatId: chatId, messageId: message.id)
|
||||
.getSingle();
|
||||
|
||||
return rowIdx - 1;
|
||||
},
|
||||
);
|
||||
return rowIdx - 1;
|
||||
});
|
||||
}
|
||||
|
||||
Future<int> removeMessage({required String messageId}) {
|
||||
@@ -98,10 +96,10 @@ class MessagesDao extends DatabaseAccessor<ChatDatabase>
|
||||
return (db.chatMessage.update()
|
||||
..where((row) => row.messageId.equals(messageId)))
|
||||
.write(
|
||||
ChatMessageCompanion(
|
||||
messageJson: Value(jsonEncode(message.toJson())),
|
||||
),
|
||||
);
|
||||
ChatMessageCompanion(
|
||||
messageJson: Value(jsonEncode(message.toJson())),
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
Future<int> deleteChatMessages({required String chatId}) {
|
||||
@@ -120,21 +118,19 @@ class MessagesDao extends DatabaseAccessor<ChatDatabase>
|
||||
await db.leadingOrderKey(bucket: 0, chatId: chatId).getSingle();
|
||||
|
||||
await db.chatMessage.insertAll(
|
||||
messages.map(
|
||||
(message) {
|
||||
final insertable = ChatMessageCompanion.insert(
|
||||
messageId: message.id,
|
||||
chatId: chatId,
|
||||
messageJson: jsonEncode(message.toJson()),
|
||||
orderKey: currentOrderKey,
|
||||
// timestamp: DateTime.now(),
|
||||
);
|
||||
messages.map((message) {
|
||||
final insertable = ChatMessageCompanion.insert(
|
||||
messageId: message.id,
|
||||
chatId: chatId,
|
||||
messageJson: jsonEncode(message.toJson()),
|
||||
orderKey: currentOrderKey,
|
||||
// timestamp: DateTime.now(),
|
||||
);
|
||||
|
||||
currentOrderKey = LexoRank.parse(currentOrderKey).genPrev().value;
|
||||
currentOrderKey = LexoRank.parse(currentOrderKey).genPrev().value;
|
||||
|
||||
return insertable;
|
||||
},
|
||||
),
|
||||
return insertable;
|
||||
}),
|
||||
);
|
||||
});
|
||||
}
|
||||
|
||||
@@ -10,9 +10,10 @@ class MetadataDao extends DatabaseAccessor<ChatDatabase>
|
||||
MetadataDao(super.db);
|
||||
|
||||
SingleOrNullSelectable<ChatMetadata> chatMetadata(String chatId) {
|
||||
final statement = db.chatData.selectOnly()
|
||||
..addColumns([db.chatData.metadata])
|
||||
..where(db.chatData.chatId.equals(chatId));
|
||||
final statement =
|
||||
db.chatData.selectOnly()
|
||||
..addColumns([db.chatData.metadata])
|
||||
..where(db.chatData.chatId.equals(chatId));
|
||||
|
||||
return statement.map((row) => row.readWithConverter(db.chatData.metadata)!);
|
||||
}
|
||||
|
||||
@@ -9,16 +9,22 @@ class ChatData extends Table with TableInfo<ChatData, ChatDataData> {
|
||||
final String? _alias;
|
||||
ChatData(this.attachedDatabase, [this._alias]);
|
||||
late final GeneratedColumn<String> chatId = GeneratedColumn<String>(
|
||||
'chat_id', aliasedName, false,
|
||||
type: DriftSqlType.string,
|
||||
requiredDuringInsert: true,
|
||||
$customConstraints: 'PRIMARY KEY NOT NULL');
|
||||
'chat_id',
|
||||
aliasedName,
|
||||
false,
|
||||
type: DriftSqlType.string,
|
||||
requiredDuringInsert: true,
|
||||
$customConstraints: 'PRIMARY KEY NOT NULL',
|
||||
);
|
||||
late final GeneratedColumnWithTypeConverter<ChatMetadata, String> metadata =
|
||||
GeneratedColumn<String>('metadata', aliasedName, false,
|
||||
type: DriftSqlType.string,
|
||||
requiredDuringInsert: true,
|
||||
$customConstraints: 'NOT NULL')
|
||||
.withConverter<ChatMetadata>(ChatData.$convertermetadata);
|
||||
GeneratedColumn<String>(
|
||||
'metadata',
|
||||
aliasedName,
|
||||
false,
|
||||
type: DriftSqlType.string,
|
||||
requiredDuringInsert: true,
|
||||
$customConstraints: 'NOT NULL',
|
||||
).withConverter<ChatMetadata>(ChatData.$convertermetadata);
|
||||
@override
|
||||
List<GeneratedColumn> get $columns => [chatId, metadata];
|
||||
@override
|
||||
@@ -32,10 +38,17 @@ class ChatData extends Table with TableInfo<ChatData, ChatDataData> {
|
||||
ChatDataData map(Map<String, dynamic> data, {String? tablePrefix}) {
|
||||
final effectivePrefix = tablePrefix != null ? '$tablePrefix.' : '';
|
||||
return ChatDataData(
|
||||
chatId: attachedDatabase.typeMapping
|
||||
.read(DriftSqlType.string, data['${effectivePrefix}chat_id'])!,
|
||||
metadata: ChatData.$convertermetadata.fromSql(attachedDatabase.typeMapping
|
||||
.read(DriftSqlType.string, data['${effectivePrefix}metadata'])!),
|
||||
chatId:
|
||||
attachedDatabase.typeMapping.read(
|
||||
DriftSqlType.string,
|
||||
data['${effectivePrefix}chat_id'],
|
||||
)!,
|
||||
metadata: ChatData.$convertermetadata.fromSql(
|
||||
attachedDatabase.typeMapping.read(
|
||||
DriftSqlType.string,
|
||||
data['${effectivePrefix}metadata'],
|
||||
)!,
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
@@ -59,14 +72,17 @@ class ChatDataData extends DataClass implements Insertable<ChatDataData> {
|
||||
final map = <String, Expression>{};
|
||||
map['chat_id'] = Variable<String>(chatId);
|
||||
{
|
||||
map['metadata'] =
|
||||
Variable<String>(ChatData.$convertermetadata.toSql(metadata));
|
||||
map['metadata'] = Variable<String>(
|
||||
ChatData.$convertermetadata.toSql(metadata),
|
||||
);
|
||||
}
|
||||
return map;
|
||||
}
|
||||
|
||||
factory ChatDataData.fromJson(Map<String, dynamic> json,
|
||||
{ValueSerializer? serializer}) {
|
||||
factory ChatDataData.fromJson(
|
||||
Map<String, dynamic> json, {
|
||||
ValueSerializer? serializer,
|
||||
}) {
|
||||
serializer ??= driftRuntimeOptions.defaultSerializer;
|
||||
return ChatDataData(
|
||||
chatId: serializer.fromJson<String>(json['chat_id']),
|
||||
@@ -126,8 +142,8 @@ class ChatDataCompanion extends UpdateCompanion<ChatDataData> {
|
||||
required String chatId,
|
||||
required ChatMetadata metadata,
|
||||
this.rowid = const Value.absent(),
|
||||
}) : chatId = Value(chatId),
|
||||
metadata = Value(metadata);
|
||||
}) : chatId = Value(chatId),
|
||||
metadata = Value(metadata);
|
||||
static Insertable<ChatDataData> custom({
|
||||
Expression<String>? chatId,
|
||||
Expression<String>? metadata,
|
||||
@@ -140,10 +156,11 @@ class ChatDataCompanion extends UpdateCompanion<ChatDataData> {
|
||||
});
|
||||
}
|
||||
|
||||
ChatDataCompanion copyWith(
|
||||
{Value<String>? chatId,
|
||||
Value<ChatMetadata>? metadata,
|
||||
Value<int>? rowid}) {
|
||||
ChatDataCompanion copyWith({
|
||||
Value<String>? chatId,
|
||||
Value<ChatMetadata>? metadata,
|
||||
Value<int>? rowid,
|
||||
}) {
|
||||
return ChatDataCompanion(
|
||||
chatId: chatId ?? this.chatId,
|
||||
metadata: metadata ?? this.metadata,
|
||||
@@ -158,8 +175,9 @@ class ChatDataCompanion extends UpdateCompanion<ChatDataData> {
|
||||
map['chat_id'] = Variable<String>(chatId.value);
|
||||
}
|
||||
if (metadata.present) {
|
||||
map['metadata'] =
|
||||
Variable<String>(ChatData.$convertermetadata.toSql(metadata.value));
|
||||
map['metadata'] = Variable<String>(
|
||||
ChatData.$convertermetadata.toSql(metadata.value),
|
||||
);
|
||||
}
|
||||
if (rowid.present) {
|
||||
map['rowid'] = Variable<int>(rowid.value);
|
||||
@@ -184,28 +202,44 @@ class ChatMessage extends Table with TableInfo<ChatMessage, ChatMessageData> {
|
||||
final String? _alias;
|
||||
ChatMessage(this.attachedDatabase, [this._alias]);
|
||||
late final GeneratedColumn<String> messageId = GeneratedColumn<String>(
|
||||
'message_id', aliasedName, false,
|
||||
type: DriftSqlType.string,
|
||||
requiredDuringInsert: true,
|
||||
$customConstraints: 'PRIMARY KEY NOT NULL');
|
||||
'message_id',
|
||||
aliasedName,
|
||||
false,
|
||||
type: DriftSqlType.string,
|
||||
requiredDuringInsert: true,
|
||||
$customConstraints: 'PRIMARY KEY NOT NULL',
|
||||
);
|
||||
late final GeneratedColumn<String> chatId = GeneratedColumn<String>(
|
||||
'chat_id', aliasedName, false,
|
||||
type: DriftSqlType.string,
|
||||
requiredDuringInsert: true,
|
||||
$customConstraints: 'NOT NULL');
|
||||
'chat_id',
|
||||
aliasedName,
|
||||
false,
|
||||
type: DriftSqlType.string,
|
||||
requiredDuringInsert: true,
|
||||
$customConstraints: 'NOT NULL',
|
||||
);
|
||||
late final GeneratedColumn<String> orderKey = GeneratedColumn<String>(
|
||||
'order_key', aliasedName, false,
|
||||
type: DriftSqlType.string,
|
||||
requiredDuringInsert: true,
|
||||
$customConstraints: 'NOT NULL');
|
||||
'order_key',
|
||||
aliasedName,
|
||||
false,
|
||||
type: DriftSqlType.string,
|
||||
requiredDuringInsert: true,
|
||||
$customConstraints: 'NOT NULL',
|
||||
);
|
||||
late final GeneratedColumn<String> messageJson = GeneratedColumn<String>(
|
||||
'message_json', aliasedName, false,
|
||||
type: DriftSqlType.string,
|
||||
requiredDuringInsert: true,
|
||||
$customConstraints: 'NOT NULL');
|
||||
'message_json',
|
||||
aliasedName,
|
||||
false,
|
||||
type: DriftSqlType.string,
|
||||
requiredDuringInsert: true,
|
||||
$customConstraints: 'NOT NULL',
|
||||
);
|
||||
@override
|
||||
List<GeneratedColumn> get $columns =>
|
||||
[messageId, chatId, orderKey, messageJson];
|
||||
List<GeneratedColumn> get $columns => [
|
||||
messageId,
|
||||
chatId,
|
||||
orderKey,
|
||||
messageJson,
|
||||
];
|
||||
@override
|
||||
String get aliasedName => _alias ?? actualTableName;
|
||||
@override
|
||||
@@ -217,14 +251,26 @@ class ChatMessage extends Table with TableInfo<ChatMessage, ChatMessageData> {
|
||||
ChatMessageData map(Map<String, dynamic> data, {String? tablePrefix}) {
|
||||
final effectivePrefix = tablePrefix != null ? '$tablePrefix.' : '';
|
||||
return ChatMessageData(
|
||||
messageId: attachedDatabase.typeMapping
|
||||
.read(DriftSqlType.string, data['${effectivePrefix}message_id'])!,
|
||||
chatId: attachedDatabase.typeMapping
|
||||
.read(DriftSqlType.string, data['${effectivePrefix}chat_id'])!,
|
||||
orderKey: attachedDatabase.typeMapping
|
||||
.read(DriftSqlType.string, data['${effectivePrefix}order_key'])!,
|
||||
messageJson: attachedDatabase.typeMapping
|
||||
.read(DriftSqlType.string, data['${effectivePrefix}message_json'])!,
|
||||
messageId:
|
||||
attachedDatabase.typeMapping.read(
|
||||
DriftSqlType.string,
|
||||
data['${effectivePrefix}message_id'],
|
||||
)!,
|
||||
chatId:
|
||||
attachedDatabase.typeMapping.read(
|
||||
DriftSqlType.string,
|
||||
data['${effectivePrefix}chat_id'],
|
||||
)!,
|
||||
orderKey:
|
||||
attachedDatabase.typeMapping.read(
|
||||
DriftSqlType.string,
|
||||
data['${effectivePrefix}order_key'],
|
||||
)!,
|
||||
messageJson:
|
||||
attachedDatabase.typeMapping.read(
|
||||
DriftSqlType.string,
|
||||
data['${effectivePrefix}message_json'],
|
||||
)!,
|
||||
);
|
||||
}
|
||||
|
||||
@@ -242,11 +288,12 @@ class ChatMessageData extends DataClass implements Insertable<ChatMessageData> {
|
||||
final String chatId;
|
||||
final String orderKey;
|
||||
final String messageJson;
|
||||
const ChatMessageData(
|
||||
{required this.messageId,
|
||||
required this.chatId,
|
||||
required this.orderKey,
|
||||
required this.messageJson});
|
||||
const ChatMessageData({
|
||||
required this.messageId,
|
||||
required this.chatId,
|
||||
required this.orderKey,
|
||||
required this.messageJson,
|
||||
});
|
||||
@override
|
||||
Map<String, Expression> toColumns(bool nullToAbsent) {
|
||||
final map = <String, Expression>{};
|
||||
@@ -257,8 +304,10 @@ class ChatMessageData extends DataClass implements Insertable<ChatMessageData> {
|
||||
return map;
|
||||
}
|
||||
|
||||
factory ChatMessageData.fromJson(Map<String, dynamic> json,
|
||||
{ValueSerializer? serializer}) {
|
||||
factory ChatMessageData.fromJson(
|
||||
Map<String, dynamic> json, {
|
||||
ValueSerializer? serializer,
|
||||
}) {
|
||||
serializer ??= driftRuntimeOptions.defaultSerializer;
|
||||
return ChatMessageData(
|
||||
messageId: serializer.fromJson<String>(json['message_id']),
|
||||
@@ -278,17 +327,17 @@ class ChatMessageData extends DataClass implements Insertable<ChatMessageData> {
|
||||
};
|
||||
}
|
||||
|
||||
ChatMessageData copyWith(
|
||||
{String? messageId,
|
||||
String? chatId,
|
||||
String? orderKey,
|
||||
String? messageJson}) =>
|
||||
ChatMessageData(
|
||||
messageId: messageId ?? this.messageId,
|
||||
chatId: chatId ?? this.chatId,
|
||||
orderKey: orderKey ?? this.orderKey,
|
||||
messageJson: messageJson ?? this.messageJson,
|
||||
);
|
||||
ChatMessageData copyWith({
|
||||
String? messageId,
|
||||
String? chatId,
|
||||
String? orderKey,
|
||||
String? messageJson,
|
||||
}) => ChatMessageData(
|
||||
messageId: messageId ?? this.messageId,
|
||||
chatId: chatId ?? this.chatId,
|
||||
orderKey: orderKey ?? this.orderKey,
|
||||
messageJson: messageJson ?? this.messageJson,
|
||||
);
|
||||
ChatMessageData copyWithCompanion(ChatMessageCompanion data) {
|
||||
return ChatMessageData(
|
||||
messageId: data.messageId.present ? data.messageId.value : this.messageId,
|
||||
@@ -341,10 +390,10 @@ class ChatMessageCompanion extends UpdateCompanion<ChatMessageData> {
|
||||
required String orderKey,
|
||||
required String messageJson,
|
||||
this.rowid = const Value.absent(),
|
||||
}) : messageId = Value(messageId),
|
||||
chatId = Value(chatId),
|
||||
orderKey = Value(orderKey),
|
||||
messageJson = Value(messageJson);
|
||||
}) : messageId = Value(messageId),
|
||||
chatId = Value(chatId),
|
||||
orderKey = Value(orderKey),
|
||||
messageJson = Value(messageJson);
|
||||
static Insertable<ChatMessageData> custom({
|
||||
Expression<String>? messageId,
|
||||
Expression<String>? chatId,
|
||||
@@ -361,12 +410,13 @@ class ChatMessageCompanion extends UpdateCompanion<ChatMessageData> {
|
||||
});
|
||||
}
|
||||
|
||||
ChatMessageCompanion copyWith(
|
||||
{Value<String>? messageId,
|
||||
Value<String>? chatId,
|
||||
Value<String>? orderKey,
|
||||
Value<String>? messageJson,
|
||||
Value<int>? rowid}) {
|
||||
ChatMessageCompanion copyWith({
|
||||
Value<String>? messageId,
|
||||
Value<String>? chatId,
|
||||
Value<String>? orderKey,
|
||||
Value<String>? messageJson,
|
||||
Value<int>? rowid,
|
||||
}) {
|
||||
return ChatMessageCompanion(
|
||||
messageId: messageId ?? this.messageId,
|
||||
chatId: chatId ?? this.chatId,
|
||||
@@ -415,80 +465,79 @@ abstract class _$ChatDatabase extends GeneratedDatabase {
|
||||
$ChatDatabaseManager get managers => $ChatDatabaseManager(this);
|
||||
late final ChatData chatData = ChatData(this);
|
||||
late final ChatMessage chatMessage = ChatMessage(this);
|
||||
late final Index groupOrderIdx = Index('group_order_idx',
|
||||
'CREATE UNIQUE INDEX group_order_idx ON chat_message (chat_id, order_key)');
|
||||
late final Index groupOrderIdx = Index(
|
||||
'group_order_idx',
|
||||
'CREATE UNIQUE INDEX group_order_idx ON chat_message (chat_id, order_key)',
|
||||
);
|
||||
late final MessagesDao messagesDao = MessagesDao(this as ChatDatabase);
|
||||
late final MetadataDao metadataDao = MetadataDao(this as ChatDatabase);
|
||||
Selectable<String> leadingOrderKey(
|
||||
{required int bucket, required String chatId}) {
|
||||
Selectable<String> leadingOrderKey({
|
||||
required int bucket,
|
||||
required String chatId,
|
||||
}) {
|
||||
return customSelect(
|
||||
'SELECT lexo_rank_previous(?1, (SELECT order_key FROM chat_message WHERE chat_id = ?2 ORDER BY order_key LIMIT 1)) AS _c0',
|
||||
variables: [
|
||||
Variable<int>(bucket),
|
||||
Variable<String>(chatId)
|
||||
],
|
||||
readsFrom: {
|
||||
chatMessage,
|
||||
}).map((QueryRow row) => row.read<String>('_c0'));
|
||||
'SELECT lexo_rank_previous(?1, (SELECT order_key FROM chat_message WHERE chat_id = ?2 ORDER BY order_key LIMIT 1)) AS _c0',
|
||||
variables: [Variable<int>(bucket), Variable<String>(chatId)],
|
||||
readsFrom: {chatMessage},
|
||||
).map((QueryRow row) => row.read<String>('_c0'));
|
||||
}
|
||||
|
||||
Selectable<String> trailingOrderKey(
|
||||
{required int bucket, required String chatId}) {
|
||||
Selectable<String> trailingOrderKey({
|
||||
required int bucket,
|
||||
required String chatId,
|
||||
}) {
|
||||
return customSelect(
|
||||
'SELECT lexo_rank_next(?1, (SELECT order_key FROM chat_message WHERE chat_id = ?2 ORDER BY order_key DESC LIMIT 1)) AS _c0',
|
||||
variables: [
|
||||
Variable<int>(bucket),
|
||||
Variable<String>(chatId)
|
||||
],
|
||||
readsFrom: {
|
||||
chatMessage,
|
||||
}).map((QueryRow row) => row.read<String>('_c0'));
|
||||
'SELECT lexo_rank_next(?1, (SELECT order_key FROM chat_message WHERE chat_id = ?2 ORDER BY order_key DESC LIMIT 1)) AS _c0',
|
||||
variables: [Variable<int>(bucket), Variable<String>(chatId)],
|
||||
readsFrom: {chatMessage},
|
||||
).map((QueryRow row) => row.read<String>('_c0'));
|
||||
}
|
||||
|
||||
Selectable<String> orderKeyBeforeIndex(
|
||||
{required String chatId, required int rowIdx}) {
|
||||
Selectable<String> orderKeyBeforeIndex({
|
||||
required String chatId,
|
||||
required int rowIdx,
|
||||
}) {
|
||||
return customSelect(
|
||||
'WITH ordered_table AS (SELECT message_id, order_key, LEAD(order_key)OVER (ORDER BY order_key RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW EXCLUDE NO OTHERS) AS next_order_key, ROW_NUMBER()OVER (ORDER BY order_key RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW EXCLUDE NO OTHERS) AS row_idx, COUNT(*)OVER (RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW EXCLUDE NO OTHERS) AS total_rows FROM chat_message WHERE chat_id = ?1) SELECT lexo_rank_reorder_after(order_key, next_order_key) AS _c0 FROM ordered_table WHERE row_idx = MIN(?2, total_rows)',
|
||||
variables: [
|
||||
Variable<String>(chatId),
|
||||
Variable<int>(rowIdx)
|
||||
],
|
||||
readsFrom: {
|
||||
chatMessage,
|
||||
}).map((QueryRow row) => row.read<String>('_c0'));
|
||||
'WITH ordered_table AS (SELECT message_id, order_key, LEAD(order_key)OVER (ORDER BY order_key RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW EXCLUDE NO OTHERS) AS next_order_key, ROW_NUMBER()OVER (ORDER BY order_key RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW EXCLUDE NO OTHERS) AS row_idx, COUNT(*)OVER (RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW EXCLUDE NO OTHERS) AS total_rows FROM chat_message WHERE chat_id = ?1) SELECT lexo_rank_reorder_after(order_key, next_order_key) AS _c0 FROM ordered_table WHERE row_idx = MIN(?2, total_rows)',
|
||||
variables: [Variable<String>(chatId), Variable<int>(rowIdx)],
|
||||
readsFrom: {chatMessage},
|
||||
).map((QueryRow row) => row.read<String>('_c0'));
|
||||
}
|
||||
|
||||
Selectable<int> messageIndex(
|
||||
{required String chatId, required String messageId}) {
|
||||
Selectable<int> messageIndex({
|
||||
required String chatId,
|
||||
required String messageId,
|
||||
}) {
|
||||
return customSelect(
|
||||
'WITH ordered_table AS (SELECT message_id, ROW_NUMBER()OVER (ORDER BY order_key RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW EXCLUDE NO OTHERS) AS row_idx FROM chat_message WHERE chat_id = ?1) SELECT row_idx FROM ordered_table WHERE message_id = ?2',
|
||||
variables: [
|
||||
Variable<String>(chatId),
|
||||
Variable<String>(messageId)
|
||||
],
|
||||
readsFrom: {
|
||||
chatMessage,
|
||||
}).map((QueryRow row) => row.read<int>('row_idx'));
|
||||
'WITH ordered_table AS (SELECT message_id, ROW_NUMBER()OVER (ORDER BY order_key RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW EXCLUDE NO OTHERS) AS row_idx FROM chat_message WHERE chat_id = ?1) SELECT row_idx FROM ordered_table WHERE message_id = ?2',
|
||||
variables: [Variable<String>(chatId), Variable<String>(messageId)],
|
||||
readsFrom: {chatMessage},
|
||||
).map((QueryRow row) => row.read<int>('row_idx'));
|
||||
}
|
||||
|
||||
@override
|
||||
Iterable<TableInfo<Table, Object?>> get allTables =>
|
||||
allSchemaEntities.whereType<TableInfo<Table, Object?>>();
|
||||
@override
|
||||
List<DatabaseSchemaEntity> get allSchemaEntities =>
|
||||
[chatData, chatMessage, groupOrderIdx];
|
||||
List<DatabaseSchemaEntity> get allSchemaEntities => [
|
||||
chatData,
|
||||
chatMessage,
|
||||
groupOrderIdx,
|
||||
];
|
||||
}
|
||||
|
||||
typedef $ChatDataCreateCompanionBuilder = ChatDataCompanion Function({
|
||||
required String chatId,
|
||||
required ChatMetadata metadata,
|
||||
Value<int> rowid,
|
||||
});
|
||||
typedef $ChatDataUpdateCompanionBuilder = ChatDataCompanion Function({
|
||||
Value<String> chatId,
|
||||
Value<ChatMetadata> metadata,
|
||||
Value<int> rowid,
|
||||
});
|
||||
typedef $ChatDataCreateCompanionBuilder =
|
||||
ChatDataCompanion Function({
|
||||
required String chatId,
|
||||
required ChatMetadata metadata,
|
||||
Value<int> rowid,
|
||||
});
|
||||
typedef $ChatDataUpdateCompanionBuilder =
|
||||
ChatDataCompanion Function({
|
||||
Value<String> chatId,
|
||||
Value<ChatMetadata> metadata,
|
||||
Value<int> rowid,
|
||||
});
|
||||
|
||||
class $ChatDataFilterComposer extends Composer<_$ChatDatabase, ChatData> {
|
||||
$ChatDataFilterComposer({
|
||||
@@ -499,12 +548,15 @@ class $ChatDataFilterComposer extends Composer<_$ChatDatabase, ChatData> {
|
||||
super.$removeJoinBuilderFromRootComposer,
|
||||
});
|
||||
ColumnFilters<String> get chatId => $composableBuilder(
|
||||
column: $table.chatId, builder: (column) => ColumnFilters(column));
|
||||
column: $table.chatId,
|
||||
builder: (column) => ColumnFilters(column),
|
||||
);
|
||||
|
||||
ColumnWithTypeConverterFilters<ChatMetadata, ChatMetadata, String>
|
||||
get metadata => $composableBuilder(
|
||||
column: $table.metadata,
|
||||
builder: (column) => ColumnWithTypeConverterFilters(column));
|
||||
get metadata => $composableBuilder(
|
||||
column: $table.metadata,
|
||||
builder: (column) => ColumnWithTypeConverterFilters(column),
|
||||
);
|
||||
}
|
||||
|
||||
class $ChatDataOrderingComposer extends Composer<_$ChatDatabase, ChatData> {
|
||||
@@ -516,10 +568,14 @@ class $ChatDataOrderingComposer extends Composer<_$ChatDatabase, ChatData> {
|
||||
super.$removeJoinBuilderFromRootComposer,
|
||||
});
|
||||
ColumnOrderings<String> get chatId => $composableBuilder(
|
||||
column: $table.chatId, builder: (column) => ColumnOrderings(column));
|
||||
column: $table.chatId,
|
||||
builder: (column) => ColumnOrderings(column),
|
||||
);
|
||||
|
||||
ColumnOrderings<String> get metadata => $composableBuilder(
|
||||
column: $table.metadata, builder: (column) => ColumnOrderings(column));
|
||||
column: $table.metadata,
|
||||
builder: (column) => ColumnOrderings(column),
|
||||
);
|
||||
}
|
||||
|
||||
class $ChatDataAnnotationComposer extends Composer<_$ChatDatabase, ChatData> {
|
||||
@@ -537,81 +593,100 @@ class $ChatDataAnnotationComposer extends Composer<_$ChatDatabase, ChatData> {
|
||||
$composableBuilder(column: $table.metadata, builder: (column) => column);
|
||||
}
|
||||
|
||||
class $ChatDataTableManager extends RootTableManager<
|
||||
_$ChatDatabase,
|
||||
ChatData,
|
||||
ChatDataData,
|
||||
$ChatDataFilterComposer,
|
||||
$ChatDataOrderingComposer,
|
||||
$ChatDataAnnotationComposer,
|
||||
$ChatDataCreateCompanionBuilder,
|
||||
$ChatDataUpdateCompanionBuilder,
|
||||
(ChatDataData, BaseReferences<_$ChatDatabase, ChatData, ChatDataData>),
|
||||
ChatDataData,
|
||||
PrefetchHooks Function()> {
|
||||
class $ChatDataTableManager
|
||||
extends
|
||||
RootTableManager<
|
||||
_$ChatDatabase,
|
||||
ChatData,
|
||||
ChatDataData,
|
||||
$ChatDataFilterComposer,
|
||||
$ChatDataOrderingComposer,
|
||||
$ChatDataAnnotationComposer,
|
||||
$ChatDataCreateCompanionBuilder,
|
||||
$ChatDataUpdateCompanionBuilder,
|
||||
(
|
||||
ChatDataData,
|
||||
BaseReferences<_$ChatDatabase, ChatData, ChatDataData>,
|
||||
),
|
||||
ChatDataData,
|
||||
PrefetchHooks Function()
|
||||
> {
|
||||
$ChatDataTableManager(_$ChatDatabase db, ChatData table)
|
||||
: super(TableManagerState(
|
||||
: super(
|
||||
TableManagerState(
|
||||
db: db,
|
||||
table: table,
|
||||
createFilteringComposer: () =>
|
||||
$ChatDataFilterComposer($db: db, $table: table),
|
||||
createOrderingComposer: () =>
|
||||
$ChatDataOrderingComposer($db: db, $table: table),
|
||||
createComputedFieldComposer: () =>
|
||||
$ChatDataAnnotationComposer($db: db, $table: table),
|
||||
updateCompanionCallback: ({
|
||||
Value<String> chatId = const Value.absent(),
|
||||
Value<ChatMetadata> metadata = const Value.absent(),
|
||||
Value<int> rowid = const Value.absent(),
|
||||
}) =>
|
||||
ChatDataCompanion(
|
||||
chatId: chatId,
|
||||
metadata: metadata,
|
||||
rowid: rowid,
|
||||
),
|
||||
createCompanionCallback: ({
|
||||
required String chatId,
|
||||
required ChatMetadata metadata,
|
||||
Value<int> rowid = const Value.absent(),
|
||||
}) =>
|
||||
ChatDataCompanion.insert(
|
||||
chatId: chatId,
|
||||
metadata: metadata,
|
||||
rowid: rowid,
|
||||
),
|
||||
withReferenceMapper: (p0) => p0
|
||||
.map((e) => (e.readTable(table), BaseReferences(db, table, e)))
|
||||
.toList(),
|
||||
createFilteringComposer:
|
||||
() => $ChatDataFilterComposer($db: db, $table: table),
|
||||
createOrderingComposer:
|
||||
() => $ChatDataOrderingComposer($db: db, $table: table),
|
||||
createComputedFieldComposer:
|
||||
() => $ChatDataAnnotationComposer($db: db, $table: table),
|
||||
updateCompanionCallback:
|
||||
({
|
||||
Value<String> chatId = const Value.absent(),
|
||||
Value<ChatMetadata> metadata = const Value.absent(),
|
||||
Value<int> rowid = const Value.absent(),
|
||||
}) => ChatDataCompanion(
|
||||
chatId: chatId,
|
||||
metadata: metadata,
|
||||
rowid: rowid,
|
||||
),
|
||||
createCompanionCallback:
|
||||
({
|
||||
required String chatId,
|
||||
required ChatMetadata metadata,
|
||||
Value<int> rowid = const Value.absent(),
|
||||
}) => ChatDataCompanion.insert(
|
||||
chatId: chatId,
|
||||
metadata: metadata,
|
||||
rowid: rowid,
|
||||
),
|
||||
withReferenceMapper:
|
||||
(p0) =>
|
||||
p0
|
||||
.map(
|
||||
(e) => (
|
||||
e.readTable(table),
|
||||
BaseReferences(db, table, e),
|
||||
),
|
||||
)
|
||||
.toList(),
|
||||
prefetchHooksCallback: null,
|
||||
));
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
typedef $ChatDataProcessedTableManager = ProcessedTableManager<
|
||||
_$ChatDatabase,
|
||||
ChatData,
|
||||
ChatDataData,
|
||||
$ChatDataFilterComposer,
|
||||
$ChatDataOrderingComposer,
|
||||
$ChatDataAnnotationComposer,
|
||||
$ChatDataCreateCompanionBuilder,
|
||||
$ChatDataUpdateCompanionBuilder,
|
||||
(ChatDataData, BaseReferences<_$ChatDatabase, ChatData, ChatDataData>),
|
||||
ChatDataData,
|
||||
PrefetchHooks Function()>;
|
||||
typedef $ChatMessageCreateCompanionBuilder = ChatMessageCompanion Function({
|
||||
required String messageId,
|
||||
required String chatId,
|
||||
required String orderKey,
|
||||
required String messageJson,
|
||||
Value<int> rowid,
|
||||
});
|
||||
typedef $ChatMessageUpdateCompanionBuilder = ChatMessageCompanion Function({
|
||||
Value<String> messageId,
|
||||
Value<String> chatId,
|
||||
Value<String> orderKey,
|
||||
Value<String> messageJson,
|
||||
Value<int> rowid,
|
||||
});
|
||||
typedef $ChatDataProcessedTableManager =
|
||||
ProcessedTableManager<
|
||||
_$ChatDatabase,
|
||||
ChatData,
|
||||
ChatDataData,
|
||||
$ChatDataFilterComposer,
|
||||
$ChatDataOrderingComposer,
|
||||
$ChatDataAnnotationComposer,
|
||||
$ChatDataCreateCompanionBuilder,
|
||||
$ChatDataUpdateCompanionBuilder,
|
||||
(ChatDataData, BaseReferences<_$ChatDatabase, ChatData, ChatDataData>),
|
||||
ChatDataData,
|
||||
PrefetchHooks Function()
|
||||
>;
|
||||
typedef $ChatMessageCreateCompanionBuilder =
|
||||
ChatMessageCompanion Function({
|
||||
required String messageId,
|
||||
required String chatId,
|
||||
required String orderKey,
|
||||
required String messageJson,
|
||||
Value<int> rowid,
|
||||
});
|
||||
typedef $ChatMessageUpdateCompanionBuilder =
|
||||
ChatMessageCompanion Function({
|
||||
Value<String> messageId,
|
||||
Value<String> chatId,
|
||||
Value<String> orderKey,
|
||||
Value<String> messageJson,
|
||||
Value<int> rowid,
|
||||
});
|
||||
|
||||
class $ChatMessageFilterComposer extends Composer<_$ChatDatabase, ChatMessage> {
|
||||
$ChatMessageFilterComposer({
|
||||
@@ -622,16 +697,24 @@ class $ChatMessageFilterComposer extends Composer<_$ChatDatabase, ChatMessage> {
|
||||
super.$removeJoinBuilderFromRootComposer,
|
||||
});
|
||||
ColumnFilters<String> get messageId => $composableBuilder(
|
||||
column: $table.messageId, builder: (column) => ColumnFilters(column));
|
||||
column: $table.messageId,
|
||||
builder: (column) => ColumnFilters(column),
|
||||
);
|
||||
|
||||
ColumnFilters<String> get chatId => $composableBuilder(
|
||||
column: $table.chatId, builder: (column) => ColumnFilters(column));
|
||||
column: $table.chatId,
|
||||
builder: (column) => ColumnFilters(column),
|
||||
);
|
||||
|
||||
ColumnFilters<String> get orderKey => $composableBuilder(
|
||||
column: $table.orderKey, builder: (column) => ColumnFilters(column));
|
||||
column: $table.orderKey,
|
||||
builder: (column) => ColumnFilters(column),
|
||||
);
|
||||
|
||||
ColumnFilters<String> get messageJson => $composableBuilder(
|
||||
column: $table.messageJson, builder: (column) => ColumnFilters(column));
|
||||
column: $table.messageJson,
|
||||
builder: (column) => ColumnFilters(column),
|
||||
);
|
||||
}
|
||||
|
||||
class $ChatMessageOrderingComposer
|
||||
@@ -644,16 +727,24 @@ class $ChatMessageOrderingComposer
|
||||
super.$removeJoinBuilderFromRootComposer,
|
||||
});
|
||||
ColumnOrderings<String> get messageId => $composableBuilder(
|
||||
column: $table.messageId, builder: (column) => ColumnOrderings(column));
|
||||
column: $table.messageId,
|
||||
builder: (column) => ColumnOrderings(column),
|
||||
);
|
||||
|
||||
ColumnOrderings<String> get chatId => $composableBuilder(
|
||||
column: $table.chatId, builder: (column) => ColumnOrderings(column));
|
||||
column: $table.chatId,
|
||||
builder: (column) => ColumnOrderings(column),
|
||||
);
|
||||
|
||||
ColumnOrderings<String> get orderKey => $composableBuilder(
|
||||
column: $table.orderKey, builder: (column) => ColumnOrderings(column));
|
||||
column: $table.orderKey,
|
||||
builder: (column) => ColumnOrderings(column),
|
||||
);
|
||||
|
||||
ColumnOrderings<String> get messageJson => $composableBuilder(
|
||||
column: $table.messageJson, builder: (column) => ColumnOrderings(column));
|
||||
column: $table.messageJson,
|
||||
builder: (column) => ColumnOrderings(column),
|
||||
);
|
||||
}
|
||||
|
||||
class $ChatMessageAnnotationComposer
|
||||
@@ -675,84 +766,100 @@ class $ChatMessageAnnotationComposer
|
||||
$composableBuilder(column: $table.orderKey, builder: (column) => column);
|
||||
|
||||
GeneratedColumn<String> get messageJson => $composableBuilder(
|
||||
column: $table.messageJson, builder: (column) => column);
|
||||
column: $table.messageJson,
|
||||
builder: (column) => column,
|
||||
);
|
||||
}
|
||||
|
||||
class $ChatMessageTableManager extends RootTableManager<
|
||||
_$ChatDatabase,
|
||||
ChatMessage,
|
||||
ChatMessageData,
|
||||
$ChatMessageFilterComposer,
|
||||
$ChatMessageOrderingComposer,
|
||||
$ChatMessageAnnotationComposer,
|
||||
$ChatMessageCreateCompanionBuilder,
|
||||
$ChatMessageUpdateCompanionBuilder,
|
||||
(
|
||||
ChatMessageData,
|
||||
BaseReferences<_$ChatDatabase, ChatMessage, ChatMessageData>
|
||||
),
|
||||
ChatMessageData,
|
||||
PrefetchHooks Function()> {
|
||||
class $ChatMessageTableManager
|
||||
extends
|
||||
RootTableManager<
|
||||
_$ChatDatabase,
|
||||
ChatMessage,
|
||||
ChatMessageData,
|
||||
$ChatMessageFilterComposer,
|
||||
$ChatMessageOrderingComposer,
|
||||
$ChatMessageAnnotationComposer,
|
||||
$ChatMessageCreateCompanionBuilder,
|
||||
$ChatMessageUpdateCompanionBuilder,
|
||||
(
|
||||
ChatMessageData,
|
||||
BaseReferences<_$ChatDatabase, ChatMessage, ChatMessageData>,
|
||||
),
|
||||
ChatMessageData,
|
||||
PrefetchHooks Function()
|
||||
> {
|
||||
$ChatMessageTableManager(_$ChatDatabase db, ChatMessage table)
|
||||
: super(TableManagerState(
|
||||
: super(
|
||||
TableManagerState(
|
||||
db: db,
|
||||
table: table,
|
||||
createFilteringComposer: () =>
|
||||
$ChatMessageFilterComposer($db: db, $table: table),
|
||||
createOrderingComposer: () =>
|
||||
$ChatMessageOrderingComposer($db: db, $table: table),
|
||||
createComputedFieldComposer: () =>
|
||||
$ChatMessageAnnotationComposer($db: db, $table: table),
|
||||
updateCompanionCallback: ({
|
||||
Value<String> messageId = const Value.absent(),
|
||||
Value<String> chatId = const Value.absent(),
|
||||
Value<String> orderKey = const Value.absent(),
|
||||
Value<String> messageJson = const Value.absent(),
|
||||
Value<int> rowid = const Value.absent(),
|
||||
}) =>
|
||||
ChatMessageCompanion(
|
||||
messageId: messageId,
|
||||
chatId: chatId,
|
||||
orderKey: orderKey,
|
||||
messageJson: messageJson,
|
||||
rowid: rowid,
|
||||
),
|
||||
createCompanionCallback: ({
|
||||
required String messageId,
|
||||
required String chatId,
|
||||
required String orderKey,
|
||||
required String messageJson,
|
||||
Value<int> rowid = const Value.absent(),
|
||||
}) =>
|
||||
ChatMessageCompanion.insert(
|
||||
messageId: messageId,
|
||||
chatId: chatId,
|
||||
orderKey: orderKey,
|
||||
messageJson: messageJson,
|
||||
rowid: rowid,
|
||||
),
|
||||
withReferenceMapper: (p0) => p0
|
||||
.map((e) => (e.readTable(table), BaseReferences(db, table, e)))
|
||||
.toList(),
|
||||
createFilteringComposer:
|
||||
() => $ChatMessageFilterComposer($db: db, $table: table),
|
||||
createOrderingComposer:
|
||||
() => $ChatMessageOrderingComposer($db: db, $table: table),
|
||||
createComputedFieldComposer:
|
||||
() => $ChatMessageAnnotationComposer($db: db, $table: table),
|
||||
updateCompanionCallback:
|
||||
({
|
||||
Value<String> messageId = const Value.absent(),
|
||||
Value<String> chatId = const Value.absent(),
|
||||
Value<String> orderKey = const Value.absent(),
|
||||
Value<String> messageJson = const Value.absent(),
|
||||
Value<int> rowid = const Value.absent(),
|
||||
}) => ChatMessageCompanion(
|
||||
messageId: messageId,
|
||||
chatId: chatId,
|
||||
orderKey: orderKey,
|
||||
messageJson: messageJson,
|
||||
rowid: rowid,
|
||||
),
|
||||
createCompanionCallback:
|
||||
({
|
||||
required String messageId,
|
||||
required String chatId,
|
||||
required String orderKey,
|
||||
required String messageJson,
|
||||
Value<int> rowid = const Value.absent(),
|
||||
}) => ChatMessageCompanion.insert(
|
||||
messageId: messageId,
|
||||
chatId: chatId,
|
||||
orderKey: orderKey,
|
||||
messageJson: messageJson,
|
||||
rowid: rowid,
|
||||
),
|
||||
withReferenceMapper:
|
||||
(p0) =>
|
||||
p0
|
||||
.map(
|
||||
(e) => (
|
||||
e.readTable(table),
|
||||
BaseReferences(db, table, e),
|
||||
),
|
||||
)
|
||||
.toList(),
|
||||
prefetchHooksCallback: null,
|
||||
));
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
typedef $ChatMessageProcessedTableManager = ProcessedTableManager<
|
||||
_$ChatDatabase,
|
||||
ChatMessage,
|
||||
ChatMessageData,
|
||||
$ChatMessageFilterComposer,
|
||||
$ChatMessageOrderingComposer,
|
||||
$ChatMessageAnnotationComposer,
|
||||
$ChatMessageCreateCompanionBuilder,
|
||||
$ChatMessageUpdateCompanionBuilder,
|
||||
(
|
||||
typedef $ChatMessageProcessedTableManager =
|
||||
ProcessedTableManager<
|
||||
_$ChatDatabase,
|
||||
ChatMessage,
|
||||
ChatMessageData,
|
||||
BaseReferences<_$ChatDatabase, ChatMessage, ChatMessageData>
|
||||
),
|
||||
ChatMessageData,
|
||||
PrefetchHooks Function()>;
|
||||
$ChatMessageFilterComposer,
|
||||
$ChatMessageOrderingComposer,
|
||||
$ChatMessageAnnotationComposer,
|
||||
$ChatMessageCreateCompanionBuilder,
|
||||
$ChatMessageUpdateCompanionBuilder,
|
||||
(
|
||||
ChatMessageData,
|
||||
BaseReferences<_$ChatDatabase, ChatMessage, ChatMessageData>,
|
||||
),
|
||||
ChatMessageData,
|
||||
PrefetchHooks Function()
|
||||
>;
|
||||
|
||||
class $ChatDatabaseManager {
|
||||
final _$ChatDatabase _db;
|
||||
|
||||
@@ -7,9 +7,9 @@ part of 'chat_metadata.dart';
|
||||
// **************************************************************************
|
||||
|
||||
ChatMetadata _$ChatMetadataFromJson(Map<String, dynamic> json) => ChatMetadata(
|
||||
mainDocumentId: json['mainDocumentId'] as String?,
|
||||
contextId: json['contextId'] as String?,
|
||||
);
|
||||
mainDocumentId: json['mainDocumentId'] as String?,
|
||||
contextId: json['contextId'] as String?,
|
||||
);
|
||||
|
||||
Map<String, dynamic> _$ChatMetadataToJson(ChatMetadata instance) =>
|
||||
<String, dynamic>{
|
||||
|
||||
@@ -59,44 +59,46 @@ class ChatMemory implements BaseMemory {
|
||||
Future<MemoryVariables> loadMemoryVariables([
|
||||
MemoryInputValues values = const {},
|
||||
]) async {
|
||||
final messages = _controller.messages
|
||||
.whereNot(
|
||||
(message) => message.metadata?['hideFromModelChatHistory'] == true,
|
||||
)
|
||||
.map(
|
||||
(message) => switch (message) {
|
||||
TextMessage(
|
||||
authorId: final authorId,
|
||||
text: final text,
|
||||
metadata: final metadata,
|
||||
) =>
|
||||
() {
|
||||
if (authorId == MessageAuthor.system.user.id) {
|
||||
return SystemChatMessage(content: text);
|
||||
}
|
||||
if (authorId == MessageAuthor.human.user.id) {
|
||||
return HumanChatMessage(
|
||||
content: ChatMessageContent.text(text),
|
||||
);
|
||||
}
|
||||
if (authorId == MessageAuthor.ai.user.id) {
|
||||
final toolsRaw = metadata?['toolCalls'];
|
||||
if (toolsRaw is String) {
|
||||
return AIChatMessage(
|
||||
content: text,
|
||||
toolCalls: _deserializeToolCalls(toolsRaw),
|
||||
);
|
||||
}
|
||||
return AIChatMessage(content: text);
|
||||
}
|
||||
throw UnimplementedError();
|
||||
}(),
|
||||
ImageMessage() => throw UnimplementedError(),
|
||||
CustomMessage() => throw UnimplementedError(),
|
||||
UnsupportedMessage() => throw UnimplementedError()
|
||||
},
|
||||
)
|
||||
.toList();
|
||||
final messages =
|
||||
_controller.messages
|
||||
.whereNot(
|
||||
(message) =>
|
||||
message.metadata?['hideFromModelChatHistory'] == true,
|
||||
)
|
||||
.map(
|
||||
(message) => switch (message) {
|
||||
TextMessage(
|
||||
authorId: final authorId,
|
||||
text: final text,
|
||||
metadata: final metadata,
|
||||
) =>
|
||||
() {
|
||||
if (authorId == MessageAuthor.system.user.id) {
|
||||
return SystemChatMessage(content: text);
|
||||
}
|
||||
if (authorId == MessageAuthor.human.user.id) {
|
||||
return HumanChatMessage(
|
||||
content: ChatMessageContent.text(text),
|
||||
);
|
||||
}
|
||||
if (authorId == MessageAuthor.ai.user.id) {
|
||||
final toolsRaw = metadata?['toolCalls'];
|
||||
if (toolsRaw is String) {
|
||||
return AIChatMessage(
|
||||
content: text,
|
||||
toolCalls: _deserializeToolCalls(toolsRaw),
|
||||
);
|
||||
}
|
||||
return AIChatMessage(content: text);
|
||||
}
|
||||
throw UnimplementedError();
|
||||
}(),
|
||||
ImageMessage() => throw UnimplementedError(),
|
||||
CustomMessage() => throw UnimplementedError(),
|
||||
UnsupportedMessage() => throw UnimplementedError(),
|
||||
},
|
||||
)
|
||||
.toList();
|
||||
|
||||
int currentBufferLength = await llm.countTokens(PromptValue.chat(messages));
|
||||
// Prune buffer if it exceeds max token limit
|
||||
@@ -124,16 +126,17 @@ class ChatMemory implements BaseMemory {
|
||||
|
||||
List<AIChatMessageToolCall> _deserializeToolCalls(String toolsRaw) {
|
||||
final decoded = jsonDecode(toolsRaw) as List<dynamic>;
|
||||
final tools = decoded
|
||||
.map(
|
||||
(tool) => AIChatMessageToolCall(
|
||||
id: tool['id'] as String,
|
||||
name: tool['name'] as String,
|
||||
arguments: tool['arguments'] as Map<String, dynamic>,
|
||||
argumentsRaw: tool['argumentsRaw'] as String,
|
||||
),
|
||||
)
|
||||
.toList();
|
||||
final tools =
|
||||
decoded
|
||||
.map(
|
||||
(tool) => AIChatMessageToolCall(
|
||||
id: tool['id'] as String,
|
||||
name: tool['name'] as String,
|
||||
arguments: tool['arguments'] as Map<String, dynamic>,
|
||||
argumentsRaw: tool['argumentsRaw'] as String,
|
||||
),
|
||||
)
|
||||
.toList();
|
||||
return tools;
|
||||
}
|
||||
|
||||
|
||||
@@ -17,30 +17,26 @@ class DriftChatController implements ChatController {
|
||||
late final BehaviorSubject<Map<String, Message>> _intermediateMessages;
|
||||
|
||||
DriftChatController(this._dao, {required this.chatId}) {
|
||||
final chatMessagesStream = _dao
|
||||
.chatMessages(chatId: chatId)
|
||||
.map(
|
||||
(data) => Message.fromJson(
|
||||
jsonDecode(data.messageJson) as Map<String, dynamic>,
|
||||
),
|
||||
)
|
||||
.watch();
|
||||
final chatMessagesStream =
|
||||
_dao
|
||||
.chatMessages(chatId: chatId)
|
||||
.map(
|
||||
(data) => Message.fromJson(
|
||||
jsonDecode(data.messageJson) as Map<String, dynamic>,
|
||||
),
|
||||
)
|
||||
.watch();
|
||||
|
||||
_intermediateMessages = BehaviorSubject.seeded({});
|
||||
|
||||
_mergedMessagesStream = Rx.combineLatest2(
|
||||
chatMessagesStream,
|
||||
_intermediateMessages,
|
||||
(a, b) {
|
||||
if (a.isNotEmpty && b.isNotEmpty) {
|
||||
return [
|
||||
for (final message in a) b[message.id] ?? message,
|
||||
];
|
||||
}
|
||||
_mergedMessagesStream =
|
||||
Rx.combineLatest2(chatMessagesStream, _intermediateMessages, (a, b) {
|
||||
if (a.isNotEmpty && b.isNotEmpty) {
|
||||
return [for (final message in a) b[message.id] ?? message];
|
||||
}
|
||||
|
||||
return a;
|
||||
},
|
||||
).shareValue();
|
||||
return a;
|
||||
}).shareValue();
|
||||
|
||||
//Set initial messages
|
||||
unawaited(
|
||||
@@ -80,9 +76,10 @@ class DriftChatController implements ChatController {
|
||||
|
||||
@override
|
||||
Future<void> remove(Message message) async {
|
||||
final index = await _dao
|
||||
.messageIndex(chatId: chatId, messageId: message.id)
|
||||
.getSingleOrNull();
|
||||
final index =
|
||||
await _dao
|
||||
.messageIndex(chatId: chatId, messageId: message.id)
|
||||
.getSingleOrNull();
|
||||
|
||||
if (index != null) {
|
||||
await _dao.removeMessage(messageId: message.id);
|
||||
|
||||
@@ -39,21 +39,15 @@ class ChatControllerFamily extends Family<DriftChatController> {
|
||||
const ChatControllerFamily();
|
||||
|
||||
/// See also [chatController].
|
||||
ChatControllerProvider call(
|
||||
String chatId,
|
||||
) {
|
||||
return ChatControllerProvider(
|
||||
chatId,
|
||||
);
|
||||
ChatControllerProvider call(String chatId) {
|
||||
return ChatControllerProvider(chatId);
|
||||
}
|
||||
|
||||
@override
|
||||
ChatControllerProvider getProviderOverride(
|
||||
covariant ChatControllerProvider provider,
|
||||
) {
|
||||
return call(
|
||||
provider.chatId,
|
||||
);
|
||||
return call(provider.chatId);
|
||||
}
|
||||
|
||||
static const Iterable<ProviderOrFamily>? _dependencies = null;
|
||||
@@ -74,24 +68,20 @@ class ChatControllerFamily extends Family<DriftChatController> {
|
||||
/// See also [chatController].
|
||||
class ChatControllerProvider extends AutoDisposeProvider<DriftChatController> {
|
||||
/// See also [chatController].
|
||||
ChatControllerProvider(
|
||||
String chatId,
|
||||
) : this._internal(
|
||||
(ref) => chatController(
|
||||
ref as ChatControllerRef,
|
||||
chatId,
|
||||
),
|
||||
from: chatControllerProvider,
|
||||
name: r'chatControllerProvider',
|
||||
debugGetCreateSourceHash:
|
||||
const bool.fromEnvironment('dart.vm.product')
|
||||
? null
|
||||
: _$chatControllerHash,
|
||||
dependencies: ChatControllerFamily._dependencies,
|
||||
allTransitiveDependencies:
|
||||
ChatControllerFamily._allTransitiveDependencies,
|
||||
chatId: chatId,
|
||||
);
|
||||
ChatControllerProvider(String chatId)
|
||||
: this._internal(
|
||||
(ref) => chatController(ref as ChatControllerRef, chatId),
|
||||
from: chatControllerProvider,
|
||||
name: r'chatControllerProvider',
|
||||
debugGetCreateSourceHash:
|
||||
const bool.fromEnvironment('dart.vm.product')
|
||||
? null
|
||||
: _$chatControllerHash,
|
||||
dependencies: ChatControllerFamily._dependencies,
|
||||
allTransitiveDependencies:
|
||||
ChatControllerFamily._allTransitiveDependencies,
|
||||
chatId: chatId,
|
||||
);
|
||||
|
||||
ChatControllerProvider._internal(
|
||||
super._createNotifier, {
|
||||
@@ -170,21 +160,15 @@ class ChatMetadataFamily extends Family<AsyncValue<ChatMetadata?>> {
|
||||
const ChatMetadataFamily();
|
||||
|
||||
/// See also [chatMetadata].
|
||||
ChatMetadataProvider call(
|
||||
String chatId,
|
||||
) {
|
||||
return ChatMetadataProvider(
|
||||
chatId,
|
||||
);
|
||||
ChatMetadataProvider call(String chatId) {
|
||||
return ChatMetadataProvider(chatId);
|
||||
}
|
||||
|
||||
@override
|
||||
ChatMetadataProvider getProviderOverride(
|
||||
covariant ChatMetadataProvider provider,
|
||||
) {
|
||||
return call(
|
||||
provider.chatId,
|
||||
);
|
||||
return call(provider.chatId);
|
||||
}
|
||||
|
||||
static const Iterable<ProviderOrFamily>? _dependencies = null;
|
||||
@@ -205,24 +189,20 @@ class ChatMetadataFamily extends Family<AsyncValue<ChatMetadata?>> {
|
||||
/// See also [chatMetadata].
|
||||
class ChatMetadataProvider extends AutoDisposeStreamProvider<ChatMetadata?> {
|
||||
/// See also [chatMetadata].
|
||||
ChatMetadataProvider(
|
||||
String chatId,
|
||||
) : this._internal(
|
||||
(ref) => chatMetadata(
|
||||
ref as ChatMetadataRef,
|
||||
chatId,
|
||||
),
|
||||
from: chatMetadataProvider,
|
||||
name: r'chatMetadataProvider',
|
||||
debugGetCreateSourceHash:
|
||||
const bool.fromEnvironment('dart.vm.product')
|
||||
? null
|
||||
: _$chatMetadataHash,
|
||||
dependencies: ChatMetadataFamily._dependencies,
|
||||
allTransitiveDependencies:
|
||||
ChatMetadataFamily._allTransitiveDependencies,
|
||||
chatId: chatId,
|
||||
);
|
||||
ChatMetadataProvider(String chatId)
|
||||
: this._internal(
|
||||
(ref) => chatMetadata(ref as ChatMetadataRef, chatId),
|
||||
from: chatMetadataProvider,
|
||||
name: r'chatMetadataProvider',
|
||||
debugGetCreateSourceHash:
|
||||
const bool.fromEnvironment('dart.vm.product')
|
||||
? null
|
||||
: _$chatMetadataHash,
|
||||
dependencies: ChatMetadataFamily._dependencies,
|
||||
allTransitiveDependencies:
|
||||
ChatMetadataFamily._allTransitiveDependencies,
|
||||
chatId: chatId,
|
||||
);
|
||||
|
||||
ChatMetadataProvider._internal(
|
||||
super._createNotifier, {
|
||||
@@ -288,5 +268,6 @@ class _ChatMetadataProviderElement
|
||||
@override
|
||||
String get chatId => (origin as ChatMetadataProvider).chatId;
|
||||
}
|
||||
|
||||
// ignore_for_file: type=lint
|
||||
// ignore_for_file: subtype_of_sealed_class, invalid_use_of_internal_member, invalid_use_of_visible_for_testing_member, deprecated_member_use_from_same_package
|
||||
|
||||
@@ -31,9 +31,7 @@ class ChatMessageRepository extends _$ChatMessageRepository {
|
||||
id: uuid.v4(),
|
||||
authorId: author.user.id,
|
||||
createdAt: DateTime.now().toUtc(),
|
||||
metadata: {
|
||||
'type': 'typing',
|
||||
},
|
||||
metadata: {'type': 'typing'},
|
||||
),
|
||||
);
|
||||
|
||||
@@ -65,12 +63,13 @@ class ChatMessageRepository extends _$ChatMessageRepository {
|
||||
createdAt: DateTime.now().toUtc(),
|
||||
text: content,
|
||||
isOnlyEmoji: isOnlyEmoji(content),
|
||||
metadata: (hideFromModelChatHistory || (toolCalls?.isNotEmpty ?? false))
|
||||
? {
|
||||
'toolCalls': toolCalls?.map((tool) => tool.toMap()).toList(),
|
||||
if (hideFromModelChatHistory) 'hideFromModelChatHistory': true,
|
||||
}
|
||||
: null,
|
||||
metadata:
|
||||
(hideFromModelChatHistory || (toolCalls?.isNotEmpty ?? false))
|
||||
? {
|
||||
'toolCalls': toolCalls?.map((tool) => tool.toMap()).toList(),
|
||||
if (hideFromModelChatHistory) 'hideFromModelChatHistory': true,
|
||||
}
|
||||
: null,
|
||||
);
|
||||
|
||||
return Result.fromAsync(() async {
|
||||
|
||||
@@ -34,9 +34,7 @@ abstract class _$ChatMessageRepository
|
||||
extends BuildlessAutoDisposeNotifier<void> {
|
||||
late final String chatId;
|
||||
|
||||
void build(
|
||||
String chatId,
|
||||
);
|
||||
void build(String chatId);
|
||||
}
|
||||
|
||||
/// See also [ChatMessageRepository].
|
||||
@@ -49,21 +47,15 @@ class ChatMessageRepositoryFamily extends Family<void> {
|
||||
const ChatMessageRepositoryFamily();
|
||||
|
||||
/// See also [ChatMessageRepository].
|
||||
ChatMessageRepositoryProvider call(
|
||||
String chatId,
|
||||
) {
|
||||
return ChatMessageRepositoryProvider(
|
||||
chatId,
|
||||
);
|
||||
ChatMessageRepositoryProvider call(String chatId) {
|
||||
return ChatMessageRepositoryProvider(chatId);
|
||||
}
|
||||
|
||||
@override
|
||||
ChatMessageRepositoryProvider getProviderOverride(
|
||||
covariant ChatMessageRepositoryProvider provider,
|
||||
) {
|
||||
return call(
|
||||
provider.chatId,
|
||||
);
|
||||
return call(provider.chatId);
|
||||
}
|
||||
|
||||
static const Iterable<ProviderOrFamily>? _dependencies = null;
|
||||
@@ -85,21 +77,20 @@ class ChatMessageRepositoryFamily extends Family<void> {
|
||||
class ChatMessageRepositoryProvider
|
||||
extends AutoDisposeNotifierProviderImpl<ChatMessageRepository, void> {
|
||||
/// See also [ChatMessageRepository].
|
||||
ChatMessageRepositoryProvider(
|
||||
String chatId,
|
||||
) : this._internal(
|
||||
() => ChatMessageRepository()..chatId = chatId,
|
||||
from: chatMessageRepositoryProvider,
|
||||
name: r'chatMessageRepositoryProvider',
|
||||
debugGetCreateSourceHash:
|
||||
const bool.fromEnvironment('dart.vm.product')
|
||||
? null
|
||||
: _$chatMessageRepositoryHash,
|
||||
dependencies: ChatMessageRepositoryFamily._dependencies,
|
||||
allTransitiveDependencies:
|
||||
ChatMessageRepositoryFamily._allTransitiveDependencies,
|
||||
chatId: chatId,
|
||||
);
|
||||
ChatMessageRepositoryProvider(String chatId)
|
||||
: this._internal(
|
||||
() => ChatMessageRepository()..chatId = chatId,
|
||||
from: chatMessageRepositoryProvider,
|
||||
name: r'chatMessageRepositoryProvider',
|
||||
debugGetCreateSourceHash:
|
||||
const bool.fromEnvironment('dart.vm.product')
|
||||
? null
|
||||
: _$chatMessageRepositoryHash,
|
||||
dependencies: ChatMessageRepositoryFamily._dependencies,
|
||||
allTransitiveDependencies:
|
||||
ChatMessageRepositoryFamily._allTransitiveDependencies,
|
||||
chatId: chatId,
|
||||
);
|
||||
|
||||
ChatMessageRepositoryProvider._internal(
|
||||
super._createNotifier, {
|
||||
@@ -114,12 +105,8 @@ class ChatMessageRepositoryProvider
|
||||
final String chatId;
|
||||
|
||||
@override
|
||||
void runNotifierBuild(
|
||||
covariant ChatMessageRepository notifier,
|
||||
) {
|
||||
return notifier.build(
|
||||
chatId,
|
||||
);
|
||||
void runNotifierBuild(covariant ChatMessageRepository notifier) {
|
||||
return notifier.build(chatId);
|
||||
}
|
||||
|
||||
@override
|
||||
@@ -140,7 +127,7 @@ class ChatMessageRepositoryProvider
|
||||
|
||||
@override
|
||||
AutoDisposeNotifierProviderElement<ChatMessageRepository, void>
|
||||
createElement() {
|
||||
createElement() {
|
||||
return _ChatMessageRepositoryProviderElement(this);
|
||||
}
|
||||
|
||||
@@ -173,5 +160,6 @@ class _ChatMessageRepositoryProviderElement
|
||||
@override
|
||||
String get chatId => (origin as ChatMessageRepositoryProvider).chatId;
|
||||
}
|
||||
|
||||
// ignore_for_file: type=lint
|
||||
// ignore_for_file: subtype_of_sealed_class, invalid_use_of_internal_member, invalid_use_of_visible_for_testing_member, deprecated_member_use_from_same_package
|
||||
|
||||
+22
-34
@@ -34,9 +34,7 @@ abstract class _$ChatMetadataRepository
|
||||
extends BuildlessAutoDisposeNotifier<void> {
|
||||
late final String chatId;
|
||||
|
||||
void build(
|
||||
String chatId,
|
||||
);
|
||||
void build(String chatId);
|
||||
}
|
||||
|
||||
/// See also [ChatMetadataRepository].
|
||||
@@ -49,21 +47,15 @@ class ChatMetadataRepositoryFamily extends Family<void> {
|
||||
const ChatMetadataRepositoryFamily();
|
||||
|
||||
/// See also [ChatMetadataRepository].
|
||||
ChatMetadataRepositoryProvider call(
|
||||
String chatId,
|
||||
) {
|
||||
return ChatMetadataRepositoryProvider(
|
||||
chatId,
|
||||
);
|
||||
ChatMetadataRepositoryProvider call(String chatId) {
|
||||
return ChatMetadataRepositoryProvider(chatId);
|
||||
}
|
||||
|
||||
@override
|
||||
ChatMetadataRepositoryProvider getProviderOverride(
|
||||
covariant ChatMetadataRepositoryProvider provider,
|
||||
) {
|
||||
return call(
|
||||
provider.chatId,
|
||||
);
|
||||
return call(provider.chatId);
|
||||
}
|
||||
|
||||
static const Iterable<ProviderOrFamily>? _dependencies = null;
|
||||
@@ -85,21 +77,20 @@ class ChatMetadataRepositoryFamily extends Family<void> {
|
||||
class ChatMetadataRepositoryProvider
|
||||
extends AutoDisposeNotifierProviderImpl<ChatMetadataRepository, void> {
|
||||
/// See also [ChatMetadataRepository].
|
||||
ChatMetadataRepositoryProvider(
|
||||
String chatId,
|
||||
) : this._internal(
|
||||
() => ChatMetadataRepository()..chatId = chatId,
|
||||
from: chatMetadataRepositoryProvider,
|
||||
name: r'chatMetadataRepositoryProvider',
|
||||
debugGetCreateSourceHash:
|
||||
const bool.fromEnvironment('dart.vm.product')
|
||||
? null
|
||||
: _$chatMetadataRepositoryHash,
|
||||
dependencies: ChatMetadataRepositoryFamily._dependencies,
|
||||
allTransitiveDependencies:
|
||||
ChatMetadataRepositoryFamily._allTransitiveDependencies,
|
||||
chatId: chatId,
|
||||
);
|
||||
ChatMetadataRepositoryProvider(String chatId)
|
||||
: this._internal(
|
||||
() => ChatMetadataRepository()..chatId = chatId,
|
||||
from: chatMetadataRepositoryProvider,
|
||||
name: r'chatMetadataRepositoryProvider',
|
||||
debugGetCreateSourceHash:
|
||||
const bool.fromEnvironment('dart.vm.product')
|
||||
? null
|
||||
: _$chatMetadataRepositoryHash,
|
||||
dependencies: ChatMetadataRepositoryFamily._dependencies,
|
||||
allTransitiveDependencies:
|
||||
ChatMetadataRepositoryFamily._allTransitiveDependencies,
|
||||
chatId: chatId,
|
||||
);
|
||||
|
||||
ChatMetadataRepositoryProvider._internal(
|
||||
super._createNotifier, {
|
||||
@@ -114,12 +105,8 @@ class ChatMetadataRepositoryProvider
|
||||
final String chatId;
|
||||
|
||||
@override
|
||||
void runNotifierBuild(
|
||||
covariant ChatMetadataRepository notifier,
|
||||
) {
|
||||
return notifier.build(
|
||||
chatId,
|
||||
);
|
||||
void runNotifierBuild(covariant ChatMetadataRepository notifier) {
|
||||
return notifier.build(chatId);
|
||||
}
|
||||
|
||||
@override
|
||||
@@ -140,7 +127,7 @@ class ChatMetadataRepositoryProvider
|
||||
|
||||
@override
|
||||
AutoDisposeNotifierProviderElement<ChatMetadataRepository, void>
|
||||
createElement() {
|
||||
createElement() {
|
||||
return _ChatMetadataRepositoryProviderElement(this);
|
||||
}
|
||||
|
||||
@@ -173,5 +160,6 @@ class _ChatMetadataRepositoryProviderElement
|
||||
@override
|
||||
String get chatId => (origin as ChatMetadataRepositoryProvider).chatId;
|
||||
}
|
||||
|
||||
// ignore_for_file: type=lint
|
||||
// ignore_for_file: subtype_of_sealed_class, invalid_use_of_internal_member, invalid_use_of_visible_for_testing_member, deprecated_member_use_from_same_package
|
||||
|
||||
@@ -24,9 +24,7 @@ class SearchDao extends DatabaseAccessor<ChatSearchDatabase>
|
||||
return db.chat.insertOne(
|
||||
chat,
|
||||
onConflict: DoUpdate(
|
||||
(old) => ChatCompanion.custom(
|
||||
content: Variable(chat.content.value),
|
||||
),
|
||||
(old) => ChatCompanion.custom(content: Variable(chat.content.value)),
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
@@ -4,10 +4,7 @@ import 'package:lensai/features/search/domain/fts_tokenizer.dart';
|
||||
|
||||
part 'database.g.dart';
|
||||
|
||||
@DriftDatabase(
|
||||
include: {'database.drift'},
|
||||
daos: [SearchDao],
|
||||
)
|
||||
@DriftDatabase(include: {'database.drift'}, daos: [SearchDao])
|
||||
class ChatSearchDatabase extends _$ChatSearchDatabase
|
||||
with TrigramQueryBuilderMixin {
|
||||
@override
|
||||
|
||||
@@ -9,20 +9,29 @@ class Chat extends Table with TableInfo<Chat, ChatData> {
|
||||
final String? _alias;
|
||||
Chat(this.attachedDatabase, [this._alias]);
|
||||
late final GeneratedColumn<String> fileName = GeneratedColumn<String>(
|
||||
'file_name', aliasedName, false,
|
||||
type: DriftSqlType.string,
|
||||
requiredDuringInsert: true,
|
||||
$customConstraints: 'PRIMARY KEY NOT NULL');
|
||||
'file_name',
|
||||
aliasedName,
|
||||
false,
|
||||
type: DriftSqlType.string,
|
||||
requiredDuringInsert: true,
|
||||
$customConstraints: 'PRIMARY KEY NOT NULL',
|
||||
);
|
||||
late final GeneratedColumn<String> title = GeneratedColumn<String>(
|
||||
'title', aliasedName, false,
|
||||
type: DriftSqlType.string,
|
||||
requiredDuringInsert: true,
|
||||
$customConstraints: 'NOT NULL');
|
||||
'title',
|
||||
aliasedName,
|
||||
false,
|
||||
type: DriftSqlType.string,
|
||||
requiredDuringInsert: true,
|
||||
$customConstraints: 'NOT NULL',
|
||||
);
|
||||
late final GeneratedColumn<String> content = GeneratedColumn<String>(
|
||||
'content', aliasedName, false,
|
||||
type: DriftSqlType.string,
|
||||
requiredDuringInsert: true,
|
||||
$customConstraints: 'NOT NULL');
|
||||
'content',
|
||||
aliasedName,
|
||||
false,
|
||||
type: DriftSqlType.string,
|
||||
requiredDuringInsert: true,
|
||||
$customConstraints: 'NOT NULL',
|
||||
);
|
||||
@override
|
||||
List<GeneratedColumn> get $columns => [fileName, title, content];
|
||||
@override
|
||||
@@ -36,12 +45,21 @@ class Chat extends Table with TableInfo<Chat, ChatData> {
|
||||
ChatData map(Map<String, dynamic> data, {String? tablePrefix}) {
|
||||
final effectivePrefix = tablePrefix != null ? '$tablePrefix.' : '';
|
||||
return ChatData(
|
||||
fileName: attachedDatabase.typeMapping
|
||||
.read(DriftSqlType.string, data['${effectivePrefix}file_name'])!,
|
||||
title: attachedDatabase.typeMapping
|
||||
.read(DriftSqlType.string, data['${effectivePrefix}title'])!,
|
||||
content: attachedDatabase.typeMapping
|
||||
.read(DriftSqlType.string, data['${effectivePrefix}content'])!,
|
||||
fileName:
|
||||
attachedDatabase.typeMapping.read(
|
||||
DriftSqlType.string,
|
||||
data['${effectivePrefix}file_name'],
|
||||
)!,
|
||||
title:
|
||||
attachedDatabase.typeMapping.read(
|
||||
DriftSqlType.string,
|
||||
data['${effectivePrefix}title'],
|
||||
)!,
|
||||
content:
|
||||
attachedDatabase.typeMapping.read(
|
||||
DriftSqlType.string,
|
||||
data['${effectivePrefix}content'],
|
||||
)!,
|
||||
);
|
||||
}
|
||||
|
||||
@@ -58,8 +76,11 @@ class ChatData extends DataClass implements Insertable<ChatData> {
|
||||
final String fileName;
|
||||
final String title;
|
||||
final String content;
|
||||
const ChatData(
|
||||
{required this.fileName, required this.title, required this.content});
|
||||
const ChatData({
|
||||
required this.fileName,
|
||||
required this.title,
|
||||
required this.content,
|
||||
});
|
||||
@override
|
||||
Map<String, Expression> toColumns(bool nullToAbsent) {
|
||||
final map = <String, Expression>{};
|
||||
@@ -69,8 +90,10 @@ class ChatData extends DataClass implements Insertable<ChatData> {
|
||||
return map;
|
||||
}
|
||||
|
||||
factory ChatData.fromJson(Map<String, dynamic> json,
|
||||
{ValueSerializer? serializer}) {
|
||||
factory ChatData.fromJson(
|
||||
Map<String, dynamic> json, {
|
||||
ValueSerializer? serializer,
|
||||
}) {
|
||||
serializer ??= driftRuntimeOptions.defaultSerializer;
|
||||
return ChatData(
|
||||
fileName: serializer.fromJson<String>(json['file_name']),
|
||||
@@ -139,9 +162,9 @@ class ChatCompanion extends UpdateCompanion<ChatData> {
|
||||
required String title,
|
||||
required String content,
|
||||
this.rowid = const Value.absent(),
|
||||
}) : fileName = Value(fileName),
|
||||
title = Value(title),
|
||||
content = Value(content);
|
||||
}) : fileName = Value(fileName),
|
||||
title = Value(title),
|
||||
content = Value(content);
|
||||
static Insertable<ChatData> custom({
|
||||
Expression<String>? fileName,
|
||||
Expression<String>? title,
|
||||
@@ -156,11 +179,12 @@ class ChatCompanion extends UpdateCompanion<ChatData> {
|
||||
});
|
||||
}
|
||||
|
||||
ChatCompanion copyWith(
|
||||
{Value<String>? fileName,
|
||||
Value<String>? title,
|
||||
Value<String>? content,
|
||||
Value<int>? rowid}) {
|
||||
ChatCompanion copyWith({
|
||||
Value<String>? fileName,
|
||||
Value<String>? title,
|
||||
Value<String>? content,
|
||||
Value<int>? rowid,
|
||||
}) {
|
||||
return ChatCompanion(
|
||||
fileName: fileName ?? this.fileName,
|
||||
title: title ?? this.title,
|
||||
@@ -206,15 +230,21 @@ class ChatFts extends Table
|
||||
final String? _alias;
|
||||
ChatFts(this.attachedDatabase, [this._alias]);
|
||||
late final GeneratedColumn<String> title = GeneratedColumn<String>(
|
||||
'title', aliasedName, false,
|
||||
type: DriftSqlType.string,
|
||||
requiredDuringInsert: true,
|
||||
$customConstraints: '');
|
||||
'title',
|
||||
aliasedName,
|
||||
false,
|
||||
type: DriftSqlType.string,
|
||||
requiredDuringInsert: true,
|
||||
$customConstraints: '',
|
||||
);
|
||||
late final GeneratedColumn<String> content = GeneratedColumn<String>(
|
||||
'content', aliasedName, false,
|
||||
type: DriftSqlType.string,
|
||||
requiredDuringInsert: true,
|
||||
$customConstraints: '');
|
||||
'content',
|
||||
aliasedName,
|
||||
false,
|
||||
type: DriftSqlType.string,
|
||||
requiredDuringInsert: true,
|
||||
$customConstraints: '',
|
||||
);
|
||||
@override
|
||||
List<GeneratedColumn> get $columns => [title, content];
|
||||
@override
|
||||
@@ -228,10 +258,16 @@ class ChatFts extends Table
|
||||
ChatFt map(Map<String, dynamic> data, {String? tablePrefix}) {
|
||||
final effectivePrefix = tablePrefix != null ? '$tablePrefix.' : '';
|
||||
return ChatFt(
|
||||
title: attachedDatabase.typeMapping
|
||||
.read(DriftSqlType.string, data['${effectivePrefix}title'])!,
|
||||
content: attachedDatabase.typeMapping
|
||||
.read(DriftSqlType.string, data['${effectivePrefix}content'])!,
|
||||
title:
|
||||
attachedDatabase.typeMapping.read(
|
||||
DriftSqlType.string,
|
||||
data['${effectivePrefix}title'],
|
||||
)!,
|
||||
content:
|
||||
attachedDatabase.typeMapping.read(
|
||||
DriftSqlType.string,
|
||||
data['${effectivePrefix}content'],
|
||||
)!,
|
||||
);
|
||||
}
|
||||
|
||||
@@ -259,8 +295,10 @@ class ChatFt extends DataClass implements Insertable<ChatFt> {
|
||||
return map;
|
||||
}
|
||||
|
||||
factory ChatFt.fromJson(Map<String, dynamic> json,
|
||||
{ValueSerializer? serializer}) {
|
||||
factory ChatFt.fromJson(
|
||||
Map<String, dynamic> json, {
|
||||
ValueSerializer? serializer,
|
||||
}) {
|
||||
serializer ??= driftRuntimeOptions.defaultSerializer;
|
||||
return ChatFt(
|
||||
title: serializer.fromJson<String>(json['title']),
|
||||
@@ -276,10 +314,8 @@ class ChatFt extends DataClass implements Insertable<ChatFt> {
|
||||
};
|
||||
}
|
||||
|
||||
ChatFt copyWith({String? title, String? content}) => ChatFt(
|
||||
title: title ?? this.title,
|
||||
content: content ?? this.content,
|
||||
);
|
||||
ChatFt copyWith({String? title, String? content}) =>
|
||||
ChatFt(title: title ?? this.title, content: content ?? this.content);
|
||||
ChatFt copyWithCompanion(ChatFtsCompanion data) {
|
||||
return ChatFt(
|
||||
title: data.title.present ? data.title.value : this.title,
|
||||
@@ -319,8 +355,8 @@ class ChatFtsCompanion extends UpdateCompanion<ChatFt> {
|
||||
required String title,
|
||||
required String content,
|
||||
this.rowid = const Value.absent(),
|
||||
}) : title = Value(title),
|
||||
content = Value(content);
|
||||
}) : title = Value(title),
|
||||
content = Value(content);
|
||||
static Insertable<ChatFt> custom({
|
||||
Expression<String>? title,
|
||||
Expression<String>? content,
|
||||
@@ -333,8 +369,11 @@ class ChatFtsCompanion extends UpdateCompanion<ChatFt> {
|
||||
});
|
||||
}
|
||||
|
||||
ChatFtsCompanion copyWith(
|
||||
{Value<String>? title, Value<String>? content, Value<int>? rowid}) {
|
||||
ChatFtsCompanion copyWith({
|
||||
Value<String>? title,
|
||||
Value<String>? content,
|
||||
Value<int>? rowid,
|
||||
}) {
|
||||
return ChatFtsCompanion(
|
||||
title: title ?? this.title,
|
||||
content: content ?? this.content,
|
||||
@@ -374,86 +413,95 @@ abstract class _$ChatSearchDatabase extends GeneratedDatabase {
|
||||
late final Chat chat = Chat(this);
|
||||
late final ChatFts chatFts = ChatFts(this);
|
||||
late final Trigger chatAfterInsert = Trigger(
|
||||
'CREATE TRIGGER chat_after_insert AFTER INSERT ON chat BEGIN INSERT INTO chat_fts ("rowid", title, content) VALUES (new."rowid", new.title, new.content);END',
|
||||
'chat_after_insert');
|
||||
'CREATE TRIGGER chat_after_insert AFTER INSERT ON chat BEGIN INSERT INTO chat_fts ("rowid", title, content) VALUES (new."rowid", new.title, new.content);END',
|
||||
'chat_after_insert',
|
||||
);
|
||||
late final Trigger chatAfterDelete = Trigger(
|
||||
'CREATE TRIGGER chat_after_delete AFTER DELETE ON chat BEGIN INSERT INTO chat_fts (chat_fts, "rowid", title, content) VALUES (\'delete\', old."rowid", old.title, old.content);END',
|
||||
'chat_after_delete');
|
||||
'CREATE TRIGGER chat_after_delete AFTER DELETE ON chat BEGIN INSERT INTO chat_fts (chat_fts, "rowid", title, content) VALUES (\'delete\', old."rowid", old.title, old.content);END',
|
||||
'chat_after_delete',
|
||||
);
|
||||
late final Trigger chatAfterUpdate = Trigger(
|
||||
'CREATE TRIGGER chat_after_update AFTER UPDATE ON chat BEGIN INSERT INTO chat_fts (chat_fts, "rowid", title, content) VALUES (\'delete\', old."rowid", old.title, old.content);INSERT INTO chat_fts ("rowid", title, content) VALUES (new."rowid", new.title, new.content);END',
|
||||
'chat_after_update');
|
||||
'CREATE TRIGGER chat_after_update AFTER UPDATE ON chat BEGIN INSERT INTO chat_fts (chat_fts, "rowid", title, content) VALUES (\'delete\', old."rowid", old.title, old.content);INSERT INTO chat_fts ("rowid", title, content) VALUES (new."rowid", new.title, new.content);END',
|
||||
'chat_after_update',
|
||||
);
|
||||
late final SearchDao searchDao = SearchDao(this as ChatSearchDatabase);
|
||||
Selectable<ChatQueryResult> chatQuery(
|
||||
{required String beforeMatch,
|
||||
required String afterMatch,
|
||||
required String ellipsis,
|
||||
required int snippetLength,
|
||||
required String query}) {
|
||||
Selectable<ChatQueryResult> chatQuery({
|
||||
required String beforeMatch,
|
||||
required String afterMatch,
|
||||
required String ellipsis,
|
||||
required int snippetLength,
|
||||
required String query,
|
||||
}) {
|
||||
return customSelect(
|
||||
'SELECT c.file_name, highlight(chat_fts, 0, ?1, ?2) AS title, snippet(chat_fts, 1, ?1, ?2, ?3, ?4) AS content_snippet FROM chat_fts(?5)AS fts INNER JOIN chat AS c ON c."rowid" = fts."rowid" ORDER BY RANK',
|
||||
variables: [
|
||||
Variable<String>(beforeMatch),
|
||||
Variable<String>(afterMatch),
|
||||
Variable<String>(ellipsis),
|
||||
Variable<int>(snippetLength),
|
||||
Variable<String>(query)
|
||||
],
|
||||
readsFrom: {
|
||||
chat,
|
||||
chatFts,
|
||||
}).map((QueryRow row) => ChatQueryResult(
|
||||
fileName: row.read<String>('file_name'),
|
||||
title: row.readNullable<String>('title'),
|
||||
contentSnippet: row.readNullable<String>('content_snippet'),
|
||||
));
|
||||
'SELECT c.file_name, highlight(chat_fts, 0, ?1, ?2) AS title, snippet(chat_fts, 1, ?1, ?2, ?3, ?4) AS content_snippet FROM chat_fts(?5)AS fts INNER JOIN chat AS c ON c."rowid" = fts."rowid" ORDER BY RANK',
|
||||
variables: [
|
||||
Variable<String>(beforeMatch),
|
||||
Variable<String>(afterMatch),
|
||||
Variable<String>(ellipsis),
|
||||
Variable<int>(snippetLength),
|
||||
Variable<String>(query),
|
||||
],
|
||||
readsFrom: {chat, chatFts},
|
||||
).map(
|
||||
(QueryRow row) => ChatQueryResult(
|
||||
fileName: row.read<String>('file_name'),
|
||||
title: row.readNullable<String>('title'),
|
||||
contentSnippet: row.readNullable<String>('content_snippet'),
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
@override
|
||||
Iterable<TableInfo<Table, Object?>> get allTables =>
|
||||
allSchemaEntities.whereType<TableInfo<Table, Object?>>();
|
||||
@override
|
||||
List<DatabaseSchemaEntity> get allSchemaEntities =>
|
||||
[chat, chatFts, chatAfterInsert, chatAfterDelete, chatAfterUpdate];
|
||||
List<DatabaseSchemaEntity> get allSchemaEntities => [
|
||||
chat,
|
||||
chatFts,
|
||||
chatAfterInsert,
|
||||
chatAfterDelete,
|
||||
chatAfterUpdate,
|
||||
];
|
||||
@override
|
||||
StreamQueryUpdateRules get streamUpdateRules => const StreamQueryUpdateRules(
|
||||
[
|
||||
WritePropagation(
|
||||
on: TableUpdateQuery.onTableName('chat',
|
||||
limitUpdateKind: UpdateKind.insert),
|
||||
result: [
|
||||
TableUpdate('chat_fts', kind: UpdateKind.insert),
|
||||
],
|
||||
),
|
||||
WritePropagation(
|
||||
on: TableUpdateQuery.onTableName('chat',
|
||||
limitUpdateKind: UpdateKind.delete),
|
||||
result: [
|
||||
TableUpdate('chat_fts', kind: UpdateKind.insert),
|
||||
],
|
||||
),
|
||||
WritePropagation(
|
||||
on: TableUpdateQuery.onTableName('chat',
|
||||
limitUpdateKind: UpdateKind.update),
|
||||
result: [
|
||||
TableUpdate('chat_fts', kind: UpdateKind.insert),
|
||||
],
|
||||
),
|
||||
],
|
||||
);
|
||||
StreamQueryUpdateRules get streamUpdateRules => const StreamQueryUpdateRules([
|
||||
WritePropagation(
|
||||
on: TableUpdateQuery.onTableName(
|
||||
'chat',
|
||||
limitUpdateKind: UpdateKind.insert,
|
||||
),
|
||||
result: [TableUpdate('chat_fts', kind: UpdateKind.insert)],
|
||||
),
|
||||
WritePropagation(
|
||||
on: TableUpdateQuery.onTableName(
|
||||
'chat',
|
||||
limitUpdateKind: UpdateKind.delete,
|
||||
),
|
||||
result: [TableUpdate('chat_fts', kind: UpdateKind.insert)],
|
||||
),
|
||||
WritePropagation(
|
||||
on: TableUpdateQuery.onTableName(
|
||||
'chat',
|
||||
limitUpdateKind: UpdateKind.update,
|
||||
),
|
||||
result: [TableUpdate('chat_fts', kind: UpdateKind.insert)],
|
||||
),
|
||||
]);
|
||||
}
|
||||
|
||||
typedef $ChatCreateCompanionBuilder = ChatCompanion Function({
|
||||
required String fileName,
|
||||
required String title,
|
||||
required String content,
|
||||
Value<int> rowid,
|
||||
});
|
||||
typedef $ChatUpdateCompanionBuilder = ChatCompanion Function({
|
||||
Value<String> fileName,
|
||||
Value<String> title,
|
||||
Value<String> content,
|
||||
Value<int> rowid,
|
||||
});
|
||||
typedef $ChatCreateCompanionBuilder =
|
||||
ChatCompanion Function({
|
||||
required String fileName,
|
||||
required String title,
|
||||
required String content,
|
||||
Value<int> rowid,
|
||||
});
|
||||
typedef $ChatUpdateCompanionBuilder =
|
||||
ChatCompanion Function({
|
||||
Value<String> fileName,
|
||||
Value<String> title,
|
||||
Value<String> content,
|
||||
Value<int> rowid,
|
||||
});
|
||||
|
||||
class $ChatFilterComposer extends Composer<_$ChatSearchDatabase, Chat> {
|
||||
$ChatFilterComposer({
|
||||
@@ -464,13 +512,19 @@ class $ChatFilterComposer extends Composer<_$ChatSearchDatabase, Chat> {
|
||||
super.$removeJoinBuilderFromRootComposer,
|
||||
});
|
||||
ColumnFilters<String> get fileName => $composableBuilder(
|
||||
column: $table.fileName, builder: (column) => ColumnFilters(column));
|
||||
column: $table.fileName,
|
||||
builder: (column) => ColumnFilters(column),
|
||||
);
|
||||
|
||||
ColumnFilters<String> get title => $composableBuilder(
|
||||
column: $table.title, builder: (column) => ColumnFilters(column));
|
||||
column: $table.title,
|
||||
builder: (column) => ColumnFilters(column),
|
||||
);
|
||||
|
||||
ColumnFilters<String> get content => $composableBuilder(
|
||||
column: $table.content, builder: (column) => ColumnFilters(column));
|
||||
column: $table.content,
|
||||
builder: (column) => ColumnFilters(column),
|
||||
);
|
||||
}
|
||||
|
||||
class $ChatOrderingComposer extends Composer<_$ChatSearchDatabase, Chat> {
|
||||
@@ -482,13 +536,19 @@ class $ChatOrderingComposer extends Composer<_$ChatSearchDatabase, Chat> {
|
||||
super.$removeJoinBuilderFromRootComposer,
|
||||
});
|
||||
ColumnOrderings<String> get fileName => $composableBuilder(
|
||||
column: $table.fileName, builder: (column) => ColumnOrderings(column));
|
||||
column: $table.fileName,
|
||||
builder: (column) => ColumnOrderings(column),
|
||||
);
|
||||
|
||||
ColumnOrderings<String> get title => $composableBuilder(
|
||||
column: $table.title, builder: (column) => ColumnOrderings(column));
|
||||
column: $table.title,
|
||||
builder: (column) => ColumnOrderings(column),
|
||||
);
|
||||
|
||||
ColumnOrderings<String> get content => $composableBuilder(
|
||||
column: $table.content, builder: (column) => ColumnOrderings(column));
|
||||
column: $table.content,
|
||||
builder: (column) => ColumnOrderings(column),
|
||||
);
|
||||
}
|
||||
|
||||
class $ChatAnnotationComposer extends Composer<_$ChatSearchDatabase, Chat> {
|
||||
@@ -509,81 +569,97 @@ class $ChatAnnotationComposer extends Composer<_$ChatSearchDatabase, Chat> {
|
||||
$composableBuilder(column: $table.content, builder: (column) => column);
|
||||
}
|
||||
|
||||
class $ChatTableManager extends RootTableManager<
|
||||
_$ChatSearchDatabase,
|
||||
Chat,
|
||||
ChatData,
|
||||
$ChatFilterComposer,
|
||||
$ChatOrderingComposer,
|
||||
$ChatAnnotationComposer,
|
||||
$ChatCreateCompanionBuilder,
|
||||
$ChatUpdateCompanionBuilder,
|
||||
(ChatData, BaseReferences<_$ChatSearchDatabase, Chat, ChatData>),
|
||||
ChatData,
|
||||
PrefetchHooks Function()> {
|
||||
class $ChatTableManager
|
||||
extends
|
||||
RootTableManager<
|
||||
_$ChatSearchDatabase,
|
||||
Chat,
|
||||
ChatData,
|
||||
$ChatFilterComposer,
|
||||
$ChatOrderingComposer,
|
||||
$ChatAnnotationComposer,
|
||||
$ChatCreateCompanionBuilder,
|
||||
$ChatUpdateCompanionBuilder,
|
||||
(ChatData, BaseReferences<_$ChatSearchDatabase, Chat, ChatData>),
|
||||
ChatData,
|
||||
PrefetchHooks Function()
|
||||
> {
|
||||
$ChatTableManager(_$ChatSearchDatabase db, Chat table)
|
||||
: super(TableManagerState(
|
||||
: super(
|
||||
TableManagerState(
|
||||
db: db,
|
||||
table: table,
|
||||
createFilteringComposer: () =>
|
||||
$ChatFilterComposer($db: db, $table: table),
|
||||
createOrderingComposer: () =>
|
||||
$ChatOrderingComposer($db: db, $table: table),
|
||||
createComputedFieldComposer: () =>
|
||||
$ChatAnnotationComposer($db: db, $table: table),
|
||||
updateCompanionCallback: ({
|
||||
Value<String> fileName = const Value.absent(),
|
||||
Value<String> title = const Value.absent(),
|
||||
Value<String> content = const Value.absent(),
|
||||
Value<int> rowid = const Value.absent(),
|
||||
}) =>
|
||||
ChatCompanion(
|
||||
fileName: fileName,
|
||||
title: title,
|
||||
content: content,
|
||||
rowid: rowid,
|
||||
),
|
||||
createCompanionCallback: ({
|
||||
required String fileName,
|
||||
required String title,
|
||||
required String content,
|
||||
Value<int> rowid = const Value.absent(),
|
||||
}) =>
|
||||
ChatCompanion.insert(
|
||||
fileName: fileName,
|
||||
title: title,
|
||||
content: content,
|
||||
rowid: rowid,
|
||||
),
|
||||
withReferenceMapper: (p0) => p0
|
||||
.map((e) => (e.readTable(table), BaseReferences(db, table, e)))
|
||||
.toList(),
|
||||
createFilteringComposer:
|
||||
() => $ChatFilterComposer($db: db, $table: table),
|
||||
createOrderingComposer:
|
||||
() => $ChatOrderingComposer($db: db, $table: table),
|
||||
createComputedFieldComposer:
|
||||
() => $ChatAnnotationComposer($db: db, $table: table),
|
||||
updateCompanionCallback:
|
||||
({
|
||||
Value<String> fileName = const Value.absent(),
|
||||
Value<String> title = const Value.absent(),
|
||||
Value<String> content = const Value.absent(),
|
||||
Value<int> rowid = const Value.absent(),
|
||||
}) => ChatCompanion(
|
||||
fileName: fileName,
|
||||
title: title,
|
||||
content: content,
|
||||
rowid: rowid,
|
||||
),
|
||||
createCompanionCallback:
|
||||
({
|
||||
required String fileName,
|
||||
required String title,
|
||||
required String content,
|
||||
Value<int> rowid = const Value.absent(),
|
||||
}) => ChatCompanion.insert(
|
||||
fileName: fileName,
|
||||
title: title,
|
||||
content: content,
|
||||
rowid: rowid,
|
||||
),
|
||||
withReferenceMapper:
|
||||
(p0) =>
|
||||
p0
|
||||
.map(
|
||||
(e) => (
|
||||
e.readTable(table),
|
||||
BaseReferences(db, table, e),
|
||||
),
|
||||
)
|
||||
.toList(),
|
||||
prefetchHooksCallback: null,
|
||||
));
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
typedef $ChatProcessedTableManager = ProcessedTableManager<
|
||||
_$ChatSearchDatabase,
|
||||
Chat,
|
||||
ChatData,
|
||||
$ChatFilterComposer,
|
||||
$ChatOrderingComposer,
|
||||
$ChatAnnotationComposer,
|
||||
$ChatCreateCompanionBuilder,
|
||||
$ChatUpdateCompanionBuilder,
|
||||
(ChatData, BaseReferences<_$ChatSearchDatabase, Chat, ChatData>),
|
||||
ChatData,
|
||||
PrefetchHooks Function()>;
|
||||
typedef $ChatFtsCreateCompanionBuilder = ChatFtsCompanion Function({
|
||||
required String title,
|
||||
required String content,
|
||||
Value<int> rowid,
|
||||
});
|
||||
typedef $ChatFtsUpdateCompanionBuilder = ChatFtsCompanion Function({
|
||||
Value<String> title,
|
||||
Value<String> content,
|
||||
Value<int> rowid,
|
||||
});
|
||||
typedef $ChatProcessedTableManager =
|
||||
ProcessedTableManager<
|
||||
_$ChatSearchDatabase,
|
||||
Chat,
|
||||
ChatData,
|
||||
$ChatFilterComposer,
|
||||
$ChatOrderingComposer,
|
||||
$ChatAnnotationComposer,
|
||||
$ChatCreateCompanionBuilder,
|
||||
$ChatUpdateCompanionBuilder,
|
||||
(ChatData, BaseReferences<_$ChatSearchDatabase, Chat, ChatData>),
|
||||
ChatData,
|
||||
PrefetchHooks Function()
|
||||
>;
|
||||
typedef $ChatFtsCreateCompanionBuilder =
|
||||
ChatFtsCompanion Function({
|
||||
required String title,
|
||||
required String content,
|
||||
Value<int> rowid,
|
||||
});
|
||||
typedef $ChatFtsUpdateCompanionBuilder =
|
||||
ChatFtsCompanion Function({
|
||||
Value<String> title,
|
||||
Value<String> content,
|
||||
Value<int> rowid,
|
||||
});
|
||||
|
||||
class $ChatFtsFilterComposer extends Composer<_$ChatSearchDatabase, ChatFts> {
|
||||
$ChatFtsFilterComposer({
|
||||
@@ -594,10 +670,14 @@ class $ChatFtsFilterComposer extends Composer<_$ChatSearchDatabase, ChatFts> {
|
||||
super.$removeJoinBuilderFromRootComposer,
|
||||
});
|
||||
ColumnFilters<String> get title => $composableBuilder(
|
||||
column: $table.title, builder: (column) => ColumnFilters(column));
|
||||
column: $table.title,
|
||||
builder: (column) => ColumnFilters(column),
|
||||
);
|
||||
|
||||
ColumnFilters<String> get content => $composableBuilder(
|
||||
column: $table.content, builder: (column) => ColumnFilters(column));
|
||||
column: $table.content,
|
||||
builder: (column) => ColumnFilters(column),
|
||||
);
|
||||
}
|
||||
|
||||
class $ChatFtsOrderingComposer extends Composer<_$ChatSearchDatabase, ChatFts> {
|
||||
@@ -609,10 +689,14 @@ class $ChatFtsOrderingComposer extends Composer<_$ChatSearchDatabase, ChatFts> {
|
||||
super.$removeJoinBuilderFromRootComposer,
|
||||
});
|
||||
ColumnOrderings<String> get title => $composableBuilder(
|
||||
column: $table.title, builder: (column) => ColumnOrderings(column));
|
||||
column: $table.title,
|
||||
builder: (column) => ColumnOrderings(column),
|
||||
);
|
||||
|
||||
ColumnOrderings<String> get content => $composableBuilder(
|
||||
column: $table.content, builder: (column) => ColumnOrderings(column));
|
||||
column: $table.content,
|
||||
builder: (column) => ColumnOrderings(column),
|
||||
);
|
||||
}
|
||||
|
||||
class $ChatFtsAnnotationComposer
|
||||
@@ -631,67 +715,81 @@ class $ChatFtsAnnotationComposer
|
||||
$composableBuilder(column: $table.content, builder: (column) => column);
|
||||
}
|
||||
|
||||
class $ChatFtsTableManager extends RootTableManager<
|
||||
_$ChatSearchDatabase,
|
||||
ChatFts,
|
||||
ChatFt,
|
||||
$ChatFtsFilterComposer,
|
||||
$ChatFtsOrderingComposer,
|
||||
$ChatFtsAnnotationComposer,
|
||||
$ChatFtsCreateCompanionBuilder,
|
||||
$ChatFtsUpdateCompanionBuilder,
|
||||
(ChatFt, BaseReferences<_$ChatSearchDatabase, ChatFts, ChatFt>),
|
||||
ChatFt,
|
||||
PrefetchHooks Function()> {
|
||||
class $ChatFtsTableManager
|
||||
extends
|
||||
RootTableManager<
|
||||
_$ChatSearchDatabase,
|
||||
ChatFts,
|
||||
ChatFt,
|
||||
$ChatFtsFilterComposer,
|
||||
$ChatFtsOrderingComposer,
|
||||
$ChatFtsAnnotationComposer,
|
||||
$ChatFtsCreateCompanionBuilder,
|
||||
$ChatFtsUpdateCompanionBuilder,
|
||||
(ChatFt, BaseReferences<_$ChatSearchDatabase, ChatFts, ChatFt>),
|
||||
ChatFt,
|
||||
PrefetchHooks Function()
|
||||
> {
|
||||
$ChatFtsTableManager(_$ChatSearchDatabase db, ChatFts table)
|
||||
: super(TableManagerState(
|
||||
: super(
|
||||
TableManagerState(
|
||||
db: db,
|
||||
table: table,
|
||||
createFilteringComposer: () =>
|
||||
$ChatFtsFilterComposer($db: db, $table: table),
|
||||
createOrderingComposer: () =>
|
||||
$ChatFtsOrderingComposer($db: db, $table: table),
|
||||
createComputedFieldComposer: () =>
|
||||
$ChatFtsAnnotationComposer($db: db, $table: table),
|
||||
updateCompanionCallback: ({
|
||||
Value<String> title = const Value.absent(),
|
||||
Value<String> content = const Value.absent(),
|
||||
Value<int> rowid = const Value.absent(),
|
||||
}) =>
|
||||
ChatFtsCompanion(
|
||||
title: title,
|
||||
content: content,
|
||||
rowid: rowid,
|
||||
),
|
||||
createCompanionCallback: ({
|
||||
required String title,
|
||||
required String content,
|
||||
Value<int> rowid = const Value.absent(),
|
||||
}) =>
|
||||
ChatFtsCompanion.insert(
|
||||
title: title,
|
||||
content: content,
|
||||
rowid: rowid,
|
||||
),
|
||||
withReferenceMapper: (p0) => p0
|
||||
.map((e) => (e.readTable(table), BaseReferences(db, table, e)))
|
||||
.toList(),
|
||||
createFilteringComposer:
|
||||
() => $ChatFtsFilterComposer($db: db, $table: table),
|
||||
createOrderingComposer:
|
||||
() => $ChatFtsOrderingComposer($db: db, $table: table),
|
||||
createComputedFieldComposer:
|
||||
() => $ChatFtsAnnotationComposer($db: db, $table: table),
|
||||
updateCompanionCallback:
|
||||
({
|
||||
Value<String> title = const Value.absent(),
|
||||
Value<String> content = const Value.absent(),
|
||||
Value<int> rowid = const Value.absent(),
|
||||
}) => ChatFtsCompanion(
|
||||
title: title,
|
||||
content: content,
|
||||
rowid: rowid,
|
||||
),
|
||||
createCompanionCallback:
|
||||
({
|
||||
required String title,
|
||||
required String content,
|
||||
Value<int> rowid = const Value.absent(),
|
||||
}) => ChatFtsCompanion.insert(
|
||||
title: title,
|
||||
content: content,
|
||||
rowid: rowid,
|
||||
),
|
||||
withReferenceMapper:
|
||||
(p0) =>
|
||||
p0
|
||||
.map(
|
||||
(e) => (
|
||||
e.readTable(table),
|
||||
BaseReferences(db, table, e),
|
||||
),
|
||||
)
|
||||
.toList(),
|
||||
prefetchHooksCallback: null,
|
||||
));
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
typedef $ChatFtsProcessedTableManager = ProcessedTableManager<
|
||||
_$ChatSearchDatabase,
|
||||
ChatFts,
|
||||
ChatFt,
|
||||
$ChatFtsFilterComposer,
|
||||
$ChatFtsOrderingComposer,
|
||||
$ChatFtsAnnotationComposer,
|
||||
$ChatFtsCreateCompanionBuilder,
|
||||
$ChatFtsUpdateCompanionBuilder,
|
||||
(ChatFt, BaseReferences<_$ChatSearchDatabase, ChatFts, ChatFt>),
|
||||
ChatFt,
|
||||
PrefetchHooks Function()>;
|
||||
typedef $ChatFtsProcessedTableManager =
|
||||
ProcessedTableManager<
|
||||
_$ChatSearchDatabase,
|
||||
ChatFts,
|
||||
ChatFt,
|
||||
$ChatFtsFilterComposer,
|
||||
$ChatFtsOrderingComposer,
|
||||
$ChatFtsAnnotationComposer,
|
||||
$ChatFtsCreateCompanionBuilder,
|
||||
$ChatFtsUpdateCompanionBuilder,
|
||||
(ChatFt, BaseReferences<_$ChatSearchDatabase, ChatFts, ChatFt>),
|
||||
ChatFt,
|
||||
PrefetchHooks Function()
|
||||
>;
|
||||
|
||||
class $ChatSearchDatabaseManager {
|
||||
final _$ChatSearchDatabase _db;
|
||||
@@ -704,9 +802,5 @@ class ChatQueryResult {
|
||||
final String fileName;
|
||||
final String? title;
|
||||
final String? contentSnippet;
|
||||
ChatQueryResult({
|
||||
required this.fileName,
|
||||
this.title,
|
||||
this.contentSnippet,
|
||||
});
|
||||
ChatQueryResult({required this.fileName, this.title, this.contentSnippet});
|
||||
}
|
||||
|
||||
@@ -13,14 +13,15 @@ String _$chatSearchDatabaseHash() =>
|
||||
@ProviderFor(chatSearchDatabase)
|
||||
final chatSearchDatabaseProvider =
|
||||
AutoDisposeProvider<ChatSearchDatabase>.internal(
|
||||
chatSearchDatabase,
|
||||
name: r'chatSearchDatabaseProvider',
|
||||
debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product')
|
||||
? null
|
||||
: _$chatSearchDatabaseHash,
|
||||
dependencies: null,
|
||||
allTransitiveDependencies: null,
|
||||
);
|
||||
chatSearchDatabase,
|
||||
name: r'chatSearchDatabaseProvider',
|
||||
debugGetCreateSourceHash:
|
||||
const bool.fromEnvironment('dart.vm.product')
|
||||
? null
|
||||
: _$chatSearchDatabaseHash,
|
||||
dependencies: null,
|
||||
allTransitiveDependencies: null,
|
||||
);
|
||||
|
||||
@Deprecated('Will be removed in 3.0. Use Ref instead')
|
||||
// ignore: unused_element
|
||||
|
||||
@@ -11,19 +11,21 @@ class ChatArchiveFileService extends _$ChatArchiveFileService {
|
||||
final Future<Directory> _archiveDirectoryFuture;
|
||||
|
||||
ChatArchiveFileService()
|
||||
: _archiveDirectoryFuture =
|
||||
path_provider.getApplicationDocumentsDirectory().then(
|
||||
(documentDirectory) => Directory(
|
||||
path.join(documentDirectory.path, 'archive', 'chat'),
|
||||
).create(recursive: true),
|
||||
);
|
||||
: _archiveDirectoryFuture = path_provider
|
||||
.getApplicationDocumentsDirectory()
|
||||
.then(
|
||||
(documentDirectory) => Directory(
|
||||
path.join(documentDirectory.path, 'archive', 'chat'),
|
||||
).create(recursive: true),
|
||||
);
|
||||
|
||||
Future<List<FileSystemEntity>> list() {
|
||||
return _archiveDirectoryFuture.then(
|
||||
(value) => value
|
||||
.list()
|
||||
.where((file) => path.extension(file.path) == '.md')
|
||||
.toList(),
|
||||
(value) =>
|
||||
value
|
||||
.list()
|
||||
.where((file) => path.extension(file.path) == '.md')
|
||||
.toList(),
|
||||
);
|
||||
}
|
||||
|
||||
@@ -56,8 +58,9 @@ class ChatArchiveFileService extends _$ChatArchiveFileService {
|
||||
|
||||
Stream<WatchEvent> _directoryStream() async* {
|
||||
final watcher = DirectoryWatcher(
|
||||
await _archiveDirectoryFuture
|
||||
.then((archiveDirectory) => archiveDirectory.absolute.path),
|
||||
await _archiveDirectoryFuture.then(
|
||||
(archiveDirectory) => archiveDirectory.absolute.path,
|
||||
),
|
||||
);
|
||||
|
||||
yield* watcher.events.where((event) => path.extension(event.path) == '.md');
|
||||
|
||||
@@ -12,12 +12,15 @@ String _$chatArchiveFileServiceHash() =>
|
||||
/// See also [ChatArchiveFileService].
|
||||
@ProviderFor(ChatArchiveFileService)
|
||||
final chatArchiveFileServiceProvider = AutoDisposeNotifierProvider<
|
||||
ChatArchiveFileService, Raw<Stream<WatchEvent>>>.internal(
|
||||
ChatArchiveFileService,
|
||||
Raw<Stream<WatchEvent>>
|
||||
>.internal(
|
||||
ChatArchiveFileService.new,
|
||||
name: r'chatArchiveFileServiceProvider',
|
||||
debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product')
|
||||
? null
|
||||
: _$chatArchiveFileServiceHash,
|
||||
debugGetCreateSourceHash:
|
||||
const bool.fromEnvironment('dart.vm.product')
|
||||
? null
|
||||
: _$chatArchiveFileServiceHash,
|
||||
dependencies: null,
|
||||
allTransitiveDependencies: null,
|
||||
);
|
||||
|
||||
@@ -21,8 +21,9 @@ class ChatArchiveRepository extends _$ChatArchiveRepository {
|
||||
}
|
||||
|
||||
Future<Result<void>> archiveChat(String fileName, Uri url) async {
|
||||
final contentsResult =
|
||||
await ref.read(kagiChatServiceProvider.notifier).downloadChat(url);
|
||||
final contentsResult = await ref
|
||||
.read(kagiChatServiceProvider.notifier)
|
||||
.downloadChat(url);
|
||||
|
||||
return contentsResult.flatMapAsync(
|
||||
(contents) => ref
|
||||
@@ -37,14 +38,15 @@ class ChatArchiveRepository extends _$ChatArchiveRepository {
|
||||
);
|
||||
|
||||
return contentsResult.fold(
|
||||
(value) => (value == null)
|
||||
? Result.failure(
|
||||
ErrorMessage(
|
||||
source: 'Chat Archive',
|
||||
message: 'Chat $fileName not found',
|
||||
),
|
||||
)
|
||||
: Result.success(value),
|
||||
(value) =>
|
||||
(value == null)
|
||||
? Result.failure(
|
||||
ErrorMessage(
|
||||
source: 'Chat Archive',
|
||||
message: 'Chat $fileName not found',
|
||||
),
|
||||
)
|
||||
: Result.success(value),
|
||||
onFailure: Result.failure,
|
||||
);
|
||||
}
|
||||
@@ -55,17 +57,16 @@ class ChatArchiveRepository extends _$ChatArchiveRepository {
|
||||
|
||||
yield* ConcatStream([
|
||||
listArchivedChats().asStream(),
|
||||
fileRepository.asyncMap(
|
||||
(_) => listArchivedChats(),
|
||||
),
|
||||
fileRepository.asyncMap((_) => listArchivedChats()),
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
||||
@Riverpod()
|
||||
Future<String> readArchivedChat(Ref ref, String fileName) async {
|
||||
final result =
|
||||
await ref.read(chatArchiveRepositoryProvider.notifier).readChat(fileName);
|
||||
final result = await ref
|
||||
.read(chatArchiveRepositoryProvider.notifier)
|
||||
.readChat(fileName);
|
||||
|
||||
return result.value;
|
||||
}
|
||||
|
||||
@@ -39,21 +39,15 @@ class ReadArchivedChatFamily extends Family<AsyncValue<String>> {
|
||||
const ReadArchivedChatFamily();
|
||||
|
||||
/// See also [readArchivedChat].
|
||||
ReadArchivedChatProvider call(
|
||||
String fileName,
|
||||
) {
|
||||
return ReadArchivedChatProvider(
|
||||
fileName,
|
||||
);
|
||||
ReadArchivedChatProvider call(String fileName) {
|
||||
return ReadArchivedChatProvider(fileName);
|
||||
}
|
||||
|
||||
@override
|
||||
ReadArchivedChatProvider getProviderOverride(
|
||||
covariant ReadArchivedChatProvider provider,
|
||||
) {
|
||||
return call(
|
||||
provider.fileName,
|
||||
);
|
||||
return call(provider.fileName);
|
||||
}
|
||||
|
||||
static const Iterable<ProviderOrFamily>? _dependencies = null;
|
||||
@@ -74,24 +68,20 @@ class ReadArchivedChatFamily extends Family<AsyncValue<String>> {
|
||||
/// See also [readArchivedChat].
|
||||
class ReadArchivedChatProvider extends AutoDisposeFutureProvider<String> {
|
||||
/// See also [readArchivedChat].
|
||||
ReadArchivedChatProvider(
|
||||
String fileName,
|
||||
) : this._internal(
|
||||
(ref) => readArchivedChat(
|
||||
ref as ReadArchivedChatRef,
|
||||
fileName,
|
||||
),
|
||||
from: readArchivedChatProvider,
|
||||
name: r'readArchivedChatProvider',
|
||||
debugGetCreateSourceHash:
|
||||
const bool.fromEnvironment('dart.vm.product')
|
||||
? null
|
||||
: _$readArchivedChatHash,
|
||||
dependencies: ReadArchivedChatFamily._dependencies,
|
||||
allTransitiveDependencies:
|
||||
ReadArchivedChatFamily._allTransitiveDependencies,
|
||||
fileName: fileName,
|
||||
);
|
||||
ReadArchivedChatProvider(String fileName)
|
||||
: this._internal(
|
||||
(ref) => readArchivedChat(ref as ReadArchivedChatRef, fileName),
|
||||
from: readArchivedChatProvider,
|
||||
name: r'readArchivedChatProvider',
|
||||
debugGetCreateSourceHash:
|
||||
const bool.fromEnvironment('dart.vm.product')
|
||||
? null
|
||||
: _$readArchivedChatHash,
|
||||
dependencies: ReadArchivedChatFamily._dependencies,
|
||||
allTransitiveDependencies:
|
||||
ReadArchivedChatFamily._allTransitiveDependencies,
|
||||
fileName: fileName,
|
||||
);
|
||||
|
||||
ReadArchivedChatProvider._internal(
|
||||
super._createNotifier, {
|
||||
@@ -150,7 +140,8 @@ mixin ReadArchivedChatRef on AutoDisposeFutureProviderRef<String> {
|
||||
}
|
||||
|
||||
class _ReadArchivedChatProviderElement
|
||||
extends AutoDisposeFutureProviderElement<String> with ReadArchivedChatRef {
|
||||
extends AutoDisposeFutureProviderElement<String>
|
||||
with ReadArchivedChatRef {
|
||||
_ReadArchivedChatProviderElement(super.provider);
|
||||
|
||||
@override
|
||||
@@ -163,12 +154,15 @@ String _$chatArchiveRepositoryHash() =>
|
||||
/// See also [ChatArchiveRepository].
|
||||
@ProviderFor(ChatArchiveRepository)
|
||||
final chatArchiveRepositoryProvider = AutoDisposeStreamNotifierProvider<
|
||||
ChatArchiveRepository, List<ChatEntity>>.internal(
|
||||
ChatArchiveRepository,
|
||||
List<ChatEntity>
|
||||
>.internal(
|
||||
ChatArchiveRepository.new,
|
||||
name: r'chatArchiveRepositoryProvider',
|
||||
debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product')
|
||||
? null
|
||||
: _$chatArchiveRepositoryHash,
|
||||
debugGetCreateSourceHash:
|
||||
const bool.fromEnvironment('dart.vm.product')
|
||||
? null
|
||||
: _$chatArchiveRepositoryHash,
|
||||
dependencies: null,
|
||||
allTransitiveDependencies: null,
|
||||
);
|
||||
|
||||
@@ -74,13 +74,11 @@ class ChatArchiveSearchRepository extends _$ChatArchiveSearchRepository {
|
||||
ellipsis: ellipsis,
|
||||
)
|
||||
.get()
|
||||
.then(
|
||||
(value) {
|
||||
if (!_streamController.isClosed) {
|
||||
_streamController.add(value);
|
||||
}
|
||||
},
|
||||
);
|
||||
.then((value) {
|
||||
if (!_streamController.isClosed) {
|
||||
_streamController.add(value);
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
@@ -96,23 +94,24 @@ class ChatArchiveSearchRepository extends _$ChatArchiveSearchRepository {
|
||||
await searchDatabase.searchDao.indexChats(await _availableChats());
|
||||
_populatedCompleter.complete();
|
||||
|
||||
final changeStreamSubscription =
|
||||
ref.watch(chatArchiveFileServiceProvider).listen((event) async {
|
||||
final chat = ChatEntity.fromFileName(path.basename(event.path));
|
||||
final changeStreamSubscription = ref
|
||||
.watch(chatArchiveFileServiceProvider)
|
||||
.listen((event) async {
|
||||
final chat = ChatEntity.fromFileName(path.basename(event.path));
|
||||
|
||||
switch (event.type) {
|
||||
case ChangeType.ADD:
|
||||
case ChangeType.MODIFY:
|
||||
if (chat.name != null) {
|
||||
final companion = await _readChat(chat);
|
||||
if (companion != null) {
|
||||
await searchDatabase.searchDao.upsertChat(companion);
|
||||
}
|
||||
switch (event.type) {
|
||||
case ChangeType.ADD:
|
||||
case ChangeType.MODIFY:
|
||||
if (chat.name != null) {
|
||||
final companion = await _readChat(chat);
|
||||
if (companion != null) {
|
||||
await searchDatabase.searchDao.upsertChat(companion);
|
||||
}
|
||||
}
|
||||
case ChangeType.REMOVE:
|
||||
await searchDatabase.searchDao.deleteChat(chat.fileName);
|
||||
}
|
||||
case ChangeType.REMOVE:
|
||||
await searchDatabase.searchDao.deleteChat(chat.fileName);
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
ref.onDispose(() async {
|
||||
await changeStreamSubscription.cancel();
|
||||
|
||||
@@ -12,17 +12,20 @@ String _$chatArchiveSearchRepositoryHash() =>
|
||||
/// See also [ChatArchiveSearchRepository].
|
||||
@ProviderFor(ChatArchiveSearchRepository)
|
||||
final chatArchiveSearchRepositoryProvider = AutoDisposeStreamNotifierProvider<
|
||||
ChatArchiveSearchRepository, List<ChatQueryResult>>.internal(
|
||||
ChatArchiveSearchRepository,
|
||||
List<ChatQueryResult>
|
||||
>.internal(
|
||||
ChatArchiveSearchRepository.new,
|
||||
name: r'chatArchiveSearchRepositoryProvider',
|
||||
debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product')
|
||||
? null
|
||||
: _$chatArchiveSearchRepositoryHash,
|
||||
debugGetCreateSourceHash:
|
||||
const bool.fromEnvironment('dart.vm.product')
|
||||
? null
|
||||
: _$chatArchiveSearchRepositoryHash,
|
||||
dependencies: null,
|
||||
allTransitiveDependencies: null,
|
||||
);
|
||||
|
||||
typedef _$ChatArchiveSearchRepository
|
||||
= AutoDisposeStreamNotifier<List<ChatQueryResult>>;
|
||||
typedef _$ChatArchiveSearchRepository =
|
||||
AutoDisposeStreamNotifier<List<ChatQueryResult>>;
|
||||
// ignore_for_file: type=lint
|
||||
// ignore_for_file: subtype_of_sealed_class, invalid_use_of_internal_member, invalid_use_of_visible_for_testing_member, deprecated_member_use_from_same_package
|
||||
|
||||
@@ -62,9 +62,7 @@ class ChatArchiveDetailScreen extends HookConsumerWidget {
|
||||
onPressed: () async {
|
||||
if (chatAsync.valueOrNull != null) {
|
||||
await Clipboard.setData(
|
||||
ClipboardData(
|
||||
text: chatAsync.valueOrNull!,
|
||||
),
|
||||
ClipboardData(text: chatAsync.valueOrNull!),
|
||||
);
|
||||
}
|
||||
},
|
||||
@@ -94,23 +92,24 @@ class ChatArchiveDetailScreen extends HookConsumerWidget {
|
||||
enabled: chatAsync.isLoading,
|
||||
justifyMultiLineText: false,
|
||||
child: chatAsync.when(
|
||||
data: (data) => Markdown(
|
||||
data: data,
|
||||
selectable: true,
|
||||
onTapLink: (text, href, title) async {
|
||||
if (href != null) {
|
||||
if (Uri.parse(href) case final Uri url) {
|
||||
await ref
|
||||
.read(tabRepositoryProvider.notifier)
|
||||
.addTab(url: url);
|
||||
data:
|
||||
(data) => Markdown(
|
||||
data: data,
|
||||
selectable: true,
|
||||
onTapLink: (text, href, title) async {
|
||||
if (href != null) {
|
||||
if (Uri.parse(href) case final Uri url) {
|
||||
await ref
|
||||
.read(tabRepositoryProvider.notifier)
|
||||
.addTab(url: url);
|
||||
|
||||
if (context.mounted) {
|
||||
context.go(BrowserRoute().location);
|
||||
if (context.mounted) {
|
||||
context.go(BrowserRoute().location);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
),
|
||||
},
|
||||
),
|
||||
error: (error, stackTrace) {
|
||||
return FailureWidget(
|
||||
title: 'Could not load chat',
|
||||
@@ -118,9 +117,7 @@ class ChatArchiveDetailScreen extends HookConsumerWidget {
|
||||
onRetry: () => ref.refresh(readArchivedChatProvider(fileName)),
|
||||
);
|
||||
},
|
||||
loading: () => const Bone.multiText(
|
||||
lines: 15,
|
||||
),
|
||||
loading: () => const Bone.multiText(lines: 15),
|
||||
),
|
||||
),
|
||||
);
|
||||
|
||||
@@ -48,8 +48,9 @@ class ChatArchiveListScreen extends HookConsumerWidget {
|
||||
),
|
||||
onTap: () async {
|
||||
await context.push(
|
||||
ChatArchiveDetailRoute(fileName: chat.fileName)
|
||||
.location,
|
||||
ChatArchiveDetailRoute(
|
||||
fileName: chat.fileName,
|
||||
).location,
|
||||
);
|
||||
},
|
||||
);
|
||||
@@ -65,13 +66,15 @@ class ChatArchiveListScreen extends HookConsumerWidget {
|
||||
onRetry: () => ref.refresh(chatArchiveRepositoryProvider),
|
||||
);
|
||||
},
|
||||
loading: () => ListView.builder(
|
||||
itemCount: 3,
|
||||
itemBuilder: (context, index) => const ListTile(
|
||||
title: Bone.text(),
|
||||
subtitle: Bone.text(),
|
||||
),
|
||||
),
|
||||
loading:
|
||||
() => ListView.builder(
|
||||
itemCount: 3,
|
||||
itemBuilder:
|
||||
(context, index) => const ListTile(
|
||||
title: Bone.text(),
|
||||
subtitle: Bone.text(),
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
);
|
||||
|
||||
@@ -56,58 +56,58 @@ class ChatArchiveSearchScreen extends HookConsumerWidget {
|
||||
),
|
||||
body: resultsAsync.when(
|
||||
skipLoadingOnReload: true,
|
||||
data: (chats) => FadingScroll(
|
||||
fadingSize: 25,
|
||||
builder: (context, controller) {
|
||||
return ListView.builder(
|
||||
controller: controller,
|
||||
itemCount: chats.length,
|
||||
itemBuilder: (context, index) {
|
||||
final chat = chats[index];
|
||||
final chatEntity = ChatEntity.fromFileName(chat.fileName);
|
||||
data:
|
||||
(chats) => FadingScroll(
|
||||
fadingSize: 25,
|
||||
builder: (context, controller) {
|
||||
return ListView.builder(
|
||||
controller: controller,
|
||||
itemCount: chats.length,
|
||||
itemBuilder: (context, index) {
|
||||
final chat = chats[index];
|
||||
final chatEntity = ChatEntity.fromFileName(chat.fileName);
|
||||
|
||||
return Card(
|
||||
clipBehavior: Clip.antiAlias,
|
||||
child: InkWell(
|
||||
onTap: () async {
|
||||
await context.push(
|
||||
ChatArchiveDetailRoute(fileName: chat.fileName)
|
||||
.location,
|
||||
);
|
||||
},
|
||||
child: Padding(
|
||||
padding: const EdgeInsets.all(16.0),
|
||||
child: Column(
|
||||
mainAxisSize: MainAxisSize.min,
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
MarkdownBody(
|
||||
data: '## ${chat.title}',
|
||||
return Card(
|
||||
clipBehavior: Clip.antiAlias,
|
||||
child: InkWell(
|
||||
onTap: () async {
|
||||
await context.push(
|
||||
ChatArchiveDetailRoute(
|
||||
fileName: chat.fileName,
|
||||
).location,
|
||||
);
|
||||
},
|
||||
child: Padding(
|
||||
padding: const EdgeInsets.all(16.0),
|
||||
child: Column(
|
||||
mainAxisSize: MainAxisSize.min,
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
MarkdownBody(data: '## ${chat.title}'),
|
||||
if (chatEntity.dateTime != null)
|
||||
Text(
|
||||
chatEntity.dateTime!
|
||||
.formatWithMinutePrecision(),
|
||||
),
|
||||
const SizedBox(height: 8.0),
|
||||
if (chat.contentSnippet != null)
|
||||
MarkdownBody(data: chat.contentSnippet!),
|
||||
],
|
||||
),
|
||||
if (chatEntity.dateTime != null)
|
||||
Text(
|
||||
chatEntity.dateTime!.formatWithMinutePrecision(),
|
||||
),
|
||||
const SizedBox(height: 8.0),
|
||||
if (chat.contentSnippet != null)
|
||||
MarkdownBody(
|
||||
data: chat.contentSnippet!,
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
);
|
||||
},
|
||||
);
|
||||
},
|
||||
);
|
||||
},
|
||||
),
|
||||
error: (error, stackTrace) => Center(
|
||||
child: FailureWidget(
|
||||
title: 'Chat Search failed',
|
||||
exception: error,
|
||||
),
|
||||
),
|
||||
),
|
||||
error:
|
||||
(error, stackTrace) => Center(
|
||||
child: FailureWidget(
|
||||
title: 'Chat Search failed',
|
||||
exception: error,
|
||||
),
|
||||
),
|
||||
loading: () => const SizedBox.shrink(),
|
||||
),
|
||||
);
|
||||
|
||||
@@ -42,7 +42,8 @@ class BottomSheetExtend extends _$BottomSheetExtend {
|
||||
await _extentStreamController.close();
|
||||
});
|
||||
|
||||
return _extentStreamController.stream
|
||||
.sampleTime(const Duration(milliseconds: 50));
|
||||
return _extentStreamController.stream.sampleTime(
|
||||
const Duration(milliseconds: 50),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -13,14 +13,15 @@ String _$bottomSheetControllerHash() =>
|
||||
@ProviderFor(BottomSheetController)
|
||||
final bottomSheetControllerProvider =
|
||||
AutoDisposeNotifierProvider<BottomSheetController, Sheet?>.internal(
|
||||
BottomSheetController.new,
|
||||
name: r'bottomSheetControllerProvider',
|
||||
debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product')
|
||||
? null
|
||||
: _$bottomSheetControllerHash,
|
||||
dependencies: null,
|
||||
allTransitiveDependencies: null,
|
||||
);
|
||||
BottomSheetController.new,
|
||||
name: r'bottomSheetControllerProvider',
|
||||
debugGetCreateSourceHash:
|
||||
const bool.fromEnvironment('dart.vm.product')
|
||||
? null
|
||||
: _$bottomSheetControllerHash,
|
||||
dependencies: null,
|
||||
allTransitiveDependencies: null,
|
||||
);
|
||||
|
||||
typedef _$BottomSheetController = AutoDisposeNotifier<Sheet?>;
|
||||
String _$bottomSheetExtendHash() => r'7e11b9047c15bdeb4dfcb488a8573daadb64e25c';
|
||||
@@ -29,14 +30,15 @@ String _$bottomSheetExtendHash() => r'7e11b9047c15bdeb4dfcb488a8573daadb64e25c';
|
||||
@ProviderFor(BottomSheetExtend)
|
||||
final bottomSheetExtendProvider =
|
||||
StreamNotifierProvider<BottomSheetExtend, double>.internal(
|
||||
BottomSheetExtend.new,
|
||||
name: r'bottomSheetExtendProvider',
|
||||
debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product')
|
||||
? null
|
||||
: _$bottomSheetExtendHash,
|
||||
dependencies: null,
|
||||
allTransitiveDependencies: null,
|
||||
);
|
||||
BottomSheetExtend.new,
|
||||
name: r'bottomSheetExtendProvider',
|
||||
debugGetCreateSourceHash:
|
||||
const bool.fromEnvironment('dart.vm.product')
|
||||
? null
|
||||
: _$bottomSheetExtendHash,
|
||||
dependencies: null,
|
||||
allTransitiveDependencies: null,
|
||||
);
|
||||
|
||||
typedef _$BottomSheetExtend = StreamNotifier<double>;
|
||||
// ignore_for_file: type=lint
|
||||
|
||||
@@ -13,14 +13,15 @@ String _$overlayDialogControllerHash() =>
|
||||
@ProviderFor(OverlayDialogController)
|
||||
final overlayDialogControllerProvider =
|
||||
AutoDisposeNotifierProvider<OverlayDialogController, Widget?>.internal(
|
||||
OverlayDialogController.new,
|
||||
name: r'overlayDialogControllerProvider',
|
||||
debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product')
|
||||
? null
|
||||
: _$overlayDialogControllerHash,
|
||||
dependencies: null,
|
||||
allTransitiveDependencies: null,
|
||||
);
|
||||
OverlayDialogController.new,
|
||||
name: r'overlayDialogControllerProvider',
|
||||
debugGetCreateSourceHash:
|
||||
const bool.fromEnvironment('dart.vm.product')
|
||||
? null
|
||||
: _$overlayDialogControllerHash,
|
||||
dependencies: null,
|
||||
allTransitiveDependencies: null,
|
||||
);
|
||||
|
||||
typedef _$OverlayDialogController = AutoDisposeNotifier<Widget?>;
|
||||
// ignore_for_file: type=lint
|
||||
|
||||
@@ -18,8 +18,9 @@ class BrowserIcon with FastEquatable {
|
||||
required Color? dominantColor,
|
||||
required IconSource source,
|
||||
}) async {
|
||||
final image =
|
||||
await tryDecodeImage(bytes).then((image) => image!.toEquatable());
|
||||
final image = await tryDecodeImage(
|
||||
bytes,
|
||||
).then((image) => image!.toEquatable());
|
||||
|
||||
return BrowserIcon(
|
||||
image: image,
|
||||
@@ -38,9 +39,5 @@ class BrowserIcon with FastEquatable {
|
||||
bool get cacheHash => true;
|
||||
|
||||
@override
|
||||
List<Object?> get hashParameters => [
|
||||
image,
|
||||
dominantColor,
|
||||
source,
|
||||
];
|
||||
List<Object?> get hashParameters => [image, dominantColor, source];
|
||||
}
|
||||
|
||||
@@ -12,17 +12,17 @@ class FindResultState with FastEquatable {
|
||||
});
|
||||
|
||||
factory FindResultState.$default() => FindResultState(
|
||||
activeMatchOrdinal: -1,
|
||||
numberOfMatches: 0,
|
||||
isDoneCounting: false,
|
||||
);
|
||||
activeMatchOrdinal: -1,
|
||||
numberOfMatches: 0,
|
||||
isDoneCounting: false,
|
||||
);
|
||||
|
||||
@override
|
||||
List<Object?> get hashParameters => [
|
||||
activeMatchOrdinal,
|
||||
numberOfMatches,
|
||||
isDoneCounting,
|
||||
];
|
||||
activeMatchOrdinal,
|
||||
numberOfMatches,
|
||||
isDoneCounting,
|
||||
];
|
||||
|
||||
@override
|
||||
bool get cacheHash => true;
|
||||
|
||||
@@ -28,16 +28,20 @@ class HistoryState with FastEquatable {
|
||||
});
|
||||
|
||||
factory HistoryState.$default() => HistoryState(
|
||||
items: const [],
|
||||
currentIndex: 0,
|
||||
canGoBack: false,
|
||||
canGoForward: false,
|
||||
);
|
||||
items: const [],
|
||||
currentIndex: 0,
|
||||
canGoBack: false,
|
||||
canGoForward: false,
|
||||
);
|
||||
|
||||
@override
|
||||
bool get cacheHash => true;
|
||||
|
||||
@override
|
||||
List<Object?> get hashParameters =>
|
||||
[items, currentIndex, canGoBack, canGoForward];
|
||||
List<Object?> get hashParameters => [
|
||||
items,
|
||||
currentIndex,
|
||||
canGoBack,
|
||||
canGoForward,
|
||||
];
|
||||
}
|
||||
|
||||
@@ -5,15 +5,10 @@ class ReaderableState with FastEquatable {
|
||||
|
||||
final bool active;
|
||||
|
||||
ReaderableState({
|
||||
required this.readerable,
|
||||
required this.active,
|
||||
});
|
||||
ReaderableState({required this.readerable, required this.active});
|
||||
|
||||
factory ReaderableState.$default() => ReaderableState(
|
||||
readerable: false,
|
||||
active: false,
|
||||
);
|
||||
factory ReaderableState.$default() =>
|
||||
ReaderableState(readerable: false, active: false);
|
||||
|
||||
@override
|
||||
bool get cacheHash => true;
|
||||
|
||||
@@ -11,11 +11,8 @@ class SecurityState with FastEquatable {
|
||||
required this.issuer,
|
||||
});
|
||||
|
||||
factory SecurityState.$default() => SecurityState(
|
||||
secure: false,
|
||||
host: "",
|
||||
issuer: "",
|
||||
);
|
||||
factory SecurityState.$default() =>
|
||||
SecurityState(secure: false, host: "", issuer: "");
|
||||
|
||||
@override
|
||||
bool get cacheHash => true;
|
||||
|
||||
@@ -26,12 +26,12 @@ class TabState extends WebPageInfo with FastEquatable {
|
||||
|
||||
@override
|
||||
BrowserIcon? get favicon => icon.mapNotNull(
|
||||
(icon) => BrowserIcon(
|
||||
image: icon,
|
||||
dominantColor: null,
|
||||
source: IconSource.memory,
|
||||
),
|
||||
);
|
||||
(icon) => BrowserIcon(
|
||||
image: icon,
|
||||
dominantColor: null,
|
||||
source: IconSource.memory,
|
||||
),
|
||||
);
|
||||
|
||||
final EquatableImage? thumbnail;
|
||||
|
||||
@@ -64,40 +64,40 @@ class TabState extends WebPageInfo with FastEquatable {
|
||||
}) : super(title: title);
|
||||
|
||||
factory TabState.$default(String tabId) => TabState(
|
||||
id: tabId,
|
||||
contextId: null,
|
||||
url: Uri.parse('about:blank'),
|
||||
title: "",
|
||||
icon: null,
|
||||
thumbnail: null,
|
||||
progress: 0,
|
||||
isPrivate: false,
|
||||
isFullScreen: false,
|
||||
isLoading: false,
|
||||
securityInfoState: SecurityState.$default(),
|
||||
historyState: HistoryState.$default(),
|
||||
readerableState: ReaderableState.$default(),
|
||||
findResultState: FindResultState.$default(),
|
||||
);
|
||||
id: tabId,
|
||||
contextId: null,
|
||||
url: Uri.parse('about:blank'),
|
||||
title: "",
|
||||
icon: null,
|
||||
thumbnail: null,
|
||||
progress: 0,
|
||||
isPrivate: false,
|
||||
isFullScreen: false,
|
||||
isLoading: false,
|
||||
securityInfoState: SecurityState.$default(),
|
||||
historyState: HistoryState.$default(),
|
||||
readerableState: ReaderableState.$default(),
|
||||
findResultState: FindResultState.$default(),
|
||||
);
|
||||
|
||||
@override
|
||||
bool get cacheHash => true;
|
||||
|
||||
@override
|
||||
List<Object?> get hashParameters => [
|
||||
id,
|
||||
contextId,
|
||||
url,
|
||||
title,
|
||||
icon,
|
||||
thumbnail,
|
||||
progress,
|
||||
isPrivate,
|
||||
isFullScreen,
|
||||
isLoading,
|
||||
securityInfoState,
|
||||
historyState,
|
||||
readerableState,
|
||||
findResultState,
|
||||
];
|
||||
id,
|
||||
contextId,
|
||||
url,
|
||||
title,
|
||||
icon,
|
||||
thumbnail,
|
||||
progress,
|
||||
isPrivate,
|
||||
isFullScreen,
|
||||
isLoading,
|
||||
securityInfoState,
|
||||
historyState,
|
||||
readerableState,
|
||||
findResultState,
|
||||
];
|
||||
}
|
||||
|
||||
@@ -106,7 +106,6 @@ class _$TabStateCWProxyImpl implements _$TabStateCWProxy {
|
||||
this(findResultState: findResultState);
|
||||
|
||||
@override
|
||||
|
||||
/// This function **does support** nullification of nullable fields. All `null` values passed to `non-nullable` fields will be ignored. You can also use `TabState(...).copyWith.fieldName(...)` to override fields one at a time with nullification support.
|
||||
///
|
||||
/// Usage
|
||||
@@ -130,58 +129,71 @@ class _$TabStateCWProxyImpl implements _$TabStateCWProxy {
|
||||
}) {
|
||||
return TabState(
|
||||
id: _value.id,
|
||||
contextId: contextId == const $CopyWithPlaceholder()
|
||||
? _value.contextId
|
||||
// ignore: cast_nullable_to_non_nullable
|
||||
: contextId as String?,
|
||||
url: url == const $CopyWithPlaceholder()
|
||||
? _value.url
|
||||
// ignore: cast_nullable_to_non_nullable
|
||||
: url as Uri,
|
||||
title: title == const $CopyWithPlaceholder()
|
||||
? _value.title
|
||||
// ignore: cast_nullable_to_non_nullable
|
||||
: title as String,
|
||||
icon: icon == const $CopyWithPlaceholder()
|
||||
? _value.icon
|
||||
// ignore: cast_nullable_to_non_nullable
|
||||
: icon as EquatableImage?,
|
||||
thumbnail: thumbnail == const $CopyWithPlaceholder()
|
||||
? _value.thumbnail
|
||||
// ignore: cast_nullable_to_non_nullable
|
||||
: thumbnail as EquatableImage?,
|
||||
progress: progress == const $CopyWithPlaceholder()
|
||||
? _value.progress
|
||||
// ignore: cast_nullable_to_non_nullable
|
||||
: progress as int,
|
||||
isPrivate: isPrivate == const $CopyWithPlaceholder()
|
||||
? _value.isPrivate
|
||||
// ignore: cast_nullable_to_non_nullable
|
||||
: isPrivate as bool,
|
||||
isFullScreen: isFullScreen == const $CopyWithPlaceholder()
|
||||
? _value.isFullScreen
|
||||
// ignore: cast_nullable_to_non_nullable
|
||||
: isFullScreen as bool,
|
||||
isLoading: isLoading == const $CopyWithPlaceholder()
|
||||
? _value.isLoading
|
||||
// ignore: cast_nullable_to_non_nullable
|
||||
: isLoading as bool,
|
||||
securityInfoState: securityInfoState == const $CopyWithPlaceholder()
|
||||
? _value.securityInfoState
|
||||
// ignore: cast_nullable_to_non_nullable
|
||||
: securityInfoState as SecurityState,
|
||||
historyState: historyState == const $CopyWithPlaceholder()
|
||||
? _value.historyState
|
||||
// ignore: cast_nullable_to_non_nullable
|
||||
: historyState as HistoryState,
|
||||
readerableState: readerableState == const $CopyWithPlaceholder()
|
||||
? _value.readerableState
|
||||
// ignore: cast_nullable_to_non_nullable
|
||||
: readerableState as ReaderableState,
|
||||
findResultState: findResultState == const $CopyWithPlaceholder()
|
||||
? _value.findResultState
|
||||
// ignore: cast_nullable_to_non_nullable
|
||||
: findResultState as FindResultState,
|
||||
contextId:
|
||||
contextId == const $CopyWithPlaceholder()
|
||||
? _value.contextId
|
||||
// ignore: cast_nullable_to_non_nullable
|
||||
: contextId as String?,
|
||||
url:
|
||||
url == const $CopyWithPlaceholder()
|
||||
? _value.url
|
||||
// ignore: cast_nullable_to_non_nullable
|
||||
: url as Uri,
|
||||
title:
|
||||
title == const $CopyWithPlaceholder()
|
||||
? _value.title
|
||||
// ignore: cast_nullable_to_non_nullable
|
||||
: title as String,
|
||||
icon:
|
||||
icon == const $CopyWithPlaceholder()
|
||||
? _value.icon
|
||||
// ignore: cast_nullable_to_non_nullable
|
||||
: icon as EquatableImage?,
|
||||
thumbnail:
|
||||
thumbnail == const $CopyWithPlaceholder()
|
||||
? _value.thumbnail
|
||||
// ignore: cast_nullable_to_non_nullable
|
||||
: thumbnail as EquatableImage?,
|
||||
progress:
|
||||
progress == const $CopyWithPlaceholder()
|
||||
? _value.progress
|
||||
// ignore: cast_nullable_to_non_nullable
|
||||
: progress as int,
|
||||
isPrivate:
|
||||
isPrivate == const $CopyWithPlaceholder()
|
||||
? _value.isPrivate
|
||||
// ignore: cast_nullable_to_non_nullable
|
||||
: isPrivate as bool,
|
||||
isFullScreen:
|
||||
isFullScreen == const $CopyWithPlaceholder()
|
||||
? _value.isFullScreen
|
||||
// ignore: cast_nullable_to_non_nullable
|
||||
: isFullScreen as bool,
|
||||
isLoading:
|
||||
isLoading == const $CopyWithPlaceholder()
|
||||
? _value.isLoading
|
||||
// ignore: cast_nullable_to_non_nullable
|
||||
: isLoading as bool,
|
||||
securityInfoState:
|
||||
securityInfoState == const $CopyWithPlaceholder()
|
||||
? _value.securityInfoState
|
||||
// ignore: cast_nullable_to_non_nullable
|
||||
: securityInfoState as SecurityState,
|
||||
historyState:
|
||||
historyState == const $CopyWithPlaceholder()
|
||||
? _value.historyState
|
||||
// ignore: cast_nullable_to_non_nullable
|
||||
: historyState as HistoryState,
|
||||
readerableState:
|
||||
readerableState == const $CopyWithPlaceholder()
|
||||
? _value.readerableState
|
||||
// ignore: cast_nullable_to_non_nullable
|
||||
: readerableState as ReaderableState,
|
||||
findResultState:
|
||||
findResultState == const $CopyWithPlaceholder()
|
||||
? _value.findResultState
|
||||
// ignore: cast_nullable_to_non_nullable
|
||||
: findResultState as FindResultState,
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -33,12 +33,12 @@ class WebExtensionState with FastEquatable {
|
||||
|
||||
@override
|
||||
List<Object?> get hashParameters => [
|
||||
extensionId,
|
||||
title,
|
||||
enabled,
|
||||
badgeText,
|
||||
badgeTextColor,
|
||||
badgeBackgroundColor,
|
||||
icon,
|
||||
];
|
||||
extensionId,
|
||||
title,
|
||||
enabled,
|
||||
badgeText,
|
||||
badgeTextColor,
|
||||
badgeBackgroundColor,
|
||||
icon,
|
||||
];
|
||||
}
|
||||
|
||||
@@ -69,7 +69,6 @@ class _$WebExtensionStateCWProxyImpl implements _$WebExtensionStateCWProxy {
|
||||
WebExtensionState icon(EquatableImage? icon) => this(icon: icon);
|
||||
|
||||
@override
|
||||
|
||||
/// This function **does support** nullification of nullable fields. All `null` values passed to `non-nullable` fields will be ignored. You can also use `WebExtensionState(...).copyWith.fieldName(...)` to override fields one at a time with nullification support.
|
||||
///
|
||||
/// Usage
|
||||
@@ -86,34 +85,41 @@ class _$WebExtensionStateCWProxyImpl implements _$WebExtensionStateCWProxy {
|
||||
Object? icon = const $CopyWithPlaceholder(),
|
||||
}) {
|
||||
return WebExtensionState(
|
||||
extensionId: extensionId == const $CopyWithPlaceholder()
|
||||
? _value.extensionId
|
||||
// ignore: cast_nullable_to_non_nullable
|
||||
: extensionId as String,
|
||||
enabled: enabled == const $CopyWithPlaceholder()
|
||||
? _value.enabled
|
||||
// ignore: cast_nullable_to_non_nullable
|
||||
: enabled as bool,
|
||||
title: title == const $CopyWithPlaceholder()
|
||||
? _value.title
|
||||
// ignore: cast_nullable_to_non_nullable
|
||||
: title as String?,
|
||||
badgeText: badgeText == const $CopyWithPlaceholder()
|
||||
? _value.badgeText
|
||||
// ignore: cast_nullable_to_non_nullable
|
||||
: badgeText as String?,
|
||||
badgeTextColor: badgeTextColor == const $CopyWithPlaceholder()
|
||||
? _value.badgeTextColor
|
||||
// ignore: cast_nullable_to_non_nullable
|
||||
: badgeTextColor as Color?,
|
||||
badgeBackgroundColor: badgeBackgroundColor == const $CopyWithPlaceholder()
|
||||
? _value.badgeBackgroundColor
|
||||
// ignore: cast_nullable_to_non_nullable
|
||||
: badgeBackgroundColor as Color?,
|
||||
icon: icon == const $CopyWithPlaceholder()
|
||||
? _value.icon
|
||||
// ignore: cast_nullable_to_non_nullable
|
||||
: icon as EquatableImage?,
|
||||
extensionId:
|
||||
extensionId == const $CopyWithPlaceholder()
|
||||
? _value.extensionId
|
||||
// ignore: cast_nullable_to_non_nullable
|
||||
: extensionId as String,
|
||||
enabled:
|
||||
enabled == const $CopyWithPlaceholder()
|
||||
? _value.enabled
|
||||
// ignore: cast_nullable_to_non_nullable
|
||||
: enabled as bool,
|
||||
title:
|
||||
title == const $CopyWithPlaceholder()
|
||||
? _value.title
|
||||
// ignore: cast_nullable_to_non_nullable
|
||||
: title as String?,
|
||||
badgeText:
|
||||
badgeText == const $CopyWithPlaceholder()
|
||||
? _value.badgeText
|
||||
// ignore: cast_nullable_to_non_nullable
|
||||
: badgeText as String?,
|
||||
badgeTextColor:
|
||||
badgeTextColor == const $CopyWithPlaceholder()
|
||||
? _value.badgeTextColor
|
||||
// ignore: cast_nullable_to_non_nullable
|
||||
: badgeTextColor as Color?,
|
||||
badgeBackgroundColor:
|
||||
badgeBackgroundColor == const $CopyWithPlaceholder()
|
||||
? _value.badgeBackgroundColor
|
||||
// ignore: cast_nullable_to_non_nullable
|
||||
: badgeBackgroundColor as Color?,
|
||||
icon:
|
||||
icon == const $CopyWithPlaceholder()
|
||||
? _value.icon
|
||||
// ignore: cast_nullable_to_non_nullable
|
||||
: icon as EquatableImage?,
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -13,16 +13,15 @@ import 'package:url_launcher/url_launcher.dart';
|
||||
part 'providers.g.dart';
|
||||
|
||||
@Riverpod(keepAlive: true)
|
||||
GeckoSelectionActionService selectionActionService(
|
||||
Ref ref,
|
||||
) {
|
||||
GeckoSelectionActionService selectionActionService(Ref ref) {
|
||||
final service = GeckoSelectionActionService.setUp();
|
||||
|
||||
unawaited(
|
||||
service.setActions([
|
||||
SearchAction((text) async {
|
||||
final defaultSearchBang =
|
||||
await ref.read(defaultSearchBangDataProvider.future);
|
||||
final defaultSearchBang = await ref.read(
|
||||
defaultSearchBangDataProvider.future,
|
||||
);
|
||||
|
||||
if (defaultSearchBang != null) {
|
||||
await ref
|
||||
@@ -33,14 +32,14 @@ GeckoSelectionActionService selectionActionService(
|
||||
}
|
||||
}),
|
||||
PrivateSearchAction((text) async {
|
||||
final defaultSearchBang =
|
||||
await ref.read(defaultSearchBangDataProvider.future);
|
||||
final defaultSearchBang = await ref.read(
|
||||
defaultSearchBangDataProvider.future,
|
||||
);
|
||||
|
||||
if (defaultSearchBang != null) {
|
||||
await ref.read(tabRepositoryProvider.notifier).addTab(
|
||||
url: defaultSearchBang.getUrl(text),
|
||||
private: true,
|
||||
);
|
||||
await ref
|
||||
.read(tabRepositoryProvider.notifier)
|
||||
.addTab(url: defaultSearchBang.getUrl(text), private: true);
|
||||
} else {
|
||||
logger.e('No default search bang found');
|
||||
}
|
||||
@@ -132,12 +131,13 @@ class EngineReadyState extends _$EngineReadyState {
|
||||
eventService.engineReadyStateEvents
|
||||
.firstWhere((value) => value == true)
|
||||
.timeout(
|
||||
const Duration(seconds: 5),
|
||||
onTimeout: () {
|
||||
logger.w('Waiting for engine ready state timed out');
|
||||
return true;
|
||||
},
|
||||
).whenComplete(() => state = true),
|
||||
const Duration(seconds: 5),
|
||||
onTimeout: () {
|
||||
logger.w('Waiting for engine ready state timed out');
|
||||
return true;
|
||||
},
|
||||
)
|
||||
.whenComplete(() => state = true),
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
@@ -13,14 +13,15 @@ String _$selectionActionServiceHash() =>
|
||||
@ProviderFor(selectionActionService)
|
||||
final selectionActionServiceProvider =
|
||||
Provider<GeckoSelectionActionService>.internal(
|
||||
selectionActionService,
|
||||
name: r'selectionActionServiceProvider',
|
||||
debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product')
|
||||
? null
|
||||
: _$selectionActionServiceHash,
|
||||
dependencies: null,
|
||||
allTransitiveDependencies: null,
|
||||
);
|
||||
selectionActionService,
|
||||
name: r'selectionActionServiceProvider',
|
||||
debugGetCreateSourceHash:
|
||||
const bool.fromEnvironment('dart.vm.product')
|
||||
? null
|
||||
: _$selectionActionServiceHash,
|
||||
dependencies: null,
|
||||
allTransitiveDependencies: null,
|
||||
);
|
||||
|
||||
@Deprecated('Will be removed in 3.0. Use Ref instead')
|
||||
// ignore: unused_element
|
||||
@@ -64,9 +65,10 @@ String _$tabContentServiceHash() => r'd9a991add907ecc138c62790883e59d8e9aa9266';
|
||||
final tabContentServiceProvider = Provider<GeckoTabContentService>.internal(
|
||||
tabContentService,
|
||||
name: r'tabContentServiceProvider',
|
||||
debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product')
|
||||
? null
|
||||
: _$tabContentServiceHash,
|
||||
debugGetCreateSourceHash:
|
||||
const bool.fromEnvironment('dart.vm.product')
|
||||
? null
|
||||
: _$tabContentServiceHash,
|
||||
dependencies: null,
|
||||
allTransitiveDependencies: null,
|
||||
);
|
||||
@@ -81,14 +83,15 @@ String _$engineSuggestionsServiceHash() =>
|
||||
@ProviderFor(engineSuggestionsService)
|
||||
final engineSuggestionsServiceProvider =
|
||||
Provider<GeckoSuggestionsService>.internal(
|
||||
engineSuggestionsService,
|
||||
name: r'engineSuggestionsServiceProvider',
|
||||
debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product')
|
||||
? null
|
||||
: _$engineSuggestionsServiceHash,
|
||||
dependencies: null,
|
||||
allTransitiveDependencies: null,
|
||||
);
|
||||
engineSuggestionsService,
|
||||
name: r'engineSuggestionsServiceProvider',
|
||||
debugGetCreateSourceHash:
|
||||
const bool.fromEnvironment('dart.vm.product')
|
||||
? null
|
||||
: _$engineSuggestionsServiceHash,
|
||||
dependencies: null,
|
||||
allTransitiveDependencies: null,
|
||||
);
|
||||
|
||||
@Deprecated('Will be removed in 3.0. Use Ref instead')
|
||||
// ignore: unused_element
|
||||
@@ -100,14 +103,15 @@ String _$selectedTabSessionNotifierHash() =>
|
||||
@ProviderFor(selectedTabSessionNotifier)
|
||||
final selectedTabSessionNotifierProvider =
|
||||
AutoDisposeProvider<Raw<TabSession>>.internal(
|
||||
selectedTabSessionNotifier,
|
||||
name: r'selectedTabSessionNotifierProvider',
|
||||
debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product')
|
||||
? null
|
||||
: _$selectedTabSessionNotifierHash,
|
||||
dependencies: null,
|
||||
allTransitiveDependencies: null,
|
||||
);
|
||||
selectedTabSessionNotifier,
|
||||
name: r'selectedTabSessionNotifierProvider',
|
||||
debugGetCreateSourceHash:
|
||||
const bool.fromEnvironment('dart.vm.product')
|
||||
? null
|
||||
: _$selectedTabSessionNotifierHash,
|
||||
dependencies: null,
|
||||
allTransitiveDependencies: null,
|
||||
);
|
||||
|
||||
@Deprecated('Will be removed in 3.0. Use Ref instead')
|
||||
// ignore: unused_element
|
||||
@@ -118,14 +122,15 @@ String _$engineReadyStateHash() => r'c682333e2e07cf0635aa7ae793a2088ca648c950';
|
||||
@ProviderFor(EngineReadyState)
|
||||
final engineReadyStateProvider =
|
||||
NotifierProvider<EngineReadyState, bool>.internal(
|
||||
EngineReadyState.new,
|
||||
name: r'engineReadyStateProvider',
|
||||
debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product')
|
||||
? null
|
||||
: _$engineReadyStateHash,
|
||||
dependencies: null,
|
||||
allTransitiveDependencies: null,
|
||||
);
|
||||
EngineReadyState.new,
|
||||
name: r'engineReadyStateProvider',
|
||||
debugGetCreateSourceHash:
|
||||
const bool.fromEnvironment('dart.vm.product')
|
||||
? null
|
||||
: _$engineReadyStateHash,
|
||||
dependencies: null,
|
||||
allTransitiveDependencies: null,
|
||||
);
|
||||
|
||||
typedef _$EngineReadyState = Notifier<bool>;
|
||||
// ignore_for_file: type=lint
|
||||
|
||||
@@ -12,21 +12,18 @@ class SelectedTab extends _$SelectedTab {
|
||||
String? build() {
|
||||
final eventSerivce = ref.watch(eventServiceProvider);
|
||||
|
||||
ref.listen(
|
||||
fireImmediately: true,
|
||||
engineReadyStateProvider,
|
||||
(previous, next) async {
|
||||
if (next) {
|
||||
await GeckoTabService().syncEvents(onSelectedTabChange: true);
|
||||
}
|
||||
},
|
||||
);
|
||||
ref.listen(fireImmediately: true, engineReadyStateProvider, (
|
||||
previous,
|
||||
next,
|
||||
) async {
|
||||
if (next) {
|
||||
await GeckoTabService().syncEvents(onSelectedTabChange: true);
|
||||
}
|
||||
});
|
||||
|
||||
final selectedTabSub = eventSerivce.selectedTabEvents.listen(
|
||||
(tabId) async {
|
||||
state = tabId;
|
||||
},
|
||||
);
|
||||
final selectedTabSub = eventSerivce.selectedTabEvents.listen((tabId) async {
|
||||
state = tabId;
|
||||
});
|
||||
|
||||
ref.onDispose(() {
|
||||
unawaited(selectedTabSub.cancel());
|
||||
|
||||
@@ -13,23 +13,20 @@ class TabList extends _$TabList {
|
||||
List<String> build() {
|
||||
final eventService = ref.watch(eventServiceProvider);
|
||||
|
||||
ref.listen(
|
||||
fireImmediately: true,
|
||||
engineReadyStateProvider,
|
||||
(previous, next) async {
|
||||
if (next) {
|
||||
await GeckoTabService().syncEvents(onTabListChange: true);
|
||||
}
|
||||
},
|
||||
);
|
||||
ref.listen(fireImmediately: true, engineReadyStateProvider, (
|
||||
previous,
|
||||
next,
|
||||
) async {
|
||||
if (next) {
|
||||
await GeckoTabService().syncEvents(onTabListChange: true);
|
||||
}
|
||||
});
|
||||
|
||||
final tabListSub = eventService.tabListEvents.listen(
|
||||
(tabs) async {
|
||||
if (!const DeepCollectionEquality().equals(state, tabs)) {
|
||||
state = tabs;
|
||||
}
|
||||
},
|
||||
);
|
||||
final tabListSub = eventService.tabListEvents.listen((tabs) async {
|
||||
if (!const DeepCollectionEquality().equals(state, tabs)) {
|
||||
state = tabs;
|
||||
}
|
||||
});
|
||||
|
||||
ref.onDispose(() {
|
||||
unawaited(tabListSub.cancel());
|
||||
|
||||
@@ -43,8 +43,9 @@ class TabSession extends _$TabSession {
|
||||
|
||||
@override
|
||||
void build({required String? tabId}) {
|
||||
_sessionService = (tabId != null)
|
||||
? GeckoSessionService(tabId: tabId)
|
||||
: GeckoSessionService.forActiveTab();
|
||||
_sessionService =
|
||||
(tabId != null)
|
||||
? GeckoSessionService(tabId: tabId)
|
||||
: GeckoSessionService.forActiveTab();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -32,9 +32,7 @@ class _SystemHash {
|
||||
abstract class _$TabSession extends BuildlessAutoDisposeNotifier<void> {
|
||||
late final String? tabId;
|
||||
|
||||
void build({
|
||||
required String? tabId,
|
||||
});
|
||||
void build({required String? tabId});
|
||||
}
|
||||
|
||||
/// See also [TabSession].
|
||||
@@ -47,21 +45,15 @@ class TabSessionFamily extends Family<void> {
|
||||
const TabSessionFamily();
|
||||
|
||||
/// See also [TabSession].
|
||||
TabSessionProvider call({
|
||||
required String? tabId,
|
||||
}) {
|
||||
return TabSessionProvider(
|
||||
tabId: tabId,
|
||||
);
|
||||
TabSessionProvider call({required String? tabId}) {
|
||||
return TabSessionProvider(tabId: tabId);
|
||||
}
|
||||
|
||||
@override
|
||||
TabSessionProvider getProviderOverride(
|
||||
covariant TabSessionProvider provider,
|
||||
) {
|
||||
return call(
|
||||
tabId: provider.tabId,
|
||||
);
|
||||
return call(tabId: provider.tabId);
|
||||
}
|
||||
|
||||
static const Iterable<ProviderOrFamily>? _dependencies = null;
|
||||
@@ -83,21 +75,19 @@ class TabSessionFamily extends Family<void> {
|
||||
class TabSessionProvider
|
||||
extends AutoDisposeNotifierProviderImpl<TabSession, void> {
|
||||
/// See also [TabSession].
|
||||
TabSessionProvider({
|
||||
required String? tabId,
|
||||
}) : this._internal(
|
||||
() => TabSession()..tabId = tabId,
|
||||
from: tabSessionProvider,
|
||||
name: r'tabSessionProvider',
|
||||
debugGetCreateSourceHash:
|
||||
const bool.fromEnvironment('dart.vm.product')
|
||||
? null
|
||||
: _$tabSessionHash,
|
||||
dependencies: TabSessionFamily._dependencies,
|
||||
allTransitiveDependencies:
|
||||
TabSessionFamily._allTransitiveDependencies,
|
||||
tabId: tabId,
|
||||
);
|
||||
TabSessionProvider({required String? tabId})
|
||||
: this._internal(
|
||||
() => TabSession()..tabId = tabId,
|
||||
from: tabSessionProvider,
|
||||
name: r'tabSessionProvider',
|
||||
debugGetCreateSourceHash:
|
||||
const bool.fromEnvironment('dart.vm.product')
|
||||
? null
|
||||
: _$tabSessionHash,
|
||||
dependencies: TabSessionFamily._dependencies,
|
||||
allTransitiveDependencies: TabSessionFamily._allTransitiveDependencies,
|
||||
tabId: tabId,
|
||||
);
|
||||
|
||||
TabSessionProvider._internal(
|
||||
super._createNotifier, {
|
||||
@@ -112,12 +102,8 @@ class TabSessionProvider
|
||||
final String? tabId;
|
||||
|
||||
@override
|
||||
void runNotifierBuild(
|
||||
covariant TabSession notifier,
|
||||
) {
|
||||
return notifier.build(
|
||||
tabId: tabId,
|
||||
);
|
||||
void runNotifierBuild(covariant TabSession notifier) {
|
||||
return notifier.build(tabId: tabId);
|
||||
}
|
||||
|
||||
@override
|
||||
@@ -170,5 +156,6 @@ class _TabSessionProviderElement
|
||||
@override
|
||||
String? get tabId => (origin as TabSessionProvider).tabId;
|
||||
}
|
||||
|
||||
// ignore_for_file: type=lint
|
||||
// ignore_for_file: subtype_of_sealed_class, invalid_use_of_internal_member, invalid_use_of_visible_for_testing_member, deprecated_member_use_from_same_package
|
||||
|
||||
@@ -24,12 +24,14 @@ class TabStates extends _$TabStates {
|
||||
void _onTabContentStateChange(TabContentState contentState) {
|
||||
final current =
|
||||
state[contentState.id] ?? TabState.$default(contentState.id);
|
||||
state = {...state}..[contentState.id] = current.copyWith(
|
||||
state = {...state}
|
||||
..[contentState.id] = current.copyWith(
|
||||
contextId: contentState.contextId,
|
||||
url: Uri.parse(contentState.url),
|
||||
title: (contentState.title.isNotEmpty)
|
||||
? contentState.title
|
||||
: current.title,
|
||||
title:
|
||||
(contentState.title.isNotEmpty)
|
||||
? contentState.title
|
||||
: current.title,
|
||||
progress: contentState.progress,
|
||||
isPrivate: contentState.isPrivate,
|
||||
isFullScreen: contentState.isFullScreen,
|
||||
@@ -65,7 +67,8 @@ class TabStates extends _$TabStates {
|
||||
final SecurityInfoEvent(:tabId, :securityInfo) = event;
|
||||
|
||||
final current = state[tabId] ?? TabState.$default(tabId);
|
||||
state = {...state}..[tabId] = current.copyWith.securityInfoState(
|
||||
state = {...state}
|
||||
..[tabId] = current.copyWith.securityInfoState(
|
||||
SecurityState(
|
||||
secure: securityInfo.secure,
|
||||
host: securityInfo.host,
|
||||
@@ -78,14 +81,18 @@ class TabStates extends _$TabStates {
|
||||
final HistoryEvent(:tabId, :history) = event;
|
||||
|
||||
final current = state[tabId] ?? TabState.$default(tabId);
|
||||
state = {...state}..[tabId] = current.copyWith.historyState(
|
||||
state = {...state}
|
||||
..[tabId] = current.copyWith.historyState(
|
||||
HistoryState(
|
||||
items: history.items.nonNulls
|
||||
.map(
|
||||
(item) =>
|
||||
HistoryItem(url: Uri.parse(item.url), title: item.title),
|
||||
)
|
||||
.toList(),
|
||||
items:
|
||||
history.items.nonNulls
|
||||
.map(
|
||||
(item) => HistoryItem(
|
||||
url: Uri.parse(item.url),
|
||||
title: item.title,
|
||||
),
|
||||
)
|
||||
.toList(),
|
||||
currentIndex: history.currentIndex,
|
||||
canGoBack: history.canGoBack,
|
||||
canGoForward: history.canGoForward,
|
||||
@@ -97,7 +104,8 @@ class TabStates extends _$TabStates {
|
||||
final ReaderableEvent(:tabId, :readerable) = event;
|
||||
|
||||
final current = state[tabId] ?? TabState.$default(tabId);
|
||||
state = {...state}..[tabId] = current.copyWith.readerableState(
|
||||
state = {...state}
|
||||
..[tabId] = current.copyWith.readerableState(
|
||||
ReaderableState(
|
||||
readerable: readerable.readerable,
|
||||
active: readerable.active,
|
||||
@@ -112,7 +120,8 @@ class TabStates extends _$TabStates {
|
||||
final result = results.last;
|
||||
|
||||
final current = state[tabId] ?? TabState.$default(tabId);
|
||||
state = {...state}..[tabId] = current.copyWith.findResultState(
|
||||
state = {...state}
|
||||
..[tabId] = current.copyWith.findResultState(
|
||||
FindResultState(
|
||||
activeMatchOrdinal: result.activeMatchOrdinal,
|
||||
numberOfMatches: result.numberOfMatches,
|
||||
@@ -127,59 +136,44 @@ class TabStates extends _$TabStates {
|
||||
final eventService = ref.watch(eventServiceProvider);
|
||||
|
||||
final subscriptions = [
|
||||
eventService.tabContentEvents.listen(
|
||||
(event) async {
|
||||
await _lock.synchronized(() => _onTabContentStateChange(event));
|
||||
},
|
||||
),
|
||||
eventService.iconChangeEvents.listen(
|
||||
(event) async {
|
||||
await _lock.synchronized(() => _onIconChange(event));
|
||||
},
|
||||
),
|
||||
eventService.thumbnailEvents.listen(
|
||||
(event) async {
|
||||
await _lock.synchronized(() => _onThumbnailChange(event));
|
||||
},
|
||||
),
|
||||
eventService.securityInfoEvents.listen(
|
||||
(event) async {
|
||||
await _lock.synchronized(() => _onSecurityInfoStateChange(event));
|
||||
},
|
||||
),
|
||||
eventService.historyEvents.listen(
|
||||
(event) async {
|
||||
await _lock.synchronized(() => _onHistoryStateChange(event));
|
||||
},
|
||||
),
|
||||
eventService.readerableEvents.listen(
|
||||
(event) async {
|
||||
await _lock.synchronized(() => _onReaderableStateChange(event));
|
||||
},
|
||||
),
|
||||
eventService.findResultsEvent.listen(
|
||||
(event) async {
|
||||
await _lock.synchronized(() => _onFindResultsChange(event));
|
||||
},
|
||||
),
|
||||
eventService.tabContentEvents.listen((event) async {
|
||||
await _lock.synchronized(() => _onTabContentStateChange(event));
|
||||
}),
|
||||
eventService.iconChangeEvents.listen((event) async {
|
||||
await _lock.synchronized(() => _onIconChange(event));
|
||||
}),
|
||||
eventService.thumbnailEvents.listen((event) async {
|
||||
await _lock.synchronized(() => _onThumbnailChange(event));
|
||||
}),
|
||||
eventService.securityInfoEvents.listen((event) async {
|
||||
await _lock.synchronized(() => _onSecurityInfoStateChange(event));
|
||||
}),
|
||||
eventService.historyEvents.listen((event) async {
|
||||
await _lock.synchronized(() => _onHistoryStateChange(event));
|
||||
}),
|
||||
eventService.readerableEvents.listen((event) async {
|
||||
await _lock.synchronized(() => _onReaderableStateChange(event));
|
||||
}),
|
||||
eventService.findResultsEvent.listen((event) async {
|
||||
await _lock.synchronized(() => _onFindResultsChange(event));
|
||||
}),
|
||||
];
|
||||
|
||||
ref.listen(
|
||||
fireImmediately: true,
|
||||
engineReadyStateProvider,
|
||||
(previous, next) async {
|
||||
if (next) {
|
||||
await GeckoTabService().syncEvents(
|
||||
onTabContentStateChange: true,
|
||||
onIconChange: true,
|
||||
onThumbnailChange: true,
|
||||
onSecurityInfoStateChange: true,
|
||||
onHistoryStateChange: true,
|
||||
onFindResults: true,
|
||||
);
|
||||
}
|
||||
},
|
||||
);
|
||||
ref.listen(fireImmediately: true, engineReadyStateProvider, (
|
||||
previous,
|
||||
next,
|
||||
) async {
|
||||
if (next) {
|
||||
await GeckoTabService().syncEvents(
|
||||
onTabContentStateChange: true,
|
||||
onIconChange: true,
|
||||
onThumbnailChange: true,
|
||||
onSecurityInfoStateChange: true,
|
||||
onHistoryStateChange: true,
|
||||
onFindResults: true,
|
||||
);
|
||||
}
|
||||
});
|
||||
|
||||
ref.onDispose(() {
|
||||
for (final sub in subscriptions) {
|
||||
@@ -197,9 +191,7 @@ TabState? tabState(Ref ref, String? tabId) {
|
||||
return null;
|
||||
}
|
||||
|
||||
return ref.watch(
|
||||
tabStatesProvider.select((tabs) => tabs[tabId]),
|
||||
);
|
||||
return ref.watch(tabStatesProvider.select((tabs) => tabs[tabId]));
|
||||
}
|
||||
|
||||
@Riverpod()
|
||||
|
||||
@@ -39,21 +39,13 @@ class TabStateFamily extends Family<TabState?> {
|
||||
const TabStateFamily();
|
||||
|
||||
/// See also [tabState].
|
||||
TabStateProvider call(
|
||||
String? tabId,
|
||||
) {
|
||||
return TabStateProvider(
|
||||
tabId,
|
||||
);
|
||||
TabStateProvider call(String? tabId) {
|
||||
return TabStateProvider(tabId);
|
||||
}
|
||||
|
||||
@override
|
||||
TabStateProvider getProviderOverride(
|
||||
covariant TabStateProvider provider,
|
||||
) {
|
||||
return call(
|
||||
provider.tabId,
|
||||
);
|
||||
TabStateProvider getProviderOverride(covariant TabStateProvider provider) {
|
||||
return call(provider.tabId);
|
||||
}
|
||||
|
||||
static const Iterable<ProviderOrFamily>? _dependencies = null;
|
||||
@@ -74,23 +66,19 @@ class TabStateFamily extends Family<TabState?> {
|
||||
/// See also [tabState].
|
||||
class TabStateProvider extends AutoDisposeProvider<TabState?> {
|
||||
/// See also [tabState].
|
||||
TabStateProvider(
|
||||
String? tabId,
|
||||
) : this._internal(
|
||||
(ref) => tabState(
|
||||
ref as TabStateRef,
|
||||
tabId,
|
||||
),
|
||||
from: tabStateProvider,
|
||||
name: r'tabStateProvider',
|
||||
debugGetCreateSourceHash:
|
||||
const bool.fromEnvironment('dart.vm.product')
|
||||
? null
|
||||
: _$tabStateHash,
|
||||
dependencies: TabStateFamily._dependencies,
|
||||
allTransitiveDependencies: TabStateFamily._allTransitiveDependencies,
|
||||
tabId: tabId,
|
||||
);
|
||||
TabStateProvider(String? tabId)
|
||||
: this._internal(
|
||||
(ref) => tabState(ref as TabStateRef, tabId),
|
||||
from: tabStateProvider,
|
||||
name: r'tabStateProvider',
|
||||
debugGetCreateSourceHash:
|
||||
const bool.fromEnvironment('dart.vm.product')
|
||||
? null
|
||||
: _$tabStateHash,
|
||||
dependencies: TabStateFamily._dependencies,
|
||||
allTransitiveDependencies: TabStateFamily._allTransitiveDependencies,
|
||||
tabId: tabId,
|
||||
);
|
||||
|
||||
TabStateProvider._internal(
|
||||
super._createNotifier, {
|
||||
@@ -105,9 +93,7 @@ class TabStateProvider extends AutoDisposeProvider<TabState?> {
|
||||
final String? tabId;
|
||||
|
||||
@override
|
||||
Override overrideWith(
|
||||
TabState? Function(TabStateRef provider) create,
|
||||
) {
|
||||
Override overrideWith(TabState? Function(TabStateRef provider) create) {
|
||||
return ProviderOverride(
|
||||
origin: this,
|
||||
override: TabStateProvider._internal(
|
||||
@@ -163,9 +149,10 @@ String _$selectedTabStateHash() => r'dbd36af7af286bd9d079f30e8e11bbda23bf7728';
|
||||
final selectedTabStateProvider = AutoDisposeProvider<TabState?>.internal(
|
||||
selectedTabState,
|
||||
name: r'selectedTabStateProvider',
|
||||
debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product')
|
||||
? null
|
||||
: _$selectedTabStateHash,
|
||||
debugGetCreateSourceHash:
|
||||
const bool.fromEnvironment('dart.vm.product')
|
||||
? null
|
||||
: _$selectedTabStateHash,
|
||||
dependencies: null,
|
||||
allTransitiveDependencies: null,
|
||||
);
|
||||
@@ -179,13 +166,15 @@ String _$tabStatesHash() => r'296d85ec016b22236b5830fce6b01cda81fbc02d';
|
||||
@ProviderFor(TabStates)
|
||||
final tabStatesProvider =
|
||||
NotifierProvider<TabStates, Map<String, TabState>>.internal(
|
||||
TabStates.new,
|
||||
name: r'tabStatesProvider',
|
||||
debugGetCreateSourceHash:
|
||||
const bool.fromEnvironment('dart.vm.product') ? null : _$tabStatesHash,
|
||||
dependencies: null,
|
||||
allTransitiveDependencies: null,
|
||||
);
|
||||
TabStates.new,
|
||||
name: r'tabStatesProvider',
|
||||
debugGetCreateSourceHash:
|
||||
const bool.fromEnvironment('dart.vm.product')
|
||||
? null
|
||||
: _$tabStatesHash,
|
||||
dependencies: null,
|
||||
allTransitiveDependencies: null,
|
||||
);
|
||||
|
||||
typedef _$TabStates = Notifier<Map<String, TabState>>;
|
||||
// ignore_for_file: type=lint
|
||||
|
||||
@@ -23,21 +23,25 @@ class WebExtensionsState extends _$WebExtensionsState {
|
||||
final ExtensionDataEvent(:extensionId, :data) = event;
|
||||
|
||||
if (data != null) {
|
||||
final current = state[extensionId] ??
|
||||
final current =
|
||||
state[extensionId] ??
|
||||
WebExtensionState(
|
||||
extensionId: extensionId,
|
||||
icon: _imageCache[extensionId],
|
||||
enabled: false,
|
||||
);
|
||||
|
||||
state = {...state}..[extensionId] = current.copyWith(
|
||||
state = {...state}
|
||||
..[extensionId] = current.copyWith(
|
||||
title: data.title,
|
||||
enabled: data.enabled ?? current.enabled,
|
||||
badgeText: data.badgeText,
|
||||
badgeTextColor:
|
||||
data.badgeTextColor.mapNotNull((color) => Color(color)),
|
||||
badgeBackgroundColor:
|
||||
data.badgeBackgroundColor.mapNotNull((color) => Color(color)),
|
||||
badgeTextColor: data.badgeTextColor.mapNotNull(
|
||||
(color) => Color(color),
|
||||
),
|
||||
badgeBackgroundColor: data.badgeBackgroundColor.mapNotNull(
|
||||
(color) => Color(color),
|
||||
),
|
||||
);
|
||||
} else {
|
||||
if (state.containsKey(extensionId)) {
|
||||
@@ -49,16 +53,17 @@ class WebExtensionsState extends _$WebExtensionsState {
|
||||
Future<void> _onIconChange(ExtensionIconEvent event) async {
|
||||
final ExtensionIconEvent(:extensionId, :bytes) = event;
|
||||
|
||||
final image =
|
||||
await tryDecodeImage(bytes).then((image) async => image?.toEquatable());
|
||||
final image = await tryDecodeImage(
|
||||
bytes,
|
||||
).then((image) async => image?.toEquatable());
|
||||
|
||||
if (image != null) {
|
||||
if (_imageCache[extensionId] != image) {
|
||||
_imageCache[extensionId] = image;
|
||||
|
||||
if (state.containsKey(extensionId)) {
|
||||
state = {...state}..[extensionId] =
|
||||
state[extensionId]!.copyWith.icon(image);
|
||||
state = {...state}
|
||||
..[extensionId] = state[extensionId]!.copyWith.icon(image);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -70,29 +75,21 @@ class WebExtensionsState extends _$WebExtensionsState {
|
||||
|
||||
final subscriptions = switch (actionType) {
|
||||
WebExtensionActionType.browser => [
|
||||
addonService.browserExtensionStream.listen(
|
||||
(event) async {
|
||||
await _lock.synchronized(() => _onExtensionUpdate(event));
|
||||
},
|
||||
),
|
||||
addonService.browserIconStream.listen(
|
||||
(event) async {
|
||||
await _lock.synchronized(() => _onIconChange(event));
|
||||
},
|
||||
),
|
||||
],
|
||||
addonService.browserExtensionStream.listen((event) async {
|
||||
await _lock.synchronized(() => _onExtensionUpdate(event));
|
||||
}),
|
||||
addonService.browserIconStream.listen((event) async {
|
||||
await _lock.synchronized(() => _onIconChange(event));
|
||||
}),
|
||||
],
|
||||
WebExtensionActionType.page => [
|
||||
addonService.pageExtensionStream.listen(
|
||||
(event) async {
|
||||
await _lock.synchronized(() => _onExtensionUpdate(event));
|
||||
},
|
||||
),
|
||||
addonService.pageIconStream.listen(
|
||||
(event) async {
|
||||
await _lock.synchronized(() => _onIconChange(event));
|
||||
},
|
||||
),
|
||||
],
|
||||
addonService.pageExtensionStream.listen((event) async {
|
||||
await _lock.synchronized(() => _onExtensionUpdate(event));
|
||||
}),
|
||||
addonService.pageIconStream.listen((event) async {
|
||||
await _lock.synchronized(() => _onIconChange(event));
|
||||
}),
|
||||
],
|
||||
};
|
||||
|
||||
ref.onDispose(() {
|
||||
|
||||
@@ -34,9 +34,7 @@ abstract class _$WebExtensionsState
|
||||
extends BuildlessNotifier<Map<String, WebExtensionState>> {
|
||||
late final WebExtensionActionType actionType;
|
||||
|
||||
Map<String, WebExtensionState> build(
|
||||
WebExtensionActionType actionType,
|
||||
);
|
||||
Map<String, WebExtensionState> build(WebExtensionActionType actionType);
|
||||
}
|
||||
|
||||
/// See also [WebExtensionsState].
|
||||
@@ -49,21 +47,15 @@ class WebExtensionsStateFamily extends Family<Map<String, WebExtensionState>> {
|
||||
const WebExtensionsStateFamily();
|
||||
|
||||
/// See also [WebExtensionsState].
|
||||
WebExtensionsStateProvider call(
|
||||
WebExtensionActionType actionType,
|
||||
) {
|
||||
return WebExtensionsStateProvider(
|
||||
actionType,
|
||||
);
|
||||
WebExtensionsStateProvider call(WebExtensionActionType actionType) {
|
||||
return WebExtensionsStateProvider(actionType);
|
||||
}
|
||||
|
||||
@override
|
||||
WebExtensionsStateProvider getProviderOverride(
|
||||
covariant WebExtensionsStateProvider provider,
|
||||
) {
|
||||
return call(
|
||||
provider.actionType,
|
||||
);
|
||||
return call(provider.actionType);
|
||||
}
|
||||
|
||||
static const Iterable<ProviderOrFamily>? _dependencies = null;
|
||||
@@ -82,24 +74,27 @@ class WebExtensionsStateFamily extends Family<Map<String, WebExtensionState>> {
|
||||
}
|
||||
|
||||
/// See also [WebExtensionsState].
|
||||
class WebExtensionsStateProvider extends NotifierProviderImpl<
|
||||
WebExtensionsState, Map<String, WebExtensionState>> {
|
||||
class WebExtensionsStateProvider
|
||||
extends
|
||||
NotifierProviderImpl<
|
||||
WebExtensionsState,
|
||||
Map<String, WebExtensionState>
|
||||
> {
|
||||
/// See also [WebExtensionsState].
|
||||
WebExtensionsStateProvider(
|
||||
WebExtensionActionType actionType,
|
||||
) : this._internal(
|
||||
() => WebExtensionsState()..actionType = actionType,
|
||||
from: webExtensionsStateProvider,
|
||||
name: r'webExtensionsStateProvider',
|
||||
debugGetCreateSourceHash:
|
||||
const bool.fromEnvironment('dart.vm.product')
|
||||
? null
|
||||
: _$webExtensionsStateHash,
|
||||
dependencies: WebExtensionsStateFamily._dependencies,
|
||||
allTransitiveDependencies:
|
||||
WebExtensionsStateFamily._allTransitiveDependencies,
|
||||
actionType: actionType,
|
||||
);
|
||||
WebExtensionsStateProvider(WebExtensionActionType actionType)
|
||||
: this._internal(
|
||||
() => WebExtensionsState()..actionType = actionType,
|
||||
from: webExtensionsStateProvider,
|
||||
name: r'webExtensionsStateProvider',
|
||||
debugGetCreateSourceHash:
|
||||
const bool.fromEnvironment('dart.vm.product')
|
||||
? null
|
||||
: _$webExtensionsStateHash,
|
||||
dependencies: WebExtensionsStateFamily._dependencies,
|
||||
allTransitiveDependencies:
|
||||
WebExtensionsStateFamily._allTransitiveDependencies,
|
||||
actionType: actionType,
|
||||
);
|
||||
|
||||
WebExtensionsStateProvider._internal(
|
||||
super._createNotifier, {
|
||||
@@ -117,9 +112,7 @@ class WebExtensionsStateProvider extends NotifierProviderImpl<
|
||||
Map<String, WebExtensionState> runNotifierBuild(
|
||||
covariant WebExtensionsState notifier,
|
||||
) {
|
||||
return notifier.build(
|
||||
actionType,
|
||||
);
|
||||
return notifier.build(actionType);
|
||||
}
|
||||
|
||||
@override
|
||||
@@ -140,7 +133,7 @@ class WebExtensionsStateProvider extends NotifierProviderImpl<
|
||||
|
||||
@override
|
||||
NotifierProviderElement<WebExtensionsState, Map<String, WebExtensionState>>
|
||||
createElement() {
|
||||
createElement() {
|
||||
return _WebExtensionsStateProviderElement(this);
|
||||
}
|
||||
|
||||
@@ -167,14 +160,19 @@ mixin WebExtensionsStateRef
|
||||
WebExtensionActionType get actionType;
|
||||
}
|
||||
|
||||
class _WebExtensionsStateProviderElement extends NotifierProviderElement<
|
||||
WebExtensionsState,
|
||||
Map<String, WebExtensionState>> with WebExtensionsStateRef {
|
||||
class _WebExtensionsStateProviderElement
|
||||
extends
|
||||
NotifierProviderElement<
|
||||
WebExtensionsState,
|
||||
Map<String, WebExtensionState>
|
||||
>
|
||||
with WebExtensionsStateRef {
|
||||
_WebExtensionsStateProviderElement(super.provider);
|
||||
|
||||
@override
|
||||
WebExtensionActionType get actionType =>
|
||||
(origin as WebExtensionsStateProvider).actionType;
|
||||
}
|
||||
|
||||
// ignore_for_file: type=lint
|
||||
// ignore_for_file: subtype_of_sealed_class, invalid_use_of_internal_member, invalid_use_of_visible_for_testing_member, deprecated_member_use_from_same_package
|
||||
|
||||
@@ -98,16 +98,17 @@ class TabRepository extends _$TabRepository {
|
||||
|
||||
final db = ref.watch(tabDatabaseProvider);
|
||||
|
||||
final tabAddedSub = eventSerivce.tabAddedStream.listen(
|
||||
(tabId) async {
|
||||
final containerId = ref.read(selectedContainerProvider);
|
||||
await db.tabDao
|
||||
.upsertUnassignedTab(tabId, containerId: Value(containerId));
|
||||
},
|
||||
);
|
||||
final tabAddedSub = eventSerivce.tabAddedStream.listen((tabId) async {
|
||||
final containerId = ref.read(selectedContainerProvider);
|
||||
await db.tabDao.upsertUnassignedTab(
|
||||
tabId,
|
||||
containerId: Value(containerId),
|
||||
);
|
||||
});
|
||||
|
||||
final tabContentSub =
|
||||
tabContentService.tabContentStream.listen((content) async {
|
||||
final tabContentSub = tabContentService.tabContentStream.listen((
|
||||
content,
|
||||
) async {
|
||||
await db.tabDao.updateTabContent(
|
||||
content.tabId,
|
||||
isProbablyReaderable: content.isProbablyReaderable,
|
||||
@@ -118,42 +119,33 @@ class TabRepository extends _$TabRepository {
|
||||
);
|
||||
});
|
||||
|
||||
ref.listen(
|
||||
selectedTabProvider,
|
||||
(previous, tabId) async {
|
||||
if (tabId != null) {
|
||||
await db.tabDao.touchTab(tabId, timestamp: DateTime.now());
|
||||
}
|
||||
},
|
||||
);
|
||||
ref.listen(selectedTabProvider, (previous, tabId) async {
|
||||
if (tabId != null) {
|
||||
await db.tabDao.touchTab(tabId, timestamp: DateTime.now());
|
||||
}
|
||||
});
|
||||
|
||||
ref.listen(
|
||||
tabListProvider,
|
||||
(previous, next) async {
|
||||
//Only sync tabs if there has been a previous value or is not empty
|
||||
final syncTabs = next.isNotEmpty || (previous?.isNotEmpty ?? false);
|
||||
ref.listen(tabListProvider, (previous, next) async {
|
||||
//Only sync tabs if there has been a previous value or is not empty
|
||||
final syncTabs = next.isNotEmpty || (previous?.isNotEmpty ?? false);
|
||||
|
||||
if (syncTabs) {
|
||||
await db.tabDao.syncTabs(retainTabIds: next);
|
||||
}
|
||||
},
|
||||
);
|
||||
if (syncTabs) {
|
||||
await db.tabDao.syncTabs(retainTabIds: next);
|
||||
}
|
||||
});
|
||||
|
||||
ref.listen(
|
||||
tabStatesProvider,
|
||||
(previous, next) async {
|
||||
//Since state changes occure pretty often and our map always contains
|
||||
//the latest state, we cache the value before starting debouncing and
|
||||
//later diff to that, to avoid frequent database writes
|
||||
if (!tabStateDebouncer.isDebouncing) {
|
||||
debounceStartValue = previous;
|
||||
}
|
||||
ref.listen(tabStatesProvider, (previous, next) async {
|
||||
//Since state changes occure pretty often and our map always contains
|
||||
//the latest state, we cache the value before starting debouncing and
|
||||
//later diff to that, to avoid frequent database writes
|
||||
if (!tabStateDebouncer.isDebouncing) {
|
||||
debounceStartValue = previous;
|
||||
}
|
||||
|
||||
tabStateDebouncer.eventOccured(() async {
|
||||
await db.tabDao.updateTabs(debounceStartValue, next);
|
||||
});
|
||||
},
|
||||
);
|
||||
tabStateDebouncer.eventOccured(() async {
|
||||
await db.tabDao.updateTabs(debounceStartValue, next);
|
||||
});
|
||||
});
|
||||
|
||||
ref.onDispose(() {
|
||||
tabStateDebouncer.dispose();
|
||||
|
||||
@@ -13,9 +13,10 @@ String _$tabRepositoryHash() => r'85af29fa18ea5a4a67fbffbb9478c801dafddac2';
|
||||
final tabRepositoryProvider = NotifierProvider<TabRepository, void>.internal(
|
||||
TabRepository.new,
|
||||
name: r'tabRepositoryProvider',
|
||||
debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product')
|
||||
? null
|
||||
: _$tabRepositoryHash,
|
||||
debugGetCreateSourceHash:
|
||||
const bool.fromEnvironment('dart.vm.product')
|
||||
? null
|
||||
: _$tabRepositoryHash,
|
||||
dependencies: null,
|
||||
allTransitiveDependencies: null,
|
||||
);
|
||||
|
||||
@@ -40,15 +40,16 @@ class SelectedBangData extends _$SelectedBangData {
|
||||
@override
|
||||
BangData? build({String? domain}) {
|
||||
final repository = ref.watch(bangDataRepositoryProvider.notifier);
|
||||
final selectedBangTrigger =
|
||||
ref.watch(selectedBangTriggerProvider(domain: domain));
|
||||
|
||||
final subscription = repository.watchBang(selectedBangTrigger).listen(
|
||||
(value) {
|
||||
state = value;
|
||||
},
|
||||
final selectedBangTrigger = ref.watch(
|
||||
selectedBangTriggerProvider(domain: domain),
|
||||
);
|
||||
|
||||
final subscription = repository.watchBang(selectedBangTrigger).listen((
|
||||
value,
|
||||
) {
|
||||
state = value;
|
||||
});
|
||||
|
||||
ref.onDispose(() {
|
||||
unawaited(subscription.cancel());
|
||||
});
|
||||
@@ -111,8 +112,9 @@ EquatableCollection<List<String>> availableTabIds(
|
||||
ContainerFilter containerFilter,
|
||||
) {
|
||||
final containerTabs = ref.watch(
|
||||
containerTabIdsProvider(containerFilter)
|
||||
.select((value) => value.valueOrNull),
|
||||
containerTabIdsProvider(
|
||||
containerFilter,
|
||||
).select((value) => value.valueOrNull),
|
||||
);
|
||||
final tabList = ref.watch(tabListProvider);
|
||||
|
||||
@@ -130,13 +132,10 @@ EquatableCollection<Map<String, TabState>> availableTabStates(
|
||||
final availableTabs = ref.watch(availableTabIdsProvider(containerFilter));
|
||||
final tabStates = ref.watch(tabStatesProvider);
|
||||
|
||||
return EquatableCollection(
|
||||
{
|
||||
for (final tabId in availableTabs.collection)
|
||||
if (tabStates.containsKey(tabId)) tabId: tabStates[tabId]!,
|
||||
},
|
||||
immutable: true,
|
||||
);
|
||||
return EquatableCollection({
|
||||
for (final tabId in availableTabs.collection)
|
||||
if (tabStates.containsKey(tabId)) tabId: tabStates[tabId]!,
|
||||
}, immutable: true);
|
||||
}
|
||||
|
||||
@Riverpod()
|
||||
@@ -145,16 +144,17 @@ EquatableCollection<List<String>> seamlessFilteredTabIds(
|
||||
TabSearchPartition searchPartition,
|
||||
ContainerFilter containerFilter,
|
||||
) {
|
||||
final tabSearchResults = ref
|
||||
.watch(
|
||||
tabSearchRepositoryProvider(searchPartition).select(
|
||||
(value) => EquatableCollection(
|
||||
value.valueOrNull?.map((tab) => tab.id).toList(),
|
||||
immutable: true,
|
||||
),
|
||||
),
|
||||
)
|
||||
.collection;
|
||||
final tabSearchResults =
|
||||
ref
|
||||
.watch(
|
||||
tabSearchRepositoryProvider(searchPartition).select(
|
||||
(value) => EquatableCollection(
|
||||
value.valueOrNull?.map((tab) => tab.id).toList(),
|
||||
immutable: true,
|
||||
),
|
||||
),
|
||||
)
|
||||
.collection;
|
||||
|
||||
final availableTabs = ref.watch(availableTabIdsProvider(containerFilter));
|
||||
|
||||
@@ -176,19 +176,19 @@ EquatableCollection<List<TabPreview>> seamlessFilteredTabPreviews(
|
||||
TabSearchPartition searchPartition,
|
||||
ContainerFilter containerFilter,
|
||||
) {
|
||||
final tabSearchResults = ref
|
||||
.watch(
|
||||
tabSearchRepositoryProvider(searchPartition).select(
|
||||
(value) => EquatableCollection(
|
||||
value.valueOrNull,
|
||||
immutable: true,
|
||||
),
|
||||
),
|
||||
)
|
||||
.collection;
|
||||
final tabSearchResults =
|
||||
ref
|
||||
.watch(
|
||||
tabSearchRepositoryProvider(searchPartition).select(
|
||||
(value) =>
|
||||
EquatableCollection(value.valueOrNull, immutable: true),
|
||||
),
|
||||
)
|
||||
.collection;
|
||||
|
||||
final availableTabStates =
|
||||
ref.watch(availableTabStatesProvider(containerFilter));
|
||||
final availableTabStates = ref.watch(
|
||||
availableTabStatesProvider(containerFilter),
|
||||
);
|
||||
|
||||
if (tabSearchResults == null) {
|
||||
return EquatableCollection(
|
||||
@@ -216,7 +216,8 @@ EquatableCollection<List<TabPreview>> seamlessFilteredTabPreviews(
|
||||
id: tab.id,
|
||||
title: tab.title ?? availableTabStates.collection[tab.id]!.title,
|
||||
icon: null,
|
||||
url: tab.cleanUrl.mapNotNull(Uri.tryParse) ??
|
||||
url:
|
||||
tab.cleanUrl.mapNotNull(Uri.tryParse) ??
|
||||
availableTabStates.collection[tab.id]!.url,
|
||||
highlightedUrl: tab.url,
|
||||
content: tab.extractedContent ?? tab.fullContent,
|
||||
|
||||
@@ -39,21 +39,15 @@ class AvailableTabIdsFamily extends Family<EquatableCollection<List<String>>> {
|
||||
const AvailableTabIdsFamily();
|
||||
|
||||
/// See also [availableTabIds].
|
||||
AvailableTabIdsProvider call(
|
||||
ContainerFilter containerFilter,
|
||||
) {
|
||||
return AvailableTabIdsProvider(
|
||||
containerFilter,
|
||||
);
|
||||
AvailableTabIdsProvider call(ContainerFilter containerFilter) {
|
||||
return AvailableTabIdsProvider(containerFilter);
|
||||
}
|
||||
|
||||
@override
|
||||
AvailableTabIdsProvider getProviderOverride(
|
||||
covariant AvailableTabIdsProvider provider,
|
||||
) {
|
||||
return call(
|
||||
provider.containerFilter,
|
||||
);
|
||||
return call(provider.containerFilter);
|
||||
}
|
||||
|
||||
static const Iterable<ProviderOrFamily>? _dependencies = null;
|
||||
@@ -75,24 +69,20 @@ class AvailableTabIdsFamily extends Family<EquatableCollection<List<String>>> {
|
||||
class AvailableTabIdsProvider
|
||||
extends AutoDisposeProvider<EquatableCollection<List<String>>> {
|
||||
/// See also [availableTabIds].
|
||||
AvailableTabIdsProvider(
|
||||
ContainerFilter containerFilter,
|
||||
) : this._internal(
|
||||
(ref) => availableTabIds(
|
||||
ref as AvailableTabIdsRef,
|
||||
containerFilter,
|
||||
),
|
||||
from: availableTabIdsProvider,
|
||||
name: r'availableTabIdsProvider',
|
||||
debugGetCreateSourceHash:
|
||||
const bool.fromEnvironment('dart.vm.product')
|
||||
? null
|
||||
: _$availableTabIdsHash,
|
||||
dependencies: AvailableTabIdsFamily._dependencies,
|
||||
allTransitiveDependencies:
|
||||
AvailableTabIdsFamily._allTransitiveDependencies,
|
||||
containerFilter: containerFilter,
|
||||
);
|
||||
AvailableTabIdsProvider(ContainerFilter containerFilter)
|
||||
: this._internal(
|
||||
(ref) => availableTabIds(ref as AvailableTabIdsRef, containerFilter),
|
||||
from: availableTabIdsProvider,
|
||||
name: r'availableTabIdsProvider',
|
||||
debugGetCreateSourceHash:
|
||||
const bool.fromEnvironment('dart.vm.product')
|
||||
? null
|
||||
: _$availableTabIdsHash,
|
||||
dependencies: AvailableTabIdsFamily._dependencies,
|
||||
allTransitiveDependencies:
|
||||
AvailableTabIdsFamily._allTransitiveDependencies,
|
||||
containerFilter: containerFilter,
|
||||
);
|
||||
|
||||
AvailableTabIdsProvider._internal(
|
||||
super._createNotifier, {
|
||||
@@ -109,7 +99,7 @@ class AvailableTabIdsProvider
|
||||
@override
|
||||
Override overrideWith(
|
||||
EquatableCollection<List<String>> Function(AvailableTabIdsRef provider)
|
||||
create,
|
||||
create,
|
||||
) {
|
||||
return ProviderOverride(
|
||||
origin: this,
|
||||
@@ -127,7 +117,7 @@ class AvailableTabIdsProvider
|
||||
|
||||
@override
|
||||
AutoDisposeProviderElement<EquatableCollection<List<String>>>
|
||||
createElement() {
|
||||
createElement() {
|
||||
return _AvailableTabIdsProviderElement(this);
|
||||
}
|
||||
|
||||
@@ -178,21 +168,15 @@ class AvailableTabStatesFamily
|
||||
const AvailableTabStatesFamily();
|
||||
|
||||
/// See also [availableTabStates].
|
||||
AvailableTabStatesProvider call(
|
||||
ContainerFilter containerFilter,
|
||||
) {
|
||||
return AvailableTabStatesProvider(
|
||||
containerFilter,
|
||||
);
|
||||
AvailableTabStatesProvider call(ContainerFilter containerFilter) {
|
||||
return AvailableTabStatesProvider(containerFilter);
|
||||
}
|
||||
|
||||
@override
|
||||
AvailableTabStatesProvider getProviderOverride(
|
||||
covariant AvailableTabStatesProvider provider,
|
||||
) {
|
||||
return call(
|
||||
provider.containerFilter,
|
||||
);
|
||||
return call(provider.containerFilter);
|
||||
}
|
||||
|
||||
static const Iterable<ProviderOrFamily>? _dependencies = null;
|
||||
@@ -214,24 +198,21 @@ class AvailableTabStatesFamily
|
||||
class AvailableTabStatesProvider
|
||||
extends AutoDisposeProvider<EquatableCollection<Map<String, TabState>>> {
|
||||
/// See also [availableTabStates].
|
||||
AvailableTabStatesProvider(
|
||||
ContainerFilter containerFilter,
|
||||
) : this._internal(
|
||||
(ref) => availableTabStates(
|
||||
ref as AvailableTabStatesRef,
|
||||
containerFilter,
|
||||
),
|
||||
from: availableTabStatesProvider,
|
||||
name: r'availableTabStatesProvider',
|
||||
debugGetCreateSourceHash:
|
||||
const bool.fromEnvironment('dart.vm.product')
|
||||
? null
|
||||
: _$availableTabStatesHash,
|
||||
dependencies: AvailableTabStatesFamily._dependencies,
|
||||
allTransitiveDependencies:
|
||||
AvailableTabStatesFamily._allTransitiveDependencies,
|
||||
containerFilter: containerFilter,
|
||||
);
|
||||
AvailableTabStatesProvider(ContainerFilter containerFilter)
|
||||
: this._internal(
|
||||
(ref) =>
|
||||
availableTabStates(ref as AvailableTabStatesRef, containerFilter),
|
||||
from: availableTabStatesProvider,
|
||||
name: r'availableTabStatesProvider',
|
||||
debugGetCreateSourceHash:
|
||||
const bool.fromEnvironment('dart.vm.product')
|
||||
? null
|
||||
: _$availableTabStatesHash,
|
||||
dependencies: AvailableTabStatesFamily._dependencies,
|
||||
allTransitiveDependencies:
|
||||
AvailableTabStatesFamily._allTransitiveDependencies,
|
||||
containerFilter: containerFilter,
|
||||
);
|
||||
|
||||
AvailableTabStatesProvider._internal(
|
||||
super._createNotifier, {
|
||||
@@ -248,8 +229,9 @@ class AvailableTabStatesProvider
|
||||
@override
|
||||
Override overrideWith(
|
||||
EquatableCollection<Map<String, TabState>> Function(
|
||||
AvailableTabStatesRef provider)
|
||||
create,
|
||||
AvailableTabStatesRef provider,
|
||||
)
|
||||
create,
|
||||
) {
|
||||
return ProviderOverride(
|
||||
origin: this,
|
||||
@@ -267,7 +249,7 @@ class AvailableTabStatesProvider
|
||||
|
||||
@override
|
||||
AutoDisposeProviderElement<EquatableCollection<Map<String, TabState>>>
|
||||
createElement() {
|
||||
createElement() {
|
||||
return _AvailableTabStatesProviderElement(this);
|
||||
}
|
||||
|
||||
@@ -294,8 +276,10 @@ mixin AvailableTabStatesRef
|
||||
ContainerFilter get containerFilter;
|
||||
}
|
||||
|
||||
class _AvailableTabStatesProviderElement extends AutoDisposeProviderElement<
|
||||
EquatableCollection<Map<String, TabState>>> with AvailableTabStatesRef {
|
||||
class _AvailableTabStatesProviderElement
|
||||
extends
|
||||
AutoDisposeProviderElement<EquatableCollection<Map<String, TabState>>>
|
||||
with AvailableTabStatesRef {
|
||||
_AvailableTabStatesProviderElement(super.provider);
|
||||
|
||||
@override
|
||||
@@ -321,20 +305,14 @@ class SeamlessFilteredTabIdsFamily
|
||||
TabSearchPartition searchPartition,
|
||||
ContainerFilter containerFilter,
|
||||
) {
|
||||
return SeamlessFilteredTabIdsProvider(
|
||||
searchPartition,
|
||||
containerFilter,
|
||||
);
|
||||
return SeamlessFilteredTabIdsProvider(searchPartition, containerFilter);
|
||||
}
|
||||
|
||||
@override
|
||||
SeamlessFilteredTabIdsProvider getProviderOverride(
|
||||
covariant SeamlessFilteredTabIdsProvider provider,
|
||||
) {
|
||||
return call(
|
||||
provider.searchPartition,
|
||||
provider.containerFilter,
|
||||
);
|
||||
return call(provider.searchPartition, provider.containerFilter);
|
||||
}
|
||||
|
||||
static const Iterable<ProviderOrFamily>? _dependencies = null;
|
||||
@@ -360,23 +338,23 @@ class SeamlessFilteredTabIdsProvider
|
||||
TabSearchPartition searchPartition,
|
||||
ContainerFilter containerFilter,
|
||||
) : this._internal(
|
||||
(ref) => seamlessFilteredTabIds(
|
||||
ref as SeamlessFilteredTabIdsRef,
|
||||
searchPartition,
|
||||
containerFilter,
|
||||
),
|
||||
from: seamlessFilteredTabIdsProvider,
|
||||
name: r'seamlessFilteredTabIdsProvider',
|
||||
debugGetCreateSourceHash:
|
||||
const bool.fromEnvironment('dart.vm.product')
|
||||
? null
|
||||
: _$seamlessFilteredTabIdsHash,
|
||||
dependencies: SeamlessFilteredTabIdsFamily._dependencies,
|
||||
allTransitiveDependencies:
|
||||
SeamlessFilteredTabIdsFamily._allTransitiveDependencies,
|
||||
searchPartition: searchPartition,
|
||||
containerFilter: containerFilter,
|
||||
);
|
||||
(ref) => seamlessFilteredTabIds(
|
||||
ref as SeamlessFilteredTabIdsRef,
|
||||
searchPartition,
|
||||
containerFilter,
|
||||
),
|
||||
from: seamlessFilteredTabIdsProvider,
|
||||
name: r'seamlessFilteredTabIdsProvider',
|
||||
debugGetCreateSourceHash:
|
||||
const bool.fromEnvironment('dart.vm.product')
|
||||
? null
|
||||
: _$seamlessFilteredTabIdsHash,
|
||||
dependencies: SeamlessFilteredTabIdsFamily._dependencies,
|
||||
allTransitiveDependencies:
|
||||
SeamlessFilteredTabIdsFamily._allTransitiveDependencies,
|
||||
searchPartition: searchPartition,
|
||||
containerFilter: containerFilter,
|
||||
);
|
||||
|
||||
SeamlessFilteredTabIdsProvider._internal(
|
||||
super._createNotifier, {
|
||||
@@ -395,8 +373,9 @@ class SeamlessFilteredTabIdsProvider
|
||||
@override
|
||||
Override overrideWith(
|
||||
EquatableCollection<List<String>> Function(
|
||||
SeamlessFilteredTabIdsRef provider)
|
||||
create,
|
||||
SeamlessFilteredTabIdsRef provider,
|
||||
)
|
||||
create,
|
||||
) {
|
||||
return ProviderOverride(
|
||||
origin: this,
|
||||
@@ -415,7 +394,7 @@ class SeamlessFilteredTabIdsProvider
|
||||
|
||||
@override
|
||||
AutoDisposeProviderElement<EquatableCollection<List<String>>>
|
||||
createElement() {
|
||||
createElement() {
|
||||
return _SeamlessFilteredTabIdsProviderElement(this);
|
||||
}
|
||||
|
||||
@@ -488,10 +467,7 @@ class SeamlessFilteredTabPreviewsFamily
|
||||
SeamlessFilteredTabPreviewsProvider getProviderOverride(
|
||||
covariant SeamlessFilteredTabPreviewsProvider provider,
|
||||
) {
|
||||
return call(
|
||||
provider.searchPartition,
|
||||
provider.containerFilter,
|
||||
);
|
||||
return call(provider.searchPartition, provider.containerFilter);
|
||||
}
|
||||
|
||||
static const Iterable<ProviderOrFamily>? _dependencies = null;
|
||||
@@ -517,23 +493,23 @@ class SeamlessFilteredTabPreviewsProvider
|
||||
TabSearchPartition searchPartition,
|
||||
ContainerFilter containerFilter,
|
||||
) : this._internal(
|
||||
(ref) => seamlessFilteredTabPreviews(
|
||||
ref as SeamlessFilteredTabPreviewsRef,
|
||||
searchPartition,
|
||||
containerFilter,
|
||||
),
|
||||
from: seamlessFilteredTabPreviewsProvider,
|
||||
name: r'seamlessFilteredTabPreviewsProvider',
|
||||
debugGetCreateSourceHash:
|
||||
const bool.fromEnvironment('dart.vm.product')
|
||||
? null
|
||||
: _$seamlessFilteredTabPreviewsHash,
|
||||
dependencies: SeamlessFilteredTabPreviewsFamily._dependencies,
|
||||
allTransitiveDependencies:
|
||||
SeamlessFilteredTabPreviewsFamily._allTransitiveDependencies,
|
||||
searchPartition: searchPartition,
|
||||
containerFilter: containerFilter,
|
||||
);
|
||||
(ref) => seamlessFilteredTabPreviews(
|
||||
ref as SeamlessFilteredTabPreviewsRef,
|
||||
searchPartition,
|
||||
containerFilter,
|
||||
),
|
||||
from: seamlessFilteredTabPreviewsProvider,
|
||||
name: r'seamlessFilteredTabPreviewsProvider',
|
||||
debugGetCreateSourceHash:
|
||||
const bool.fromEnvironment('dart.vm.product')
|
||||
? null
|
||||
: _$seamlessFilteredTabPreviewsHash,
|
||||
dependencies: SeamlessFilteredTabPreviewsFamily._dependencies,
|
||||
allTransitiveDependencies:
|
||||
SeamlessFilteredTabPreviewsFamily._allTransitiveDependencies,
|
||||
searchPartition: searchPartition,
|
||||
containerFilter: containerFilter,
|
||||
);
|
||||
|
||||
SeamlessFilteredTabPreviewsProvider._internal(
|
||||
super._createNotifier, {
|
||||
@@ -552,8 +528,9 @@ class SeamlessFilteredTabPreviewsProvider
|
||||
@override
|
||||
Override overrideWith(
|
||||
EquatableCollection<List<TabPreview>> Function(
|
||||
SeamlessFilteredTabPreviewsRef provider)
|
||||
create,
|
||||
SeamlessFilteredTabPreviewsRef provider,
|
||||
)
|
||||
create,
|
||||
) {
|
||||
return ProviderOverride(
|
||||
origin: this,
|
||||
@@ -572,7 +549,7 @@ class SeamlessFilteredTabPreviewsProvider
|
||||
|
||||
@override
|
||||
AutoDisposeProviderElement<EquatableCollection<List<TabPreview>>>
|
||||
createElement() {
|
||||
createElement() {
|
||||
return _SeamlessFilteredTabPreviewsProviderElement(this);
|
||||
}
|
||||
|
||||
@@ -623,9 +600,7 @@ String _$selectedBangTriggerHash() =>
|
||||
abstract class _$SelectedBangTrigger extends BuildlessNotifier<String?> {
|
||||
late final String? domain;
|
||||
|
||||
String? build({
|
||||
String? domain,
|
||||
});
|
||||
String? build({String? domain});
|
||||
}
|
||||
|
||||
/// See also [SelectedBangTrigger].
|
||||
@@ -638,21 +613,15 @@ class SelectedBangTriggerFamily extends Family<String?> {
|
||||
const SelectedBangTriggerFamily();
|
||||
|
||||
/// See also [SelectedBangTrigger].
|
||||
SelectedBangTriggerProvider call({
|
||||
String? domain,
|
||||
}) {
|
||||
return SelectedBangTriggerProvider(
|
||||
domain: domain,
|
||||
);
|
||||
SelectedBangTriggerProvider call({String? domain}) {
|
||||
return SelectedBangTriggerProvider(domain: domain);
|
||||
}
|
||||
|
||||
@override
|
||||
SelectedBangTriggerProvider getProviderOverride(
|
||||
covariant SelectedBangTriggerProvider provider,
|
||||
) {
|
||||
return call(
|
||||
domain: provider.domain,
|
||||
);
|
||||
return call(domain: provider.domain);
|
||||
}
|
||||
|
||||
static const Iterable<ProviderOrFamily>? _dependencies = null;
|
||||
@@ -674,21 +643,20 @@ class SelectedBangTriggerFamily extends Family<String?> {
|
||||
class SelectedBangTriggerProvider
|
||||
extends NotifierProviderImpl<SelectedBangTrigger, String?> {
|
||||
/// See also [SelectedBangTrigger].
|
||||
SelectedBangTriggerProvider({
|
||||
String? domain,
|
||||
}) : this._internal(
|
||||
() => SelectedBangTrigger()..domain = domain,
|
||||
from: selectedBangTriggerProvider,
|
||||
name: r'selectedBangTriggerProvider',
|
||||
debugGetCreateSourceHash:
|
||||
const bool.fromEnvironment('dart.vm.product')
|
||||
? null
|
||||
: _$selectedBangTriggerHash,
|
||||
dependencies: SelectedBangTriggerFamily._dependencies,
|
||||
allTransitiveDependencies:
|
||||
SelectedBangTriggerFamily._allTransitiveDependencies,
|
||||
domain: domain,
|
||||
);
|
||||
SelectedBangTriggerProvider({String? domain})
|
||||
: this._internal(
|
||||
() => SelectedBangTrigger()..domain = domain,
|
||||
from: selectedBangTriggerProvider,
|
||||
name: r'selectedBangTriggerProvider',
|
||||
debugGetCreateSourceHash:
|
||||
const bool.fromEnvironment('dart.vm.product')
|
||||
? null
|
||||
: _$selectedBangTriggerHash,
|
||||
dependencies: SelectedBangTriggerFamily._dependencies,
|
||||
allTransitiveDependencies:
|
||||
SelectedBangTriggerFamily._allTransitiveDependencies,
|
||||
domain: domain,
|
||||
);
|
||||
|
||||
SelectedBangTriggerProvider._internal(
|
||||
super._createNotifier, {
|
||||
@@ -703,12 +671,8 @@ class SelectedBangTriggerProvider
|
||||
final String? domain;
|
||||
|
||||
@override
|
||||
String? runNotifierBuild(
|
||||
covariant SelectedBangTrigger notifier,
|
||||
) {
|
||||
return notifier.build(
|
||||
domain: domain,
|
||||
);
|
||||
String? runNotifierBuild(covariant SelectedBangTrigger notifier) {
|
||||
return notifier.build(domain: domain);
|
||||
}
|
||||
|
||||
@override
|
||||
@@ -768,9 +732,7 @@ abstract class _$SelectedBangData
|
||||
extends BuildlessAutoDisposeNotifier<BangData?> {
|
||||
late final String? domain;
|
||||
|
||||
BangData? build({
|
||||
String? domain,
|
||||
});
|
||||
BangData? build({String? domain});
|
||||
}
|
||||
|
||||
/// See also [SelectedBangData].
|
||||
@@ -783,21 +745,15 @@ class SelectedBangDataFamily extends Family<BangData?> {
|
||||
const SelectedBangDataFamily();
|
||||
|
||||
/// See also [SelectedBangData].
|
||||
SelectedBangDataProvider call({
|
||||
String? domain,
|
||||
}) {
|
||||
return SelectedBangDataProvider(
|
||||
domain: domain,
|
||||
);
|
||||
SelectedBangDataProvider call({String? domain}) {
|
||||
return SelectedBangDataProvider(domain: domain);
|
||||
}
|
||||
|
||||
@override
|
||||
SelectedBangDataProvider getProviderOverride(
|
||||
covariant SelectedBangDataProvider provider,
|
||||
) {
|
||||
return call(
|
||||
domain: provider.domain,
|
||||
);
|
||||
return call(domain: provider.domain);
|
||||
}
|
||||
|
||||
static const Iterable<ProviderOrFamily>? _dependencies = null;
|
||||
@@ -819,21 +775,20 @@ class SelectedBangDataFamily extends Family<BangData?> {
|
||||
class SelectedBangDataProvider
|
||||
extends AutoDisposeNotifierProviderImpl<SelectedBangData, BangData?> {
|
||||
/// See also [SelectedBangData].
|
||||
SelectedBangDataProvider({
|
||||
String? domain,
|
||||
}) : this._internal(
|
||||
() => SelectedBangData()..domain = domain,
|
||||
from: selectedBangDataProvider,
|
||||
name: r'selectedBangDataProvider',
|
||||
debugGetCreateSourceHash:
|
||||
const bool.fromEnvironment('dart.vm.product')
|
||||
? null
|
||||
: _$selectedBangDataHash,
|
||||
dependencies: SelectedBangDataFamily._dependencies,
|
||||
allTransitiveDependencies:
|
||||
SelectedBangDataFamily._allTransitiveDependencies,
|
||||
domain: domain,
|
||||
);
|
||||
SelectedBangDataProvider({String? domain})
|
||||
: this._internal(
|
||||
() => SelectedBangData()..domain = domain,
|
||||
from: selectedBangDataProvider,
|
||||
name: r'selectedBangDataProvider',
|
||||
debugGetCreateSourceHash:
|
||||
const bool.fromEnvironment('dart.vm.product')
|
||||
? null
|
||||
: _$selectedBangDataHash,
|
||||
dependencies: SelectedBangDataFamily._dependencies,
|
||||
allTransitiveDependencies:
|
||||
SelectedBangDataFamily._allTransitiveDependencies,
|
||||
domain: domain,
|
||||
);
|
||||
|
||||
SelectedBangDataProvider._internal(
|
||||
super._createNotifier, {
|
||||
@@ -848,12 +803,8 @@ class SelectedBangDataProvider
|
||||
final String? domain;
|
||||
|
||||
@override
|
||||
BangData? runNotifierBuild(
|
||||
covariant SelectedBangData notifier,
|
||||
) {
|
||||
return notifier.build(
|
||||
domain: domain,
|
||||
);
|
||||
BangData? runNotifierBuild(covariant SelectedBangData notifier) {
|
||||
return notifier.build(domain: domain);
|
||||
}
|
||||
|
||||
@override
|
||||
@@ -874,7 +825,7 @@ class SelectedBangDataProvider
|
||||
|
||||
@override
|
||||
AutoDisposeNotifierProviderElement<SelectedBangData, BangData?>
|
||||
createElement() {
|
||||
createElement() {
|
||||
return _SelectedBangDataProviderElement(this);
|
||||
}
|
||||
|
||||
@@ -915,14 +866,15 @@ String _$lastUsedAssistantModeHash() =>
|
||||
@ProviderFor(LastUsedAssistantMode)
|
||||
final lastUsedAssistantModeProvider =
|
||||
NotifierProvider<LastUsedAssistantMode, AssistantMode>.internal(
|
||||
LastUsedAssistantMode.new,
|
||||
name: r'lastUsedAssistantModeProvider',
|
||||
debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product')
|
||||
? null
|
||||
: _$lastUsedAssistantModeHash,
|
||||
dependencies: null,
|
||||
allTransitiveDependencies: null,
|
||||
);
|
||||
LastUsedAssistantMode.new,
|
||||
name: r'lastUsedAssistantModeProvider',
|
||||
debugGetCreateSourceHash:
|
||||
const bool.fromEnvironment('dart.vm.product')
|
||||
? null
|
||||
: _$lastUsedAssistantModeHash,
|
||||
dependencies: null,
|
||||
allTransitiveDependencies: null,
|
||||
);
|
||||
|
||||
typedef _$LastUsedAssistantMode = Notifier<AssistantMode>;
|
||||
String _$activeResearchVariantHash() =>
|
||||
@@ -932,14 +884,15 @@ String _$activeResearchVariantHash() =>
|
||||
@ProviderFor(ActiveResearchVariant)
|
||||
final activeResearchVariantProvider =
|
||||
NotifierProvider<ActiveResearchVariant, ResearchVariant>.internal(
|
||||
ActiveResearchVariant.new,
|
||||
name: r'activeResearchVariantProvider',
|
||||
debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product')
|
||||
? null
|
||||
: _$activeResearchVariantHash,
|
||||
dependencies: null,
|
||||
allTransitiveDependencies: null,
|
||||
);
|
||||
ActiveResearchVariant.new,
|
||||
name: r'activeResearchVariantProvider',
|
||||
debugGetCreateSourceHash:
|
||||
const bool.fromEnvironment('dart.vm.product')
|
||||
? null
|
||||
: _$activeResearchVariantHash,
|
||||
dependencies: null,
|
||||
allTransitiveDependencies: null,
|
||||
);
|
||||
|
||||
typedef _$ActiveResearchVariant = Notifier<ResearchVariant>;
|
||||
String _$activeChatModelHash() => r'675f406af8b4aa92699d59e37b5805a81d03a799';
|
||||
@@ -948,14 +901,15 @@ String _$activeChatModelHash() => r'675f406af8b4aa92699d59e37b5805a81d03a799';
|
||||
@ProviderFor(ActiveChatModel)
|
||||
final activeChatModelProvider =
|
||||
NotifierProvider<ActiveChatModel, ChatModel>.internal(
|
||||
ActiveChatModel.new,
|
||||
name: r'activeChatModelProvider',
|
||||
debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product')
|
||||
? null
|
||||
: _$activeChatModelHash,
|
||||
dependencies: null,
|
||||
allTransitiveDependencies: null,
|
||||
);
|
||||
ActiveChatModel.new,
|
||||
name: r'activeChatModelProvider',
|
||||
debugGetCreateSourceHash:
|
||||
const bool.fromEnvironment('dart.vm.product')
|
||||
? null
|
||||
: _$activeChatModelHash,
|
||||
dependencies: null,
|
||||
allTransitiveDependencies: null,
|
||||
);
|
||||
|
||||
typedef _$ActiveChatModel = Notifier<ChatModel>;
|
||||
String _$showFindInPageHash() => r'7ee5703f7d0c7e8a8dd6b0849d7b1e0a41fe24d9';
|
||||
@@ -965,9 +919,10 @@ String _$showFindInPageHash() => r'7ee5703f7d0c7e8a8dd6b0849d7b1e0a41fe24d9';
|
||||
final showFindInPageProvider = NotifierProvider<ShowFindInPage, bool>.internal(
|
||||
ShowFindInPage.new,
|
||||
name: r'showFindInPageProvider',
|
||||
debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product')
|
||||
? null
|
||||
: _$showFindInPageHash,
|
||||
debugGetCreateSourceHash:
|
||||
const bool.fromEnvironment('dart.vm.product')
|
||||
? null
|
||||
: _$showFindInPageHash,
|
||||
dependencies: null,
|
||||
allTransitiveDependencies: null,
|
||||
);
|
||||
|
||||
@@ -13,18 +13,19 @@ part 'create_tab.g.dart';
|
||||
|
||||
final _parameterToCreateTabSheetTransformer =
|
||||
StreamTransformer<ReceivedParameter, CreateTabSheet>.fromHandlers(
|
||||
handleData: (parameter, sink) {
|
||||
final createTab = CreateTabSheet(
|
||||
preferredTool: KagiTool.values
|
||||
.firstWhereOrNull((tool) => tool.name == parameter.tool),
|
||||
content: parameter.content,
|
||||
);
|
||||
handleData: (parameter, sink) {
|
||||
final createTab = CreateTabSheet(
|
||||
preferredTool: KagiTool.values.firstWhereOrNull(
|
||||
(tool) => tool.name == parameter.tool,
|
||||
),
|
||||
content: parameter.content,
|
||||
);
|
||||
|
||||
if (createTab.hasParameters) {
|
||||
sink.add(createTab);
|
||||
}
|
||||
},
|
||||
);
|
||||
if (createTab.hasParameters) {
|
||||
sink.add(createTab);
|
||||
}
|
||||
},
|
||||
);
|
||||
|
||||
@Riverpod()
|
||||
class CreateTabStream extends _$CreateTabStream {
|
||||
|
||||
@@ -12,14 +12,15 @@ String _$createTabStreamHash() => r'2e802a10ecaf1862074f32b76e89c26997bdd7b2';
|
||||
@ProviderFor(CreateTabStream)
|
||||
final createTabStreamProvider =
|
||||
AutoDisposeStreamNotifierProvider<CreateTabStream, CreateTabSheet>.internal(
|
||||
CreateTabStream.new,
|
||||
name: r'createTabStreamProvider',
|
||||
debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product')
|
||||
? null
|
||||
: _$createTabStreamHash,
|
||||
dependencies: null,
|
||||
allTransitiveDependencies: null,
|
||||
);
|
||||
CreateTabStream.new,
|
||||
name: r'createTabStreamProvider',
|
||||
debugGetCreateSourceHash:
|
||||
const bool.fromEnvironment('dart.vm.product')
|
||||
? null
|
||||
: _$createTabStreamHash,
|
||||
dependencies: null,
|
||||
allTransitiveDependencies: null,
|
||||
);
|
||||
|
||||
typedef _$CreateTabStream = AutoDisposeStreamNotifier<CreateTabSheet>;
|
||||
// ignore_for_file: type=lint
|
||||
|
||||
+9
-8
@@ -13,14 +13,15 @@ String _$deleteBrowserDataServiceHash() =>
|
||||
@ProviderFor(DeleteBrowserDataService)
|
||||
final deleteBrowserDataServiceProvider =
|
||||
AutoDisposeNotifierProvider<DeleteBrowserDataService, void>.internal(
|
||||
DeleteBrowserDataService.new,
|
||||
name: r'deleteBrowserDataServiceProvider',
|
||||
debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product')
|
||||
? null
|
||||
: _$deleteBrowserDataServiceHash,
|
||||
dependencies: null,
|
||||
allTransitiveDependencies: null,
|
||||
);
|
||||
DeleteBrowserDataService.new,
|
||||
name: r'deleteBrowserDataServiceProvider',
|
||||
debugGetCreateSourceHash:
|
||||
const bool.fromEnvironment('dart.vm.product')
|
||||
? null
|
||||
: _$deleteBrowserDataServiceHash,
|
||||
dependencies: null,
|
||||
allTransitiveDependencies: null,
|
||||
);
|
||||
|
||||
typedef _$DeleteBrowserDataService = AutoDisposeNotifier<void>;
|
||||
// ignore_for_file: type=lint
|
||||
|
||||
+60
-58
@@ -16,8 +16,9 @@ class EngineSettingsReplicationService
|
||||
var initialSettingsSent = false;
|
||||
|
||||
ref.listen(
|
||||
generalSettingsRepositoryProvider
|
||||
.select((settings) => settings.themeMode),
|
||||
generalSettingsRepositoryProvider.select(
|
||||
(settings) => settings.themeMode,
|
||||
),
|
||||
(previous, next) async {
|
||||
final theme = switch (next) {
|
||||
ThemeMode.system => ColorScheme.system,
|
||||
@@ -29,62 +30,63 @@ class EngineSettingsReplicationService
|
||||
},
|
||||
);
|
||||
|
||||
ref.listen(
|
||||
engineSettingsRepositoryProvider,
|
||||
(previous, next) async {
|
||||
if (initialSettingsSent && previous != null) {
|
||||
if (previous.javascriptEnabled != next.javascriptEnabled) {
|
||||
await _service.javascriptEnabled(next.javascriptEnabled);
|
||||
}
|
||||
if (previous.trackingProtectionPolicy !=
|
||||
next.trackingProtectionPolicy) {
|
||||
await _service
|
||||
.trackingProtectionPolicy(next.trackingProtectionPolicy);
|
||||
}
|
||||
if (previous.httpsOnlyMode != next.httpsOnlyMode) {
|
||||
await _service.httpsOnlyMode(next.httpsOnlyMode);
|
||||
}
|
||||
if (previous.globalPrivacyControlEnabled !=
|
||||
next.globalPrivacyControlEnabled) {
|
||||
await _service
|
||||
.globalPrivacyControlEnabled(next.globalPrivacyControlEnabled);
|
||||
}
|
||||
if (previous.preferredColorScheme != next.preferredColorScheme) {
|
||||
await _service.preferredColorScheme(next.preferredColorScheme);
|
||||
}
|
||||
if (previous.cookieBannerHandlingMode !=
|
||||
next.cookieBannerHandlingMode) {
|
||||
await _service
|
||||
.cookieBannerHandlingMode(next.cookieBannerHandlingMode);
|
||||
}
|
||||
if (previous.cookieBannerHandlingModePrivateBrowsing !=
|
||||
next.cookieBannerHandlingModePrivateBrowsing) {
|
||||
await _service.cookieBannerHandlingModePrivateBrowsing(
|
||||
next.cookieBannerHandlingModePrivateBrowsing,
|
||||
);
|
||||
}
|
||||
if (previous.cookieBannerHandlingGlobalRules !=
|
||||
next.cookieBannerHandlingGlobalRules) {
|
||||
await _service.cookieBannerHandlingGlobalRules(
|
||||
next.cookieBannerHandlingGlobalRules,
|
||||
);
|
||||
}
|
||||
if (previous.cookieBannerHandlingGlobalRulesSubFrames !=
|
||||
next.cookieBannerHandlingGlobalRulesSubFrames) {
|
||||
await _service.cookieBannerHandlingGlobalRulesSubFrames(
|
||||
next.cookieBannerHandlingGlobalRulesSubFrames,
|
||||
);
|
||||
}
|
||||
if (previous.webContentIsolationStrategy !=
|
||||
next.webContentIsolationStrategy) {
|
||||
await _service
|
||||
.webContentIsolationStrategy(next.webContentIsolationStrategy);
|
||||
}
|
||||
} else {
|
||||
await _service.setDefaultSettings(next);
|
||||
initialSettingsSent = true;
|
||||
ref.listen(engineSettingsRepositoryProvider, (previous, next) async {
|
||||
if (initialSettingsSent && previous != null) {
|
||||
if (previous.javascriptEnabled != next.javascriptEnabled) {
|
||||
await _service.javascriptEnabled(next.javascriptEnabled);
|
||||
}
|
||||
},
|
||||
);
|
||||
if (previous.trackingProtectionPolicy !=
|
||||
next.trackingProtectionPolicy) {
|
||||
await _service.trackingProtectionPolicy(
|
||||
next.trackingProtectionPolicy,
|
||||
);
|
||||
}
|
||||
if (previous.httpsOnlyMode != next.httpsOnlyMode) {
|
||||
await _service.httpsOnlyMode(next.httpsOnlyMode);
|
||||
}
|
||||
if (previous.globalPrivacyControlEnabled !=
|
||||
next.globalPrivacyControlEnabled) {
|
||||
await _service.globalPrivacyControlEnabled(
|
||||
next.globalPrivacyControlEnabled,
|
||||
);
|
||||
}
|
||||
if (previous.preferredColorScheme != next.preferredColorScheme) {
|
||||
await _service.preferredColorScheme(next.preferredColorScheme);
|
||||
}
|
||||
if (previous.cookieBannerHandlingMode !=
|
||||
next.cookieBannerHandlingMode) {
|
||||
await _service.cookieBannerHandlingMode(
|
||||
next.cookieBannerHandlingMode,
|
||||
);
|
||||
}
|
||||
if (previous.cookieBannerHandlingModePrivateBrowsing !=
|
||||
next.cookieBannerHandlingModePrivateBrowsing) {
|
||||
await _service.cookieBannerHandlingModePrivateBrowsing(
|
||||
next.cookieBannerHandlingModePrivateBrowsing,
|
||||
);
|
||||
}
|
||||
if (previous.cookieBannerHandlingGlobalRules !=
|
||||
next.cookieBannerHandlingGlobalRules) {
|
||||
await _service.cookieBannerHandlingGlobalRules(
|
||||
next.cookieBannerHandlingGlobalRules,
|
||||
);
|
||||
}
|
||||
if (previous.cookieBannerHandlingGlobalRulesSubFrames !=
|
||||
next.cookieBannerHandlingGlobalRulesSubFrames) {
|
||||
await _service.cookieBannerHandlingGlobalRulesSubFrames(
|
||||
next.cookieBannerHandlingGlobalRulesSubFrames,
|
||||
);
|
||||
}
|
||||
if (previous.webContentIsolationStrategy !=
|
||||
next.webContentIsolationStrategy) {
|
||||
await _service.webContentIsolationStrategy(
|
||||
next.webContentIsolationStrategy,
|
||||
);
|
||||
}
|
||||
} else {
|
||||
await _service.setDefaultSettings(next);
|
||||
initialSettingsSent = true;
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
+9
-8
@@ -13,14 +13,15 @@ String _$engineSettingsReplicationServiceHash() =>
|
||||
@ProviderFor(EngineSettingsReplicationService)
|
||||
final engineSettingsReplicationServiceProvider =
|
||||
NotifierProvider<EngineSettingsReplicationService, void>.internal(
|
||||
EngineSettingsReplicationService.new,
|
||||
name: r'engineSettingsReplicationServiceProvider',
|
||||
debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product')
|
||||
? null
|
||||
: _$engineSettingsReplicationServiceHash,
|
||||
dependencies: null,
|
||||
allTransitiveDependencies: null,
|
||||
);
|
||||
EngineSettingsReplicationService.new,
|
||||
name: r'engineSettingsReplicationServiceProvider',
|
||||
debugGetCreateSourceHash:
|
||||
const bool.fromEnvironment('dart.vm.product')
|
||||
? null
|
||||
: _$engineSettingsReplicationServiceHash,
|
||||
dependencies: null,
|
||||
allTransitiveDependencies: null,
|
||||
);
|
||||
|
||||
typedef _$EngineSettingsReplicationService = Notifier<void>;
|
||||
// ignore_for_file: type=lint
|
||||
|
||||
+8
-8
@@ -12,14 +12,14 @@ class ProxySettingsReplucation extends _$ProxySettingsReplucation {
|
||||
|
||||
@override
|
||||
void build() {
|
||||
ref.listen(
|
||||
torProxyServiceProvider.select((data) => data.valueOrNull),
|
||||
(previous, next) async {
|
||||
if (next != null) {
|
||||
await _service.setProxyPort(next);
|
||||
}
|
||||
},
|
||||
);
|
||||
ref.listen(torProxyServiceProvider.select((data) => data.valueOrNull), (
|
||||
previous,
|
||||
next,
|
||||
) async {
|
||||
if (next != null) {
|
||||
await _service.setProxyPort(next);
|
||||
}
|
||||
});
|
||||
|
||||
ref.listen(
|
||||
containersWithCountProvider.select(
|
||||
|
||||
+9
-8
@@ -13,14 +13,15 @@ String _$proxySettingsReplucationHash() =>
|
||||
@ProviderFor(ProxySettingsReplucation)
|
||||
final proxySettingsReplucationProvider =
|
||||
NotifierProvider<ProxySettingsReplucation, void>.internal(
|
||||
ProxySettingsReplucation.new,
|
||||
name: r'proxySettingsReplucationProvider',
|
||||
debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product')
|
||||
? null
|
||||
: _$proxySettingsReplucationHash,
|
||||
dependencies: null,
|
||||
allTransitiveDependencies: null,
|
||||
);
|
||||
ProxySettingsReplucation.new,
|
||||
name: r'proxySettingsReplucationProvider',
|
||||
debugGetCreateSourceHash:
|
||||
const bool.fromEnvironment('dart.vm.product')
|
||||
? null
|
||||
: _$proxySettingsReplucationHash,
|
||||
dependencies: null,
|
||||
allTransitiveDependencies: null,
|
||||
);
|
||||
|
||||
typedef _$ProxySettingsReplucation = Notifier<void>;
|
||||
// ignore_for_file: type=lint
|
||||
|
||||
+62
-64
@@ -36,11 +36,7 @@ class WebPageDialog extends HookConsumerWidget {
|
||||
final Uri url;
|
||||
final WebPageInfo? precachedInfo;
|
||||
|
||||
const WebPageDialog({
|
||||
required this.url,
|
||||
this.precachedInfo,
|
||||
super.key,
|
||||
});
|
||||
const WebPageDialog({required this.url, this.precachedInfo, super.key});
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context, WidgetRef ref) {
|
||||
@@ -63,8 +59,10 @@ class WebPageDialog extends HookConsumerWidget {
|
||||
context: context,
|
||||
removeBottom: true,
|
||||
child: Dialog(
|
||||
insetPadding:
|
||||
const EdgeInsets.symmetric(horizontal: 16.0, vertical: 64.0),
|
||||
insetPadding: const EdgeInsets.symmetric(
|
||||
horizontal: 16.0,
|
||||
vertical: 64.0,
|
||||
),
|
||||
child: Column(
|
||||
mainAxisSize: MainAxisSize.min,
|
||||
children: [
|
||||
@@ -79,26 +77,24 @@ class WebPageDialog extends HookConsumerWidget {
|
||||
padding: const EdgeInsets.symmetric(horizontal: 16.0),
|
||||
child: HookConsumer(
|
||||
builder: (context, ref, child) {
|
||||
final addressTextController =
|
||||
useTextEditingController(text: url.toString());
|
||||
final addressTextController = useTextEditingController(
|
||||
text: url.toString(),
|
||||
);
|
||||
final addressTextFocusNode = useFocusNode();
|
||||
|
||||
final suggestion = useState<String?>(null);
|
||||
|
||||
useListenableCallback(
|
||||
addressTextController,
|
||||
() async {
|
||||
if (addressTextController.text.isNotEmpty) {
|
||||
final result = await ref
|
||||
.read(engineSuggestionsProvider.notifier)
|
||||
.getAutocompleteSuggestion(
|
||||
addressTextController.text,
|
||||
);
|
||||
useListenableCallback(addressTextController, () async {
|
||||
if (addressTextController.text.isNotEmpty) {
|
||||
final result = await ref
|
||||
.read(engineSuggestionsProvider.notifier)
|
||||
.getAutocompleteSuggestion(
|
||||
addressTextController.text,
|
||||
);
|
||||
|
||||
suggestion.value = result;
|
||||
}
|
||||
},
|
||||
);
|
||||
suggestion.value = result;
|
||||
}
|
||||
});
|
||||
|
||||
return AutoSuggestTextField(
|
||||
controller: addressTextController,
|
||||
@@ -121,12 +117,15 @@ class WebPageDialog extends HookConsumerWidget {
|
||||
},
|
||||
onSubmitted: (value) async {
|
||||
if (value.isNotEmpty) {
|
||||
var newUrl =
|
||||
uri_parser.tryParseUrl(value, eagerParsing: true);
|
||||
var newUrl = uri_parser.tryParseUrl(
|
||||
value,
|
||||
eagerParsing: true,
|
||||
);
|
||||
|
||||
if (newUrl == null) {
|
||||
final defaultSearchBang = await ref
|
||||
.read(defaultSearchBangDataProvider.future);
|
||||
final defaultSearchBang = await ref.read(
|
||||
defaultSearchBangDataProvider.future,
|
||||
);
|
||||
|
||||
newUrl = defaultSearchBang?.getUrl(value);
|
||||
}
|
||||
@@ -147,9 +146,7 @@ class WebPageDialog extends HookConsumerWidget {
|
||||
),
|
||||
),
|
||||
),
|
||||
const SizedBox(
|
||||
height: 4,
|
||||
),
|
||||
const SizedBox(height: 4),
|
||||
const Divider(),
|
||||
Flexible(
|
||||
child: FadingScroll(
|
||||
@@ -173,21 +170,23 @@ class WebPageDialog extends HookConsumerWidget {
|
||||
availableBangs: availableBangs,
|
||||
);
|
||||
},
|
||||
error: (error, stackTrace) => FailureWidget(
|
||||
title: 'Could not load bangs',
|
||||
exception: error,
|
||||
),
|
||||
loading: () => SiteSearch(
|
||||
domain: url.host,
|
||||
availableBangs: [
|
||||
BangData(
|
||||
websiteName: 'websiteName',
|
||||
domain: 'domain',
|
||||
trigger: 'trigger',
|
||||
urlTemplate: 'urlTemplate',
|
||||
error:
|
||||
(error, stackTrace) => FailureWidget(
|
||||
title: 'Could not load bangs',
|
||||
exception: error,
|
||||
),
|
||||
loading:
|
||||
() => SiteSearch(
|
||||
domain: url.host,
|
||||
availableBangs: [
|
||||
BangData(
|
||||
websiteName: 'websiteName',
|
||||
domain: 'domain',
|
||||
trigger: 'trigger',
|
||||
urlTemplate: 'urlTemplate',
|
||||
),
|
||||
],
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
),
|
||||
if (availableBangsAsync.isLoading ||
|
||||
@@ -241,31 +240,30 @@ class WebPageDialog extends HookConsumerWidget {
|
||||
leading: const Icon(Icons.mobile_screen_share),
|
||||
title: const Text('Share screenshot'),
|
||||
onTap: () async {
|
||||
final screenshot = await ref
|
||||
.read(selectedTabSessionNotifierProvider)
|
||||
.requestScreenshot();
|
||||
final screenshot =
|
||||
await ref
|
||||
.read(selectedTabSessionNotifierProvider)
|
||||
.requestScreenshot();
|
||||
|
||||
if (screenshot != null) {
|
||||
ui.decodeImageFromList(
|
||||
screenshot,
|
||||
(result) async {
|
||||
final png = await result.toByteData(
|
||||
format: ui.ImageByteFormat.png,
|
||||
ui.decodeImageFromList(screenshot, (
|
||||
result,
|
||||
) async {
|
||||
final png = await result.toByteData(
|
||||
format: ui.ImageByteFormat.png,
|
||||
);
|
||||
|
||||
if (png != null) {
|
||||
final file = XFile.fromData(
|
||||
png.buffer.asUint8List(),
|
||||
mimeType: 'image/png',
|
||||
);
|
||||
|
||||
if (png != null) {
|
||||
final file = XFile.fromData(
|
||||
png.buffer.asUint8List(),
|
||||
mimeType: 'image/png',
|
||||
);
|
||||
|
||||
await Share.shareXFiles(
|
||||
[file],
|
||||
subject: precachedInfo?.title,
|
||||
);
|
||||
}
|
||||
},
|
||||
);
|
||||
await Share.shareXFiles([
|
||||
file,
|
||||
], subject: precachedInfo?.title);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
if (context.mounted) {
|
||||
|
||||
@@ -53,8 +53,9 @@ class BrowserScreen extends HookConsumerWidget {
|
||||
final displayedSheet = ref.watch(bottomSheetControllerProvider);
|
||||
final displayedOverlayDialog = ref.watch(overlayDialogControllerProvider);
|
||||
|
||||
final selectedTabId =
|
||||
ref.watch(selectedTabStateProvider.select((value) => value?.id));
|
||||
final selectedTabId = ref.watch(
|
||||
selectedTabStateProvider.select((value) => value?.id),
|
||||
);
|
||||
|
||||
final trippleDotMenuController = useMenuController();
|
||||
final tabMenuController = useMenuController();
|
||||
@@ -65,16 +66,13 @@ class BrowserScreen extends HookConsumerWidget {
|
||||
|
||||
final activeKagiTool = useValueNotifier<KagiTool?>(null, [displayedSheet]);
|
||||
|
||||
ref.listen(
|
||||
overlayDialogControllerProvider,
|
||||
(previous, next) {
|
||||
if (next != null) {
|
||||
overlayController.show();
|
||||
} else {
|
||||
overlayController.hide();
|
||||
}
|
||||
},
|
||||
);
|
||||
ref.listen(overlayDialogControllerProvider, (previous, next) {
|
||||
if (next != null) {
|
||||
overlayController.show();
|
||||
} else {
|
||||
overlayController.hide();
|
||||
}
|
||||
});
|
||||
|
||||
// ref.listen(
|
||||
// generalSettingsRepositoryProvider
|
||||
@@ -96,8 +94,9 @@ class BrowserScreen extends HookConsumerWidget {
|
||||
bottomNavigationBar: Consumer(
|
||||
builder: (context, ref, child) {
|
||||
final tabInFullScreen = ref.watch(
|
||||
selectedTabStateProvider
|
||||
.select((value) => value?.isFullScreen ?? false),
|
||||
selectedTabStateProvider.select(
|
||||
(value) => value?.isFullScreen ?? false,
|
||||
),
|
||||
);
|
||||
|
||||
return Visibility(
|
||||
@@ -108,15 +107,17 @@ class BrowserScreen extends HookConsumerWidget {
|
||||
child: AppBar(
|
||||
automaticallyImplyLeading: false,
|
||||
titleSpacing: 8.0,
|
||||
title: (selectedTabId != null &&
|
||||
displayedSheet is! ViewTabsSheet)
|
||||
? Consumer(
|
||||
builder: (context, ref, child) {
|
||||
final tabState =
|
||||
ref.watch(tabStateProvider(selectedTabId));
|
||||
title:
|
||||
(selectedTabId != null &&
|
||||
displayedSheet is! ViewTabsSheet)
|
||||
? Consumer(
|
||||
builder: (context, ref, child) {
|
||||
final tabState = ref.watch(
|
||||
tabStateProvider(selectedTabId),
|
||||
);
|
||||
|
||||
return (tabState != null)
|
||||
? AppBarTitle(
|
||||
return (tabState != null)
|
||||
? AppBarTitle(
|
||||
tab: tabState,
|
||||
onTap: () async {
|
||||
await context.push(
|
||||
@@ -129,93 +130,95 @@ class BrowserScreen extends HookConsumerWidget {
|
||||
onDoubleTap: () async {
|
||||
final newUrl = await showDialog<Uri?>(
|
||||
context: context,
|
||||
builder: (context) => EditUrlDialog(
|
||||
initialUrl: tabState.url,
|
||||
),
|
||||
builder:
|
||||
(context) => EditUrlDialog(
|
||||
initialUrl: tabState.url,
|
||||
),
|
||||
);
|
||||
|
||||
if (newUrl != null) {
|
||||
await ref
|
||||
.read(
|
||||
tabSessionProvider(tabId: null)
|
||||
.notifier,
|
||||
tabSessionProvider(
|
||||
tabId: null,
|
||||
).notifier,
|
||||
)
|
||||
.loadUrl(url: newUrl);
|
||||
}
|
||||
},
|
||||
)
|
||||
: const SizedBox.shrink();
|
||||
},
|
||||
)
|
||||
: HookBuilder(
|
||||
builder: (context) {
|
||||
// final activeTool = useListenableSelector(
|
||||
// activeKagiTool,
|
||||
// () {
|
||||
// if (displayedSheet is CreateTabSheetWidget) {
|
||||
// return null;
|
||||
// }
|
||||
: const SizedBox.shrink();
|
||||
},
|
||||
)
|
||||
: HookBuilder(
|
||||
builder: (context) {
|
||||
// final activeTool = useListenableSelector(
|
||||
// activeKagiTool,
|
||||
// () {
|
||||
// if (displayedSheet is CreateTabSheetWidget) {
|
||||
// return null;
|
||||
// }
|
||||
|
||||
// return activeKagiTool.value;
|
||||
// },
|
||||
// );
|
||||
// return activeKagiTool.value;
|
||||
// },
|
||||
// );
|
||||
|
||||
return Row(
|
||||
children: [
|
||||
// IconButton(
|
||||
// color: (activeTool == KagiTool.search)
|
||||
// ? Theme.of(context).colorScheme.primary
|
||||
// : null,
|
||||
// onPressed: () async {
|
||||
// // ref
|
||||
// // .read(createTabStreamProvider.notifier)
|
||||
// // .createTab(
|
||||
// // CreateTabSheet(
|
||||
// // preferredTool: KagiTool.search,
|
||||
// // ),
|
||||
// // );
|
||||
// await context
|
||||
// .push(const SearchRoute().location);
|
||||
// },
|
||||
// icon: Icon(KagiTool.search.icon),
|
||||
// ),
|
||||
// IconButton(
|
||||
// color: (activeTool == KagiTool.summarizer)
|
||||
// ? Theme.of(context).colorScheme.primary
|
||||
// : null,
|
||||
// onPressed: () {
|
||||
// ref
|
||||
// .read(createTabStreamProvider.notifier)
|
||||
// .createTab(
|
||||
// CreateTabSheet(
|
||||
// preferredTool: KagiTool.summarizer,
|
||||
// ),
|
||||
// );
|
||||
// },
|
||||
// icon: Icon(KagiTool.summarizer.icon),
|
||||
// ),
|
||||
// if (showEarlyAccessFeatures)
|
||||
// IconButton(
|
||||
// color: (activeTool == KagiTool.assistant)
|
||||
// ? Theme.of(context).colorScheme.primary
|
||||
// : null,
|
||||
// onPressed: () {
|
||||
// ref
|
||||
// .read(
|
||||
// createTabStreamProvider.notifier,
|
||||
// )
|
||||
// .createTab(
|
||||
// CreateTabSheet(
|
||||
// preferredTool: KagiTool.assistant,
|
||||
// ),
|
||||
// );
|
||||
// },
|
||||
// icon: Icon(KagiTool.assistant.icon),
|
||||
// ),
|
||||
],
|
||||
);
|
||||
},
|
||||
),
|
||||
return Row(
|
||||
children: [
|
||||
// IconButton(
|
||||
// color: (activeTool == KagiTool.search)
|
||||
// ? Theme.of(context).colorScheme.primary
|
||||
// : null,
|
||||
// onPressed: () async {
|
||||
// // ref
|
||||
// // .read(createTabStreamProvider.notifier)
|
||||
// // .createTab(
|
||||
// // CreateTabSheet(
|
||||
// // preferredTool: KagiTool.search,
|
||||
// // ),
|
||||
// // );
|
||||
// await context
|
||||
// .push(const SearchRoute().location);
|
||||
// },
|
||||
// icon: Icon(KagiTool.search.icon),
|
||||
// ),
|
||||
// IconButton(
|
||||
// color: (activeTool == KagiTool.summarizer)
|
||||
// ? Theme.of(context).colorScheme.primary
|
||||
// : null,
|
||||
// onPressed: () {
|
||||
// ref
|
||||
// .read(createTabStreamProvider.notifier)
|
||||
// .createTab(
|
||||
// CreateTabSheet(
|
||||
// preferredTool: KagiTool.summarizer,
|
||||
// ),
|
||||
// );
|
||||
// },
|
||||
// icon: Icon(KagiTool.summarizer.icon),
|
||||
// ),
|
||||
// if (showEarlyAccessFeatures)
|
||||
// IconButton(
|
||||
// color: (activeTool == KagiTool.assistant)
|
||||
// ? Theme.of(context).colorScheme.primary
|
||||
// : null,
|
||||
// onPressed: () {
|
||||
// ref
|
||||
// .read(
|
||||
// createTabStreamProvider.notifier,
|
||||
// )
|
||||
// .createTab(
|
||||
// CreateTabSheet(
|
||||
// preferredTool: KagiTool.assistant,
|
||||
// ),
|
||||
// );
|
||||
// },
|
||||
// icon: Icon(KagiTool.assistant.icon),
|
||||
// ),
|
||||
],
|
||||
);
|
||||
},
|
||||
),
|
||||
actions: [
|
||||
if (selectedTabId != null &&
|
||||
displayedSheet is! ViewTabsSheet)
|
||||
@@ -278,9 +281,7 @@ class BrowserScreen extends HookConsumerWidget {
|
||||
MenuItemButton(
|
||||
onPressed: () async {
|
||||
await ref
|
||||
.read(
|
||||
tabRepositoryProvider.notifier,
|
||||
)
|
||||
.read(tabRepositoryProvider.notifier)
|
||||
.closeTab(selectedTabId);
|
||||
},
|
||||
leadingIcon: const Icon(Icons.close),
|
||||
@@ -488,8 +489,9 @@ class BrowserScreen extends HookConsumerWidget {
|
||||
if (selectedTabId != null)
|
||||
MenuItemButton(
|
||||
onPressed: () async {
|
||||
final tabState =
|
||||
ref.read(tabStateProvider(selectedTabId));
|
||||
final tabState = ref.read(
|
||||
tabStateProvider(selectedTabId),
|
||||
);
|
||||
|
||||
if (tabState?.url case final Uri url) {
|
||||
await ui_helper.launchUrlFeedback(context, url);
|
||||
@@ -501,8 +503,9 @@ class BrowserScreen extends HookConsumerWidget {
|
||||
if (selectedTabId != null)
|
||||
MenuItemButton(
|
||||
onPressed: () async {
|
||||
final tabState =
|
||||
ref.read(tabStateProvider(selectedTabId));
|
||||
final tabState = ref.read(
|
||||
tabStateProvider(selectedTabId),
|
||||
);
|
||||
|
||||
if (tabState?.url case final Uri url) {
|
||||
await Share.shareUri(url);
|
||||
@@ -530,8 +533,9 @@ class BrowserScreen extends HookConsumerWidget {
|
||||
MenuItemButton(
|
||||
onPressed: () async {
|
||||
final controller = ref.read(
|
||||
tabSessionProvider(tabId: selectedTabId)
|
||||
.notifier,
|
||||
tabSessionProvider(
|
||||
tabId: selectedTabId,
|
||||
).notifier,
|
||||
);
|
||||
|
||||
await controller.reload();
|
||||
@@ -545,39 +549,45 @@ class BrowserScreen extends HookConsumerWidget {
|
||||
Consumer(
|
||||
builder: (context, ref, child) {
|
||||
final history = ref.watch(
|
||||
tabStateProvider(selectedTabId)
|
||||
.select((value) => value?.historyState),
|
||||
tabStateProvider(
|
||||
selectedTabId,
|
||||
).select((value) => value?.historyState),
|
||||
);
|
||||
|
||||
return Row(
|
||||
children: [
|
||||
Expanded(
|
||||
child: (history?.canGoBack == true)
|
||||
? IconButton(
|
||||
onPressed: () async {
|
||||
final controller = ref.read(
|
||||
tabSessionProvider(
|
||||
tabId: selectedTabId,
|
||||
).notifier,
|
||||
);
|
||||
child:
|
||||
(history?.canGoBack == true)
|
||||
? IconButton(
|
||||
onPressed: () async {
|
||||
final controller = ref.read(
|
||||
tabSessionProvider(
|
||||
tabId: selectedTabId,
|
||||
).notifier,
|
||||
);
|
||||
|
||||
await controller.goBack();
|
||||
trippleDotMenuController.close();
|
||||
},
|
||||
icon: const Icon(Icons.arrow_back),
|
||||
)
|
||||
: IconButton(
|
||||
onPressed: () async {
|
||||
await ref
|
||||
.read(
|
||||
tabRepositoryProvider
|
||||
.notifier,
|
||||
)
|
||||
.closeTab(selectedTabId);
|
||||
trippleDotMenuController.close();
|
||||
},
|
||||
icon: const Icon(Icons.close),
|
||||
),
|
||||
await controller.goBack();
|
||||
trippleDotMenuController
|
||||
.close();
|
||||
},
|
||||
icon: const Icon(
|
||||
Icons.arrow_back,
|
||||
),
|
||||
)
|
||||
: IconButton(
|
||||
onPressed: () async {
|
||||
await ref
|
||||
.read(
|
||||
tabRepositoryProvider
|
||||
.notifier,
|
||||
)
|
||||
.closeTab(selectedTabId);
|
||||
trippleDotMenuController
|
||||
.close();
|
||||
},
|
||||
icon: const Icon(Icons.close),
|
||||
),
|
||||
),
|
||||
const SizedBox(
|
||||
height: 48,
|
||||
@@ -585,18 +595,20 @@ class BrowserScreen extends HookConsumerWidget {
|
||||
),
|
||||
Expanded(
|
||||
child: IconButton(
|
||||
onPressed: (history?.canGoForward == true)
|
||||
? () async {
|
||||
final controller = ref.read(
|
||||
tabSessionProvider(
|
||||
tabId: selectedTabId,
|
||||
).notifier,
|
||||
);
|
||||
onPressed:
|
||||
(history?.canGoForward == true)
|
||||
? () async {
|
||||
final controller = ref.read(
|
||||
tabSessionProvider(
|
||||
tabId: selectedTabId,
|
||||
).notifier,
|
||||
);
|
||||
|
||||
await controller.goForward();
|
||||
trippleDotMenuController.close();
|
||||
}
|
||||
: null,
|
||||
await controller.goForward();
|
||||
trippleDotMenuController
|
||||
.close();
|
||||
}
|
||||
: null,
|
||||
icon: const Icon(Icons.arrow_forward),
|
||||
),
|
||||
),
|
||||
@@ -640,20 +652,22 @@ class BrowserScreen extends HookConsumerWidget {
|
||||
return displayedOverlayDialog!;
|
||||
},
|
||||
child: Listener(
|
||||
onPointerDown: (displayedSheet != null)
|
||||
? (_) {
|
||||
ref
|
||||
.read(bottomSheetControllerProvider.notifier)
|
||||
.dismiss();
|
||||
}
|
||||
: null,
|
||||
onPointerDown:
|
||||
(displayedSheet != null)
|
||||
? (_) {
|
||||
ref
|
||||
.read(bottomSheetControllerProvider.notifier)
|
||||
.dismiss();
|
||||
}
|
||||
: null,
|
||||
child: HookConsumer(
|
||||
builder: (context, ref, child) {
|
||||
return BackButtonListener(
|
||||
onBackButtonPressed: () async {
|
||||
final tabState = (selectedTabId != null)
|
||||
? ref.read(tabStateProvider(selectedTabId))
|
||||
: null;
|
||||
final tabState =
|
||||
(selectedTabId != null)
|
||||
? ref.read(tabStateProvider(selectedTabId))
|
||||
: null;
|
||||
|
||||
final tabCount = ref.read(
|
||||
tabListProvider.select((tabs) => tabs.length),
|
||||
@@ -698,8 +712,9 @@ class BrowserScreen extends HookConsumerWidget {
|
||||
}
|
||||
|
||||
if (lastBackButtonPress.value != null &&
|
||||
DateTime.now()
|
||||
.difference(lastBackButtonPress.value!) <
|
||||
DateTime.now().difference(
|
||||
lastBackButtonPress.value!,
|
||||
) <
|
||||
const Duration(seconds: 2)) {
|
||||
lastBackButtonPress.value = null;
|
||||
|
||||
@@ -718,13 +733,14 @@ class BrowserScreen extends HookConsumerWidget {
|
||||
..clearSnackBars()
|
||||
..showSnackBar(
|
||||
SnackBar(
|
||||
content: (tabCount > 1)
|
||||
? const Text(
|
||||
'Please click BACK again to close current tab',
|
||||
)
|
||||
: const Text(
|
||||
'Please click BACK again to exit app',
|
||||
),
|
||||
content:
|
||||
(tabCount > 1)
|
||||
? const Text(
|
||||
'Please click BACK again to close current tab',
|
||||
)
|
||||
: const Text(
|
||||
'Please click BACK again to exit app',
|
||||
),
|
||||
),
|
||||
);
|
||||
|
||||
@@ -744,16 +760,16 @@ class BrowserScreen extends HookConsumerWidget {
|
||||
child: Consumer(
|
||||
builder: (context, ref, child) {
|
||||
final value = ref.watch(
|
||||
selectedTabStateProvider.select(
|
||||
(state) {
|
||||
if (state?.isLoading == true) {
|
||||
return state?.progress ?? 100;
|
||||
}
|
||||
selectedTabStateProvider.select((
|
||||
state,
|
||||
) {
|
||||
if (state?.isLoading == true) {
|
||||
return state?.progress ?? 100;
|
||||
}
|
||||
|
||||
//When not loading we assumed finished
|
||||
return 100;
|
||||
},
|
||||
),
|
||||
//When not loading we assumed finished
|
||||
return 100;
|
||||
}),
|
||||
);
|
||||
|
||||
return Visibility(
|
||||
@@ -774,11 +790,13 @@ class BrowserScreen extends HookConsumerWidget {
|
||||
final value = ref.watch(
|
||||
selectedTabStateProvider.select(
|
||||
(state) => EdgeInsets.only(
|
||||
bottom: (state?.isLoading == true &&
|
||||
state?.progress != null &&
|
||||
state!.progress < 100)
|
||||
? 4.0
|
||||
: 0.0,
|
||||
bottom:
|
||||
(state?.isLoading == true &&
|
||||
state?.progress !=
|
||||
null &&
|
||||
state!.progress < 100)
|
||||
? 4.0
|
||||
: 0.0,
|
||||
),
|
||||
),
|
||||
);
|
||||
@@ -794,7 +812,7 @@ class BrowserScreen extends HookConsumerWidget {
|
||||
ModalBarrier(
|
||||
color:
|
||||
Theme.of(context).dialogTheme.barrierColor ??
|
||||
Colors.black54,
|
||||
Colors.black54,
|
||||
),
|
||||
],
|
||||
),
|
||||
@@ -806,22 +824,25 @@ class BrowserScreen extends HookConsumerWidget {
|
||||
},
|
||||
),
|
||||
floatingActionButton: ReaderAppearanceButton(),
|
||||
bottomSheet: (displayedSheet != null)
|
||||
? NotificationListener<DraggableScrollableNotification>(
|
||||
onNotification: (notification) {
|
||||
if (notification.extent <= 0.1) {
|
||||
ref.read(bottomSheetControllerProvider.notifier).dismiss();
|
||||
return true;
|
||||
} else {
|
||||
ref
|
||||
.read(bottomSheetExtendProvider.notifier)
|
||||
.add(notification.extent);
|
||||
}
|
||||
bottomSheet:
|
||||
(displayedSheet != null)
|
||||
? NotificationListener<DraggableScrollableNotification>(
|
||||
onNotification: (notification) {
|
||||
if (notification.extent <= 0.1) {
|
||||
ref
|
||||
.read(bottomSheetControllerProvider.notifier)
|
||||
.dismiss();
|
||||
return true;
|
||||
} else {
|
||||
ref
|
||||
.read(bottomSheetExtendProvider.notifier)
|
||||
.add(notification.extent);
|
||||
}
|
||||
|
||||
return false;
|
||||
},
|
||||
child: switch (displayedSheet) {
|
||||
ViewTabsSheet() => HookBuilder(
|
||||
return false;
|
||||
},
|
||||
child: switch (displayedSheet) {
|
||||
ViewTabsSheet() => HookBuilder(
|
||||
builder: (localContext) {
|
||||
final draggableScrollableController =
|
||||
useDraggableScrollableController();
|
||||
@@ -855,7 +876,7 @@ class BrowserScreen extends HookConsumerWidget {
|
||||
);
|
||||
},
|
||||
),
|
||||
final CreateTabSheet parameter => DraggableScrollableSheet(
|
||||
final CreateTabSheet parameter => DraggableScrollableSheet(
|
||||
key: ValueKey(displayedSheet),
|
||||
expand: false,
|
||||
initialChildSize: 0.8,
|
||||
@@ -883,7 +904,7 @@ class BrowserScreen extends HookConsumerWidget {
|
||||
);
|
||||
},
|
||||
),
|
||||
final TabQaChatSheet parameter => HookBuilder(
|
||||
final TabQaChatSheet parameter => HookBuilder(
|
||||
builder: (localContext) {
|
||||
final draggableScrollableController =
|
||||
useDraggableScrollableController();
|
||||
@@ -937,9 +958,9 @@ class BrowserScreen extends HookConsumerWidget {
|
||||
);
|
||||
},
|
||||
),
|
||||
},
|
||||
)
|
||||
: null,
|
||||
},
|
||||
)
|
||||
: null,
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
+12
-26
@@ -31,15 +31,9 @@ class AppBarTitle extends StatelessWidget {
|
||||
size: 14,
|
||||
);
|
||||
} else if (!tab.isLoading) {
|
||||
return const Icon(
|
||||
MdiIcons.lock,
|
||||
size: 14,
|
||||
);
|
||||
return const Icon(MdiIcons.lock, size: 14);
|
||||
} else {
|
||||
return const Icon(
|
||||
MdiIcons.timerSand,
|
||||
size: 14,
|
||||
);
|
||||
return const Icon(MdiIcons.timerSand, size: 14);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -54,19 +48,11 @@ class AppBarTitle extends StatelessWidget {
|
||||
Skeletonizer(
|
||||
enabled: tab.icon == null,
|
||||
child: Skeleton.replace(
|
||||
replacement: const Bone.icon(
|
||||
size: 16,
|
||||
),
|
||||
child: RawImage(
|
||||
image: tab.icon?.value,
|
||||
height: 16,
|
||||
width: 16,
|
||||
),
|
||||
replacement: const Bone.icon(size: 16),
|
||||
child: RawImage(image: tab.icon?.value, height: 16, width: 16),
|
||||
),
|
||||
),
|
||||
const SizedBox(
|
||||
width: 8,
|
||||
),
|
||||
const SizedBox(width: 8),
|
||||
Expanded(
|
||||
child: Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
@@ -82,8 +68,9 @@ class AppBarTitle extends StatelessWidget {
|
||||
child: TextScroll(
|
||||
key: ValueKey(tab.title),
|
||||
tab.title,
|
||||
style: theme.textTheme.bodyLarge
|
||||
?.copyWith(color: theme.colorScheme.onSurface),
|
||||
style: theme.textTheme.bodyLarge?.copyWith(
|
||||
color: theme.colorScheme.onSurface,
|
||||
),
|
||||
// mode: TextScrollMode.bouncing,
|
||||
velocity: const Velocity(pixelsPerSecond: Offset(75, 0)),
|
||||
delayBefore: const Duration(milliseconds: 500),
|
||||
@@ -99,14 +86,13 @@ class AppBarTitle extends StatelessWidget {
|
||||
Row(
|
||||
children: [
|
||||
_securityStatusIcon(context),
|
||||
const SizedBox(
|
||||
width: 4,
|
||||
),
|
||||
const SizedBox(width: 4),
|
||||
Expanded(
|
||||
child: Text(
|
||||
tab.url.authority,
|
||||
style: theme.textTheme.bodyMedium
|
||||
?.copyWith(color: theme.colorScheme.onSurface),
|
||||
style: theme.textTheme.bodyMedium?.copyWith(
|
||||
color: theme.colorScheme.onSurface,
|
||||
),
|
||||
),
|
||||
),
|
||||
],
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user