intermediate

This commit is contained in:
Fabian Freund
2025-01-23 14:03:55 +01:00
parent bd45ed64ee
commit 78c17a70c5
122 changed files with 8730 additions and 1662 deletions
@@ -0,0 +1,152 @@
// ignore_for_file: avoid_dynamic_calls
import 'dart:convert';
import 'package:collection/collection.dart';
import 'package:flutter_chat_core/flutter_chat_core.dart';
import 'package:langchain/langchain.dart';
import 'package:lensai/features/chat/features/chat_store/data/models/message_types.dart';
class ChatMemory implements BaseMemory {
final ChatController _controller;
/// Max number of tokens to use.
final int maxTokenLimit;
/// Language model to use for counting tokens.
final BaseLanguageModel llm;
/// The memory key to use for the chat history.
/// This will be passed as input variable to the prompt.
final String memoryKey;
/// If true, when [loadMemoryVariables] is called, it will return
/// [ChatMessage] objects. If false, it will return a String representation
/// of the messages.
///
/// Set this to true when you are using a Chat model like `ChatOpenAI`.
/// Set this to false when you are use a text LLM like `OpenAI`.
final bool returnMessages;
/// The prefix to use for system messages if [returnMessages] is false.
final String systemPrefix;
/// The prefix to use for human messages if [returnMessages] is false.
final String humanPrefix;
/// The prefix to use for AI messages if [returnMessages] is false.
final String aiPrefix;
/// The prefix to use for tool messages if [returnMessages] is false.
final String toolPrefix;
ChatMemory(
this._controller, {
required this.returnMessages,
this.maxTokenLimit = 2000,
required this.llm,
this.memoryKey = BaseMemory.defaultMemoryKey,
this.systemPrefix = SystemChatMessage.defaultPrefix,
this.humanPrefix = HumanChatMessage.defaultPrefix,
this.aiPrefix = AIChatMessage.defaultPrefix,
this.toolPrefix = ToolChatMessage.defaultPrefix,
});
@override
Set<String> get memoryKeys => {memoryKey};
@override
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();
int currentBufferLength = await llm.countTokens(PromptValue.chat(messages));
// Prune buffer if it exceeds max token limit
if (currentBufferLength > maxTokenLimit) {
while (currentBufferLength > maxTokenLimit) {
//remove oldest entry
messages.removeAt(0);
currentBufferLength = await llm.countTokens(PromptValue.chat(messages));
}
}
if (returnMessages) {
return {memoryKey: messages};
}
return {
memoryKey: messages.toBufferString(
systemPrefix: systemPrefix,
humanPrefix: humanPrefix,
aiPrefix: aiPrefix,
toolPrefix: toolPrefix,
),
};
}
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();
return tools;
}
@override
Future<void> saveContext({
required MemoryInputValues inputValues,
required MemoryOutputValues outputValues,
}) {
throw UnimplementedError('This is a read only memory');
}
@override
Future<void> clear() {
throw UnimplementedError('This is a read only memory');
}
}
@@ -0,0 +1,169 @@
import 'dart:async';
import 'dart:convert';
import 'package:collection/collection.dart';
import 'package:flutter_chat_core/flutter_chat_core.dart';
import 'package:lensai/features/chat/features/chat_store/data/database/daos/messages.dart';
import 'package:rxdart/rxdart.dart';
class DriftChatController implements ChatController {
final MessagesDao _dao;
final String chatId;
final _operationsController = StreamController<ChatOperation>.broadcast();
late final ValueStream<List<Message>> _mergedMessagesStream;
late final StreamSubscription<List<Message>> _mergedMessagesStreamSub;
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();
_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,
];
}
return a;
},
).shareValue();
//Set initial messages
unawaited(
_mergedMessagesStream.first.then((messages) {
if (messages.isNotEmpty) {
_operationsController.add(ChatOperation.set());
}
}),
);
_mergedMessagesStreamSub = _mergedMessagesStream.listen(null);
}
@override
List<Message> get messages => _mergedMessagesStream.valueOrNull ?? [];
@override
Future<void> insert(Message message, {int? index}) async {
final insertedIndex = await _dao.insertMessage(
chatId: chatId,
message: message,
index: index,
);
if (insertedIndex != null) {
await _mergedMessagesStream
.firstWhere(
(messages) =>
messages.length > insertedIndex &&
messages[insertedIndex].id == message.id,
)
.timeout(const Duration(milliseconds: 100));
_operationsController.add(ChatOperation.insert(message, insertedIndex));
}
}
@override
Future<void> remove(Message message) async {
final index = await _dao
.messageIndex(chatId: chatId, messageId: message.id)
.getSingleOrNull();
if (index != null) {
await _dao.removeMessage(messageId: message.id);
await _mergedMessagesStream
.firstWhere(
(messages) =>
!messages.any((dbMessage) => dbMessage.id == message.id),
)
.timeout(const Duration(milliseconds: 100));
_operationsController.add(ChatOperation.remove(message, index));
}
}
@override
Future<void> update(
Message oldMessage,
Message newMessage, {
bool persistMessage = true,
}) async {
assert(oldMessage.id == newMessage.id);
if (persistMessage) {
final intermediateMessage = _intermediateMessages.value[newMessage.id];
if (intermediateMessage == null && oldMessage == newMessage) {
//nothing to update
return;
}
final rows = await _dao.updateMessage(
messageId: oldMessage.id,
message: newMessage,
);
if (intermediateMessage != null) {
_intermediateMessages.add(
{..._intermediateMessages.value}..remove(newMessage.id),
);
}
if (rows <= 0 || intermediateMessage == newMessage) {
//Dont send event
return;
}
} else if (oldMessage != newMessage) {
_intermediateMessages.add({
..._intermediateMessages.value,
newMessage.id: newMessage,
});
}
await _mergedMessagesStream
.firstWhere(
(messages) => messages.any((message) => message == newMessage),
)
.timeout(const Duration(milliseconds: 100));
_operationsController.add(ChatOperation.update(oldMessage, newMessage));
}
@override
Future<void> set(List<Message> messages) async {
await _dao.replaceChatMessages(chatId: chatId, messages: messages);
await _mergedMessagesStream
.firstWhere(
(replacedMessages) =>
const DeepCollectionEquality().equals(messages, replacedMessages),
)
.timeout(const Duration(milliseconds: 100));
_operationsController.add(ChatOperation.set());
}
@override
Stream<ChatOperation> get operationsStream => _operationsController.stream;
@override
void dispose() {
unawaited(_intermediateMessages.close());
unawaited(_mergedMessagesStreamSub.cancel());
unawaited(_operationsController.close());
}
}
@@ -0,0 +1,25 @@
import 'package:lensai/features/chat/features/chat_store/data/models/chat_metadata.dart';
import 'package:lensai/features/chat/features/chat_store/data/providers.dart';
import 'package:lensai/features/chat/features/chat_store/domain/drift_chat_controller.dart';
import 'package:riverpod/riverpod.dart';
import 'package:riverpod_annotation/riverpod_annotation.dart';
part 'providers.g.dart';
@Riverpod()
DriftChatController chatController(Ref ref, String chatId) {
final db = ref.watch(chatDatabaseProvider);
final controller = DriftChatController(db.messagesDao, chatId: chatId);
ref.onDispose(() {
controller.dispose();
});
return controller;
}
@Riverpod()
Stream<ChatMetadata?> chatMetadata(Ref ref, String chatId) {
final db = ref.watch(chatDatabaseProvider);
return db.metadataDao.chatMetadata(chatId).watchSingleOrNull();
}
@@ -0,0 +1,292 @@
// GENERATED CODE - DO NOT MODIFY BY HAND
part of 'providers.dart';
// **************************************************************************
// RiverpodGenerator
// **************************************************************************
String _$chatControllerHash() => r'493264a4413ffc2d767d73a90634e1a1744cfcfd';
/// Copied from Dart SDK
class _SystemHash {
_SystemHash._();
static int combine(int hash, int value) {
// ignore: parameter_assignments
hash = 0x1fffffff & (hash + value);
// ignore: parameter_assignments
hash = 0x1fffffff & (hash + ((0x0007ffff & hash) << 10));
return hash ^ (hash >> 6);
}
static int finish(int hash) {
// ignore: parameter_assignments
hash = 0x1fffffff & (hash + ((0x03ffffff & hash) << 3));
// ignore: parameter_assignments
hash = hash ^ (hash >> 11);
return 0x1fffffff & (hash + ((0x00003fff & hash) << 15));
}
}
/// See also [chatController].
@ProviderFor(chatController)
const chatControllerProvider = ChatControllerFamily();
/// See also [chatController].
class ChatControllerFamily extends Family<DriftChatController> {
/// See also [chatController].
const ChatControllerFamily();
/// See also [chatController].
ChatControllerProvider call(
String chatId,
) {
return ChatControllerProvider(
chatId,
);
}
@override
ChatControllerProvider getProviderOverride(
covariant ChatControllerProvider provider,
) {
return call(
provider.chatId,
);
}
static const Iterable<ProviderOrFamily>? _dependencies = null;
@override
Iterable<ProviderOrFamily>? get dependencies => _dependencies;
static const Iterable<ProviderOrFamily>? _allTransitiveDependencies = null;
@override
Iterable<ProviderOrFamily>? get allTransitiveDependencies =>
_allTransitiveDependencies;
@override
String? get name => r'chatControllerProvider';
}
/// 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._internal(
super._createNotifier, {
required super.name,
required super.dependencies,
required super.allTransitiveDependencies,
required super.debugGetCreateSourceHash,
required super.from,
required this.chatId,
}) : super.internal();
final String chatId;
@override
Override overrideWith(
DriftChatController Function(ChatControllerRef provider) create,
) {
return ProviderOverride(
origin: this,
override: ChatControllerProvider._internal(
(ref) => create(ref as ChatControllerRef),
from: from,
name: null,
dependencies: null,
allTransitiveDependencies: null,
debugGetCreateSourceHash: null,
chatId: chatId,
),
);
}
@override
AutoDisposeProviderElement<DriftChatController> createElement() {
return _ChatControllerProviderElement(this);
}
@override
bool operator ==(Object other) {
return other is ChatControllerProvider && other.chatId == chatId;
}
@override
int get hashCode {
var hash = _SystemHash.combine(0, runtimeType.hashCode);
hash = _SystemHash.combine(hash, chatId.hashCode);
return _SystemHash.finish(hash);
}
}
@Deprecated('Will be removed in 3.0. Use Ref instead')
// ignore: unused_element
mixin ChatControllerRef on AutoDisposeProviderRef<DriftChatController> {
/// The parameter `chatId` of this provider.
String get chatId;
}
class _ChatControllerProviderElement
extends AutoDisposeProviderElement<DriftChatController>
with ChatControllerRef {
_ChatControllerProviderElement(super.provider);
@override
String get chatId => (origin as ChatControllerProvider).chatId;
}
String _$chatMetadataHash() => r'22252e4a4c4e9cb039c5eee0e0f6eb5b8bd03944';
/// See also [chatMetadata].
@ProviderFor(chatMetadata)
const chatMetadataProvider = ChatMetadataFamily();
/// See also [chatMetadata].
class ChatMetadataFamily extends Family<AsyncValue<ChatMetadata?>> {
/// See also [chatMetadata].
const ChatMetadataFamily();
/// See also [chatMetadata].
ChatMetadataProvider call(
String chatId,
) {
return ChatMetadataProvider(
chatId,
);
}
@override
ChatMetadataProvider getProviderOverride(
covariant ChatMetadataProvider provider,
) {
return call(
provider.chatId,
);
}
static const Iterable<ProviderOrFamily>? _dependencies = null;
@override
Iterable<ProviderOrFamily>? get dependencies => _dependencies;
static const Iterable<ProviderOrFamily>? _allTransitiveDependencies = null;
@override
Iterable<ProviderOrFamily>? get allTransitiveDependencies =>
_allTransitiveDependencies;
@override
String? get name => r'chatMetadataProvider';
}
/// 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._internal(
super._createNotifier, {
required super.name,
required super.dependencies,
required super.allTransitiveDependencies,
required super.debugGetCreateSourceHash,
required super.from,
required this.chatId,
}) : super.internal();
final String chatId;
@override
Override overrideWith(
Stream<ChatMetadata?> Function(ChatMetadataRef provider) create,
) {
return ProviderOverride(
origin: this,
override: ChatMetadataProvider._internal(
(ref) => create(ref as ChatMetadataRef),
from: from,
name: null,
dependencies: null,
allTransitiveDependencies: null,
debugGetCreateSourceHash: null,
chatId: chatId,
),
);
}
@override
AutoDisposeStreamProviderElement<ChatMetadata?> createElement() {
return _ChatMetadataProviderElement(this);
}
@override
bool operator ==(Object other) {
return other is ChatMetadataProvider && other.chatId == chatId;
}
@override
int get hashCode {
var hash = _SystemHash.combine(0, runtimeType.hashCode);
hash = _SystemHash.combine(hash, chatId.hashCode);
return _SystemHash.finish(hash);
}
}
@Deprecated('Will be removed in 3.0. Use Ref instead')
// ignore: unused_element
mixin ChatMetadataRef on AutoDisposeStreamProviderRef<ChatMetadata?> {
/// The parameter `chatId` of this provider.
String get chatId;
}
class _ChatMetadataProviderElement
extends AutoDisposeStreamProviderElement<ChatMetadata?>
with ChatMetadataRef {
_ChatMetadataProviderElement(super.provider);
@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
@@ -0,0 +1,87 @@
import 'package:collection/collection.dart';
import 'package:exceptions/exceptions.dart';
import 'package:flutter_chat_core/flutter_chat_core.dart';
import 'package:langchain/langchain.dart';
import 'package:lensai/core/uuid.dart';
import 'package:lensai/features/chat/features/chat_store/data/models/message_types.dart';
import 'package:lensai/features/chat/features/chat_store/domain/drift_chat_controller.dart';
import 'package:lensai/features/chat/features/chat_store/domain/providers.dart';
import 'package:riverpod_annotation/riverpod_annotation.dart';
part 'chat_message.g.dart';
@Riverpod()
class ChatMessageRepository extends _$ChatMessageRepository {
late DriftChatController _controller;
final _isTyping = <MessageAuthor>{};
bool isTyping(MessageAuthor author) => _isTyping.contains(author);
Future<void> setTyping({
required MessageAuthor author,
required bool typing,
}) async {
if (isTyping(author) == typing) {
return;
}
if (typing) {
await _controller.insert(
CustomMessage(
id: uuid.v4(),
authorId: author.user.id,
createdAt: DateTime.now().toUtc(),
metadata: {
'type': 'typing',
},
),
);
_isTyping.add(author);
} else {
final typingMessages = _controller.messages.where(
(message) =>
message.authorId == author.user.id &&
message.metadata?['type'] == 'typing',
);
await Future.wait(
typingMessages.map((message) => _controller.remove(message)),
);
_isTyping.remove(author);
}
}
Future<Result<TextMessage>> insertTextMessage({
required MessageAuthor author,
required String content,
List<AIChatMessageToolCall>? toolCalls,
bool hideFromModelChatHistory = false,
}) async {
final message = TextMessage(
id: uuid.v4(),
authorId: author.user.id,
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,
);
return Result.fromAsync(() async {
await _controller.insert(message);
return message;
});
}
@override
void build(String chatId) {
_controller = ref.watch(chatControllerProvider(chatId));
}
}
@@ -0,0 +1,177 @@
// GENERATED CODE - DO NOT MODIFY BY HAND
part of 'chat_message.dart';
// **************************************************************************
// RiverpodGenerator
// **************************************************************************
String _$chatMessageRepositoryHash() =>
r'a4144618b339f7c0c329a01a294b6bebbb648bf6';
/// Copied from Dart SDK
class _SystemHash {
_SystemHash._();
static int combine(int hash, int value) {
// ignore: parameter_assignments
hash = 0x1fffffff & (hash + value);
// ignore: parameter_assignments
hash = 0x1fffffff & (hash + ((0x0007ffff & hash) << 10));
return hash ^ (hash >> 6);
}
static int finish(int hash) {
// ignore: parameter_assignments
hash = 0x1fffffff & (hash + ((0x03ffffff & hash) << 3));
// ignore: parameter_assignments
hash = hash ^ (hash >> 11);
return 0x1fffffff & (hash + ((0x00003fff & hash) << 15));
}
}
abstract class _$ChatMessageRepository
extends BuildlessAutoDisposeNotifier<void> {
late final String chatId;
void build(
String chatId,
);
}
/// See also [ChatMessageRepository].
@ProviderFor(ChatMessageRepository)
const chatMessageRepositoryProvider = ChatMessageRepositoryFamily();
/// See also [ChatMessageRepository].
class ChatMessageRepositoryFamily extends Family<void> {
/// See also [ChatMessageRepository].
const ChatMessageRepositoryFamily();
/// See also [ChatMessageRepository].
ChatMessageRepositoryProvider call(
String chatId,
) {
return ChatMessageRepositoryProvider(
chatId,
);
}
@override
ChatMessageRepositoryProvider getProviderOverride(
covariant ChatMessageRepositoryProvider provider,
) {
return call(
provider.chatId,
);
}
static const Iterable<ProviderOrFamily>? _dependencies = null;
@override
Iterable<ProviderOrFamily>? get dependencies => _dependencies;
static const Iterable<ProviderOrFamily>? _allTransitiveDependencies = null;
@override
Iterable<ProviderOrFamily>? get allTransitiveDependencies =>
_allTransitiveDependencies;
@override
String? get name => r'chatMessageRepositoryProvider';
}
/// See also [ChatMessageRepository].
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._internal(
super._createNotifier, {
required super.name,
required super.dependencies,
required super.allTransitiveDependencies,
required super.debugGetCreateSourceHash,
required super.from,
required this.chatId,
}) : super.internal();
final String chatId;
@override
void runNotifierBuild(
covariant ChatMessageRepository notifier,
) {
return notifier.build(
chatId,
);
}
@override
Override overrideWith(ChatMessageRepository Function() create) {
return ProviderOverride(
origin: this,
override: ChatMessageRepositoryProvider._internal(
() => create()..chatId = chatId,
from: from,
name: null,
dependencies: null,
allTransitiveDependencies: null,
debugGetCreateSourceHash: null,
chatId: chatId,
),
);
}
@override
AutoDisposeNotifierProviderElement<ChatMessageRepository, void>
createElement() {
return _ChatMessageRepositoryProviderElement(this);
}
@override
bool operator ==(Object other) {
return other is ChatMessageRepositoryProvider && other.chatId == chatId;
}
@override
int get hashCode {
var hash = _SystemHash.combine(0, runtimeType.hashCode);
hash = _SystemHash.combine(hash, chatId.hashCode);
return _SystemHash.finish(hash);
}
}
@Deprecated('Will be removed in 3.0. Use Ref instead')
// ignore: unused_element
mixin ChatMessageRepositoryRef on AutoDisposeNotifierProviderRef<void> {
/// The parameter `chatId` of this provider.
String get chatId;
}
class _ChatMessageRepositoryProviderElement
extends AutoDisposeNotifierProviderElement<ChatMessageRepository, void>
with ChatMessageRepositoryRef {
_ChatMessageRepositoryProviderElement(super.provider);
@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
@@ -0,0 +1,23 @@
import 'package:exceptions/exceptions.dart';
import 'package:lensai/features/chat/features/chat_store/data/database/database.dart';
import 'package:lensai/features/chat/features/chat_store/data/models/chat_metadata.dart';
import 'package:lensai/features/chat/features/chat_store/data/providers.dart';
import 'package:riverpod_annotation/riverpod_annotation.dart';
part 'chat_metadata.g.dart';
@Riverpod()
class ChatMetadataRepository extends _$ChatMetadataRepository {
late ChatDatabase _db;
Future<Result<void>> updateMetadata(ChatMetadata metadata) {
return Result.fromAsync(() {
return _db.metadataDao.updateChatMetadata(chatId, metadata);
});
}
@override
void build(String chatId) {
_db = ref.watch(chatDatabaseProvider);
}
}
@@ -0,0 +1,177 @@
// GENERATED CODE - DO NOT MODIFY BY HAND
part of 'chat_metadata.dart';
// **************************************************************************
// RiverpodGenerator
// **************************************************************************
String _$chatMetadataRepositoryHash() =>
r'72a0226ed7e87f452f4dfe44594bb30663c2db45';
/// Copied from Dart SDK
class _SystemHash {
_SystemHash._();
static int combine(int hash, int value) {
// ignore: parameter_assignments
hash = 0x1fffffff & (hash + value);
// ignore: parameter_assignments
hash = 0x1fffffff & (hash + ((0x0007ffff & hash) << 10));
return hash ^ (hash >> 6);
}
static int finish(int hash) {
// ignore: parameter_assignments
hash = 0x1fffffff & (hash + ((0x03ffffff & hash) << 3));
// ignore: parameter_assignments
hash = hash ^ (hash >> 11);
return 0x1fffffff & (hash + ((0x00003fff & hash) << 15));
}
}
abstract class _$ChatMetadataRepository
extends BuildlessAutoDisposeNotifier<void> {
late final String chatId;
void build(
String chatId,
);
}
/// See also [ChatMetadataRepository].
@ProviderFor(ChatMetadataRepository)
const chatMetadataRepositoryProvider = ChatMetadataRepositoryFamily();
/// See also [ChatMetadataRepository].
class ChatMetadataRepositoryFamily extends Family<void> {
/// See also [ChatMetadataRepository].
const ChatMetadataRepositoryFamily();
/// See also [ChatMetadataRepository].
ChatMetadataRepositoryProvider call(
String chatId,
) {
return ChatMetadataRepositoryProvider(
chatId,
);
}
@override
ChatMetadataRepositoryProvider getProviderOverride(
covariant ChatMetadataRepositoryProvider provider,
) {
return call(
provider.chatId,
);
}
static const Iterable<ProviderOrFamily>? _dependencies = null;
@override
Iterable<ProviderOrFamily>? get dependencies => _dependencies;
static const Iterable<ProviderOrFamily>? _allTransitiveDependencies = null;
@override
Iterable<ProviderOrFamily>? get allTransitiveDependencies =>
_allTransitiveDependencies;
@override
String? get name => r'chatMetadataRepositoryProvider';
}
/// See also [ChatMetadataRepository].
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._internal(
super._createNotifier, {
required super.name,
required super.dependencies,
required super.allTransitiveDependencies,
required super.debugGetCreateSourceHash,
required super.from,
required this.chatId,
}) : super.internal();
final String chatId;
@override
void runNotifierBuild(
covariant ChatMetadataRepository notifier,
) {
return notifier.build(
chatId,
);
}
@override
Override overrideWith(ChatMetadataRepository Function() create) {
return ProviderOverride(
origin: this,
override: ChatMetadataRepositoryProvider._internal(
() => create()..chatId = chatId,
from: from,
name: null,
dependencies: null,
allTransitiveDependencies: null,
debugGetCreateSourceHash: null,
chatId: chatId,
),
);
}
@override
AutoDisposeNotifierProviderElement<ChatMetadataRepository, void>
createElement() {
return _ChatMetadataRepositoryProviderElement(this);
}
@override
bool operator ==(Object other) {
return other is ChatMetadataRepositoryProvider && other.chatId == chatId;
}
@override
int get hashCode {
var hash = _SystemHash.combine(0, runtimeType.hashCode);
hash = _SystemHash.combine(hash, chatId.hashCode);
return _SystemHash.finish(hash);
}
}
@Deprecated('Will be removed in 3.0. Use Ref instead')
// ignore: unused_element
mixin ChatMetadataRepositoryRef on AutoDisposeNotifierProviderRef<void> {
/// The parameter `chatId` of this provider.
String get chatId;
}
class _ChatMetadataRepositoryProviderElement
extends AutoDisposeNotifierProviderElement<ChatMetadataRepository, void>
with ChatMetadataRepositoryRef {
_ChatMetadataRepositoryProviderElement(super.provider);
@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