1+ import 'dart:convert' ;
2+
3+ import 'package:flutter/foundation.dart' ;
4+ import 'package:ur/cbor_lite.dart' ;
5+ import 'package:ur/ur.dart' ;
6+ import 'package:mobx/mobx.dart' ;
7+ import 'package:ur/ur_decoder.dart' ;
8+
9+ part 'qr_tools_view_model.g.dart' ;
10+
11+ class QRToolsViewModel = QRToolsViewModelBase with _$QRToolsViewModel ;
12+
13+ enum DevQrType {
14+ zpub,
15+ xpub,
16+ bbqr,
17+ bcur,
18+ unknown,
19+ }
20+
21+ abstract class QRToolsViewModelBase with Store {
22+ @observable
23+ String input = '' ;
24+
25+
26+
27+ @computed
28+ Map <String , dynamic > get data => _getResult (input);
29+
30+ Uint8List _decodeCBOR (Uint8List cbor) {
31+ final cborDecoder = CBORDecoder (cbor);
32+ final out = cborDecoder.decodeBytes ();
33+ return out.$1;
34+ }
35+
36+
37+ Map <String , dynamic > _getResult (String input) {
38+ try {
39+ final decoder = URDecoder ();
40+ for (var part in input.split ('\n ' )) {
41+ part = part.toLowerCase ();
42+ part = part.trim ();
43+ if (part.startsWith ('-' )) {
44+ part = part.substring (1 ).trim ();
45+ }
46+ if (! part.startsWith ('ur:' )) {
47+ continue ;
48+ }
49+ decoder.receivePart (part);
50+ }
51+ return {
52+ "result" : (decoder.result != null ) ? switch (decoder.result.runtimeType) {
53+ UR => {
54+ "cbor" : (decoder.result as UR ).cbor,
55+ "_cbor.decode.base64" : base64.encode (_decodeCBOR ((decoder.result as UR ).cbor)),
56+ "type" : (decoder.result as UR ).type,
57+ "toString" : (decoder.result as UR ).toString (),
58+ },
59+ _ => "unknown type: ${decoder .result .runtimeType }"
60+ } : null ,
61+ "expectedType" : decoder.expectedType,
62+ "estimatedPercentComplete" : decoder.estimatedPercentComplete (),
63+ "processedPartsCount" : decoder.processedPartsCount (),
64+ "expectedPartCount" : decoder.expectedPartCount (),
65+ "isComplete" : decoder.isComplete (),
66+ "isFailure" : decoder.isFailure (),
67+ "isSuccess" : decoder.isSuccess (),
68+ "lastPartIndexes" : decoder.lastPartIndexes (),
69+ "receivedPartIndexes" : decoder.receivedPartIndexes (),
70+ "resultError" : decoder.resultError (),
71+ "resultMessage" : decoder.resultMessage (),
72+ "toString" : decoder.toString (),
73+
74+ };
75+ } catch (e) {
76+ return {
77+ "error" : e.toString (),
78+ };
79+ }
80+ }
81+ }
0 commit comments