| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100 | import 'package:app_flowy/workspace/application/view/view_listener.dart';import 'package:app_flowy/workspace/application/view/view_service.dart';import 'package:dartz/dartz.dart';import 'package:flowy_sdk/protobuf/flowy-folder/view.pb.dart';import 'package:flowy_sdk/protobuf/flowy-error/errors.pb.dart';import 'package:flutter_bloc/flutter_bloc.dart';import 'package:freezed_annotation/freezed_annotation.dart';part 'view_bloc.freezed.dart';class ViewBloc extends Bloc<ViewEvent, ViewState> {  final ViewService service;  final ViewListener listener;  final ViewPB view;  ViewBloc({    required this.view,    required this.service,    required this.listener,  }) : super(ViewState.init(view)) {    on<ViewEvent>((event, emit) async {      await event.map(        initial: (e) {          listener.start(onViewUpdated: (result) {            add(ViewEvent.viewDidUpdate(result));          });          emit(state);        },        setIsEditing: (e) {          emit(state.copyWith(isEditing: e.isEditing));        },        viewDidUpdate: (e) {          e.result.fold(            (view) => emit(state.copyWith(view: view, successOrFailure: left(unit))),            (error) => emit(state.copyWith(successOrFailure: right(error))),          );        },        rename: (e) async {          final result = await service.updateView(viewId: view.id, name: e.newName);          emit(            result.fold(              (l) => state.copyWith(successOrFailure: left(unit)),              (error) => state.copyWith(successOrFailure: right(error)),            ),          );        },        delete: (e) async {          final result = await service.delete(viewId: view.id);          await service.updateView(viewId: view.id);          emit(            result.fold(              (l) => state.copyWith(successOrFailure: left(unit)),              (error) => state.copyWith(successOrFailure: right(error)),            ),          );        },        duplicate: (e) async {          final result = await service.duplicate(viewId: view.id);          emit(            result.fold(              (l) => state.copyWith(successOrFailure: left(unit)),              (error) => state.copyWith(successOrFailure: right(error)),            ),          );        },      );    });  }  @override  Future<void> close() async {    await listener.stop();    return super.close();  }}@freezedclass ViewEvent with _$ViewEvent {  const factory ViewEvent.initial() = Initial;  const factory ViewEvent.setIsEditing(bool isEditing) = SetEditing;  const factory ViewEvent.rename(String newName) = Rename;  const factory ViewEvent.delete() = Delete;  const factory ViewEvent.duplicate() = Duplicate;  const factory ViewEvent.viewDidUpdate(Either<ViewPB, FlowyError> result) = ViewDidUpdate;}@freezedclass ViewState with _$ViewState {  const factory ViewState({    required ViewPB view,    required bool isEditing,    required Either<Unit, FlowyError> successOrFailure,  }) = _ViewState;  factory ViewState.init(ViewPB view) => ViewState(        view: view,        isEditing: false,        successOrFailure: left(unit),      );}
 |