import 'dart:typed_data'; import 'package:dio/dio.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; import '../../../common/network/dio_provider.dart'; import '../../../common/network/protobuf_wire_reader.dart'; class AppMallAuthToken { const AppMallAuthToken({ required this.authToken, required this.expiresIn, required this.sourceApp, required this.scene, }); final String authToken; final int expiresIn; final String sourceApp; final String scene; } class MallAuthApi { const MallAuthApi(this._dio); final Dio _dio; Future issueAppMallAuthToken() async { final response = await _dio.post>( '/api/v1/auth/mall/app-token', // Dio serializes a List as the UTF-8 text "[]". This endpoint // expects an empty protobuf message, whose wire representation is zero // bytes; Uint8List keeps the request body binary and untransformed. data: Uint8List(0), options: protobufOptions(), ); final reply = ProtobufWireMessage(response.data ?? const []); final token = reply.string(1).trim(); final expiresIn = reply.integer(2); final sourceApp = reply.string(3).trim(); final scene = reply.string(4).trim(); if (token.isEmpty || expiresIn <= 0 || sourceApp.isEmpty || scene.isEmpty) { throw const FormatException('Incomplete mall auth token response'); } return AppMallAuthToken( authToken: token, expiresIn: expiresIn, sourceApp: sourceApp, scene: scene, ); } } final mallAuthApiProvider = Provider( (ref) => MallAuthApi(ref.watch(dioProvider)), );