redirectToAppRouteOrUrl function

Future<void> redirectToAppRouteOrUrl(
  1. BuildContext context,
  2. String? target, {
  3. String? reference,
  4. AppTranslations? tr,
})

Redirige vers une route interne Flutter ou une URL externe selon la valeur.

Implementation

Future<void> redirectToAppRouteOrUrl(BuildContext context, String? target,
    {String? reference, AppTranslations? tr}) async {
  if (target == null || target.isEmpty) return;

  final isRoute = target.startsWith('/') && !target.startsWith('http');
  if (isRoute) {

    Navigator.of(context).pushNamed(target, arguments: reference);
    return;
  }

  final uri = Uri.tryParse(target);
  if (uri != null && (uri.isScheme('http') || uri.isScheme('https'))) {
    final separator = target.contains('?') ? '&' : '?';
    final finalUrl = reference != null ? '$target${separator}reference=$reference' : target;
    final launchUri = Uri.parse(finalUrl);
    if (await canLaunchUrl(launchUri)) {
      await launchUrl(launchUri, mode: LaunchMode.externalApplication);
    } else {
      ScaffoldMessenger.of(context).showSnackBar(
        SnackBar(content: Text(tr?.unableToOpen ?? "Impossible d'ouvrir la redirection.")),
      );
    }
  } else {
    ScaffoldMessenger.of(context).showSnackBar(
      SnackBar(content: Text(tr?.invalidRedirect ?? "Redirection invalide.")),
    );
  }
}