2025-03-23 21:53:05 +08:00
|
|
|
import 'dart:async';
|
|
|
|
|
2025-03-24 14:15:20 +08:00
|
|
|
import 'package:appflowy/ai/service/ai_model_state_notifier.dart';
|
2025-03-23 21:53:05 +08:00
|
|
|
import 'package:appflowy_backend/dispatch/dispatch.dart';
|
|
|
|
import 'package:appflowy_backend/protobuf/flowy-ai/entities.pbserver.dart';
|
|
|
|
import 'package:flutter_bloc/flutter_bloc.dart';
|
|
|
|
import 'package:freezed_annotation/freezed_annotation.dart';
|
|
|
|
|
|
|
|
part 'select_model_bloc.freezed.dart';
|
|
|
|
|
|
|
|
class SelectModelBloc extends Bloc<SelectModelEvent, SelectModelState> {
|
|
|
|
SelectModelBloc({
|
2025-03-24 14:15:20 +08:00
|
|
|
required AIModelStateNotifier aiModelStateNotifier,
|
|
|
|
}) : _aiModelStateNotifier = aiModelStateNotifier,
|
2025-03-25 22:59:20 +08:00
|
|
|
super(SelectModelState.initial(aiModelStateNotifier)) {
|
2025-03-23 21:53:05 +08:00
|
|
|
on<SelectModelEvent>(
|
2025-03-24 14:15:20 +08:00
|
|
|
(event, emit) {
|
|
|
|
event.when(
|
|
|
|
selectModel: (model) {
|
|
|
|
AIEventUpdateSelectedModel(
|
2025-03-23 21:53:05 +08:00
|
|
|
UpdateSelectedModelPB(
|
2025-03-24 14:15:20 +08:00
|
|
|
source: _aiModelStateNotifier.objectId,
|
2025-03-27 12:02:58 +08:00
|
|
|
selectedModel: model,
|
2025-03-23 21:53:05 +08:00
|
|
|
),
|
|
|
|
).send();
|
|
|
|
|
2025-03-24 14:15:20 +08:00
|
|
|
emit(state.copyWith(selectedModel: model));
|
|
|
|
},
|
|
|
|
didLoadModels: (models, selectedModel) {
|
2025-03-23 21:53:05 +08:00
|
|
|
emit(
|
2025-03-24 14:15:20 +08:00
|
|
|
SelectModelState(
|
|
|
|
models: models,
|
|
|
|
selectedModel: selectedModel,
|
2025-03-23 21:53:05 +08:00
|
|
|
),
|
|
|
|
);
|
|
|
|
},
|
|
|
|
);
|
|
|
|
},
|
|
|
|
);
|
2025-03-24 14:15:20 +08:00
|
|
|
|
|
|
|
_aiModelStateNotifier.addListener(
|
|
|
|
onAvailableModelsChanged: _onAvailableModelsChanged,
|
|
|
|
);
|
2025-03-23 21:53:05 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
final AIModelStateNotifier _aiModelStateNotifier;
|
|
|
|
|
|
|
|
@override
|
|
|
|
Future<void> close() async {
|
2025-03-24 14:15:20 +08:00
|
|
|
_aiModelStateNotifier.removeListener(
|
|
|
|
onAvailableModelsChanged: _onAvailableModelsChanged,
|
|
|
|
);
|
2025-03-23 21:53:05 +08:00
|
|
|
await super.close();
|
|
|
|
}
|
2025-03-24 14:15:20 +08:00
|
|
|
|
2025-03-27 12:02:58 +08:00
|
|
|
void _onAvailableModelsChanged(
|
|
|
|
List<AIModelPB> models,
|
|
|
|
AIModelPB? selectedModel,
|
|
|
|
) {
|
2025-03-24 14:15:20 +08:00
|
|
|
if (!isClosed) {
|
|
|
|
add(SelectModelEvent.didLoadModels(models, selectedModel));
|
|
|
|
}
|
|
|
|
}
|
2025-03-23 21:53:05 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
@freezed
|
|
|
|
class SelectModelEvent with _$SelectModelEvent {
|
|
|
|
const factory SelectModelEvent.selectModel(
|
2025-03-27 12:02:58 +08:00
|
|
|
AIModelPB model,
|
2025-03-23 21:53:05 +08:00
|
|
|
) = _SelectModel;
|
|
|
|
|
|
|
|
const factory SelectModelEvent.didLoadModels(
|
2025-03-27 12:02:58 +08:00
|
|
|
List<AIModelPB> models,
|
|
|
|
AIModelPB? selectedModel,
|
2025-03-23 21:53:05 +08:00
|
|
|
) = _DidLoadModels;
|
|
|
|
}
|
|
|
|
|
|
|
|
@freezed
|
|
|
|
class SelectModelState with _$SelectModelState {
|
|
|
|
const factory SelectModelState({
|
2025-03-27 12:02:58 +08:00
|
|
|
required List<AIModelPB> models,
|
|
|
|
required AIModelPB? selectedModel,
|
2025-03-23 21:53:05 +08:00
|
|
|
}) = _SelectModelState;
|
2025-03-24 14:15:20 +08:00
|
|
|
|
2025-03-25 22:59:20 +08:00
|
|
|
factory SelectModelState.initial(AIModelStateNotifier notifier) {
|
|
|
|
final (models, selectedModel) = notifier.getAvailableModels();
|
|
|
|
return SelectModelState(
|
|
|
|
models: models,
|
|
|
|
selectedModel: selectedModel,
|
|
|
|
);
|
|
|
|
}
|
2025-03-23 21:53:05 +08:00
|
|
|
}
|