UNPKG

react-native-bluetooth-datecs-printer

Version:

Module to printer in a Datecs bluetooth Printer

653 lines (555 loc) 16.2 kB
# 🧪 Guia de Teste da Biblioteca ## 🚀 Teste Automatizado (Mais Rápido!) ### Usando os Scripts Prontos: **Windows (PowerShell):** ```powershell cd c:\projetos\masfelix\react-native-bluetooth-datecs-printer # Opção 1: Script completo com logs .\test-library.ps1 # Opção 2: Script simplificado (mais rápido) .\test-simple.ps1 ``` **Linux/Mac (Bash):** ```bash cd /path/to/react-native-bluetooth-datecs-printer chmod +x test-library.sh ./test-library.sh ``` Os scripts automaticamente: - ✅ Criam um novo projeto Expo - ✅ Instalam todas as dependências - ✅ Copiam configuração de exemplo (app.json) - ✅ Instalam a biblioteca localmente - ✅ Copiam App.tsx de exemplo completo - ✅ Executam o prebuild Depois é só executar: ```bash cd ../test-printer-app # ou ../test-printer-simple npx expo run:android ``` --- ## Opção 1: Testar Localmente (Recomendado para Desenvolvimento) ### Método A: Usando npm link #### 1. Na pasta da biblioteca: ```bash cd c:\projetos\masfelix\react-native-bluetooth-datecs-printer npm link ``` #### 2. Crie um novo projeto Expo para teste: ```bash cd c:\projetos\test-apps npx create-expo-app@latest printer-test-app cd printer-test-app ``` #### 3. Instale as dependências necessárias: ```bash npm install npx expo install expo-build-properties npm link react-native-bluetooth-datecs-printer ``` #### 4. Configure o app.json: ```json { "expo": { "name": "printer-test-app", "slug": "printer-test-app", "version": "1.0.0", "plugins": [ [ "expo-build-properties", { "android": { "compileSdkVersion": 36, "targetSdkVersion": 36, "minSdkVersion": 26, "buildToolsVersion": "35.0.0" } } ] ], "android": { "permissions": [ "BLUETOOTH", "BLUETOOTH_ADMIN", "BLUETOOTH_CONNECT", "BLUETOOTH_SCAN", "ACCESS_FINE_LOCATION", "ACCESS_COARSE_LOCATION" ], "package": "com.test.printerapp" } } } ``` #### 5. Execute o prebuild e rode o app: ```bash npx expo prebuild --clean npx expo run:android ``` #### Para desvincular depois: ```bash # No projeto de teste npm unlink react-native-bluetooth-datecs-printer # Na pasta da biblioteca npm unlink ``` --- ### Método B: Usando arquivo local (mais simples) #### 1. No projeto de teste: ```bash cd c:\projetos\test-apps npx create-expo-app@latest printer-test-app cd printer-test-app npm install npx expo install expo-build-properties ``` #### 2. Instale a biblioteca localmente: ```bash npm install file:../masfelix/react-native-bluetooth-datecs-printer ``` ou com caminho absoluto: ```bash npm install file:c:/projetos/masfelix/react-native-bluetooth-datecs-printer ``` #### 3. Configure app.json (mesmo do Método A) #### 4. Execute: ```bash npx expo prebuild --clean npx expo run:android ``` #### Para atualizar após mudanças na biblioteca: ```bash npm uninstall react-native-bluetooth-datecs-printer npm install file:../masfelix/react-native-bluetooth-datecs-printer npx expo prebuild --clean ``` --- ## Opção 2: Publicar em npm Registry (Para Produção) ### Publicação Oficial: #### 1. Atualize a versão no package.json: ```json { "version": "2.0.0" } ``` #### 2. Faça login no npm: ```bash npm login ``` #### 3. Publique: ```bash cd c:\projetos\masfelix\react-native-bluetooth-datecs-printer npm publish ``` #### 4. Use em qualquer projeto: ```bash npm install react-native-bluetooth-datecs-printer@2.0.0 ``` --- ## Opção 3: Publicar em GitHub Packages (Privado) ### 1. Configure .npmrc na raiz da biblioteca: ``` @masfelix:registry=https://npm.pkg.github.com ``` ### 2. Atualize package.json: ```json { "name": "@masfelix/react-native-bluetooth-datecs-printer", "publishConfig": { "registry": "https://npm.pkg.github.com" } } ``` ### 3. Faça login no GitHub Packages: ```bash npm login --registry=https://npm.pkg.github.com ``` ### 4. Publique: ```bash npm publish ``` ### 5. Use em outros projetos: ```bash npm install @masfelix/react-native-bluetooth-datecs-printer ``` --- ## Opção 4: Usar Git diretamente (Sem publicar) ### No projeto de teste, instale diretamente do Git: ```bash # Via HTTPS npm install https://github.com/masfelix/react-native-bluetooth-datecs-printer.git # Via SSH npm install git+ssh://git@github.com:masfelix/react-native-bluetooth-datecs-printer.git # Branch específico npm install https://github.com/masfelix/react-native-bluetooth-datecs-printer.git#main # Tag específica npm install https://github.com/masfelix/react-native-bluetooth-datecs-printer.git#v2.0.0 ``` ### No package.json do projeto de teste: ```json { "dependencies": { "react-native-bluetooth-datecs-printer": "github:masfelix/react-native-bluetooth-datecs-printer#main" } } ``` --- ## 📱 Aplicação de Teste Completa ### Crie App.tsx no projeto de teste: ```typescript import React, { useEffect, useState } from 'react'; import { View, Button, Text, PermissionsAndroid, Platform, Alert, FlatList, StyleSheet, SafeAreaView, ScrollView } from 'react-native'; import { RNBluetoothDatecsPrinter } from 'react-native-bluetooth-datecs-printer'; export default function App() { const [devices, setDevices] = useState([]); const [connectedDevice, setConnectedDevice] = useState(null); const [status, setStatus] = useState('Desconectado'); useEffect(() => { requestPermissions(); }, []); const requestPermissions = async () => { if (Platform.OS === 'android') { if (Platform.Version >= 31) { const granted = await PermissionsAndroid.requestMultiple([ PermissionsAndroid.PERMISSIONS.BLUETOOTH_CONNECT, PermissionsAndroid.PERMISSIONS.BLUETOOTH_SCAN, ]); const allGranted = granted['android.permission.BLUETOOTH_CONNECT'] === 'granted' && granted['android.permission.BLUETOOTH_SCAN'] === 'granted'; if (!allGranted) { Alert.alert('Permissões necessárias', 'Conceda as permissões de Bluetooth'); } } } }; const scanDevices = async () => { try { setStatus('Buscando dispositivos...'); const pairedDevices = await RNBluetoothDatecsPrinter.getDeviceList(); setDevices(pairedDevices); setStatus(`${pairedDevices.length} dispositivos encontrados`); if (pairedDevices.length === 0) { Alert.alert('Nenhum dispositivo', 'Pareie a impressora nas configurações do Bluetooth'); } } catch (error) { setStatus('Erro ao buscar dispositivos'); Alert.alert('Erro', error.message); } }; const connect = async (device) => { try { setStatus('Conectando...'); await RNBluetoothDatecsPrinter.connect(device.address); setConnectedDevice(device); setStatus(`Conectado: ${device.name}`); Alert.alert('Conectado!', `Conectado a ${device.name}`); } catch (error) { setStatus('Erro ao conectar'); Alert.alert('Erro', error.message); } }; const disconnect = async () => { try { await RNBluetoothDatecsPrinter.disconnect(); setConnectedDevice(null); setStatus('Desconectado'); Alert.alert('Desconectado', 'Impressora desconectada'); } catch (error) { Alert.alert('Erro', error.message); } }; const printTest = async () => { if (!connectedDevice) { Alert.alert('Erro', 'Conecte-se a uma impressora primeiro'); return; } try { setStatus('Imprimindo...'); await RNBluetoothDatecsPrinter.printText('\n'); await RNBluetoothDatecsPrinter.printText('=== TESTE DE IMPRESSÃO ===\n'); await RNBluetoothDatecsPrinter.printText('\n'); await RNBluetoothDatecsPrinter.printText('Data: ' + new Date().toLocaleString('pt-BR') + '\n'); await RNBluetoothDatecsPrinter.printText('\n'); await RNBluetoothDatecsPrinter.printText('Biblioteca Atualizada!\n'); await RNBluetoothDatecsPrinter.printText('Expo SDK 54\n'); await RNBluetoothDatecsPrinter.printText('Android SDK 36\n'); await RNBluetoothDatecsPrinter.printText('\n'); await RNBluetoothDatecsPrinter.printText('==========================\n'); await RNBluetoothDatecsPrinter.printText('\n\n\n'); setStatus('Impressão concluída!'); Alert.alert('Sucesso!', 'Impressão concluída'); } catch (error) { setStatus('Erro ao imprimir'); Alert.alert('Erro', error.message); } }; return ( <SafeAreaView style={styles.container}> <ScrollView> <View style={styles.content}> <Text style={styles.title}>🖨️ Teste Datecs Printer</Text> <View style={styles.statusBox}> <Text style={styles.statusLabel}>Status:</Text> <Text style={styles.statusText}>{status}</Text> </View> <View style={styles.buttonContainer}> <Button title="🔍 Buscar Impressoras" onPress={scanDevices} /> </View> {connectedDevice && ( <View style={styles.connectedBox}> <Text style={styles.connectedTitle}>✅ Conectado</Text> <Text style={styles.connectedDevice}>{connectedDevice.name}</Text> <Text style={styles.connectedAddress}>{connectedDevice.address}</Text> <View style={styles.buttonRow}> <View style={styles.buttonHalf}> <Button title="📄 Imprimir Teste" onPress={printTest} color="#28a745" /> </View> <View style={styles.buttonHalf}> <Button title="🔌 Desconectar" onPress={disconnect} color="#dc3545" /> </View> </View> </View> )} <Text style={styles.sectionTitle}>Dispositivos Pareados:</Text> {devices.length === 0 ? ( <Text style={styles.emptyText}> Nenhum dispositivo. Toque em "Buscar Impressoras" </Text> ) : ( devices.map((device) => ( <View key={device.address} style={styles.deviceItem}> <View style={styles.deviceInfo}> <Text style={styles.deviceName}> {device.name || 'Dispositivo Desconhecido'} </Text> <Text style={styles.deviceAddress}>{device.address}</Text> </View> <Button title={connectedDevice?.address === device.address ? '✓' : 'Conectar'} onPress={() => connect(device)} disabled={connectedDevice?.address === device.address} color={connectedDevice?.address === device.address ? '#28a745' : '#007bff'} /> </View> )) )} <View style={styles.infoBox}> <Text style={styles.infoTitle}>ℹ️ Informações</Text> <Text style={styles.infoText}>• Expo SDK 54</Text> <Text style={styles.infoText}>• Android SDK 36</Text> <Text style={styles.infoText}>• React Native 0.76+</Text> <Text style={styles.infoText}>• AndroidX</Text> </View> </View> </ScrollView> </SafeAreaView> ); } const styles = StyleSheet.create({ container: { flex: 1, backgroundColor: '#f5f5f5', }, content: { padding: 20, }, title: { fontSize: 28, fontWeight: 'bold', textAlign: 'center', marginBottom: 20, color: '#333', }, statusBox: { backgroundColor: '#fff', padding: 15, borderRadius: 8, marginBottom: 20, borderWidth: 1, borderColor: '#ddd', }, statusLabel: { fontSize: 12, color: '#666', marginBottom: 5, }, statusText: { fontSize: 16, fontWeight: 'bold', color: '#333', }, buttonContainer: { marginBottom: 20, }, connectedBox: { backgroundColor: '#d4edda', padding: 15, borderRadius: 8, marginBottom: 20, borderWidth: 1, borderColor: '#c3e6cb', }, connectedTitle: { fontSize: 16, fontWeight: 'bold', color: '#155724', marginBottom: 5, }, connectedDevice: { fontSize: 18, fontWeight: 'bold', color: '#155724', }, connectedAddress: { fontSize: 12, color: '#155724', marginBottom: 15, }, buttonRow: { flexDirection: 'row', gap: 10, }, buttonHalf: { flex: 1, }, sectionTitle: { fontSize: 18, fontWeight: 'bold', marginBottom: 10, color: '#333', }, emptyText: { textAlign: 'center', color: '#999', padding: 20, backgroundColor: '#fff', borderRadius: 8, }, deviceItem: { flexDirection: 'row', justifyContent: 'space-between', alignItems: 'center', backgroundColor: '#fff', padding: 15, marginBottom: 10, borderRadius: 8, borderWidth: 1, borderColor: '#ddd', }, deviceInfo: { flex: 1, }, deviceName: { fontSize: 16, fontWeight: 'bold', color: '#333', }, deviceAddress: { fontSize: 12, color: '#666', marginTop: 4, }, infoBox: { backgroundColor: '#e7f3ff', padding: 15, borderRadius: 8, marginTop: 20, borderWidth: 1, borderColor: '#b3d9ff', }, infoTitle: { fontSize: 16, fontWeight: 'bold', color: '#004085', marginBottom: 10, }, infoText: { fontSize: 14, color: '#004085', marginBottom: 5, }, }); ``` --- ## 🧪 Checklist de Testes ### Testes Básicos: - [ ] App compila sem erros - [ ] Permissões são solicitadas corretamente - [ ] Lista de dispositivos é exibida - [ ] Conecta à impressora Datecs - [ ] Imprime texto corretamente - [ ] Desconecta corretamente ### Testes Android: - [ ] Android 14+ (API 34-36) - [ ] Android 12-13 (API 31-33) - [ ] Android 8-11 (API 26-30) - [ ] Permissões runtime funcionam - [ ] Build de release funciona ### Testes de Build: - [ ] `npx expo run:android` funciona - [ ] `npx expo prebuild` funciona - [ ] Build de produção funciona - [ ] EAS Build funciona (se aplicável) --- ## 🐛 Troubleshooting ### Erro: "Cannot find module" ```bash # Limpe o cache npm cache clean --force rm -rf node_modules package-lock.json npm install npx expo prebuild --clean ``` ### Erro: "Namespace not specified" Certifique-se de que está usando a versão atualizada da biblioteca ### Build falha ```bash cd android ./gradlew clean cd .. npx expo prebuild --clean ``` ### Permissões negadas Verifique se o app.json tem todas as permissões e se está solicitando em runtime --- ## 📝 Comandos Úteis ```bash # Ver logs do Android npx expo run:android --no-install --device # Limpar tudo npx expo prebuild --clean cd android && ./gradlew clean && cd .. # Build de produção eas build --platform android --profile production # Desinstalar app do dispositivo adb uninstall com.test.printerapp ``` --- ## ✅ Teste Rápido (1 minuto) ```bash # Criar projeto de teste npx create-expo-app@latest test-printer --template blank cd test-printer # Instalar biblioteca local npm install file:../react-native-bluetooth-datecs-printer npx expo install expo-build-properties # Copiar configuração de exemplo cp ../react-native-bluetooth-datecs-printer/app.json.example ./app.json # Copiar exemplo cp ../react-native-bluetooth-datecs-printer/examples/ExpoExample.tsx ./App.tsx # Build e executar npx expo prebuild --clean npx expo run:android ```