sendNews function

Future<void> sendNews(
  1. dynamic context,
  2. dynamic ref
)

Implementation

Future<void> sendNews(BuildContext context, WidgetRef ref) async {
  // Hide Keyboard
  SystemChannels.textInput.invokeMethod('TextInput.hide');

  final newsSlideList = ref.read(newsStateProvider).newsSlideList;
  final lang = L10n.of(context);
  final spaceId = ref.read(newsStateProvider).newsPostSpaceId ??
      await selectSpaceDrawer(
        context: context,
        canCheck: 'CanPostNews',
      );

  if (spaceId == null) {
    EasyLoading.showToast(lang.pleaseFirstSelectASpace);
    return;
  }

  // Show loading message
  EasyLoading.show(status: lang.slidePosting);
  final space = await ref.read(spaceProvider(spaceId).future);
  NewsEntryDraft draft = space.newsDraft();
  int slideIdx = 0;
  for (final slidePost in newsSlideList) {
    // for users
    slideIdx += 1;
    // If slide type is text
    try {
      final slide = await switch (slidePost.type) {
        NewsSlideType.text => _makeTextSlide(ref, slidePost, lang),
        NewsSlideType.image => _makeImageSlide(ref, slidePost, lang),
        NewsSlideType.video => _makeVideoSlide(ref, slidePost, lang),
      };
      await draft.addSlide(slide);
    } catch (err, s) {
      _log.severe(
        'Failed to process ${slidePost.type} at $slideIdx ',
        err,
        s,
      );
      EasyLoading.showError(
        lang.errorProcessingSlide(slideIdx, err),
        duration: const Duration(seconds: 3),
      );
      return;
    }
  }
  try {
    final eventId = await draft.send();
    // we want to stay informed about this via push notifications
    await autosubscribe(ref: ref, objectId: eventId.toString(), lang: lang);
  } catch (e, s) {
    _log.severe('Failed to send news', e, s);
    EasyLoading.showError(
      lang.creatingNewsFailed(e),
      duration: const Duration(seconds: 3),
    );
    return;
  }

  // close loading
  EasyLoading.dismiss();

  // FIXME due to #718. well lets at least try forcing a refresh upon route.
  ref.invalidate(newsStateProvider);
  // Navigate back to update screen.
  if (!context.mounted) return;
  Navigator.pop(context);
  context.pushReplacementNamed(Routes.main.name); // go to the home/main updates
}