bemall_promotion 1.0.0+1 copy "bemall_promotion: ^1.0.0+1" to clipboard
bemall_promotion: ^1.0.0+1 copied to clipboard

SDK para integração com a plataforma BeMall.

example/lib/main.dart

import 'package:bemall_promotion/bemall_sdk.dart';
import 'package:flutter/material.dart';
import 'package:permission_handler/permission_handler.dart';

void main() async {
  runApp(const MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(title: 'SDK BeMall', home: const HomeScreen());
  }
}

class HomeScreen extends StatefulWidget {
  const HomeScreen({super.key});

  @override
  State<HomeScreen> createState() => _HomeScreenState();
}

class _HomeScreenState extends State<HomeScreen> {
  bool _checkedPermissions = false;

  @override
  void initState() {
    super.initState();
    _checkPermissions();
  }

  Future<void> _requestPermissions() async {
    await [
      Permission.camera,
      Permission.photos, // iOS
      Permission.storage, // Android até API 32
      Permission.videos, // Android 13+
    ].request();
  }

  Future<void> _checkPermissions() async {
    if (_checkedPermissions) return;

    try {
      final status = await Permission.camera.status;

      if (status.isDenied || status.isRestricted) {
        await _requestPermissions();
      }

      _checkedPermissions = true;
    } catch (e) {
      debugPrint('[BeMall SDK] Erro ao checar permissões: $e');
    }
  }

  void _handleWebViewError(dynamic error) {
    switch (error.errorType) {
      case 'WebResourceErrorType.authentication':
        debugPrint("Falha de autenticação no servidor");
        break;
      case 'WebResourceErrorType.badUrl':
        debugPrint("URL malformada");
        break;
      case 'WebResourceErrorType.connect':
        debugPrint("Falha ao conectar ao servidor");
        break;
      case 'WebResourceErrorType.failedSslHandshake':
        debugPrint("Falha na negociação SSL/TLS");
        break;
      case 'WebResourceErrorType.file':
        debugPrint("Erro genérico de arquivo");
        break;
      case 'WebResourceErrorType.fileNotFound':
        debugPrint("Arquivo não encontrado");
        break;
      case 'WebResourceErrorType.hostLookup':
        debugPrint("DNS não encontrado");
        break;
      case 'WebResourceErrorType.io':
        debugPrint("Erro de leitura/escrita (I/O)");
        break;
      case 'WebResourceErrorType.proxyAuthentication':
        debugPrint("Falha de autenticação em proxy");
        break;
      case 'WebResourceErrorType.redirectLoop':
        debugPrint("Loop de redirecionamento detectado");
        break;
      case 'WebResourceErrorType.timeout':
        debugPrint("Conexão expirada");
        break;
      case 'WebResourceErrorType.tooManyRequests':
        debugPrint("Muitas requisições");
        break;
      case 'WebResourceErrorType.unknown':
        debugPrint("Erro genérico/desconhecido");
        break;
      case 'WebResourceErrorType.unsafeResource':
        debugPrint("Recurso inseguro bloqueado");
        break;
      case 'WebResourceErrorType.unsupportedAuthScheme':
        debugPrint("Esquema de autenticação não suportado");
        break;
      case 'WebResourceErrorType.unsupportedScheme':
        debugPrint("Esquema de URI não suportado");
        break;
      case 'WebResourceErrorType.webContentProcessTerminated':
        debugPrint("Processo da WebView encerrado");
        break;
      case 'WebResourceErrorType.webViewInvalidated':
        debugPrint("WebView inválida");
        break;
      case 'WebResourceErrorType.javaScriptExceptionOccurred':
        debugPrint("Erro em execução de JavaScript");
        break;
      case 'WebResourceErrorType.javaScriptResultTypeIsUnsupported':
        debugPrint("Resultado JS não suportado");
        break;
      default:
        debugPrint("❌ Erro não tratado: ${error.errorType}");
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Center(
        child: ElevatedButton(
          onPressed: () {
            Navigator.push(
              context,
              MaterialPageRoute(
                builder: (context) => WebAppViewPromotion(
                  customerId: 'teste',
                  campaignHash: 'puuijyyk',
                  customerAccessToken:
                      '197|CZnPG3in8UEd47elM4LkkUuJMsT7oqB5Syy6f7L8ddd168bf',
                  onClose: () => Navigator.of(context).pop(),
                  pageErrorNotifier: (error) => {
                    // _handleWebViewError(error),
                  },
                  pageLoadedNotifier: (loading) =>
                      debugPrint('booelan loading: $loading'),
                  showDebugButton: true,
                ),
              ),
            );
          },
          child: const Text('Abrir WebApp Promotion'),
        ),
      ),
    );
  }
}