first implementation finished

This commit is contained in:
Fabian Freund
2024-04-22 11:21:01 +02:00
parent 1a13ca0795
commit 0e1972242a
102 changed files with 7192 additions and 55 deletions
@@ -0,0 +1,53 @@
import 'dart:async';
import 'package:collection/collection.dart';
import 'package:kagi_bang_bang/domain/entities/received_parameter.dart';
import 'package:kagi_bang_bang/features/app_widget/domain/services/home_widget.dart';
import 'package:kagi_bang_bang/features/search_browser/domain/entities/modes.dart';
import 'package:kagi_bang_bang/features/search_browser/domain/entities/sheet.dart';
import 'package:kagi_bang_bang/features/share_intent/domain/services/sharing_intent.dart';
import 'package:riverpod_annotation/riverpod_annotation.dart';
import 'package:rxdart/rxdart.dart';
part 'create_tab.g.dart';
final _parameterToCreateTabTransformer =
StreamTransformer<ReceivedParameter, CreateTab>.fromHandlers(
handleData: (parameter, sink) {
final createTab = CreateTab(
preferredTool: KagiTool.values
.firstWhereOrNull((tool) => tool.name == parameter.tool),
content: parameter.content,
);
if (createTab.hasParameters) {
sink.add(createTab);
}
},
);
@Riverpod()
class CreateTabStream extends _$CreateTabStream {
late StreamController<CreateTab> _streamController;
@override
Stream<CreateTab> build() {
_streamController = StreamController();
ref.onDispose(() async {
await _streamController.close();
});
final sharingItentStream = ref.watch(sharingIntentStreamProvider);
final appWidgetLaunchStream = ref.watch(appWidgetLaunchStreamProvider);
return MergeStream([
sharingItentStream.transform(_parameterToCreateTabTransformer),
appWidgetLaunchStream.transform(_parameterToCreateTabTransformer),
_streamController.stream,
]);
}
void createTab(CreateTab parameter) {
_streamController.add(parameter);
}
}
@@ -0,0 +1,26 @@
// GENERATED CODE - DO NOT MODIFY BY HAND
part of 'create_tab.dart';
// **************************************************************************
// RiverpodGenerator
// **************************************************************************
String _$createTabStreamHash() => r'3e85020edbebf3ec9927dba6d05af9f06a360a14';
/// See also [CreateTabStream].
@ProviderFor(CreateTabStream)
final createTabStreamProvider =
AutoDisposeStreamNotifierProvider<CreateTabStream, CreateTab>.internal(
CreateTabStream.new,
name: r'createTabStreamProvider',
debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product')
? null
: _$createTabStreamHash,
dependencies: null,
allTransitiveDependencies: null,
);
typedef _$CreateTabStream = AutoDisposeStreamNotifier<CreateTab>;
// ignore_for_file: type=lint
// ignore_for_file: subtype_of_sealed_class, invalid_use_of_internal_member, invalid_use_of_visible_for_testing_member
@@ -0,0 +1,53 @@
import 'dart:async';
import 'package:flutter_inappwebview/flutter_inappwebview.dart';
import 'package:riverpod_annotation/riverpod_annotation.dart';
part 'session.g.dart';
@Riverpod()
class SessionService extends _$SessionService {
final _cookieManager = CookieManager.instance();
Future<void> setKagiSession(String session) async {
await _cookieManager.setCookie(
url: WebUri.uri(Uri.https('kagi.com')),
name: 'kagi_session',
value: session,
domain: 'kagi.com',
isHttpOnly: true,
isSecure: true,
sameSite: HTTPCookieSameSitePolicy.LAX,
);
}
Future<void> clearAllData() async {
await _cookieManager.deleteAllCookies();
final webViewLoaded = Completer<void>();
final headlessWebView = HeadlessInAppWebView(
initialSettings: InAppWebViewSettings(
//Clears all data on (just) Android
incognito: true,
//Clear other stuff
clearCache: true,
clearSessionCache: true,
),
onWebViewCreated: (controller) {
//wait until settings are applied for sure
webViewLoaded.complete();
},
);
unawaited(headlessWebView.run());
await webViewLoaded.future.whenComplete(() => headlessWebView..dispose());
}
void initializationDone() {
state = true;
}
@override
bool build() => false;
}
@@ -0,0 +1,26 @@
// GENERATED CODE - DO NOT MODIFY BY HAND
part of 'session.dart';
// **************************************************************************
// RiverpodGenerator
// **************************************************************************
String _$sessionServiceHash() => r'48126bad2cb8d5c38296307bede64bf549365acf';
/// See also [SessionService].
@ProviderFor(SessionService)
final sessionServiceProvider =
AutoDisposeNotifierProvider<SessionService, bool>.internal(
SessionService.new,
name: r'sessionServiceProvider',
debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product')
? null
: _$sessionServiceHash,
dependencies: null,
allTransitiveDependencies: null,
);
typedef _$SessionService = AutoDisposeNotifier<bool>;
// ignore_for_file: type=lint
// ignore_for_file: subtype_of_sealed_class, invalid_use_of_internal_member, invalid_use_of_visible_for_testing_member