Skip to content

Commit 4a9627b

Browse files
committed
chore: support open url with https scheme
1 parent ae0f71b commit 4a9627b

File tree

20 files changed

+388
-184
lines changed

20 files changed

+388
-184
lines changed

frontend/app_flowy/lib/workspace/application/grid/cell/cell_service/context_builder.dart

Lines changed: 23 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,8 @@ class _GridCellContext<T, D> extends Equatable {
108108
late final ValueNotifier<T?> _cellDataNotifier;
109109
bool isListening = false;
110110
VoidCallback? _onFieldChangedFn;
111-
Timer? _delayOperation;
111+
Timer? _loadDataOperation;
112+
Timer? _saveDataOperation;
112113

113114
_GridCellContext({
114115
required this.gridCell,
@@ -138,7 +139,7 @@ class _GridCellContext<T, D> extends Equatable {
138139

139140
FieldType get fieldType => gridCell.field.fieldType;
140141

141-
VoidCallback? startListening({required void Function(T) onCellChanged}) {
142+
VoidCallback? startListening({required void Function(T?) onCellChanged}) {
142143
if (isListening) {
143144
Log.error("Already started. It seems like you should call clone first");
144145
return null;
@@ -162,7 +163,7 @@ class _GridCellContext<T, D> extends Equatable {
162163
}
163164

164165
onCellChangedFn() {
165-
onCellChanged(_cellDataNotifier.value as T);
166+
onCellChanged(_cellDataNotifier.value);
166167

167168
if (cellDataLoader.config.reloadOnCellChanged) {
168169
_loadData();
@@ -189,13 +190,26 @@ class _GridCellContext<T, D> extends Equatable {
189190
return _fieldService.getFieldTypeOptionData(fieldType: fieldType);
190191
}
191192

192-
Future<Option<FlowyError>> saveCellData(D data) {
193-
return cellDataPersistence.save(data);
193+
void saveCellData(D data, {bool deduplicate = false, void Function(Option<FlowyError>)? resultCallback}) async {
194+
if (deduplicate) {
195+
_loadDataOperation?.cancel();
196+
_loadDataOperation = Timer(const Duration(milliseconds: 300), () async {
197+
final result = await cellDataPersistence.save(data);
198+
if (resultCallback != null) {
199+
resultCallback(result);
200+
}
201+
});
202+
} else {
203+
final result = await cellDataPersistence.save(data);
204+
if (resultCallback != null) {
205+
resultCallback(result);
206+
}
207+
}
194208
}
195209

196210
void _loadData() {
197-
_delayOperation?.cancel();
198-
_delayOperation = Timer(const Duration(milliseconds: 10), () {
211+
_loadDataOperation?.cancel();
212+
_loadDataOperation = Timer(const Duration(milliseconds: 10), () {
199213
cellDataLoader.loadData().then((data) {
200214
_cellDataNotifier.value = data;
201215
cellCache.insert(GridCellCacheData(key: _cacheKey, object: data));
@@ -204,7 +218,8 @@ class _GridCellContext<T, D> extends Equatable {
204218
}
205219

206220
void dispose() {
207-
_delayOperation?.cancel();
221+
_loadDataOperation?.cancel();
222+
_saveDataOperation?.cancel();
208223

209224
if (_onFieldChangedFn != null) {
210225
cellCache.removeFieldListener(_cacheKey, _onFieldChangedFn!);

frontend/app_flowy/lib/workspace/application/grid/cell/checkbox_cell_bloc.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ class CheckboxCellBloc extends Bloc<CheckboxCellEvent, CheckboxCellState> {
5858
class CheckboxCellEvent with _$CheckboxCellEvent {
5959
const factory CheckboxCellEvent.initial() = _Initial;
6060
const factory CheckboxCellEvent.select() = _Selected;
61-
const factory CheckboxCellEvent.didReceiveCellUpdate(String cellData) = _DidReceiveCellUpdate;
61+
const factory CheckboxCellEvent.didReceiveCellUpdate(String? cellData) = _DidReceiveCellUpdate;
6262
}
6363

6464
@freezed

frontend/app_flowy/lib/workspace/application/grid/cell/date_cal_bloc.dart

Lines changed: 22 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ class DateCalBloc extends Bloc<DateCalEvent, DateCalState> {
3737
setFocusedDay: (focusedDay) {
3838
emit(state.copyWith(focusedDay: focusedDay));
3939
},
40-
didReceiveCellUpdate: (DateCellData cellData) {
40+
didReceiveCellUpdate: (DateCellData? cellData) {
4141
final dateData = dateDataFromCellData(cellData);
4242
final time = dateData.foldRight("", (dateData, previous) => dateData.time);
4343
emit(state.copyWith(dateData: dateData, time: time));
@@ -83,25 +83,26 @@ class DateCalBloc extends Bloc<DateCalEvent, DateCalState> {
8383
return;
8484
}
8585

86-
final result = await cellContext.saveCellData(newDateData);
87-
result.fold(
88-
() => emit(state.copyWith(
89-
dateData: Some(newDateData),
90-
timeFormatError: none(),
91-
)),
92-
(err) {
93-
switch (ErrorCode.valueOf(err.code)!) {
94-
case ErrorCode.InvalidDateTimeFormat:
95-
emit(state.copyWith(
96-
dateData: Some(newDateData),
97-
timeFormatError: Some(timeFormatPrompt(err)),
98-
));
99-
break;
100-
default:
101-
Log.error(err);
102-
}
103-
},
104-
);
86+
cellContext.saveCellData(newDateData, resultCallback: (result) {
87+
result.fold(
88+
() => emit(state.copyWith(
89+
dateData: Some(newDateData),
90+
timeFormatError: none(),
91+
)),
92+
(err) {
93+
switch (ErrorCode.valueOf(err.code)!) {
94+
case ErrorCode.InvalidDateTimeFormat:
95+
emit(state.copyWith(
96+
dateData: Some(newDateData),
97+
timeFormatError: Some(timeFormatPrompt(err)),
98+
));
99+
break;
100+
default:
101+
Log.error(err);
102+
}
103+
},
104+
);
105+
});
105106
}
106107

107108
String timeFormatPrompt(FlowyError error) {
@@ -183,7 +184,7 @@ class DateCalEvent with _$DateCalEvent {
183184
const factory DateCalEvent.setDateFormat(DateFormat dateFormat) = _DateFormat;
184185
const factory DateCalEvent.setIncludeTime(bool includeTime) = _IncludeTime;
185186
const factory DateCalEvent.setTime(String time) = _Time;
186-
const factory DateCalEvent.didReceiveCellUpdate(DateCellData data) = _DidReceiveCellUpdate;
187+
const factory DateCalEvent.didReceiveCellUpdate(DateCellData? data) = _DidReceiveCellUpdate;
187188
}
188189

189190
@freezed

frontend/app_flowy/lib/workspace/application/grid/cell/date_cell_bloc.dart

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,13 @@ class DateCellBloc extends Bloc<DateCellEvent, DateCellState> {
1616
(event, emit) async {
1717
event.when(
1818
initial: () => _startListening(),
19-
didReceiveCellUpdate: (DateCellData value) => emit(state.copyWith(data: Some(value))),
19+
didReceiveCellUpdate: (DateCellData? cellData) {
20+
if (cellData != null) {
21+
emit(state.copyWith(data: Some(cellData)));
22+
} else {
23+
emit(state.copyWith(data: none()));
24+
}
25+
},
2026
didReceiveFieldUpdate: (Field value) => emit(state.copyWith(field: value)),
2127
);
2228
},
@@ -47,7 +53,7 @@ class DateCellBloc extends Bloc<DateCellEvent, DateCellState> {
4753
@freezed
4854
class DateCellEvent with _$DateCellEvent {
4955
const factory DateCellEvent.initial() = _InitialCell;
50-
const factory DateCellEvent.didReceiveCellUpdate(DateCellData data) = _DidReceiveCellUpdate;
56+
const factory DateCellEvent.didReceiveCellUpdate(DateCellData? data) = _DidReceiveCellUpdate;
5157
const factory DateCellEvent.didReceiveFieldUpdate(Field field) = _DidReceiveFieldUpdate;
5258
}
5359

frontend/app_flowy/lib/workspace/application/grid/cell/number_cell_bloc.dart

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ class NumberCellBloc extends Bloc<NumberCellEvent, NumberCellState> {
1919
_startListening();
2020
},
2121
didReceiveCellUpdate: (_DidReceiveCellUpdate value) {
22-
emit(state.copyWith(content: value.cellContent));
22+
emit(state.copyWith(content: value.cellContent ?? ""));
2323
},
2424
updateCell: (_UpdateCell value) async {
2525
await _updateCellValue(value, emit);
@@ -58,7 +58,7 @@ class NumberCellBloc extends Bloc<NumberCellEvent, NumberCellState> {
5858
class NumberCellEvent with _$NumberCellEvent {
5959
const factory NumberCellEvent.initial() = _Initial;
6060
const factory NumberCellEvent.updateCell(String text) = _UpdateCell;
61-
const factory NumberCellEvent.didReceiveCellUpdate(String cellContent) = _DidReceiveCellUpdate;
61+
const factory NumberCellEvent.didReceiveCellUpdate(String? cellContent) = _DidReceiveCellUpdate;
6262
}
6363

6464
@freezed

frontend/app_flowy/lib/workspace/application/grid/cell/select_option_cell_bloc.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ class SelectOptionCellBloc extends Bloc<SelectOptionCellEvent, SelectOptionCellS
4444
onCellChanged: ((selectOptionContext) {
4545
if (!isClosed) {
4646
add(SelectOptionCellEvent.didReceiveOptions(
47-
selectOptionContext.selectOptions,
47+
selectOptionContext?.selectOptions ?? [],
4848
));
4949
}
5050
}),

frontend/app_flowy/lib/workspace/application/grid/cell/text_cell_bloc.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ class TextCellBloc extends Bloc<TextCellEvent, TextCellState> {
4343
_onCellChangedFn = cellContext.startListening(
4444
onCellChanged: ((cellContent) {
4545
if (!isClosed) {
46-
add(TextCellEvent.didReceiveCellUpdate(cellContent));
46+
add(TextCellEvent.didReceiveCellUpdate(cellContent ?? ""));
4747
}
4848
}),
4949
);

frontend/app_flowy/lib/workspace/application/grid/cell/url_cell_bloc.dart

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -18,12 +18,11 @@ class URLCellBloc extends Bloc<URLCellEvent, URLCellState> {
1818
initial: () {
1919
_startListening();
2020
},
21-
updateText: (text) {
22-
cellContext.saveCellData(text);
23-
emit(state.copyWith(content: text));
24-
},
2521
didReceiveCellUpdate: (cellData) {
26-
emit(state.copyWith(content: cellData.content, url: cellData.url));
22+
emit(state.copyWith(
23+
content: cellData?.content ?? "",
24+
url: cellData?.url ?? "",
25+
));
2726
},
2827
);
2928
},
@@ -54,8 +53,7 @@ class URLCellBloc extends Bloc<URLCellEvent, URLCellState> {
5453
@freezed
5554
class URLCellEvent with _$URLCellEvent {
5655
const factory URLCellEvent.initial() = _InitialCell;
57-
const factory URLCellEvent.didReceiveCellUpdate(URLCellData cell) = _DidReceiveCellUpdate;
58-
const factory URLCellEvent.updateText(String text) = _UpdateText;
56+
const factory URLCellEvent.didReceiveCellUpdate(URLCellData? cell) = _DidReceiveCellUpdate;
5957
}
6058

6159
@freezed
Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
import 'package:flowy_sdk/protobuf/flowy-grid/url_type_option.pb.dart';
2+
import 'package:flutter_bloc/flutter_bloc.dart';
3+
import 'package:freezed_annotation/freezed_annotation.dart';
4+
import 'dart:async';
5+
import 'cell_service/cell_service.dart';
6+
7+
part 'url_cell_editor_bloc.freezed.dart';
8+
9+
class URLCellEditorBloc extends Bloc<URLCellEditorEvent, URLCellEditorState> {
10+
final GridURLCellContext cellContext;
11+
void Function()? _onCellChangedFn;
12+
URLCellEditorBloc({
13+
required this.cellContext,
14+
}) : super(URLCellEditorState.initial(cellContext)) {
15+
on<URLCellEditorEvent>(
16+
(event, emit) async {
17+
event.when(
18+
initial: () {
19+
_startListening();
20+
},
21+
updateText: (text) {
22+
cellContext.saveCellData(text, deduplicate: true);
23+
emit(state.copyWith(content: text));
24+
},
25+
didReceiveCellUpdate: (cellData) {
26+
emit(state.copyWith(content: cellData?.content ?? ""));
27+
},
28+
);
29+
},
30+
);
31+
}
32+
33+
@override
34+
Future<void> close() async {
35+
if (_onCellChangedFn != null) {
36+
cellContext.removeListener(_onCellChangedFn!);
37+
_onCellChangedFn = null;
38+
}
39+
cellContext.dispose();
40+
return super.close();
41+
}
42+
43+
void _startListening() {
44+
_onCellChangedFn = cellContext.startListening(
45+
onCellChanged: ((cellData) {
46+
if (!isClosed) {
47+
add(URLCellEditorEvent.didReceiveCellUpdate(cellData));
48+
}
49+
}),
50+
);
51+
}
52+
}
53+
54+
@freezed
55+
class URLCellEditorEvent with _$URLCellEditorEvent {
56+
const factory URLCellEditorEvent.initial() = _InitialCell;
57+
const factory URLCellEditorEvent.didReceiveCellUpdate(URLCellData? cell) = _DidReceiveCellUpdate;
58+
const factory URLCellEditorEvent.updateText(String text) = _UpdateText;
59+
}
60+
61+
@freezed
62+
class URLCellEditorState with _$URLCellEditorState {
63+
const factory URLCellEditorState({
64+
required String content,
65+
}) = _URLCellEditorState;
66+
67+
factory URLCellEditorState.initial(GridURLCellContext context) {
68+
final cellData = context.getCellData();
69+
return URLCellEditorState(
70+
content: cellData?.content ?? "",
71+
);
72+
}
73+
}

frontend/app_flowy/lib/workspace/presentation/plugins/grid/src/widgets/cell/cell_builder.dart

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ import 'date_cell/date_cell.dart';
1313
import 'number_cell.dart';
1414
import 'select_option_cell/select_option_cell.dart';
1515
import 'text_cell.dart';
16-
import 'url_cell.dart';
16+
import 'url_cell/url_cell.dart';
1717

1818
GridCellWidget buildGridCellWidget(GridCell gridCell, GridCellCache cellCache, {GridCellStyle? style}) {
1919
final key = ValueKey(gridCell.cellId());
@@ -35,7 +35,6 @@ GridCellWidget buildGridCellWidget(GridCell gridCell, GridCellCache cellCache, {
3535
return GridTextCell(cellContextBuilder: cellContextBuilder, style: style, key: key);
3636
case FieldType.URL:
3737
return GridURLCell(cellContextBuilder: cellContextBuilder, style: style, key: key);
38-
3938
}
4039
throw UnimplementedError;
4140
}
@@ -151,7 +150,7 @@ class CellContainer extends StatelessWidget {
151150
});
152151

153152
if (expander != null) {
154-
container = _CellEnterRegion(child: container, expander: expander!);
153+
container = CellEnterRegion(child: container, expander: expander!);
155154
}
156155

157156
return GestureDetector(
@@ -181,10 +180,10 @@ class CellContainer extends StatelessWidget {
181180
}
182181
}
183182

184-
class _CellEnterRegion extends StatelessWidget {
183+
class CellEnterRegion extends StatelessWidget {
185184
final Widget child;
186185
final Widget expander;
187-
const _CellEnterRegion({required this.child, required this.expander, Key? key}) : super(key: key);
186+
const CellEnterRegion({required this.child, required this.expander, Key? key}) : super(key: key);
188187

189188
@override
190189
Widget build(BuildContext context) {

0 commit comments

Comments
 (0)