75 lines
2.1 KiB
Dart
75 lines
2.1 KiB
Dart
import 'dart:typed_data';
|
||
import 'package:dio/dio.dart';
|
||
import '../../core/constants/api_endpoints.dart';
|
||
import '../../core/network/api_response.dart';
|
||
import '../../core/network/dio_client.dart';
|
||
import '../models/user.dart';
|
||
|
||
/// 用戶服務
|
||
class UserService {
|
||
final DioClient _client;
|
||
|
||
UserService(this._client);
|
||
|
||
/// 用戶登錄
|
||
Future<ApiResponse<Map<String, dynamic>>> login(
|
||
String username,
|
||
String password,
|
||
) async {
|
||
return _client.post<Map<String, dynamic>>(
|
||
ApiEndpoints.login,
|
||
data: {'username': username, 'password': password},
|
||
);
|
||
}
|
||
|
||
/// 用戶註冊(multipart:含身份證圖片和可選推廣碼)
|
||
Future<ApiResponse<Map<String, dynamic>>> register(
|
||
String username,
|
||
String password, {
|
||
String? referralCode,
|
||
required Uint8List frontBytes,
|
||
required Uint8List backBytes,
|
||
}) async {
|
||
final formData = FormData.fromMap({
|
||
'username': username,
|
||
'password': password,
|
||
if (referralCode != null && referralCode.isNotEmpty) 'referralCode': referralCode,
|
||
'front': MultipartFile.fromBytes(frontBytes, filename: 'front.jpg'),
|
||
'back': MultipartFile.fromBytes(backBytes, filename: 'back.jpg'),
|
||
});
|
||
return _client.upload<Map<String, dynamic>>(
|
||
ApiEndpoints.register,
|
||
formData: formData,
|
||
);
|
||
}
|
||
|
||
/// 獲取用戶信息
|
||
Future<ApiResponse<User>> getUserInfo() async {
|
||
return _client.get<User>(
|
||
ApiEndpoints.userInfo,
|
||
fromJson: (data) => User.fromJson(data as Map<String, dynamic>),
|
||
);
|
||
}
|
||
|
||
/// 上傳 KYC 資料(身份證正反面圖片字節)
|
||
/// 使用 fromBytes 以兼容 Web 和移動端
|
||
Future<ApiResponse<void>> uploadKyc(
|
||
Uint8List frontBytes,
|
||
Uint8List backBytes,
|
||
) async {
|
||
final formData = FormData.fromMap({
|
||
'front': MultipartFile.fromBytes(frontBytes, filename: 'front.jpg'),
|
||
'back': MultipartFile.fromBytes(backBytes, filename: 'back.jpg'),
|
||
});
|
||
return _client.upload<void>(
|
||
ApiEndpoints.kyc,
|
||
formData: formData,
|
||
);
|
||
}
|
||
|
||
/// 退出登錄
|
||
Future<ApiResponse<void>> logout() async {
|
||
return _client.post<void>(ApiEndpoints.logout);
|
||
}
|
||
}
|