reveal static method

Future reveal(
  1. BuildContext context
)

Implementation

static Future reveal(BuildContext context) async {
  final IAppDataStore appDataStore = getObject();
  final IDeviceInfo deviceInfo = getObject();
  final canShowDialog = await appDataStore.canShowAppRatings();

  // If user said no thanks, don't show the dialog.
  if (!canShowDialog) {
    return;
  }

  final lastSeenAt = await appDataStore.ratingShownAtMs();

  // Use native iOS dialog if on iOS.
  // iOS has limitation for 3 an year
  // TODO: ask again next year

  final lastSeen = DateTime.fromMillisecondsSinceEpoch(lastSeenAt);
  final difference = DateTime.now().difference(lastSeen);

  if (difference > const Duration(days: 365)) {
    await appDataStore.setRatingShownCount(0);
  }

  final seenCount = await appDataStore.ratingShownCount();

  await appDataStore.setRatingShownCount(seenCount + 1);

  appDataStore.setRatingShownAtMs(DateTime.now().millisecondsSinceEpoch);

  if (seenCount < 3) {
    if (PlatformUtils.isIOS) {
      deviceInfo.openIosReview();
      return;
    }
  }

  final IHubbleAnalytics analytics = getObject();
  // ignore: use_build_context_synchronously
  final action = await _openModal(context);

  if (action == null) {
    return;
  }

  analytics.selectAppRatingOption(
    option: action.toString(),
  );

  if (action == _AppRatingDialogAction.rateNow) {
    deviceInfo.openAppStore();
  } else if (action == _AppRatingDialogAction.noThanks) {
    await appDataStore.setCanShowAppRatings(false);
  }
}