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 client = ref.read(alwaysClientProvider);
  final spaceId = ref.read(newsStateProvider).newsPostSpaceId;
  final newsSlideList = ref.read(newsStateProvider).newsSlideList;
  final lang = L10n.of(context);

  if (spaceId == null) {
    EasyLoading.showToast(L10n.of(context).pleaseFirstSelectASpace);
    return;
  }

  // Show loading message
  EasyLoading.show(status: L10n.of(context).slidePosting);
  try {
    final space = await ref.read(spaceProvider(spaceId).future);
    NewsEntryDraft draft = space.newsDraft();
    for (final slidePost in newsSlideList) {
      final sdk = await ref.read(sdkProvider.future);
      // If slide type is text
      if (slidePost.type == NewsSlideType.text) {
        if (slidePost.text == null || slidePost.text!.trim().isEmpty) {
          if (!context.mounted) {
            EasyLoading.dismiss();
            return;
          }
          EasyLoading.showError(
            L10n.of(context).yourTextSlidesMustContainsSomeText,
            duration: const Duration(seconds: 3),
          );
          return;
        }
        final textDraft = slidePost.html != null
            ? client.textHtmlDraft(slidePost.html!, slidePost.text!)
            : client.textMarkdownDraft(slidePost.text!);
        final textSlideDraft = textDraft.intoNewsSlideDraft();

        textSlideDraft.color(
          sdk.api.newColorizeBuilder(null, slidePost.backgroundColor?.value),
        );

        if (slidePost.newsReferencesModel != null) {
          final objRef = getSlideReference(sdk, slidePost.newsReferencesModel!);
          textSlideDraft.addReference(objRef);
        }
        await draft.addSlide(textSlideDraft);
      }

      // If slide type is image
      else if (slidePost.type == NewsSlideType.image &&
          slidePost.mediaFile != null) {
        final file = slidePost.mediaFile!;
        String? mimeType = file.mimeType ?? lookupMimeType(file.path);
        if (mimeType == null) throw lang.failedToDetectMimeType;
        if (!mimeType.startsWith('image/')) {
          if (!context.mounted) {
            EasyLoading.dismiss();
            return;
          }
          EasyLoading.showError(
            L10n.of(context).postingOfTypeNotYetSupported(mimeType),
            duration: const Duration(seconds: 3),
          );
          return;
        }
        Uint8List bytes = await file.readAsBytes();
        final decodedImage = await decodeImageFromList(bytes);
        final imageDraft = client
            .imageDraft(file.path, mimeType)
            .size(bytes.length)
            .width(decodedImage.width)
            .height(decodedImage.height);
        final imageSlideDraft = imageDraft.intoNewsSlideDraft();
        imageSlideDraft.color(
          sdk.api.newColorizeBuilder(null, slidePost.backgroundColor?.value),
        );
        if (slidePost.newsReferencesModel != null) {
          final objRef = getSlideReference(sdk, slidePost.newsReferencesModel!);
          imageSlideDraft.addReference(objRef);
        }
        await draft.addSlide(imageSlideDraft);
      }

      // If slide type is video
      else if (slidePost.type == NewsSlideType.video &&
          slidePost.mediaFile != null) {
        final file = slidePost.mediaFile!;
        String? mimeType = file.mimeType ?? lookupMimeType(file.path);
        if (mimeType == null) throw lang.failedToDetectMimeType;
        if (!mimeType.startsWith('video/')) {
          if (!context.mounted) {
            EasyLoading.dismiss();
            return;
          }
          EasyLoading.showError(
            L10n.of(context).postingOfTypeNotYetSupported(mimeType),
            duration: const Duration(seconds: 3),
          );
          return;
        }
        Uint8List bytes = await file.readAsBytes();
        final videoDraft =
            client.videoDraft(file.path, mimeType).size(bytes.length);
        final videoSlideDraft = videoDraft.intoNewsSlideDraft();
        videoSlideDraft.color(
          sdk.api.newColorizeBuilder(null, slidePost.backgroundColor?.value),
        );
        if (slidePost.newsReferencesModel != null) {
          final objRef = getSlideReference(sdk, slidePost.newsReferencesModel!);
          videoSlideDraft.addReference(objRef);
        }
        await draft.addSlide(videoSlideDraft);
      }
    }
    await draft.send();

    // close loading
    EasyLoading.dismiss();

    if (!context.mounted) return;
    // FIXME due to #718. well lets at least try forcing a refresh upon route.
    ref.invalidate(newsStateProvider);
    // Navigate back to update screen.
    Navigator.pop(context);
    context.pushReplacementNamed(
      Routes.main.name,
    ); // go to the home / main updates
  } catch (e, s) {
    _log.severe('Failed to send news', e, s);
    if (!context.mounted) {
      EasyLoading.dismiss();
      return;
    }
    EasyLoading.showError(
      L10n.of(context).creatingNewsFailed(e),
      duration: const Duration(seconds: 3),
    );
  }
}