@@ -24,6 +24,24 @@ import 'explorer_api.dart'
2424 Status,
2525 Tapi;
2626
27+ class PaginatedRequest <T > {
28+ int page;
29+ int total;
30+ int totalPages;
31+ int firstPage;
32+ int lastPage;
33+ T data;
34+
35+ PaginatedRequest ({
36+ required this .page,
37+ required this .total,
38+ required this .totalPages,
39+ required this .firstPage,
40+ required this .lastPage,
41+ required this .data,
42+ });
43+ }
44+
2745enum ExplorerMode {
2846 production,
2947 development,
@@ -52,7 +70,21 @@ class ExplorerClient {
5270 var response = await http.get (uri);
5371 if (response.statusCode == 200 ) {
5472 // response is okay
55- return convert.jsonDecode (response.body) as Map <String , dynamic >;
73+ dynamic result =
74+ convert.jsonDecode (response.body) as Map <String , dynamic >;
75+
76+ if (response.headers["x-pagination" ] != null ) {
77+ dynamic paginationHeaders = response.headers["x-pagination" ];
78+
79+ return PaginatedRequest (
80+ data: result,
81+ firstPage: paginationHeaders["first_page" ],
82+ lastPage: paginationHeaders["last_page" ],
83+ page: paginationHeaders["page" ],
84+ total: paginationHeaders["total" ],
85+ totalPages: paginationHeaders["total_pages" ],
86+ );
87+ }
5688 } else if (response.statusCode == 500 ) {}
5789 throw ExplorerException (
5890 code: response.statusCode, message: response.reasonPhrase! );
@@ -179,20 +211,40 @@ class ExplorerClient {
179211 }
180212 }
181213
182- Future <NetworkBalances > networkBalances ({int ? page, int ? pageSize}) async {
214+ Future <PaginatedRequest <NetworkBalances >> networkBalances (
215+ {int ? page, int ? pageSize}) async {
183216 try {
184- return NetworkBalances .fromJson (await _processGet (
185- api ('network/balances' , {"page" : page, "page_size" : pageSize})));
217+ PaginatedRequest <dynamic > result = await _processGet (
218+ api ('network/balances' , {"page" : page, "page_size" : pageSize}));
219+
220+ return PaginatedRequest (
221+ data: NetworkBalances .fromJson (result.data),
222+ firstPage: result.firstPage,
223+ lastPage: result.lastPage,
224+ page: result.page,
225+ total: result.total,
226+ totalPages: result.totalPages,
227+ );
186228 } on ExplorerException catch (e) {
187229 throw ExplorerException (
188230 code: e.code, message: '{"network": "${e .message }"}' );
189231 }
190232 }
191233
192- Future <NetworkReputation > reputation ({int ? page, int ? pageSize}) async {
234+ Future <PaginatedRequest <NetworkReputation >> reputation (
235+ {int ? page, int ? pageSize}) async {
193236 try {
194- return NetworkReputation .fromJson (await _processGet (
195- api ('network/reputation' , {"page" : page, "page_size" : pageSize})));
237+ PaginatedRequest <dynamic > result = await _processGet (
238+ api ('network/reputation' , {"page" : page, "page_size" : pageSize}));
239+
240+ return PaginatedRequest (
241+ data: NetworkReputation .fromJson (result.data),
242+ firstPage: result.firstPage,
243+ lastPage: result.lastPage,
244+ page: result.page,
245+ total: result.total,
246+ totalPages: result.totalPages,
247+ );
196248 } on ExplorerException catch (e) {
197249 throw ExplorerException (
198250 code: e.code, message: '{"network": "${e .message }"}' );
@@ -233,37 +285,71 @@ class ExplorerClient {
233285 try {
234286 switch (tab) {
235287 case 'blocks' :
236- List <Map <String , dynamic >> data = await _processGet (api (
237- 'address/blocks' ,
238- {'address' : value, 'page' : page, 'page_size' : pageSize}));
239- return AddressBlocks .fromJson (data);
288+ PaginatedRequest <List <Map <String , dynamic >>> result =
289+ await _processGet (api ('address/blocks' ,
290+ {'address' : value, 'page' : page, 'page_size' : pageSize}));
291+ return PaginatedRequest (
292+ data: AddressBlocks .fromJson (result.data),
293+ firstPage: result.firstPage,
294+ lastPage: result.lastPage,
295+ page: result.page,
296+ total: result.total,
297+ totalPages: result.totalPages,
298+ );
240299 // case 'details':
241300 // var data = await _processGet(api('address', {'value': value}));
242301 // return AddressDetails.fromJson(data);
243302 case 'data_requests_solved' :
244- var data = await _processGet (api ('address/data-requests-solved' ,
303+ PaginatedRequest <dynamic > result = await _processGet (api (
304+ 'address/data-requests-solved' ,
245305 {'value' : value, 'page' : page, 'page_size' : pageSize}));
246- return AddressDataRequestsSolved .fromJson (
247- {'address' : value, 'data_requests_solved' : data});
306+ return PaginatedRequest (
307+ data: AddressDataRequestsSolved .fromJson (
308+ {'address' : value, 'data_requests_solved' : result.data}),
309+ firstPage: result.firstPage,
310+ lastPage: result.lastPage,
311+ page: result.page,
312+ total: result.total,
313+ totalPages: result.totalPages,
314+ );
248315 case 'data_requests_created' :
249316 // TODO: implement method
250317 // waiting on the explorer to return valid response
251318 break ;
252319 case 'value_transfers' :
253- var data = await _processGet (api ('address/value-transfers' ,
320+ PaginatedRequest <dynamic > result = await _processGet (api (
321+ 'address/value-transfers' ,
254322 {'value' : value, 'page' : page, 'page_size' : pageSize}));
255- return AddressValueTransfers .fromJson (data);
323+
324+ return PaginatedRequest (
325+ data: AddressValueTransfers .fromJson (result.data),
326+ firstPage: result.firstPage,
327+ lastPage: result.lastPage,
328+ page: result.page,
329+ total: result.total,
330+ totalPages: result.totalPages,
331+ );
256332 }
257333 } on ExplorerException catch (e) {
258334 throw ExplorerException (
259335 code: e.code, message: '{"address": "${e .message }"}' );
260336 }
261337 }
262338
263- Future <Blockchain > blockchain ({int ? page, int ? pageSize}) async {
339+ Future <PaginatedRequest <Blockchain >> blockchain (
340+ {int ? page, int ? pageSize}) async {
264341 try {
265- return Blockchain .fromJson (await _processGet (
266- api ('network/blockchain' , {'page' : page, 'page_size' : pageSize})));
342+ PaginatedRequest <dynamic > result = await _processGet (
343+ api ('network/blockchain' , {'page' : page, 'page_size' : pageSize}));
344+
345+ return PaginatedRequest (
346+ data: Blockchain .fromJson (result.data),
347+ firstPage: result.firstPage,
348+ lastPage: result.lastPage,
349+ page: result.page,
350+ total: result.total,
351+ totalPages: result.totalPages,
352+ );
267353 } on ExplorerException catch (e) {
268354 throw ExplorerException (
269355 code: e.code, message: '{"blockchain": "${e .message }"}' );
0 commit comments