210 lines
7.9 KiB
Dart
210 lines
7.9 KiB
Dart
import 'dart:io';
|
|
|
|
import 'package:dio/dio.dart';
|
|
import 'package:flutter/foundation.dart';
|
|
import 'package:hoshan/data/storage/shared_preferences_helper.dart';
|
|
import 'package:image_picker/image_picker.dart';
|
|
import 'package:path_provider/path_provider.dart';
|
|
import 'package:pretty_dio_logger/pretty_dio_logger.dart';
|
|
|
|
class DioService {
|
|
static String baseURL = 'https://basa.houshan.ai';
|
|
//user
|
|
static String sendOTP = '/v2/user/otp'; //POST
|
|
// static String register = '/user/register'; //POST
|
|
static String loginWithPassword = '/user/login'; //POST
|
|
static String loginWithOTP = '/user/login/otp'; //POST
|
|
static String getInfo = '/user/info'; //GET
|
|
static String editUsername = '/user/username'; //PUT
|
|
static String checkUsername = '/user/username'; //POST
|
|
static String editProfile = '/user/profile'; //PUT
|
|
static String editPassword = '/user/password'; //PUT
|
|
static String deleteProfile = '/user/profile'; //DELETE
|
|
static String giftCode = '/user/code'; //POST
|
|
static String cardNumber = '/user/card-number'; //PUT
|
|
static String addSubUser = '/user/sub-user'; //POST
|
|
static String getSubUsers = '/user/sub-user'; //GET
|
|
static String deleteSubUser(String id) => '/user/sub-user/$id'; //DELETE
|
|
static String reportDay = '/user/report/daily'; //GET
|
|
static String reportWeek = '/user/report/weekly'; //GET
|
|
static String reportPeriodic = '/user/report/periodic'; //GET
|
|
static String reportPiCoin = '/user/report/coin'; //GET
|
|
static String readAllNotifications = '/user/notification'; //PUT
|
|
static String fCMtoken = '/user/firebase-token'; //PUT
|
|
//chatbot
|
|
static String sendMessage = '/chatbot/'; //POST //GET //DELETE //STREAM
|
|
static String chatHistory({required final int id}) =>
|
|
'/chatbot/$id'; //GET //DELETE q{id}
|
|
static String editTitle({required final int id}) =>
|
|
'/chatbot/$id/title'; //PUT
|
|
static String archive({required final int id}) =>
|
|
'/chatbot/$id/archive'; //PUT
|
|
static String relatedQuestions({required final int id}) =>
|
|
'/chatbot/$id/related_questions'; //POST q{id};
|
|
static String messageDelete(
|
|
{required final int id, required final String messageId}) =>
|
|
'/chatbot/$id/message/$messageId'; //DELETE q{id} q{message_id}
|
|
static String likeMessage(
|
|
{required final int id, required final String messageId}) =>
|
|
'/chatbot/$id/message/$messageId/feedback'; //PUT q{id} q{message_id}
|
|
//bot
|
|
static String getAllBots = '/bot/'; //GET q{string:serach}
|
|
static String getSingleBot(int id) => '/bot/$id'; //GET q{string:serach}
|
|
//category
|
|
static String sendMessageTool({required final int id}) =>
|
|
'/tool/$id'; //POST //GET //DELETE //STREAM
|
|
static String allCategories = '/category/'; //GET
|
|
static String toolsCategories = '/v2/category/tool'; //GET
|
|
//Ticket
|
|
static String ticket = '/ticket/'; //GET
|
|
static String deleteTicket(int id) => '/ticket/$id'; //GET
|
|
//Forum
|
|
static String forumComments = '/forum/comment/'; //GET //POST
|
|
static String forumReplieComments(int id) => '/forum/comment/$id'; //GET
|
|
static String forumCommentsFeedback(int id) =>
|
|
'/forum/comment/$id/feedback'; //PUT
|
|
//Assistant
|
|
static String getGlobalAssistants = '/bot/assistant'; //GET
|
|
static String getPersonalAssistants = '/bot/personal'; //GET
|
|
static String getPersonalAssistant(int id) => '/bot/personal/$id'; //GET
|
|
static String getGlobalAssistant(int id) => '/bot/$id'; //GET
|
|
static String getAssistantComments(int id) => '/bot/$id/comment'; //GET
|
|
static String markedBot(int id) => '/bot/$id/mark'; //PUT
|
|
//paymant
|
|
static String paymant = '/paymant/'; //GET
|
|
static String paymantBazar = '/paymant/bazzar'; //GET
|
|
static String paymantMyket = '/paymant/myket'; //GET
|
|
static String paymantHistory = '/paymant/history'; //GET
|
|
static String paymantPlans = '/v2/paymant/plan'; //GET
|
|
static String discount = '/discount/'; //POST
|
|
static String settlement = '/paymant/settlement'; //POST
|
|
static String homeBanner = '/banner/'; //GET
|
|
//generators
|
|
static String media = '/category/media'; //GET
|
|
static String effects = '/category/effect'; //GET
|
|
static String singleMedia(int id) => '/category/media/$id'; //GET
|
|
//characters
|
|
static String characters = '/category/character'; //GET
|
|
//events
|
|
static String events = '/event/';
|
|
static String remaining = '/advertisement/remaining';
|
|
DioService() {
|
|
if (kDebugMode) {
|
|
String token = AuthTokenStorage.getToken();
|
|
print("AuthToken: $token");
|
|
}
|
|
}
|
|
static const _canLog = kDebugMode && !kIsWeb;
|
|
|
|
static final Dio _dio = Dio(BaseOptions(
|
|
baseUrl: baseURL,
|
|
connectTimeout: const Duration(minutes: 1),
|
|
responseType: ResponseType.json,
|
|
headers: {
|
|
"Content-Type": "application/json",
|
|
'accept': '*/*',
|
|
// 'Authorization': "Bearer $token",
|
|
}))
|
|
..interceptors.add(PrettyDioLogger(enabled: _canLog));
|
|
|
|
static final Dio _dioStream = Dio(BaseOptions(
|
|
baseUrl: baseURL,
|
|
connectTimeout: const Duration(minutes: 10),
|
|
receiveTimeout: const Duration(minutes: 10),
|
|
sendTimeout: const Duration(minutes: 10),
|
|
responseType: ResponseType.stream,
|
|
headers: {
|
|
"Content-Type": "application/json",
|
|
'accept': '*/*',
|
|
}))
|
|
..interceptors.add(PrettyDioLogger(enabled: _canLog));
|
|
|
|
Dio sendRequest() {
|
|
String token = AuthTokenStorage.getToken();
|
|
_dio.options.headers.addAll({'Authorization': "Bearer $token"});
|
|
return _dio;
|
|
}
|
|
|
|
Dio sendRequestStream() {
|
|
String token = AuthTokenStorage.getToken();
|
|
_dioStream.options.headers.addAll({'Authorization': "Bearer $token"});
|
|
return _dioStream;
|
|
}
|
|
|
|
static final Map<String, Future<XFile?>> _ongoingDownloads = {};
|
|
|
|
static Future<XFile?> downloadFile(String url,
|
|
{String? cDirectory, Function(int, int)? onReceiveProgress}) async {
|
|
if (_ongoingDownloads.containsKey(url)) {
|
|
return _ongoingDownloads[url];
|
|
}
|
|
|
|
final downloadFuture = _downloadFile(url,
|
|
cDirectory: cDirectory, onReceiveProgress: onReceiveProgress);
|
|
_ongoingDownloads[url] = downloadFuture;
|
|
|
|
final result = await downloadFuture;
|
|
_ongoingDownloads.remove(url);
|
|
return result;
|
|
}
|
|
|
|
static Future<XFile?> _downloadFile(String url,
|
|
{String? cDirectory, Function(int, int)? onReceiveProgress}) async {
|
|
try {
|
|
final response = await _dio.get(url,
|
|
options: Options(responseType: ResponseType.bytes),
|
|
onReceiveProgress: onReceiveProgress);
|
|
if (response.statusCode == 200) {
|
|
final blob = response.data;
|
|
final fileName = url.split('/').last;
|
|
if (cDirectory != null) {
|
|
final filePath = '$cDirectory/$fileName';
|
|
final file = File(filePath);
|
|
await file.writeAsBytes(blob);
|
|
return XFile(filePath);
|
|
} else {
|
|
final directory = await getApplicationDocumentsDirectory();
|
|
final filePath = '${directory.path}/$fileName';
|
|
final file = File(filePath);
|
|
await file.writeAsBytes(blob);
|
|
return XFile(filePath);
|
|
}
|
|
} else {
|
|
debugPrint(
|
|
"Error: Unable to download file. Status: ${response.statusCode}");
|
|
return null;
|
|
}
|
|
} on DioException catch (e) {
|
|
if (kDebugMode) {
|
|
print("Error downloading file: $e");
|
|
}
|
|
return null;
|
|
}
|
|
}
|
|
|
|
static Future<MultipartFile> getMultipartFile(XFile file) async {
|
|
if (kIsWeb) {
|
|
final bytes = await file.readAsBytes();
|
|
return MultipartFile.fromBytes(bytes, filename: file.name);
|
|
} else {
|
|
return MultipartFile.fromFile(file.path, filename: file.name);
|
|
}
|
|
}
|
|
|
|
static Future<int?> getFileSize(String url) async {
|
|
try {
|
|
Dio dio = Dio();
|
|
Response response =
|
|
await dio.head(url, options: Options(followRedirects: true));
|
|
|
|
String? contentLength = response.headers.value('content-length');
|
|
return contentLength != null ? int.parse(contentLength) : null;
|
|
} catch (e) {
|
|
if (kDebugMode) {
|
|
print("Error: $e");
|
|
}
|
|
return null;
|
|
}
|
|
}
|
|
}
|