Skip to content

Commit 9c25769

Browse files
authored
Merge pull request #7649 from AppFlowy-IO/revert-7643-chore/improve-local-ai-setting-page
Revert "chore: improve local ai settings page"
2 parents 3a879b0 + 12a4bf6 commit 9c25769

File tree

17 files changed

+1031
-727
lines changed

17 files changed

+1031
-727
lines changed
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
import 'dart:async';
2+
3+
import 'package:appflowy_backend/dispatch/dispatch.dart';
4+
import 'package:bloc/bloc.dart';
5+
import 'package:freezed_annotation/freezed_annotation.dart';
6+
import 'package:url_launcher/url_launcher.dart' show launchUrl;
7+
part 'download_offline_ai_app_bloc.freezed.dart';
8+
9+
class DownloadOfflineAIBloc
10+
extends Bloc<DownloadOfflineAIEvent, DownloadOfflineAIState> {
11+
DownloadOfflineAIBloc() : super(const DownloadOfflineAIState()) {
12+
on<DownloadOfflineAIEvent>(_handleEvent);
13+
}
14+
15+
Future<void> _handleEvent(
16+
DownloadOfflineAIEvent event,
17+
Emitter<DownloadOfflineAIState> emit,
18+
) async {
19+
await event.when(
20+
started: () async {
21+
final result = await AIEventGetLocalAIDownloadLink().send();
22+
await result.fold(
23+
(app) async {
24+
await launchUrl(Uri.parse(app.link));
25+
},
26+
(err) {},
27+
);
28+
},
29+
);
30+
}
31+
}
32+
33+
@freezed
34+
class DownloadOfflineAIEvent with _$DownloadOfflineAIEvent {
35+
const factory DownloadOfflineAIEvent.started() = _Started;
36+
}
37+
38+
@freezed
39+
class DownloadOfflineAIState with _$DownloadOfflineAIState {
40+
const factory DownloadOfflineAIState() = _DownloadOfflineAIState;
41+
}
Lines changed: 59 additions & 86 deletions
Original file line numberDiff line numberDiff line change
@@ -1,121 +1,94 @@
11
import 'dart:async';
22

33
import 'package:appflowy_backend/dispatch/dispatch.dart';
4-
import 'package:appflowy_backend/log.dart';
54
import 'package:appflowy_backend/protobuf/flowy-ai/entities.pb.dart';
5+
import 'package:appflowy_backend/protobuf/flowy-error/errors.pb.dart';
66
import 'package:appflowy_result/appflowy_result.dart';
77
import 'package:bloc/bloc.dart';
88
import 'package:freezed_annotation/freezed_annotation.dart';
9-
10-
import 'local_llm_listener.dart';
11-
129
part 'local_ai_bloc.freezed.dart';
1310

14-
class LocalAiPluginBloc extends Bloc<LocalAiPluginEvent, LocalAiPluginState> {
15-
LocalAiPluginBloc() : super(const LoadingLocalAiPluginState()) {
16-
on<LocalAiPluginEvent>(_handleEvent);
17-
_startListening();
18-
_getLocalAiState();
19-
}
20-
21-
final listener = LocalAIStateListener();
22-
23-
@override
24-
Future<void> close() async {
25-
await listener.stop();
26-
return super.close();
11+
class LocalAIToggleBloc extends Bloc<LocalAIToggleEvent, LocalAIToggleState> {
12+
LocalAIToggleBloc() : super(const LocalAIToggleState()) {
13+
on<LocalAIToggleEvent>(_handleEvent);
2714
}
2815

2916
Future<void> _handleEvent(
30-
LocalAiPluginEvent event,
31-
Emitter<LocalAiPluginState> emit,
17+
LocalAIToggleEvent event,
18+
Emitter<LocalAIToggleState> emit,
3219
) async {
3320
await event.when(
34-
didReceiveAiState: (aiState) {
21+
started: () async {
22+
final result = await AIEventGetLocalAIState().send();
23+
_handleResult(emit, result);
24+
},
25+
toggle: () async {
3526
emit(
36-
ReadyLocalAiPluginState(
37-
isEnabled: aiState.enabled,
38-
runningState: aiState.state,
39-
lackOfResource:
40-
aiState.hasLackOfResource() ? aiState.lackOfResource : null,
27+
state.copyWith(
28+
pageIndicator: const LocalAIToggleStateIndicator.loading(),
4129
),
4230
);
43-
},
44-
didReceiveLackOfResources: (resources) {
45-
if (state case final ReadyLocalAiPluginState readyState) {
46-
emit(
47-
ReadyLocalAiPluginState(
48-
isEnabled: readyState.isEnabled,
49-
runningState: readyState.runningState,
50-
lackOfResource: resources,
51-
),
52-
);
53-
}
54-
},
55-
toggle: () async {
56-
emit(LoadingLocalAiPluginState());
57-
await AIEventToggleLocalAI().send().fold(
58-
(aiState) {
59-
add(LocalAiPluginEvent.didReceiveAiState(aiState));
60-
},
61-
Log.error,
31+
unawaited(
32+
AIEventToggleLocalAI().send().then(
33+
(result) {
34+
if (!isClosed) {
35+
add(LocalAIToggleEvent.handleResult(result));
36+
}
37+
},
38+
),
6239
);
6340
},
64-
restart: () async {
65-
emit(LoadingLocalAiPluginState());
66-
await AIEventRestartLocalAI().send();
41+
handleResult: (result) {
42+
_handleResult(emit, result);
6743
},
6844
);
6945
}
7046

71-
void _startListening() {
72-
listener.start(
73-
stateCallback: (pluginState) {
74-
add(LocalAiPluginEvent.didReceiveAiState(pluginState));
75-
},
76-
resourceCallback: (data) {
77-
add(LocalAiPluginEvent.didReceiveLackOfResources(data));
47+
void _handleResult(
48+
Emitter<LocalAIToggleState> emit,
49+
FlowyResult<LocalAIPB, FlowyError> result,
50+
) {
51+
result.fold(
52+
(localAI) {
53+
emit(
54+
state.copyWith(
55+
pageIndicator:
56+
LocalAIToggleStateIndicator.isEnabled(localAI.enabled),
57+
),
58+
);
7859
},
79-
);
80-
}
81-
82-
void _getLocalAiState() {
83-
AIEventGetLocalAIState().send().fold(
84-
(aiState) {
85-
add(LocalAiPluginEvent.didReceiveAiState(aiState));
60+
(err) {
61+
emit(
62+
state.copyWith(
63+
pageIndicator: LocalAIToggleStateIndicator.error(err),
64+
),
65+
);
8666
},
87-
Log.error,
8867
);
8968
}
9069
}
9170

9271
@freezed
93-
class LocalAiPluginEvent with _$LocalAiPluginEvent {
94-
const factory LocalAiPluginEvent.didReceiveAiState(LocalAIPB aiState) =
95-
_DidReceiveAiState;
96-
const factory LocalAiPluginEvent.didReceiveLackOfResources(
97-
LackOfAIResourcePB resources,
98-
) = _DidReceiveLackOfResources;
99-
const factory LocalAiPluginEvent.toggle() = _Toggle;
100-
const factory LocalAiPluginEvent.restart() = _Restart;
101-
}
102-
103-
sealed class LocalAiPluginState {
104-
const LocalAiPluginState();
72+
class LocalAIToggleEvent with _$LocalAIToggleEvent {
73+
const factory LocalAIToggleEvent.started() = _Started;
74+
const factory LocalAIToggleEvent.toggle() = _Toggle;
75+
const factory LocalAIToggleEvent.handleResult(
76+
FlowyResult<LocalAIPB, FlowyError> result,
77+
) = _HandleResult;
10578
}
10679

107-
class ReadyLocalAiPluginState extends LocalAiPluginState {
108-
const ReadyLocalAiPluginState({
109-
required this.isEnabled,
110-
required this.runningState,
111-
required this.lackOfResource,
112-
});
113-
114-
final bool isEnabled;
115-
final RunningStatePB runningState;
116-
final LackOfAIResourcePB? lackOfResource;
80+
@freezed
81+
class LocalAIToggleState with _$LocalAIToggleState {
82+
const factory LocalAIToggleState({
83+
@Default(LocalAIToggleStateIndicator.loading())
84+
LocalAIToggleStateIndicator pageIndicator,
85+
}) = _LocalAIToggleState;
11786
}
11887

119-
class LoadingLocalAiPluginState extends LocalAiPluginState {
120-
const LoadingLocalAiPluginState();
88+
@freezed
89+
class LocalAIToggleStateIndicator with _$LocalAIToggleStateIndicator {
90+
// when start downloading the model
91+
const factory LocalAIToggleStateIndicator.error(FlowyError error) = _OnError;
92+
const factory LocalAIToggleStateIndicator.isEnabled(bool isEnabled) = _Ready;
93+
const factory LocalAIToggleStateIndicator.loading() = _Loading;
12194
}

frontend/appflowy_flutter/lib/workspace/application/settings/ai/local_ai_on_boarding_bloc.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ class LocalAIOnBoardingBloc
2626
_dispatch();
2727
}
2828

29-
void _onPaymentSuccessful() {
29+
Future<void> _onPaymentSuccessful() async {
3030
if (isClosed) {
3131
return;
3232
}
Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,92 @@
1+
import 'dart:async';
2+
3+
import 'package:appflowy/workspace/application/settings/ai/local_llm_listener.dart';
4+
import 'package:appflowy_backend/dispatch/dispatch.dart';
5+
import 'package:appflowy_backend/log.dart';
6+
import 'package:appflowy_backend/protobuf/flowy-ai/entities.pb.dart';
7+
import 'package:appflowy_result/appflowy_result.dart';
8+
import 'package:bloc/bloc.dart';
9+
import 'package:freezed_annotation/freezed_annotation.dart';
10+
11+
part 'local_ai_setting_panel_bloc.freezed.dart';
12+
13+
class LocalAISettingPanelBloc
14+
extends Bloc<LocalAISettingPanelEvent, LocalAISettingPanelState> {
15+
LocalAISettingPanelBloc()
16+
: listener = LocalAIStateListener(),
17+
super(const LocalAISettingPanelState()) {
18+
on<LocalAISettingPanelEvent>(_handleEvent);
19+
20+
listener.start(
21+
stateCallback: (newState) {
22+
if (!isClosed) {
23+
add(LocalAISettingPanelEvent.updateAIState(newState));
24+
}
25+
},
26+
);
27+
28+
AIEventGetLocalAIState().send().fold(
29+
(localAIState) {
30+
if (!isClosed) {
31+
add(LocalAISettingPanelEvent.updateAIState(localAIState));
32+
}
33+
},
34+
Log.error,
35+
);
36+
}
37+
38+
final LocalAIStateListener listener;
39+
40+
/// Handles incoming events and dispatches them to the appropriate handler.
41+
Future<void> _handleEvent(
42+
LocalAISettingPanelEvent event,
43+
Emitter<LocalAISettingPanelState> emit,
44+
) async {
45+
event.when(
46+
updateAIState: (LocalAIPB pluginState) {
47+
if (pluginState.isPluginExecutableReady) {
48+
emit(
49+
state.copyWith(
50+
runningState: pluginState.state,
51+
progressIndicator: const LocalAIProgress.checkPluginState(),
52+
),
53+
);
54+
} else {
55+
emit(
56+
state.copyWith(
57+
progressIndicator: const LocalAIProgress.downloadLocalAIApp(),
58+
),
59+
);
60+
}
61+
},
62+
);
63+
}
64+
65+
@override
66+
Future<void> close() async {
67+
await listener.stop();
68+
return super.close();
69+
}
70+
}
71+
72+
@freezed
73+
class LocalAISettingPanelEvent with _$LocalAISettingPanelEvent {
74+
const factory LocalAISettingPanelEvent.updateAIState(
75+
LocalAIPB aiState,
76+
) = _UpdateAIState;
77+
}
78+
79+
@freezed
80+
class LocalAISettingPanelState with _$LocalAISettingPanelState {
81+
const factory LocalAISettingPanelState({
82+
LocalAIProgress? progressIndicator,
83+
@Default(RunningStatePB.Connecting) RunningStatePB runningState,
84+
}) = _LocalAIChatSettingState;
85+
}
86+
87+
@freezed
88+
class LocalAIProgress with _$LocalAIProgress {
89+
const factory LocalAIProgress.checkPluginState() = _CheckPluginStateProgress;
90+
const factory LocalAIProgress.downloadLocalAIApp() =
91+
_DownloadLocalAIAppProgress;
92+
}

frontend/appflowy_flutter/lib/workspace/application/settings/ai/ollama_setting_bloc.dart

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -80,9 +80,11 @@ class OllamaSettingBloc extends Bloc<OllamaSettingEvent, OllamaSettingState> {
8080
}
8181
add(OllamaSettingEvent.updateSetting(setting));
8282
AIEventUpdateLocalAISetting(setting).send().fold(
83-
(_) => Log.info('AI setting updated successfully'),
84-
(err) => Log.error("update ai setting failed: $err"),
85-
);
83+
(_) {
84+
Log.info('AI setting updated successfully');
85+
},
86+
(err) => Log.error("update ai setting failed: $err"),
87+
);
8688
},
8789
);
8890
}

0 commit comments

Comments
 (0)