react-native-bluetooth-datecs-printer
Version:
Module to printer in a Datecs bluetooth Printer
653 lines (555 loc) • 16.2 kB
Markdown
# 🧪 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
```