[flutter]: remove edit doc bloc

This commit is contained in:
appflowy
2021-10-19 13:56:11 +08:00
parent 22cc76163b
commit ce5cccd670
7 changed files with 375 additions and 743 deletions

View File

@ -2,33 +2,47 @@ import 'package:flowy_sdk/protobuf/flowy-workspace/errors.pb.dart';
import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:app_flowy/workspace/domain/i_doc.dart'; import 'package:app_flowy/workspace/domain/i_doc.dart';
import 'package:freezed_annotation/freezed_annotation.dart'; import 'package:freezed_annotation/freezed_annotation.dart';
import 'package:dartz/dartz.dart';
part 'doc_bloc.freezed.dart'; part 'doc_bloc.freezed.dart';
class DocBloc extends Bloc<DocEvent, DocState> { class DocBloc extends Bloc<DocEvent, DocState> {
final IDoc iDocImpl; final IDoc docManager;
DocBloc({ DocBloc({required this.docManager}) : super(DocState.initial());
required this.iDocImpl,
}) : super(const DocState.loading());
@override @override
Stream<DocState> mapEventToState(DocEvent event) async* { Stream<DocState> mapEventToState(DocEvent event) async* {
yield* event.map( yield* event.map(
loadDoc: (_) async* { initial: _initial,
yield* _readDoc();
},
); );
} }
Stream<DocState> _readDoc() async* { @override
final docOrFail = await iDocImpl.readDoc(); Future<void> close() async {
yield docOrFail.fold( docManager.closeDoc();
await state.doc.fold(() => null, (doc) async {
await doc.close();
});
return super.close();
}
Stream<DocState> _initial(Initial value) async* {
final result = await docManager.readDoc();
yield result.fold(
(doc) { (doc) {
final flowyDoc = FlowyDoc(doc: doc, iDocImpl: iDocImpl); final flowyDoc = FlowyDoc(doc: doc, iDocImpl: docManager);
return DocState.loadDoc(flowyDoc); return state.copyWith(
doc: some(flowyDoc),
loadState: DocLoadState.finish(left(flowyDoc)),
);
}, },
(error) { (err) {
return DocState.loadFail(error); return state.copyWith(
doc: none(),
loadState: DocLoadState.finish(right(err)),
);
}, },
); );
} }
@ -48,12 +62,18 @@ class DocBloc extends Bloc<DocEvent, DocState> {
@freezed @freezed
class DocEvent with _$DocEvent { class DocEvent with _$DocEvent {
const factory DocEvent.loadDoc() = LoadDoc; const factory DocEvent.initial() = Initial;
} }
@freezed @freezed
class DocState with _$DocState { class DocState with _$DocState {
const factory DocState.loading() = Loading; const factory DocState({required Option<FlowyDoc> doc, required DocLoadState loadState}) = _DocState;
const factory DocState.loadDoc(FlowyDoc doc) = LoadedDoc;
const factory DocState.loadFail(WorkspaceError error) = LoadFail; factory DocState.initial() => DocState(doc: none(), loadState: const _Loading());
}
@freezed
class DocLoadState with _$DocLoadState {
const factory DocLoadState.loading() = _Loading;
const factory DocLoadState.finish(Either<FlowyDoc, WorkspaceError> successOrFail) = _Finish;
} }

View File

@ -16,8 +16,8 @@ final _privateConstructorUsedError = UnsupportedError(
class _$DocEventTearOff { class _$DocEventTearOff {
const _$DocEventTearOff(); const _$DocEventTearOff();
LoadDoc loadDoc() { Initial initial() {
return const LoadDoc(); return const Initial();
} }
} }
@ -28,23 +28,23 @@ const $DocEvent = _$DocEventTearOff();
mixin _$DocEvent { mixin _$DocEvent {
@optionalTypeArgs @optionalTypeArgs
TResult when<TResult extends Object?>({ TResult when<TResult extends Object?>({
required TResult Function() loadDoc, required TResult Function() initial,
}) => }) =>
throw _privateConstructorUsedError; throw _privateConstructorUsedError;
@optionalTypeArgs @optionalTypeArgs
TResult maybeWhen<TResult extends Object?>({ TResult maybeWhen<TResult extends Object?>({
TResult Function()? loadDoc, TResult Function()? initial,
required TResult orElse(), required TResult orElse(),
}) => }) =>
throw _privateConstructorUsedError; throw _privateConstructorUsedError;
@optionalTypeArgs @optionalTypeArgs
TResult map<TResult extends Object?>({ TResult map<TResult extends Object?>({
required TResult Function(LoadDoc value) loadDoc, required TResult Function(Initial value) initial,
}) => }) =>
throw _privateConstructorUsedError; throw _privateConstructorUsedError;
@optionalTypeArgs @optionalTypeArgs
TResult maybeMap<TResult extends Object?>({ TResult maybeMap<TResult extends Object?>({
TResult Function(LoadDoc value)? loadDoc, TResult Function(Initial value)? initial,
required TResult orElse(), required TResult orElse(),
}) => }) =>
throw _privateConstructorUsedError; throw _privateConstructorUsedError;
@ -66,34 +66,34 @@ class _$DocEventCopyWithImpl<$Res> implements $DocEventCopyWith<$Res> {
} }
/// @nodoc /// @nodoc
abstract class $LoadDocCopyWith<$Res> { abstract class $InitialCopyWith<$Res> {
factory $LoadDocCopyWith(LoadDoc value, $Res Function(LoadDoc) then) = factory $InitialCopyWith(Initial value, $Res Function(Initial) then) =
_$LoadDocCopyWithImpl<$Res>; _$InitialCopyWithImpl<$Res>;
} }
/// @nodoc /// @nodoc
class _$LoadDocCopyWithImpl<$Res> extends _$DocEventCopyWithImpl<$Res> class _$InitialCopyWithImpl<$Res> extends _$DocEventCopyWithImpl<$Res>
implements $LoadDocCopyWith<$Res> { implements $InitialCopyWith<$Res> {
_$LoadDocCopyWithImpl(LoadDoc _value, $Res Function(LoadDoc) _then) _$InitialCopyWithImpl(Initial _value, $Res Function(Initial) _then)
: super(_value, (v) => _then(v as LoadDoc)); : super(_value, (v) => _then(v as Initial));
@override @override
LoadDoc get _value => super._value as LoadDoc; Initial get _value => super._value as Initial;
} }
/// @nodoc /// @nodoc
class _$LoadDoc implements LoadDoc { class _$Initial implements Initial {
const _$LoadDoc(); const _$Initial();
@override @override
String toString() { String toString() {
return 'DocEvent.loadDoc()'; return 'DocEvent.initial()';
} }
@override @override
bool operator ==(dynamic other) { bool operator ==(dynamic other) {
return identical(this, other) || (other is LoadDoc); return identical(this, other) || (other is Initial);
} }
@override @override
@ -102,19 +102,19 @@ class _$LoadDoc implements LoadDoc {
@override @override
@optionalTypeArgs @optionalTypeArgs
TResult when<TResult extends Object?>({ TResult when<TResult extends Object?>({
required TResult Function() loadDoc, required TResult Function() initial,
}) { }) {
return loadDoc(); return initial();
} }
@override @override
@optionalTypeArgs @optionalTypeArgs
TResult maybeWhen<TResult extends Object?>({ TResult maybeWhen<TResult extends Object?>({
TResult Function()? loadDoc, TResult Function()? initial,
required TResult orElse(), required TResult orElse(),
}) { }) {
if (loadDoc != null) { if (initial != null) {
return loadDoc(); return initial();
} }
return orElse(); return orElse();
} }
@ -122,45 +122,37 @@ class _$LoadDoc implements LoadDoc {
@override @override
@optionalTypeArgs @optionalTypeArgs
TResult map<TResult extends Object?>({ TResult map<TResult extends Object?>({
required TResult Function(LoadDoc value) loadDoc, required TResult Function(Initial value) initial,
}) { }) {
return loadDoc(this); return initial(this);
} }
@override @override
@optionalTypeArgs @optionalTypeArgs
TResult maybeMap<TResult extends Object?>({ TResult maybeMap<TResult extends Object?>({
TResult Function(LoadDoc value)? loadDoc, TResult Function(Initial value)? initial,
required TResult orElse(), required TResult orElse(),
}) { }) {
if (loadDoc != null) { if (initial != null) {
return loadDoc(this); return initial(this);
} }
return orElse(); return orElse();
} }
} }
abstract class LoadDoc implements DocEvent { abstract class Initial implements DocEvent {
const factory LoadDoc() = _$LoadDoc; const factory Initial() = _$Initial;
} }
/// @nodoc /// @nodoc
class _$DocStateTearOff { class _$DocStateTearOff {
const _$DocStateTearOff(); const _$DocStateTearOff();
Loading loading() { _DocState call(
return const Loading(); {required Option<FlowyDoc> doc, required DocLoadState loadState}) {
} return _DocState(
doc: doc,
LoadedDoc loadDoc(FlowyDoc doc) { loadState: loadState,
return LoadedDoc(
doc,
);
}
LoadFail loadFail(WorkspaceError error) {
return LoadFail(
error,
); );
} }
} }
@ -170,35 +162,11 @@ const $DocState = _$DocStateTearOff();
/// @nodoc /// @nodoc
mixin _$DocState { mixin _$DocState {
@optionalTypeArgs Option<FlowyDoc> get doc => throw _privateConstructorUsedError;
TResult when<TResult extends Object?>({ DocLoadState get loadState => throw _privateConstructorUsedError;
required TResult Function() loading,
required TResult Function(FlowyDoc doc) loadDoc, @JsonKey(ignore: true)
required TResult Function(WorkspaceError error) loadFail, $DocStateCopyWith<DocState> get copyWith =>
}) =>
throw _privateConstructorUsedError;
@optionalTypeArgs
TResult maybeWhen<TResult extends Object?>({
TResult Function()? loading,
TResult Function(FlowyDoc doc)? loadDoc,
TResult Function(WorkspaceError error)? loadFail,
required TResult orElse(),
}) =>
throw _privateConstructorUsedError;
@optionalTypeArgs
TResult map<TResult extends Object?>({
required TResult Function(Loading value) loading,
required TResult Function(LoadedDoc value) loadDoc,
required TResult Function(LoadFail value) loadFail,
}) =>
throw _privateConstructorUsedError;
@optionalTypeArgs
TResult maybeMap<TResult extends Object?>({
TResult Function(Loading value)? loading,
TResult Function(LoadedDoc value)? loadDoc,
TResult Function(LoadFail value)? loadFail,
required TResult orElse(),
}) =>
throw _privateConstructorUsedError; throw _privateConstructorUsedError;
} }
@ -206,6 +174,9 @@ mixin _$DocState {
abstract class $DocStateCopyWith<$Res> { abstract class $DocStateCopyWith<$Res> {
factory $DocStateCopyWith(DocState value, $Res Function(DocState) then) = factory $DocStateCopyWith(DocState value, $Res Function(DocState) then) =
_$DocStateCopyWithImpl<$Res>; _$DocStateCopyWithImpl<$Res>;
$Res call({Option<FlowyDoc> doc, DocLoadState loadState});
$DocLoadStateCopyWith<$Res> get loadState;
} }
/// @nodoc /// @nodoc
@ -215,37 +186,217 @@ class _$DocStateCopyWithImpl<$Res> implements $DocStateCopyWith<$Res> {
final DocState _value; final DocState _value;
// ignore: unused_field // ignore: unused_field
final $Res Function(DocState) _then; final $Res Function(DocState) _then;
}
/// @nodoc
abstract class $LoadingCopyWith<$Res> {
factory $LoadingCopyWith(Loading value, $Res Function(Loading) then) =
_$LoadingCopyWithImpl<$Res>;
}
/// @nodoc
class _$LoadingCopyWithImpl<$Res> extends _$DocStateCopyWithImpl<$Res>
implements $LoadingCopyWith<$Res> {
_$LoadingCopyWithImpl(Loading _value, $Res Function(Loading) _then)
: super(_value, (v) => _then(v as Loading));
@override @override
Loading get _value => super._value as Loading; $Res call({
Object? doc = freezed,
Object? loadState = freezed,
}) {
return _then(_value.copyWith(
doc: doc == freezed
? _value.doc
: doc // ignore: cast_nullable_to_non_nullable
as Option<FlowyDoc>,
loadState: loadState == freezed
? _value.loadState
: loadState // ignore: cast_nullable_to_non_nullable
as DocLoadState,
));
}
@override
$DocLoadStateCopyWith<$Res> get loadState {
return $DocLoadStateCopyWith<$Res>(_value.loadState, (value) {
return _then(_value.copyWith(loadState: value));
});
}
}
/// @nodoc
abstract class _$DocStateCopyWith<$Res> implements $DocStateCopyWith<$Res> {
factory _$DocStateCopyWith(_DocState value, $Res Function(_DocState) then) =
__$DocStateCopyWithImpl<$Res>;
@override
$Res call({Option<FlowyDoc> doc, DocLoadState loadState});
@override
$DocLoadStateCopyWith<$Res> get loadState;
}
/// @nodoc
class __$DocStateCopyWithImpl<$Res> extends _$DocStateCopyWithImpl<$Res>
implements _$DocStateCopyWith<$Res> {
__$DocStateCopyWithImpl(_DocState _value, $Res Function(_DocState) _then)
: super(_value, (v) => _then(v as _DocState));
@override
_DocState get _value => super._value as _DocState;
@override
$Res call({
Object? doc = freezed,
Object? loadState = freezed,
}) {
return _then(_DocState(
doc: doc == freezed
? _value.doc
: doc // ignore: cast_nullable_to_non_nullable
as Option<FlowyDoc>,
loadState: loadState == freezed
? _value.loadState
: loadState // ignore: cast_nullable_to_non_nullable
as DocLoadState,
));
}
} }
/// @nodoc /// @nodoc
class _$Loading implements Loading { class _$_DocState implements _DocState {
const _$Loading(); const _$_DocState({required this.doc, required this.loadState});
@override
final Option<FlowyDoc> doc;
@override
final DocLoadState loadState;
@override @override
String toString() { String toString() {
return 'DocState.loading()'; return 'DocState(doc: $doc, loadState: $loadState)';
} }
@override @override
bool operator ==(dynamic other) { bool operator ==(dynamic other) {
return identical(this, other) || (other is Loading); return identical(this, other) ||
(other is _DocState &&
(identical(other.doc, doc) ||
const DeepCollectionEquality().equals(other.doc, doc)) &&
(identical(other.loadState, loadState) ||
const DeepCollectionEquality()
.equals(other.loadState, loadState)));
}
@override
int get hashCode =>
runtimeType.hashCode ^
const DeepCollectionEquality().hash(doc) ^
const DeepCollectionEquality().hash(loadState);
@JsonKey(ignore: true)
@override
_$DocStateCopyWith<_DocState> get copyWith =>
__$DocStateCopyWithImpl<_DocState>(this, _$identity);
}
abstract class _DocState implements DocState {
const factory _DocState(
{required Option<FlowyDoc> doc,
required DocLoadState loadState}) = _$_DocState;
@override
Option<FlowyDoc> get doc => throw _privateConstructorUsedError;
@override
DocLoadState get loadState => throw _privateConstructorUsedError;
@override
@JsonKey(ignore: true)
_$DocStateCopyWith<_DocState> get copyWith =>
throw _privateConstructorUsedError;
}
/// @nodoc
class _$DocLoadStateTearOff {
const _$DocLoadStateTearOff();
_Loading loading() {
return const _Loading();
}
_Finish finish(Either<FlowyDoc, WorkspaceError> successOrFail) {
return _Finish(
successOrFail,
);
}
}
/// @nodoc
const $DocLoadState = _$DocLoadStateTearOff();
/// @nodoc
mixin _$DocLoadState {
@optionalTypeArgs
TResult when<TResult extends Object?>({
required TResult Function() loading,
required TResult Function(Either<FlowyDoc, WorkspaceError> successOrFail)
finish,
}) =>
throw _privateConstructorUsedError;
@optionalTypeArgs
TResult maybeWhen<TResult extends Object?>({
TResult Function()? loading,
TResult Function(Either<FlowyDoc, WorkspaceError> successOrFail)? finish,
required TResult orElse(),
}) =>
throw _privateConstructorUsedError;
@optionalTypeArgs
TResult map<TResult extends Object?>({
required TResult Function(_Loading value) loading,
required TResult Function(_Finish value) finish,
}) =>
throw _privateConstructorUsedError;
@optionalTypeArgs
TResult maybeMap<TResult extends Object?>({
TResult Function(_Loading value)? loading,
TResult Function(_Finish value)? finish,
required TResult orElse(),
}) =>
throw _privateConstructorUsedError;
}
/// @nodoc
abstract class $DocLoadStateCopyWith<$Res> {
factory $DocLoadStateCopyWith(
DocLoadState value, $Res Function(DocLoadState) then) =
_$DocLoadStateCopyWithImpl<$Res>;
}
/// @nodoc
class _$DocLoadStateCopyWithImpl<$Res> implements $DocLoadStateCopyWith<$Res> {
_$DocLoadStateCopyWithImpl(this._value, this._then);
final DocLoadState _value;
// ignore: unused_field
final $Res Function(DocLoadState) _then;
}
/// @nodoc
abstract class _$LoadingCopyWith<$Res> {
factory _$LoadingCopyWith(_Loading value, $Res Function(_Loading) then) =
__$LoadingCopyWithImpl<$Res>;
}
/// @nodoc
class __$LoadingCopyWithImpl<$Res> extends _$DocLoadStateCopyWithImpl<$Res>
implements _$LoadingCopyWith<$Res> {
__$LoadingCopyWithImpl(_Loading _value, $Res Function(_Loading) _then)
: super(_value, (v) => _then(v as _Loading));
@override
_Loading get _value => super._value as _Loading;
}
/// @nodoc
class _$_Loading implements _Loading {
const _$_Loading();
@override
String toString() {
return 'DocLoadState.loading()';
}
@override
bool operator ==(dynamic other) {
return identical(this, other) || (other is _Loading);
} }
@override @override
@ -255,8 +406,8 @@ class _$Loading implements Loading {
@optionalTypeArgs @optionalTypeArgs
TResult when<TResult extends Object?>({ TResult when<TResult extends Object?>({
required TResult Function() loading, required TResult Function() loading,
required TResult Function(FlowyDoc doc) loadDoc, required TResult Function(Either<FlowyDoc, WorkspaceError> successOrFail)
required TResult Function(WorkspaceError error) loadFail, finish,
}) { }) {
return loading(); return loading();
} }
@ -265,8 +416,7 @@ class _$Loading implements Loading {
@optionalTypeArgs @optionalTypeArgs
TResult maybeWhen<TResult extends Object?>({ TResult maybeWhen<TResult extends Object?>({
TResult Function()? loading, TResult Function()? loading,
TResult Function(FlowyDoc doc)? loadDoc, TResult Function(Either<FlowyDoc, WorkspaceError> successOrFail)? finish,
TResult Function(WorkspaceError error)? loadFail,
required TResult orElse(), required TResult orElse(),
}) { }) {
if (loading != null) { if (loading != null) {
@ -278,9 +428,8 @@ class _$Loading implements Loading {
@override @override
@optionalTypeArgs @optionalTypeArgs
TResult map<TResult extends Object?>({ TResult map<TResult extends Object?>({
required TResult Function(Loading value) loading, required TResult Function(_Loading value) loading,
required TResult Function(LoadedDoc value) loadDoc, required TResult Function(_Finish value) finish,
required TResult Function(LoadFail value) loadFail,
}) { }) {
return loading(this); return loading(this);
} }
@ -288,9 +437,8 @@ class _$Loading implements Loading {
@override @override
@optionalTypeArgs @optionalTypeArgs
TResult maybeMap<TResult extends Object?>({ TResult maybeMap<TResult extends Object?>({
TResult Function(Loading value)? loading, TResult Function(_Loading value)? loading,
TResult Function(LoadedDoc value)? loadDoc, TResult Function(_Finish value)? finish,
TResult Function(LoadFail value)? loadFail,
required TResult orElse(), required TResult orElse(),
}) { }) {
if (loading != null) { if (loading != null) {
@ -300,89 +448,89 @@ class _$Loading implements Loading {
} }
} }
abstract class Loading implements DocState { abstract class _Loading implements DocLoadState {
const factory Loading() = _$Loading; const factory _Loading() = _$_Loading;
} }
/// @nodoc /// @nodoc
abstract class $LoadedDocCopyWith<$Res> { abstract class _$FinishCopyWith<$Res> {
factory $LoadedDocCopyWith(LoadedDoc value, $Res Function(LoadedDoc) then) = factory _$FinishCopyWith(_Finish value, $Res Function(_Finish) then) =
_$LoadedDocCopyWithImpl<$Res>; __$FinishCopyWithImpl<$Res>;
$Res call({FlowyDoc doc}); $Res call({Either<FlowyDoc, WorkspaceError> successOrFail});
} }
/// @nodoc /// @nodoc
class _$LoadedDocCopyWithImpl<$Res> extends _$DocStateCopyWithImpl<$Res> class __$FinishCopyWithImpl<$Res> extends _$DocLoadStateCopyWithImpl<$Res>
implements $LoadedDocCopyWith<$Res> { implements _$FinishCopyWith<$Res> {
_$LoadedDocCopyWithImpl(LoadedDoc _value, $Res Function(LoadedDoc) _then) __$FinishCopyWithImpl(_Finish _value, $Res Function(_Finish) _then)
: super(_value, (v) => _then(v as LoadedDoc)); : super(_value, (v) => _then(v as _Finish));
@override @override
LoadedDoc get _value => super._value as LoadedDoc; _Finish get _value => super._value as _Finish;
@override @override
$Res call({ $Res call({
Object? doc = freezed, Object? successOrFail = freezed,
}) { }) {
return _then(LoadedDoc( return _then(_Finish(
doc == freezed successOrFail == freezed
? _value.doc ? _value.successOrFail
: doc // ignore: cast_nullable_to_non_nullable : successOrFail // ignore: cast_nullable_to_non_nullable
as FlowyDoc, as Either<FlowyDoc, WorkspaceError>,
)); ));
} }
} }
/// @nodoc /// @nodoc
class _$LoadedDoc implements LoadedDoc { class _$_Finish implements _Finish {
const _$LoadedDoc(this.doc); const _$_Finish(this.successOrFail);
@override @override
final FlowyDoc doc; final Either<FlowyDoc, WorkspaceError> successOrFail;
@override @override
String toString() { String toString() {
return 'DocState.loadDoc(doc: $doc)'; return 'DocLoadState.finish(successOrFail: $successOrFail)';
} }
@override @override
bool operator ==(dynamic other) { bool operator ==(dynamic other) {
return identical(this, other) || return identical(this, other) ||
(other is LoadedDoc && (other is _Finish &&
(identical(other.doc, doc) || (identical(other.successOrFail, successOrFail) ||
const DeepCollectionEquality().equals(other.doc, doc))); const DeepCollectionEquality()
.equals(other.successOrFail, successOrFail)));
} }
@override @override
int get hashCode => int get hashCode =>
runtimeType.hashCode ^ const DeepCollectionEquality().hash(doc); runtimeType.hashCode ^ const DeepCollectionEquality().hash(successOrFail);
@JsonKey(ignore: true) @JsonKey(ignore: true)
@override @override
$LoadedDocCopyWith<LoadedDoc> get copyWith => _$FinishCopyWith<_Finish> get copyWith =>
_$LoadedDocCopyWithImpl<LoadedDoc>(this, _$identity); __$FinishCopyWithImpl<_Finish>(this, _$identity);
@override @override
@optionalTypeArgs @optionalTypeArgs
TResult when<TResult extends Object?>({ TResult when<TResult extends Object?>({
required TResult Function() loading, required TResult Function() loading,
required TResult Function(FlowyDoc doc) loadDoc, required TResult Function(Either<FlowyDoc, WorkspaceError> successOrFail)
required TResult Function(WorkspaceError error) loadFail, finish,
}) { }) {
return loadDoc(doc); return finish(successOrFail);
} }
@override @override
@optionalTypeArgs @optionalTypeArgs
TResult maybeWhen<TResult extends Object?>({ TResult maybeWhen<TResult extends Object?>({
TResult Function()? loading, TResult Function()? loading,
TResult Function(FlowyDoc doc)? loadDoc, TResult Function(Either<FlowyDoc, WorkspaceError> successOrFail)? finish,
TResult Function(WorkspaceError error)? loadFail,
required TResult orElse(), required TResult orElse(),
}) { }) {
if (loadDoc != null) { if (finish != null) {
return loadDoc(doc); return finish(successOrFail);
} }
return orElse(); return orElse();
} }
@ -390,150 +538,32 @@ class _$LoadedDoc implements LoadedDoc {
@override @override
@optionalTypeArgs @optionalTypeArgs
TResult map<TResult extends Object?>({ TResult map<TResult extends Object?>({
required TResult Function(Loading value) loading, required TResult Function(_Loading value) loading,
required TResult Function(LoadedDoc value) loadDoc, required TResult Function(_Finish value) finish,
required TResult Function(LoadFail value) loadFail,
}) { }) {
return loadDoc(this); return finish(this);
} }
@override @override
@optionalTypeArgs @optionalTypeArgs
TResult maybeMap<TResult extends Object?>({ TResult maybeMap<TResult extends Object?>({
TResult Function(Loading value)? loading, TResult Function(_Loading value)? loading,
TResult Function(LoadedDoc value)? loadDoc, TResult Function(_Finish value)? finish,
TResult Function(LoadFail value)? loadFail,
required TResult orElse(), required TResult orElse(),
}) { }) {
if (loadDoc != null) { if (finish != null) {
return loadDoc(this); return finish(this);
} }
return orElse(); return orElse();
} }
} }
abstract class LoadedDoc implements DocState { abstract class _Finish implements DocLoadState {
const factory LoadedDoc(FlowyDoc doc) = _$LoadedDoc; const factory _Finish(Either<FlowyDoc, WorkspaceError> successOrFail) =
_$_Finish;
FlowyDoc get doc => throw _privateConstructorUsedError; Either<FlowyDoc, WorkspaceError> get successOrFail =>
@JsonKey(ignore: true)
$LoadedDocCopyWith<LoadedDoc> get copyWith =>
throw _privateConstructorUsedError; throw _privateConstructorUsedError;
}
/// @nodoc
abstract class $LoadFailCopyWith<$Res> {
factory $LoadFailCopyWith(LoadFail value, $Res Function(LoadFail) then) =
_$LoadFailCopyWithImpl<$Res>;
$Res call({WorkspaceError error});
}
/// @nodoc
class _$LoadFailCopyWithImpl<$Res> extends _$DocStateCopyWithImpl<$Res>
implements $LoadFailCopyWith<$Res> {
_$LoadFailCopyWithImpl(LoadFail _value, $Res Function(LoadFail) _then)
: super(_value, (v) => _then(v as LoadFail));
@override
LoadFail get _value => super._value as LoadFail;
@override
$Res call({
Object? error = freezed,
}) {
return _then(LoadFail(
error == freezed
? _value.error
: error // ignore: cast_nullable_to_non_nullable
as WorkspaceError,
));
}
}
/// @nodoc
class _$LoadFail implements LoadFail {
const _$LoadFail(this.error);
@override
final WorkspaceError error;
@override
String toString() {
return 'DocState.loadFail(error: $error)';
}
@override
bool operator ==(dynamic other) {
return identical(this, other) ||
(other is LoadFail &&
(identical(other.error, error) ||
const DeepCollectionEquality().equals(other.error, error)));
}
@override
int get hashCode =>
runtimeType.hashCode ^ const DeepCollectionEquality().hash(error);
@JsonKey(ignore: true) @JsonKey(ignore: true)
@override _$FinishCopyWith<_Finish> get copyWith => throw _privateConstructorUsedError;
$LoadFailCopyWith<LoadFail> get copyWith =>
_$LoadFailCopyWithImpl<LoadFail>(this, _$identity);
@override
@optionalTypeArgs
TResult when<TResult extends Object?>({
required TResult Function() loading,
required TResult Function(FlowyDoc doc) loadDoc,
required TResult Function(WorkspaceError error) loadFail,
}) {
return loadFail(error);
}
@override
@optionalTypeArgs
TResult maybeWhen<TResult extends Object?>({
TResult Function()? loading,
TResult Function(FlowyDoc doc)? loadDoc,
TResult Function(WorkspaceError error)? loadFail,
required TResult orElse(),
}) {
if (loadFail != null) {
return loadFail(error);
}
return orElse();
}
@override
@optionalTypeArgs
TResult map<TResult extends Object?>({
required TResult Function(Loading value) loading,
required TResult Function(LoadedDoc value) loadDoc,
required TResult Function(LoadFail value) loadFail,
}) {
return loadFail(this);
}
@override
@optionalTypeArgs
TResult maybeMap<TResult extends Object?>({
TResult Function(Loading value)? loading,
TResult Function(LoadedDoc value)? loadDoc,
TResult Function(LoadFail value)? loadFail,
required TResult orElse(),
}) {
if (loadFail != null) {
return loadFail(this);
}
return orElse();
}
}
abstract class LoadFail implements DocState {
const factory LoadFail(WorkspaceError error) = _$LoadFail;
WorkspaceError get error => throw _privateConstructorUsedError;
@JsonKey(ignore: true)
$LoadFailCopyWith<LoadFail> get copyWith =>
throw _privateConstructorUsedError;
} }

View File

@ -1,38 +0,0 @@
import 'package:app_flowy/workspace/domain/i_doc.dart';
import 'package:freezed_annotation/freezed_annotation.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
part 'doc_edit_bloc.freezed.dart';
class DocEditBloc extends Bloc<DocEditEvent, DocEditState> {
final IDoc iDocImpl;
DocEditBloc(this.iDocImpl) : super(DocEditState.initial());
@override
Stream<DocEditState> mapEventToState(DocEditEvent event) async* {
yield* event.map(
initial: (e) async* {},
close: (Close value) async* {
iDocImpl.closeDoc();
},
);
}
}
@freezed
class DocEditEvent with _$DocEditEvent {
const factory DocEditEvent.initial() = Initial;
const factory DocEditEvent.close() = Close;
}
@freezed
class DocEditState with _$DocEditState {
const factory DocEditState({
required bool isSaving,
}) = _DocEditState;
factory DocEditState.initial() => const DocEditState(
isSaving: false,
);
}

View File

@ -1,369 +0,0 @@
// GENERATED CODE - DO NOT MODIFY BY HAND
// ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target
part of 'doc_edit_bloc.dart';
// **************************************************************************
// FreezedGenerator
// **************************************************************************
T _$identity<T>(T value) => value;
final _privateConstructorUsedError = UnsupportedError(
'It seems like you constructed your class using `MyClass._()`. This constructor is only meant to be used by freezed and you are not supposed to need it nor use it.\nPlease check the documentation here for more informations: https://github.com/rrousselGit/freezed#custom-getters-and-methods');
/// @nodoc
class _$DocEditEventTearOff {
const _$DocEditEventTearOff();
Initial initial() {
return const Initial();
}
Close close() {
return const Close();
}
}
/// @nodoc
const $DocEditEvent = _$DocEditEventTearOff();
/// @nodoc
mixin _$DocEditEvent {
@optionalTypeArgs
TResult when<TResult extends Object?>({
required TResult Function() initial,
required TResult Function() close,
}) =>
throw _privateConstructorUsedError;
@optionalTypeArgs
TResult maybeWhen<TResult extends Object?>({
TResult Function()? initial,
TResult Function()? close,
required TResult orElse(),
}) =>
throw _privateConstructorUsedError;
@optionalTypeArgs
TResult map<TResult extends Object?>({
required TResult Function(Initial value) initial,
required TResult Function(Close value) close,
}) =>
throw _privateConstructorUsedError;
@optionalTypeArgs
TResult maybeMap<TResult extends Object?>({
TResult Function(Initial value)? initial,
TResult Function(Close value)? close,
required TResult orElse(),
}) =>
throw _privateConstructorUsedError;
}
/// @nodoc
abstract class $DocEditEventCopyWith<$Res> {
factory $DocEditEventCopyWith(
DocEditEvent value, $Res Function(DocEditEvent) then) =
_$DocEditEventCopyWithImpl<$Res>;
}
/// @nodoc
class _$DocEditEventCopyWithImpl<$Res> implements $DocEditEventCopyWith<$Res> {
_$DocEditEventCopyWithImpl(this._value, this._then);
final DocEditEvent _value;
// ignore: unused_field
final $Res Function(DocEditEvent) _then;
}
/// @nodoc
abstract class $InitialCopyWith<$Res> {
factory $InitialCopyWith(Initial value, $Res Function(Initial) then) =
_$InitialCopyWithImpl<$Res>;
}
/// @nodoc
class _$InitialCopyWithImpl<$Res> extends _$DocEditEventCopyWithImpl<$Res>
implements $InitialCopyWith<$Res> {
_$InitialCopyWithImpl(Initial _value, $Res Function(Initial) _then)
: super(_value, (v) => _then(v as Initial));
@override
Initial get _value => super._value as Initial;
}
/// @nodoc
class _$Initial implements Initial {
const _$Initial();
@override
String toString() {
return 'DocEditEvent.initial()';
}
@override
bool operator ==(dynamic other) {
return identical(this, other) || (other is Initial);
}
@override
int get hashCode => runtimeType.hashCode;
@override
@optionalTypeArgs
TResult when<TResult extends Object?>({
required TResult Function() initial,
required TResult Function() close,
}) {
return initial();
}
@override
@optionalTypeArgs
TResult maybeWhen<TResult extends Object?>({
TResult Function()? initial,
TResult Function()? close,
required TResult orElse(),
}) {
if (initial != null) {
return initial();
}
return orElse();
}
@override
@optionalTypeArgs
TResult map<TResult extends Object?>({
required TResult Function(Initial value) initial,
required TResult Function(Close value) close,
}) {
return initial(this);
}
@override
@optionalTypeArgs
TResult maybeMap<TResult extends Object?>({
TResult Function(Initial value)? initial,
TResult Function(Close value)? close,
required TResult orElse(),
}) {
if (initial != null) {
return initial(this);
}
return orElse();
}
}
abstract class Initial implements DocEditEvent {
const factory Initial() = _$Initial;
}
/// @nodoc
abstract class $CloseCopyWith<$Res> {
factory $CloseCopyWith(Close value, $Res Function(Close) then) =
_$CloseCopyWithImpl<$Res>;
}
/// @nodoc
class _$CloseCopyWithImpl<$Res> extends _$DocEditEventCopyWithImpl<$Res>
implements $CloseCopyWith<$Res> {
_$CloseCopyWithImpl(Close _value, $Res Function(Close) _then)
: super(_value, (v) => _then(v as Close));
@override
Close get _value => super._value as Close;
}
/// @nodoc
class _$Close implements Close {
const _$Close();
@override
String toString() {
return 'DocEditEvent.close()';
}
@override
bool operator ==(dynamic other) {
return identical(this, other) || (other is Close);
}
@override
int get hashCode => runtimeType.hashCode;
@override
@optionalTypeArgs
TResult when<TResult extends Object?>({
required TResult Function() initial,
required TResult Function() close,
}) {
return close();
}
@override
@optionalTypeArgs
TResult maybeWhen<TResult extends Object?>({
TResult Function()? initial,
TResult Function()? close,
required TResult orElse(),
}) {
if (close != null) {
return close();
}
return orElse();
}
@override
@optionalTypeArgs
TResult map<TResult extends Object?>({
required TResult Function(Initial value) initial,
required TResult Function(Close value) close,
}) {
return close(this);
}
@override
@optionalTypeArgs
TResult maybeMap<TResult extends Object?>({
TResult Function(Initial value)? initial,
TResult Function(Close value)? close,
required TResult orElse(),
}) {
if (close != null) {
return close(this);
}
return orElse();
}
}
abstract class Close implements DocEditEvent {
const factory Close() = _$Close;
}
/// @nodoc
class _$DocEditStateTearOff {
const _$DocEditStateTearOff();
_DocEditState call({required bool isSaving}) {
return _DocEditState(
isSaving: isSaving,
);
}
}
/// @nodoc
const $DocEditState = _$DocEditStateTearOff();
/// @nodoc
mixin _$DocEditState {
bool get isSaving => throw _privateConstructorUsedError;
@JsonKey(ignore: true)
$DocEditStateCopyWith<DocEditState> get copyWith =>
throw _privateConstructorUsedError;
}
/// @nodoc
abstract class $DocEditStateCopyWith<$Res> {
factory $DocEditStateCopyWith(
DocEditState value, $Res Function(DocEditState) then) =
_$DocEditStateCopyWithImpl<$Res>;
$Res call({bool isSaving});
}
/// @nodoc
class _$DocEditStateCopyWithImpl<$Res> implements $DocEditStateCopyWith<$Res> {
_$DocEditStateCopyWithImpl(this._value, this._then);
final DocEditState _value;
// ignore: unused_field
final $Res Function(DocEditState) _then;
@override
$Res call({
Object? isSaving = freezed,
}) {
return _then(_value.copyWith(
isSaving: isSaving == freezed
? _value.isSaving
: isSaving // ignore: cast_nullable_to_non_nullable
as bool,
));
}
}
/// @nodoc
abstract class _$DocEditStateCopyWith<$Res>
implements $DocEditStateCopyWith<$Res> {
factory _$DocEditStateCopyWith(
_DocEditState value, $Res Function(_DocEditState) then) =
__$DocEditStateCopyWithImpl<$Res>;
@override
$Res call({bool isSaving});
}
/// @nodoc
class __$DocEditStateCopyWithImpl<$Res> extends _$DocEditStateCopyWithImpl<$Res>
implements _$DocEditStateCopyWith<$Res> {
__$DocEditStateCopyWithImpl(
_DocEditState _value, $Res Function(_DocEditState) _then)
: super(_value, (v) => _then(v as _DocEditState));
@override
_DocEditState get _value => super._value as _DocEditState;
@override
$Res call({
Object? isSaving = freezed,
}) {
return _then(_DocEditState(
isSaving: isSaving == freezed
? _value.isSaving
: isSaving // ignore: cast_nullable_to_non_nullable
as bool,
));
}
}
/// @nodoc
class _$_DocEditState implements _DocEditState {
const _$_DocEditState({required this.isSaving});
@override
final bool isSaving;
@override
String toString() {
return 'DocEditState(isSaving: $isSaving)';
}
@override
bool operator ==(dynamic other) {
return identical(this, other) ||
(other is _DocEditState &&
(identical(other.isSaving, isSaving) ||
const DeepCollectionEquality()
.equals(other.isSaving, isSaving)));
}
@override
int get hashCode =>
runtimeType.hashCode ^ const DeepCollectionEquality().hash(isSaving);
@JsonKey(ignore: true)
@override
_$DocEditStateCopyWith<_DocEditState> get copyWith =>
__$DocEditStateCopyWithImpl<_DocEditState>(this, _$identity);
}
abstract class _DocEditState implements DocEditState {
const factory _DocEditState({required bool isSaving}) = _$_DocEditState;
@override
bool get isSaving => throw _privateConstructorUsedError;
@override
@JsonKey(ignore: true)
_$DocEditStateCopyWith<_DocEditState> get copyWith =>
throw _privateConstructorUsedError;
}

View File

@ -1,6 +1,5 @@
import 'package:app_flowy/workspace/application/app/app_bloc.dart'; import 'package:app_flowy/workspace/application/app/app_bloc.dart';
import 'package:app_flowy/workspace/application/doc/doc_bloc.dart'; import 'package:app_flowy/workspace/application/doc/doc_bloc.dart';
import 'package:app_flowy/workspace/application/doc/doc_edit_bloc.dart';
import 'package:app_flowy/workspace/application/menu/menu_bloc.dart'; import 'package:app_flowy/workspace/application/menu/menu_bloc.dart';
import 'package:app_flowy/workspace/application/menu/menu_user_bloc.dart'; import 'package:app_flowy/workspace/application/menu/menu_user_bloc.dart';
import 'package:app_flowy/workspace/application/trash/trash_bloc.dart'; import 'package:app_flowy/workspace/application/trash/trash_bloc.dart';
@ -86,8 +85,7 @@ class HomeDepsResolver {
); );
// Doc // Doc
getIt.registerFactoryParam<DocBloc, String, void>((docId, _) => DocBloc(iDocImpl: getIt<IDoc>(param1: docId))); getIt.registerFactoryParam<DocBloc, String, void>((docId, _) => DocBloc(docManager: getIt<IDoc>(param1: docId)));
getIt.registerFactoryParam<DocEditBloc, String, void>((docId, _) => DocEditBloc(getIt<IDoc>(param1: docId)));
// trash // trash
getIt.registerLazySingleton<TrashRepo>(() => TrashRepo()); getIt.registerLazySingleton<TrashRepo>(() => TrashRepo());

View File

@ -1,55 +1,69 @@
import 'dart:io'; import 'dart:io';
import 'package:app_flowy/startup/startup.dart'; import 'package:app_flowy/startup/startup.dart';
import 'package:app_flowy/workspace/application/doc/doc_edit_bloc.dart'; import 'package:app_flowy/workspace/application/doc/doc_bloc.dart';
import 'package:app_flowy/workspace/domain/i_doc.dart'; import 'package:app_flowy/workspace/domain/i_doc.dart';
import 'package:editor/flutter_quill.dart'; import 'package:editor/flutter_quill.dart';
import 'package:flowy_infra_ui/style_widget/progress_indicator.dart';
import 'package:flowy_infra_ui/widget/error_page.dart';
import 'package:flowy_sdk/protobuf/flowy-workspace/view_create.pb.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_bloc/flutter_bloc.dart';
class DocPage extends StatefulWidget { class DocPage extends StatefulWidget {
final QuillController controller; final View view;
final DocEditBloc editBloc;
final FlowyDoc doc;
DocPage({Key? key, required this.doc}) const DocPage({Key? key, required this.view}) : super(key: key);
: controller = QuillController(
document: doc.document,
selection: const TextSelection.collapsed(offset: 0),
),
editBloc = getIt<DocEditBloc>(param1: doc.id),
super(key: key);
@override @override
State<DocPage> createState() => _DocPageState(); State<DocPage> createState() => _DocPageState();
} }
class _DocPageState extends State<DocPage> { class _DocPageState extends State<DocPage> {
late DocBloc docBloc;
final FocusNode _focusNode = FocusNode(); final FocusNode _focusNode = FocusNode();
@override
void initState() {
docBloc = getIt<DocBloc>(param1: super.widget.view.id)..add(const DocEvent.initial());
super.initState();
}
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return BlocProvider.value( return MultiBlocProvider(
value: widget.editBloc, providers: [
child: BlocBuilder<DocEditBloc, DocEditState>( BlocProvider<DocBloc>.value(value: docBloc),
builder: (ctx, state) {
return Column(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
_renderEditor(widget.controller),
_renderToolbar(widget.controller),
], ],
); child: BlocBuilder<DocBloc, DocState>(builder: (context, state) {
}, return state.loadState.map(
loading: (_) => const FlowyProgressIndicator(),
finish: (result) => result.successOrFail.fold(
(doc) => _renderDoc(context, doc),
(err) => FlowyErrorPage(err.toString()),
), ),
); );
}),
);
} }
@override @override
Future<void> dispose() async { Future<void> dispose() async {
widget.editBloc.add(const DocEditEvent.close()); docBloc.close();
widget.editBloc.close();
super.dispose(); super.dispose();
await widget.doc.close(); }
Widget _renderDoc(BuildContext context, FlowyDoc doc) {
QuillController controller = QuillController(
document: doc.document,
selection: const TextSelection.collapsed(offset: 0),
);
return Column(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
_renderEditor(controller),
_renderToolbar(controller),
],
);
} }
Widget _renderEditor(QuillController controller) { Widget _renderEditor(QuillController controller) {

View File

@ -1,14 +1,8 @@
import 'package:app_flowy/startup/startup.dart';
import 'package:app_flowy/workspace/application/doc/doc_bloc.dart';
import 'package:app_flowy/workspace/domain/page_stack/page_stack.dart'; import 'package:app_flowy/workspace/domain/page_stack/page_stack.dart';
import 'package:app_flowy/workspace/domain/view_ext.dart'; import 'package:app_flowy/workspace/domain/view_ext.dart';
import 'package:flowy_infra_ui/style_widget/text.dart'; import 'package:flowy_infra_ui/style_widget/text.dart';
import 'package:flowy_log/flowy_log.dart';
import 'package:flowy_infra_ui/widget/error_page.dart';
import 'package:flowy_sdk/protobuf/flowy-workspace/view_create.pb.dart'; import 'package:flowy_sdk/protobuf/flowy-workspace/view_create.pb.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:flowy_infra_ui/style_widget/progress_indicator.dart';
import 'doc_page.dart'; import 'doc_page.dart';
@ -41,8 +35,6 @@ class DocStackContext extends HomeStackContext {
List<NavigationItem> makeNavigationItems() { List<NavigationItem> makeNavigationItems() {
return [ return [
this, this,
this,
this,
]; ];
} }
} }
@ -58,22 +50,7 @@ class DocStackPage extends StatefulWidget {
class _DocStackPageState extends State<DocStackPage> { class _DocStackPageState extends State<DocStackPage> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return MultiBlocProvider( return DocPage(view: widget.view);
providers: [
BlocProvider<DocBloc>(
create: (context) => getIt<DocBloc>(param1: widget.view.id)..add(const DocEvent.loadDoc())),
],
child: BlocBuilder<DocBloc, DocState>(builder: (context, state) {
return state.map(
loading: (_) => const FlowyProgressIndicator(),
loadDoc: (s) => DocPage(doc: s.doc),
loadFail: (s) {
Log.error("$s");
return FlowyErrorPage(s.error.toString());
},
);
}),
);
} }
@override @override