react-native-plugpag-nitro
Version:
High-performance React Native library for PagSeguro PlugPag payment terminals with TypeScript-first hooks API, real-time events, and 10x faster performance using Nitro Modules
470 lines (366 loc) • 13.3 kB
Markdown
# react-native-plugpag-nitro
<div align="center">
<h3>🚀 High-performance PagSeguro PlugPag integration for React Native</h3>
<p>TypeScript-first payment processing with real-time events and JSI performance</p>
[](https://www.npmjs.com/package/react-native-plugpag-nitro)
[](https://www.npmjs.com/package/react-native-plugpag-nitro)
[](LICENSE)
[](https://nitro.margelo.com/)
</div>
## ✨ Features
- 🚀 **High Performance** - Built with Nitro Modules for JSI performance
- 📘 **TypeScript First** - Complete type safety and IntelliSense support
- ⚡ **Real-time Events** - Monitor payment status with React hooks
- 💳 **Multiple Payment Types** - Credit, Debit, Voucher, and PIX support
- 🔄 **Transaction Management** - Payment, refund, and cancellation support
- 🖨️ **Receipt Printing** - Integrated thermal receipt printing
- 🛡️ **Error Handling** - Comprehensive error codes and messages
## 📦 Installation
```bash
npm install react-native-plugpag-nitro react-native-nitro-modules
```
### Requirements
- React Native ≥ 0.72
- Android API ≥ 21
- PagSeguro PlugPag terminal
## 🚀 Quick Start
```typescript
import {
initializeAndActivatePinPad,
doPayment,
useTransactionEvent,
PaymentType,
ErrorCode
} from 'react-native-plugpag-nitro';
function PaymentScreen() {
const paymentEvent = useTransactionEvent();
const handlePayment = async () => {
// Initialize terminal
await initializeAndActivatePinPad('YOUR_ACTIVATION_CODE');
// Process payment
const result = await doPayment({
amount: 2500, // R$ 25.00 in cents
type: PaymentType.CREDIT
});
if (result.result === ErrorCode.OK) {
console.log('Payment approved!', result);
}
};
return (
<View>
{/* Real-time payment events */}
{paymentEvent.code > 0 && (
<Text>Status: {paymentEvent.message}</Text>
)}
<Button title="Pay R$ 25.00" onPress={handlePayment} />
</View>
);
}
```
## 📚 API Reference
### Core Functions
#### `initializeAndActivatePinPad(activationCode: string)`
Initializes and activates the PlugPag terminal.
```typescript
const result = await initializeAndActivatePinPad('YOUR_ACTIVATION_CODE');
// Returns: { result: ErrorCode, errorCode?: string, errorMessage?: string }
```
#### `doPayment(options: PaymentOptions)`
Process payments with type-safe enums.
```typescript
interface PaymentOptions {
amount: number; // Amount in cents
type: PaymentType; // Payment type enum
installmentType?: InstallmentType; // Installment type enum
installments?: number; // Number of installments (default: 1)
printReceipt?: boolean; // Print receipt (default: true)
userReference?: string; // User reference (default: auto-generated)
}
const result = await doPayment({
amount: 2500, // Amount in cents
type: PaymentType.CREDIT, // CREDIT | DEBIT | VOUCHER | PIX
installmentType: InstallmentType.BUYER_INSTALLMENT, // Optional
installments: 3, // Optional
printReceipt: true // Optional
});
```
#### `refundPayment(options)`
Refunds a previous payment transaction.
```typescript
const result = await refundPayment({
transactionCode: 'abc123',
transactionId: 'def456',
printReceipt: true
});
```
### React Hooks
#### `useTransactionEvent()`
Real-time payment event monitoring hook.
```typescript
const paymentEvent = useTransactionEvent();
// Returns: { code: number, message: string, customMessage?: string }
useEffect(() => {
if (paymentEvent.code > 0) {
console.log('Payment event:', paymentEvent.message);
}
}, [paymentEvent]);
```
### Utility Functions
```typescript
// Get terminal serial number
getTerminalSerialNumber(): string
// Get available constants
getConstants(): PlugpagConstants
// Abort current transaction
doAbort(): Promise<PlugpagAbortResult>
// Print custom receipt from file
print(filePath: string): Promise<void>
```
### Type Definitions
```typescript
enum PaymentType {
CREDIT = 1, // Credit card
DEBIT = 2, // Debit card
VOUCHER = 3, // Voucher/meal card
PIX = 5 // PIX instant payment
}
enum ErrorCode {
OK = 0, // Success
OPERATION_ABORTED = -1, // Operation aborted
COMMUNICATION_ERROR = -3, // Connection error
// ... more error codes
}
enum InstallmentType {
NO_INSTALLMENT = 1, // No installment
BUYER_INSTALLMENT = 2, // Buyer pays installment fee
SELLER_INSTALLMENT = 3 // Seller pays installment fee
}
```
## 🎨 UI Customization & Theming
Customize the appearance of PagBank SDK modal dialogs to match your app's design. The library provides complete control over colors, themes, and UI elements displayed during payment transactions.
<div align="center">
<img src="https://github.com/mCodex/react-native-plugpag-nitro/assets/modal-example.png" alt="Customizable Payment Modal" width="400"/>
<p><em>Payment modal with custom dark theme matching your app's design</em></p>
</div>
### ⚡ Quick Theme Setup
```typescript
import { setStyleTheme } from 'react-native-plugpag-nitro';
// Create and apply a custom theme
await setStyleTheme({
headBackgroundColor: '#1A1A1D', // Header background
headTextColor: '#FFFFFF', // Header text
positiveButtonBackground: '#22C55E', // "Confirm" button color
negativeButtonBackground: '#EF4444', // "Cancel" button color
contentTextColor: '#FFFFFF', // Body text color
lineColor: '#71717A' // Borders and lines
});
```
### 🛠️ Custom Theme Creation
Create themes that match your app's design system:
```typescript
// Create a custom brand-based theme
const customTheme = {
headBackgroundColor: '#00D4FF', // Your primary brand color
headTextColor: '#FFFFFF', // White text on colored header
contentTextColor: '#1A1A1D', // Dark text for body content
positiveButtonBackground: '#00D4FF', // Consistent brand color
negativeButtonBackground: '#EF4444', // Standard red for cancel
lineColor: '#E5E7EB' // Light gray for borders
};
await setStyleTheme(customTheme);
```
### 🎨 Complete Style Properties
<details>
<summary><strong>📋 All available style properties</strong></summary>
```typescript
interface PlugpagStyleData {
// Header styling
headTextColor?: string; // Header text color
headBackgroundColor?: string; // Header background color
// Content styling
contentTextColor?: string; // General content text
contentTextValue1Color?: string; // Primary monetary values
contentTextValue2Color?: string; // Secondary monetary values
// Button styling
positiveButtonTextColor?: string; // Confirm button text
positiveButtonBackground?: string; // Confirm button background
negativeButtonTextColor?: string; // Cancel button text
negativeButtonBackground?: string; // Cancel button background
genericButtonBackground?: string; // Generic button background
genericButtonTextColor?: string; // Generic button text
// Input field styling
genericSmsEditTextBackground?: string; // SMS input background
genericSmsEditTextTextColor?: string; // SMS input text
// Interface elements
lineColor?: string; // Lines, borders, dividers
}
```
</details>
### 🔧 Theme Utilities
```typescript
import { ThemeUtils } from 'react-native-plugpag-nitro';
// Validate theme colors
const errors = ThemeUtils.validateTheme(myTheme);
if (errors.length === 0) {
await setStyleTheme(myTheme);
}
// Merge themes
const customizedTheme = ThemeUtils.mergeThemes(
baseTheme, // Your base theme
{ positiveButtonBackground: '#FF6B6B' }
);
// Preview theme colors (for debugging)
const preview = ThemeUtils.createThemePreview(myTheme);
console.log(preview); // { headBackgroundColor: '#1A1A1D', ... }
```
### 💡 Best Practices
- **Apply early**: Set themes during app initialization, before payment operations
- **Match your design**: Use colors that complement your existing UI
- **Accessibility**: Ensure sufficient contrast between text and backgrounds
- **Validation**: Always validate themes before applying them
- **Error handling**: Wrap theme operations in try-catch blocks
### 🏗️ Integration Example
```typescript
import React, { useEffect } from 'react';
import { setStyleTheme } from 'react-native-plugpag-nitro';
export default function App() {
useEffect(() => {
// Apply theme matching your app's design
const initializeTheme = async () => {
try {
const customTheme = {
headBackgroundColor: '#1A1A1D',
headTextColor: '#FFFFFF',
positiveButtonBackground: '#22C55E',
negativeButtonBackground: '#EF4444'
};
await setStyleTheme(customTheme);
console.log('Theme applied successfully');
} catch (error) {
console.error('Failed to apply theme:', error);
}
};
initializeTheme();
}, []);
// ... rest of your app
}
```
> 📖 **Complete styling guide**: See [STYLING_GUIDE.md](STYLING_GUIDE.md) for detailed documentation and examples.
## 💡 Usage Examples
### Complete Payment Flow
```typescript
import React, { useState, useEffect } from 'react';
import {
PaymentType,
ErrorCode,
doPayment,
useTransactionEvent,
initializeAndActivatePinPad
} from 'react-native-plugpag-nitro';
function PaymentScreen() {
const [isInitialized, setIsInitialized] = useState(false);
const [isProcessing, setIsProcessing] = useState(false);
const paymentEvent = useTransactionEvent();
// Initialize terminal on mount
useEffect(() => {
const initialize = async () => {
try {
const result = await initializeAndActivatePinPad('YOUR_ACTIVATION_CODE');
if (result.result === ErrorCode.OK) {
setIsInitialized(true);
}
} catch (error) {
console.error('Initialization failed:', error);
}
};
initialize();
}, []);
const handleCreditPayment = async () => {
if (!isInitialized) {
Alert.alert('Error', 'Terminal not initialized');
return;
}
try {
setIsProcessing(true);
const result = await doPayment({
amount: 2500,
type: PaymentType.CREDIT
});
if (result.result === ErrorCode.OK) {
Alert.alert('Success', 'Payment approved!');
} else {
Alert.alert('Failed', result.message || 'Payment failed');
}
} catch (error) {
Alert.alert('Error', error.message);
} finally {
setIsProcessing(false);
}
};
return (
<View style={{ padding: 20 }}>
<Text>Terminal: {isInitialized ? '✅ Ready' : '❌ Not Ready'}</Text>
{/* Real-time Event Display */}
{paymentEvent.code > 0 && (
<View style={{ padding: 10, backgroundColor: '#e3f2fd', marginVertical: 10 }}>
<Text>Status: {paymentEvent.message}</Text>
<Text>Code: {paymentEvent.code}</Text>
</View>
)}
<Button
title="Credit Card R$ 25.00"
onPress={handleCreditPayment}
disabled={!isInitialized || isProcessing}
/>
</View>
);
}
```
## ⚠️ Error Handling
```typescript
import { ErrorCode, doPayment, PaymentType } from 'react-native-plugpag-nitro';
try {
const result = await doPayment({ amount: 2500, type: PaymentType.CREDIT });
if (result.result !== ErrorCode.OK) {
// Handle specific errors
switch (result.result) {
case ErrorCode.OPERATION_ABORTED:
console.log('Payment cancelled by user');
break;
case ErrorCode.COMMUNICATION_ERROR:
console.log('Connection error - check terminal');
break;
default:
console.log('Payment failed:', result.message);
}
return;
}
console.log('Payment successful!', result);
} catch (error) {
console.error('Payment error:', error.message);
}
```
## 🛠️ Development
```bash
# Clone the repository
git clone https://github.com/mCodex/react-native-plugpag-nitro.git
cd react-native-plugpag-nitro
# Install dependencies
yarn install
# Setup the example project
yarn example android
```
## 🤝 Contributing
We welcome contributions! Please see our [Contributing Guide](CONTRIBUTING.md) for details.
## � License
This project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details.
## 🔗 Links
- [📚 Nitro Modules Documentation](https://nitro.margelo.com/)
- [🏢 PagSeguro PlugPag Official Docs](https://dev.pagseguro.uol.com.br/)
- [🐛 Report Issues](https://github.com/mCodex/react-native-plugpag-nitro/issues)
- [� Discussions](https://github.com/mCodex/react-native-plugpag-nitro/discussions)
---
<div align="center">
<p><strong>Built with ❤️ using Nitro Modules</strong></p>
<p><em>Making React Native payment processing faster and more type-safe</em></p>
</div>