You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
cloudsolutions-atoms/lib/modules/applicationDemo/providers/application_demo_request_pr...

223 lines
6.3 KiB
Dart

import 'package:flutter/material.dart';
import 'package:test_sa/controllers/api_routes/urls.dart';
import 'package:test_sa/modules/applicationDemo/models/application_demo_request_model.dart';
import 'package:test_sa/modules/applicationDemo/models/role_model.dart';
import 'dart:convert';
import 'package:http/http.dart' as http;
/// Provider for managing application demo request operations
class ApplicationDemoRequestProvider extends ChangeNotifier {
bool _loading = false;
bool _roleLoading = false;
List<ApplicationDemoRoleModel> _roles = [];
String? _errorMessage;
String? _successMessage;
// Getters
bool get loading => _loading;
bool get roleLoading => _roleLoading;
String? get errorMessage => _errorMessage;
String? get successMessage => _successMessage;
List<ApplicationDemoRoleModel> get roles => _roles;
// Setter
set loading(bool value) {
_loading = value;
notifyListeners();
}
set roleLoading(bool value) {
_loading = value;
notifyListeners();
}
/// Get headers without authentication token for public APIs
Map<String, String> get _unauthenticatedHeaders => {
'Content-Type': 'application/json',
'X-Timezone-Offset': DateTime.now().timeZoneOffset.toString().split(".").first,
};
/// Fetches available roles from the server (without authentication)
Future<int> fetchRoles() async {
if (roleLoading) return -2;
roleLoading = true;
_errorMessage = null;
notifyListeners();
try {
final response = await http.get(
Uri.parse(URLs.getApplicationDemoRoles),
headers: _unauthenticatedHeaders,
);
if (response.statusCode >= 200 && response.statusCode < 300) {
final List<dynamic> responseData = jsonDecode(response.body);
_roles = responseData.map((json) => ApplicationDemoRoleModel.fromJson(json)).toList();
roleLoading = false;
notifyListeners();
return response.statusCode;
} else {
final responseData = jsonDecode(response.body);
_errorMessage = responseData['message'] ?? 'Failed to fetch roles';
roleLoading = false;
notifyListeners();
return response.statusCode;
}
} catch (error) {
_errorMessage = 'Failed to fetch roles: $error';
roleLoading = false;
notifyListeners();
return -1;
}
}
/// Submits an application demo request to the server (without authentication)
Future<bool> submitApplicationDemoRequest(ApplicationDemoRequestModel request) async {
loading = true;
_errorMessage = null;
_successMessage = null;
notifyListeners();
try {
final requestBody = request.toJson();
final response = await http.post(
Uri.parse(URLs.submitApplicationDemoRequest),
headers: _unauthenticatedHeaders,
body: json.encode(requestBody),
);
if (response.statusCode >= 200 && response.statusCode < 300) {
final responseData = json.decode(response.body);
_successMessage = responseData['message'] ?? 'Your demo request has been submitted successfully';
loading = false;
notifyListeners();
return true;
} else {
final responseData = json.decode(response.body);
_errorMessage = responseData['message'] ?? 'Failed to submit request';
loading = false;
notifyListeners();
return false;
}
} catch (error) {
_errorMessage = 'Failed to submit request: $error';
loading = false;
notifyListeners();
return false;
}
}
/// Sends OTP to user via email or SMS
Future<bool> sendOtp({
required String fullName,
required String phoneNumber,
required String email,
required String typeSend, // "SMS" or "Email"
}) async {
loading = true;
_errorMessage = null;
_successMessage = null;
notifyListeners();
try {
final requestBody = {
'fullName': fullName,
'phoneNumber': phoneNumber,
'email': email,
'typeSend': typeSend,
};
final response = await http.post(
Uri.parse(URLs.sendDemoUserOtp),
headers: _unauthenticatedHeaders,
body: json.encode(requestBody),
);
if (response.statusCode >= 200 && response.statusCode < 300) {
final responseData = json.decode(response.body);
_successMessage = responseData['message'];
loading = false;
notifyListeners();
return true;
} else {
final responseData = json.decode(response.body);
_errorMessage = responseData['message'] ?? 'Failed to send OTP';
loading = false;
notifyListeners();
return false;
}
} catch (error) {
_errorMessage = 'Failed to send OTP: $error';
loading = false;
notifyListeners();
return false;
}
}
/// Verifies OTP code
Future<bool> verifyOtp({
String? email,
String? phoneNumber,
required String otpCode,
}) async {
loading = true;
_errorMessage = null;
_successMessage = null;
notifyListeners();
try {
final requestBody = <String, dynamic>{
'otpCode': otpCode,
};
// Add email or phoneNumber based on what's provided
if (email != null && email.isNotEmpty) {
requestBody['email'] = email;
}
if (phoneNumber != null && phoneNumber.isNotEmpty) {
requestBody['phoneNumber'] = phoneNumber;
}
final response = await http.post(
Uri.parse(URLs.verifyDemoUserOtp),
headers: _unauthenticatedHeaders,
body: json.encode(requestBody),
);
if (response.statusCode >= 200 && response.statusCode < 300) {
final responseData = json.decode(response.body);
_successMessage = responseData['message'];
loading = false;
notifyListeners();
return true;
} else {
final responseData = json.decode(response.body);
_errorMessage = responseData['message'] ?? 'Invalid OTP code';
loading = false;
notifyListeners();
return false;
}
} catch (error) {
_errorMessage = 'Failed to verify OTP: $error';
loading = false;
notifyListeners();
return false;
}
}
/// Resets the provider state
void reset() {
_loading = false;
_roles.clear();
_errorMessage = null;
notifyListeners();
}
}