QIPS-1205

etqan_ovr_integration
aamir-csol 1 day ago
parent 71d03ba664
commit facb3bf4e6

@ -68,11 +68,11 @@ class EtqanApiClient {
if (b.createdDate == null) return -1; if (b.createdDate == null) return -1;
try { try {
// Parse dates in format "15-Feb-2026 05:24 PM" // Parse dates in format "26-Feb-2026 12:54 PM" or "01-Mar-2026 02:45 PM"
DateFormat dateFormat = DateFormat("dd-MMM-yyyy hh:mm a"); DateFormat dateFormat = DateFormat("dd-MMM-yyyy hh:mm a", "en_US");
DateTime dateA = dateFormat.parse(a.createdDate!); DateTime dateA = dateFormat.parse(a.createdDate!);
DateTime dateB = dateFormat.parse(b.createdDate!); DateTime dateB = dateFormat.parse(b.createdDate!);
return dateA.compareTo(dateB); return dateB.compareTo(dateA); // Descending order (newest first)
} catch (e) { } catch (e) {
return (b.createdDate ?? '').compareTo(a.createdDate ?? ''); return (b.createdDate ?? '').compareTo(a.createdDate ?? '');
} }

@ -1,6 +1,5 @@
import 'dart:io'; import 'dart:io';
import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/foundation.dart'; import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:mohem_flutter_app/api/etqan_ovr_api_client.dart'; import 'package:mohem_flutter_app/api/etqan_ovr_api_client.dart';
@ -23,6 +22,8 @@ class EtqanOvrProviderModel with ChangeNotifier, DiagnosticableTreeMixin {
final SpeechToText _speechToText = SpeechToText(); final SpeechToText _speechToText = SpeechToText();
bool _speechEnabled = false; bool _speechEnabled = false;
bool _isListening = false; bool _isListening = false;
String _currentLocaleId = '';
TextEditingController? _currentController;
// Getters for speech state // Getters for speech state
bool get speechEnabled => _speechEnabled; bool get speechEnabled => _speechEnabled;
@ -50,18 +51,25 @@ class EtqanOvrProviderModel with ChangeNotifier, DiagnosticableTreeMixin {
Future<void> initSpeech() async { Future<void> initSpeech() async {
_speechEnabled = await _speechToText.initialize( _speechEnabled = await _speechToText.initialize(
onStatus: (String status) { onStatus: (String status) {
// Update listening state when speech recognition status changes print('Speech status: $status, isListening: $_isListening');
if (status == 'done' || status == 'notListening') { // If user wants to keep listening but speech stopped, restart it
_isListening = false; if ((status == 'done' || status == 'notListening') && _isListening && _currentController != null) {
notifyListeners(); // Automatically restart listening after a brief pause
Future.delayed(const Duration(milliseconds: 200), () {
if (_isListening && _currentController != null) {
_startListeningInternal(_currentLocaleId, _currentController!);
}
});
} }
}, },
); );
notifyListeners(); notifyListeners();
} }
/// Start listening for speech input /// Internal method to start listening
Future<void> startListening(String localeId, TextEditingController controller) async { Future<void> _startListeningInternal(String localeId, TextEditingController controller) async {
if (!_speechEnabled) return;
await _speechToText.listen( await _speechToText.listen(
onResult: (SpeechRecognitionResult result) { onResult: (SpeechRecognitionResult result) {
description = result.recognizedWords; description = result.recognizedWords;
@ -70,19 +78,31 @@ class EtqanOvrProviderModel with ChangeNotifier, DiagnosticableTreeMixin {
notifyListeners(); notifyListeners();
}, },
localeId: localeId, localeId: localeId,
listenFor: const Duration(seconds: 30), listenFor: const Duration(seconds: 60),
pauseFor: const Duration(seconds: 3), pauseFor: const Duration(seconds: 10),
partialResults: true, listenOptions: SpeechListenOptions(
listenMode: ListenMode.confirmation, partialResults: true,
listenMode: ListenMode.confirmation,
cancelOnError: false,
),
); );
}
/// Start listening for speech input
Future<void> startListening(String localeId, TextEditingController controller) async {
_isListening = true; _isListening = true;
_currentLocaleId = localeId;
_currentController = controller;
notifyListeners(); notifyListeners();
await _startListeningInternal(localeId, controller);
} }
/// Stop listening for speech input /// Stop listening for speech input
Future<void> stopListening() async { Future<void> stopListening() async {
await _speechToText.stop();
_isListening = false; _isListening = false;
_currentLocaleId = '';
_currentController = null;
await _speechToText.stop();
notifyListeners(); notifyListeners();
} }
@ -193,21 +213,7 @@ class EtqanOvrProviderModel with ChangeNotifier, DiagnosticableTreeMixin {
Utils.hideLoading(context); Utils.hideLoading(context);
if (response != null) { if (response != null) {
getEtqanEmployeeRequestsList = await EtqanApiClient().getEmployeeEtqanRequests(); getEtqanEmployeeRequestsList = await EtqanApiClient().getEmployeeEtqanRequests();
if (getEtqanEmployeeRequestsList != null) { notifyListeners();
getEtqanEmployeeRequestsList!.sort((EtqanGetEmployeeOvrRequestsResponse a, EtqanGetEmployeeOvrRequestsResponse b) {
if (a.createdDate == null && b.createdDate == null) return 0;
if (a.createdDate == null) return 1;
if (b.createdDate == null) return -1;
try {
DateFormat dateFormat = DateFormat("dd-MMM-yyyy hh:mm a");
DateTime dateA = dateFormat.parse(a.createdDate!);
DateTime dateB = dateFormat.parse(b.createdDate!);
return dateA.compareTo(dateB);
} catch (e) {
return (b.createdDate ?? '').compareTo(a.createdDate ?? '');
}
});
}
return response; return response;
} }
return null; return null;
@ -217,4 +223,12 @@ class EtqanOvrProviderModel with ChangeNotifier, DiagnosticableTreeMixin {
return null; return null;
} }
} }
@override
void dispose() {
if (_isListening) {
_speechToText.stop();
}
super.dispose();
}
} }

@ -39,6 +39,8 @@ class _EtqanOvrCreateRequestState extends State<EtqanOvrCreateRequest> {
@override @override
void dispose() { void dispose() {
// Stop listening if active
context.read<EtqanOvrProviderModel>().stopListening();
_descriptionController.dispose(); _descriptionController.dispose();
super.dispose(); super.dispose();
} }

@ -1,4 +1,3 @@
import 'dart:convert';
import 'package:easy_localization/easy_localization.dart' as lclize; import 'package:easy_localization/easy_localization.dart' as lclize;
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
@ -69,7 +68,7 @@ class _EtqanOvrHomeState extends State<EtqanOvrHome> {
mainAxisAlignment: MainAxisAlignment.spaceBetween, mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: <Widget>[ children: <Widget>[
(data.ticketNumber ?? "").toText14(isBold: true, color: MyColors.darkTextColor), (data.ticketNumber ?? "").toText14(isBold: true, color: MyColors.darkTextColor),
Directionality(textDirection: TextDirection.ltr, child: (data.createdDate! ?? "").toText12(color: MyColors.grey70Color)), Directionality(textDirection: TextDirection.ltr, child: (data.createdDate!.split(" ").first ?? "").toText12(color: MyColors.grey70Color)),
], ],
), ),
8.height, 8.height,

Loading…
Cancel
Save