feat: call the publish event

This commit is contained in:
Lucas.Xu
2024-06-21 16:25:06 +08:00
committed by Kilu
parent 360f3df99e
commit 95194930f9
4 changed files with 112 additions and 85 deletions

View File

@ -23,30 +23,9 @@ class DocumentShareBloc extends Bloc<DocumentShareEvent, DocumentShareState> {
return; return;
} }
emit( emit(state.copyWith(isLoading: true));
state.copyWith(isLoading: true),
);
final exporter = DocumentExporter(view); final result = await _export(type, path);
final FlowyResult<ExportDataPB, FlowyError> result =
await exporter.export(type.exportType).then((value) {
return value.fold(
(s) {
if (path != null) {
switch (type) {
case DocumentShareType.markdown:
return FlowyResult.success(_saveMarkdownToPath(s, path));
case DocumentShareType.html:
return FlowyResult.success(_saveHTMLToPath(s, path));
default:
break;
}
}
return FlowyResult.failure(FlowyError());
},
(f) => FlowyResult.failure(f),
);
});
emit( emit(
state.copyWith( state.copyWith(
@ -55,11 +34,41 @@ class DocumentShareBloc extends Bloc<DocumentShareEvent, DocumentShareState> {
), ),
); );
}, },
publish: (url) async {
emit(state.copyWith(isPublished: true));
},
unPublish: () async {
emit(state.copyWith(isPublished: false));
},
); );
}); });
} }
final ViewPB view; final ViewPB view;
late final exporter = DocumentExporter(view);
Future<FlowyResult<ExportDataPB, FlowyError>> _export(
DocumentShareType type,
String? path,
) async {
final result = await exporter.export(type.exportType);
return result.fold(
(s) {
if (path != null) {
switch (type) {
case DocumentShareType.markdown:
return FlowySuccess(_saveMarkdownToPath(s, path));
case DocumentShareType.html:
return FlowySuccess(_saveHTMLToPath(s, path));
default:
break;
}
}
return FlowyResult.failure(FlowyError());
},
(f) => FlowyResult.failure(f),
);
}
ExportDataPB _saveMarkdownToPath(String markdown, String path) { ExportDataPB _saveMarkdownToPath(String markdown, String path) {
File(path).writeAsStringSync(markdown); File(path).writeAsStringSync(markdown);
@ -103,7 +112,9 @@ class DocumentShareEvent with _$DocumentShareEvent {
const factory DocumentShareEvent.share( const factory DocumentShareEvent.share(
DocumentShareType type, DocumentShareType type,
String? path, String? path,
) = Share; ) = _Share;
const factory DocumentShareEvent.publish(String url) = _Publish;
const factory DocumentShareEvent.unPublish() = _UnPublish;
} }
@freezed @freezed
@ -111,9 +122,12 @@ class DocumentShareState with _$DocumentShareState {
const factory DocumentShareState({ const factory DocumentShareState({
required bool isLoading, required bool isLoading,
FlowyResult<ExportDataPB, FlowyError>? exportResult, FlowyResult<ExportDataPB, FlowyError>? exportResult,
required bool isPublished,
FlowyResult<void, FlowyError>? publishResult,
}) = _DocumentShareState; }) = _DocumentShareState;
factory DocumentShareState.initial() => const DocumentShareState( factory DocumentShareState.initial() => const DocumentShareState(
isLoading: false, isLoading: false,
isPublished: false,
); );
} }

View File

@ -1,25 +1,31 @@
import 'package:appflowy/generated/flowy_svgs.g.dart'; import 'package:appflowy/generated/flowy_svgs.g.dart';
import 'package:appflowy/generated/locale_keys.g.dart'; import 'package:appflowy/generated/locale_keys.g.dart';
import 'package:appflowy/plugins/document/application/document_share_bloc.dart';
import 'package:easy_localization/easy_localization.dart'; import 'package:easy_localization/easy_localization.dart';
import 'package:flowy_infra_ui/flowy_infra_ui.dart'; import 'package:flowy_infra_ui/flowy_infra_ui.dart';
import 'package:flowy_infra_ui/widget/rounded_button.dart'; import 'package:flowy_infra_ui/widget/rounded_button.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
class PublishTab extends StatefulWidget { class PublishTab extends StatelessWidget {
const PublishTab({super.key}); const PublishTab({super.key});
@override
State<PublishTab> createState() => _PublishTabState();
}
class _PublishTabState extends State<PublishTab> {
bool isPublished = false;
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return isPublished return context.watch<DocumentShareBloc>().state.isPublished
? _PublishedWidget(onUnPublish: () {}, onVisitSite: () {}) ? _PublishedWidget(
: _UnPublishWidget(onPublish: () => setState(() => isPublished = true)); onUnPublish: () {
context
.read<DocumentShareBloc>()
.add(const DocumentShareEvent.unPublish());
},
onVisitSite: () {},
)
: _UnPublishWidget(
onPublish: () => context
.read<DocumentShareBloc>()
.add(const DocumentShareEvent.publish('')),
);
} }
} }

View File

@ -41,26 +41,32 @@ class DocumentShareButton extends StatelessWidget {
} }
}, },
child: BlocBuilder<DocumentShareBloc, DocumentShareState>( child: BlocBuilder<DocumentShareBloc, DocumentShareState>(
builder: (context, state) => SizedBox( builder: (context, state) {
height: 32.0, final shareBloc = context.read<DocumentShareBloc>();
child: IntrinsicWidth( return SizedBox(
child: AppFlowyPopover( height: 32.0,
direction: PopoverDirection.bottomWithRightAligned, child: IntrinsicWidth(
constraints: const BoxConstraints( child: AppFlowyPopover(
maxWidth: 422, direction: PopoverDirection.bottomWithRightAligned,
), constraints: const BoxConstraints(
margin: const EdgeInsets.all(16), maxWidth: 422,
offset: const Offset(0, 8), ),
popupBuilder: (context) => const ShareMenu(), margin: const EdgeInsets.all(16),
child: RoundedTextButton( offset: const Offset(0, 8),
title: LocaleKeys.shareAction_buttonText.tr(), popupBuilder: (context) => BlocProvider.value(
padding: const EdgeInsets.symmetric(horizontal: 12.0), value: shareBloc,
fontSize: 14.0, child: const ShareMenu(),
textColor: Theme.of(context).colorScheme.onPrimary, ),
child: RoundedTextButton(
title: LocaleKeys.shareAction_buttonText.tr(),
padding: const EdgeInsets.symmetric(horizontal: 12.0),
fontSize: 14.0,
textColor: Theme.of(context).colorScheme.onPrimary,
),
), ),
), ),
), );
), },
), ),
), ),
); );

View File

@ -51,32 +51,36 @@ class _ShareMenuState extends State<ShareMenu> {
return Column( return Column(
mainAxisSize: MainAxisSize.min, mainAxisSize: MainAxisSize.min,
children: [ children: [
CustomSlidingSegmentedControl<ShareMenuTab>( SizedBox(
initialValue: selectedTab, height: 34,
curve: Curves.linear, child: CustomSlidingSegmentedControl<ShareMenuTab>(
padding: 0, initialValue: selectedTab,
innerPadding: const EdgeInsets.all(3.0), curve: Curves.linear,
children: children, padding: 0,
decoration: BoxDecoration( fixedWidth: 128,
color: const Color(0xFFEEF0F3), innerPadding: const EdgeInsets.all(3.0),
borderRadius: BorderRadius.circular(8), children: children,
decoration: BoxDecoration(
color: const Color(0xFFEEF0F3),
borderRadius: BorderRadius.circular(8),
),
thumbDecoration: BoxDecoration(
color: Colors.white,
boxShadow: const [
BoxShadow(
color: Color(0x141F2225),
blurRadius: 8,
offset: Offset(0, 2),
),
],
borderRadius: BorderRadius.circular(8),
),
onValueChanged: (v) {
setState(() {
selectedTab = v;
});
},
), ),
thumbDecoration: BoxDecoration(
color: Colors.white,
boxShadow: const [
BoxShadow(
color: Color(0x141F2225),
blurRadius: 8,
offset: Offset(0, 2),
),
],
borderRadius: BorderRadius.circular(8),
),
onValueChanged: (v) {
setState(() {
selectedTab = v;
});
},
), ),
_buildTab(context), _buildTab(context),
], ],
@ -108,13 +112,10 @@ class _Segment extends StatelessWidget {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
final textColor = isSelected ? null : Theme.of(context).hintColor; final textColor = isSelected ? null : Theme.of(context).hintColor;
return SizedBox( return FlowyText(
width: 128, title,
child: FlowyText( textAlign: TextAlign.center,
title, color: textColor,
textAlign: TextAlign.center,
color: textColor,
),
); );
} }
} }