feat: adicionar suporte a impressoras pequenas com parâmetro dpi e layout adaptativo para etiquetas

This commit is contained in:
2026-03-14 21:21:15 -03:00
parent b6e4aa7622
commit 5c8d6a368e
6 changed files with 261 additions and 64 deletions
+52 -2
View File
@@ -320,8 +320,8 @@ Base: `EXPO_PUBLIC_API_URL` (padrão: `http://localhost:3000/api/v1`)
| PATCH | `/filaments/:id` | Atualizar |
| DELETE | `/filaments/:id` | Excluir |
| GET | `/filaments/:id/qrcode` | QR Code PNG |
| GET | `/filaments/:id/label.svg` | Etiqueta SVG (`width_mm`, `height_mm`, `fields`) |
| GET | `/filaments/:id/label.pdf` | Etiqueta PDF (`width_mm`, `height_mm`, `fields`) |
| GET | `/filaments/:id/label.svg` | Etiqueta SVG (`width_mm`, `height_mm`, `fields`, `dpi`) |
| GET | `/filaments/:id/label.pdf` | Etiqueta PDF (`width_mm`, `height_mm`, `fields`, `dpi`) |
### Spool Presets
@@ -349,6 +349,7 @@ Base: `EXPO_PUBLIC_API_URL` (padrão: `http://localhost:3000/api/v1`)
- [x] Exportar etiqueta SVG via `GET /filaments/:id/label.svg`
- [x] Exportar etiqueta PDF via `GET /filaments/:id/label.pdf`
- [x] Seletor de formato (PDF/SVG) e controle de campos na tela de etiqueta
- [x] Suporte a Niimbot D11/D110 (22×14mm) com seleção automática de conteúdo mínimo
- [x] NFC leitura NTAG215 → `nfc-reader.tsx` (bottom sheet modal)
- [x] NFC gravação NTAG215 → `filaments/[id]/write-nfc.tsx`
- [ ] NFC suporte iOS (requer entitlement `com.apple.developer.nfc.readwrite`)
@@ -360,6 +361,55 @@ Base: `EXPO_PUBLIC_API_URL` (padrão: `http://localhost:3000/api/v1`)
## Mudanças Recentes (14/03/2026)
### ✅ Suporte a Impressoras Pequenas — Niimbot D11/D110 (`label.tsx`)
**Arquivo alterado**: `app/(app)/filaments/[id]/label.tsx`
#### Preset Niimbot 22×14mm
Adicionado como primeira opção em `LABEL_SIZES`:
```ts
{ id: '22x14', label: '22 × 14', sub: 'Niimbot D11/D110' }
```
O tipo `LabelSize` foi atualizado para incluir `'22x14'`.
#### Seleção automática de conteúdo mínimo
A função `handleSizeChange` substitui o `setSelectedSize` direto nos chips. Ao selecionar `22x14`, o conteúdo ativo é automaticamente reduzido para `{ color, name, qrcode }` — os únicos campos que cabem fisicamente em 22×14mm. O usuário pode ajustar manualmente após.
```ts
const MINI_LABEL_CONTENT: Set<ContentOption> = new Set(['color', 'name', 'qrcode']);
function handleSizeChange(size: LabelSize): void {
setSelectedSize(size);
if (size === '22x14') setEnabledContent(new Set(MINI_LABEL_CONTENT));
}
```
#### `dpi=203` enviado para o backend
O parâmetro `dpi` é incluído automaticamente nos requests de `/label.pdf` e `/label.svg` quando Niimbot está selecionado. Instrui o backend a calcular pixels do SVG na resolução correta da impressora térmica.
#### Fix: btoa chunking para PDFs grandes
O código original usava `String.fromCharCode(...new Uint8Array(buffer))` com spread, que causa **stack overflow** em buffers > ~64KB em React Native. Substituído por loop em chunks de 8192 bytes:
```ts
const bytes = new Uint8Array(response.data);
let binary = '';
const CHUNK = 8192;
for (let i = 0; i < bytes.length; i += CHUNK) {
binary += String.fromCharCode(...bytes.subarray(i, i + CHUNK));
}
const base64 = btoa(binary);
```
Essa correção se aplica a todos os tamanhos de etiqueta, não apenas Niimbot.
---
### ✅ NFC Read/Write — NTAG215
Implementação completa de leitura e gravação NFC para tags NTAG215. O conteúdo gravado é idêntico ao QR Code: `meowspool://filament/{id}` como NDEF URI record.