Skip to content

Instantly share code, notes, and snippets.

@AliAkberAakash
Created May 20, 2022 17:17
Show Gist options
  • Save AliAkberAakash/968466c090d4d529ce5b13b9e2c82d81 to your computer and use it in GitHub Desktop.
Save AliAkberAakash/968466c090d4d529ce5b13b9e2c82d81 to your computer and use it in GitHub Desktop.
import 'dart:convert';
import 'package:core/controller/base_controller.dart';
import 'package:rxdart/rxdart.dart';
import 'package:stomp_dart_client/stomp.dart';
import 'package:stomp_dart_client/stomp_config.dart';
import 'package:stomp_dart_client/stomp_frame.dart';
import 'package:stomp_dart_client/stomp_handler.dart';
import 'package:unipet_mobile_refueling/app/di/setup_di.dart';
import 'package:unipet_mobile_refueling/app/module/pump_reserve/controller/pump_reserve_controller.dart';
import 'package:unipet_mobile_refueling/app/module/pump_reserve/data/model/pump_reserve_response.dart';
import 'package:unipet_mobile_refueling/app/module/refueling_instruction/controller/refueling_instruction_controller.dart';
import 'module/pump_reserve/data/model/pump_reserve_push_rsponsee.dart';
class StompClientController extends BaseController {
final BehaviorSubject<bool> _isStompConnected = BehaviorSubject.seeded(false);
Stream<bool> get isStompConnectedStream => _isStompConnected.stream;
bool get isStompConnected => _isStompConnected.value;
late final StompClient? _stompClient;
final List<StompUnsubscribe> _stompUnsubscribeList = [];
void initStompClient(){
logger.d("Initializing stomp client...");
_stompClient = StompClient(
config: StompConfig.SockJS(
url: 'http:/my-secret-url.com:8080/im',
onConnect: _onStompConnect,
onWebSocketError: _onStompConnectError,
),
);
_stompClient?.activate();
}
void _onStompConnect(StompFrame frame){
logger.d("Connected to stomp client");
logger.d("Stomp Headers ${frame.headers}");
logger.d("Stomp Body ${frame.body}");
_isStompConnected.add(true);
}
void _onStompConnectError(error){
logger.d("Error connecting to stomp client");
logger.d(error);
}
void subscribeToClient(String umti){
var unSubscriber = _stompClient?.subscribe(
headers: {"id":umti},
destination: '/app/umti/'+umti+'/status',
callback: (StompFrame frame){
logger.d("Received stomp data from app is: ${frame.body}");
//_onDataReceived(frame.body);
_stompClient?.subscribe(
destination: '/topic/umti/'+umti+'/status',
callback: (StompFrame frame) {
logger.d("Received stomp data from topic is: ${frame.body}");
onTokenData(frame.body);
/*_onDataReceived(frame.body);*/
},
);
},
);
if(unSubscriber != null) {
_stompUnsubscribeList.add(unSubscriber);
}
}
void _onDataReceived(stompData){
if(stompData != null) {
_handleRemoteMessage(stompData);
}else{
logger.d("screen was unmounted");
}
}
/* void _onAppOpened(RemoteMessage? remoteMessage){
logger.d("remoteMessage: ${remoteMessage?.data}");
if(mounted && remoteMessage != null) {
_handleRemoteMessage(remoteMessage);
}else{
logger.d("screen was unmounted");
}
}*/
void _handleRemoteMessage(stompData){
try{
PumpReservePushResponse pumpReserveResponse =
PumpReservePushResponse.fromJson(jsonDecode(stompData));
_sendPumpReservePushResponse(pumpReserveResponse);
_handleInstructionScreenPush(pumpReserveResponse);
/*RefuelingInstructionController _instructionController = getIt
.get<RefuelingInstructionController>();*/
/* // todo fix this
if(pumpReserveResponse.umti != null) {
_instructionController.umti = pumpReserveResponse.umti!;
}*/
}catch(e, stacktrace){
logger.d("Remote message data is not for pump reserve response");
logger.d(e);
logger.d(stacktrace);
}
}
void _sendPumpReservePushResponse(PumpReservePushResponse pumpReserveResponse) async{
PumpReserveController pumpReserveController =
getIt.get<PumpReserveController>();
if(pumpReserveController.pumpReservePushResponse==null) {
pumpReserveController.setPumpReservePushResponse(pumpReserveResponse);
}else{
logger.d("Pump Reserve Push already registered, Aborting...");
}
}
void _handleInstructionScreenPush(PumpReservePushResponse pumpReservePushResponse) {
logger.d("Pushing pump reserve response to Instruction screen ${pumpReservePushResponse.step}");
RefuelingInstructionController _instructionController = getIt
.get<RefuelingInstructionController>();
_instructionController.setPumpReservePushController(pumpReservePushResponse);
}
@override
void dispose() {
_stompClient?.deactivate();
_isStompConnected.close();
super.dispose();
}
}
void onTokenData(data){
print("Top level $data");
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment