webclient.lpr 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190
  1. {
  2. This file is part of the Free Component Library
  3. Copyright (c) 2024 by Michael Van Canneyt [email protected]
  4. FCM Messaging demo - web client
  5. See the file COPYING.FPC, included in this distribution,
  6. for details about the copyright.
  7. This program is distributed in the hope that it will be useful,
  8. but WITHOUT ANY WARRANTY; without even the implied warranty of
  9. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  10. **********************************************************************}
  11. program webclient;
  12. {$mode objfpc}
  13. {$externalclasses}
  14. uses
  15. BrowserConsole, JS, Classes, SysUtils, weborworker, Web, browserapp, firebaseapp,
  16. module.messagingservice, service.messagingserver, fprpcclient;
  17. Type
  18. { TDemoApp }
  19. TDemoApp = class(TBrowserApplication)
  20. private
  21. procedure HandleReceivedMessage(aMessage: TJSObject);
  22. procedure HaveToken(aToken: string);
  23. procedure requestPermission;
  24. procedure SendToken(aToken: string);
  25. procedure ShowToken(aToken: string);
  26. Public
  27. pnlToken : TJSHTMLElement;
  28. lblToken : TJSHTMLElement;
  29. edtMessage : TJSHTMLInputElement;
  30. btnSend: TJSHTMLButtonElement;
  31. btnRegister:TJSHTMLButtonElement;
  32. App : TFirebaseApp;
  33. Reg: weborworker.TJSServiceWorkerRegistration;
  34. Procedure DoRun; override;
  35. procedure handleregister(event : TJSEvent); async;
  36. procedure handlesend(event : TJSEvent); async;
  37. end;
  38. var
  39. Application : TDemoApp;
  40. config : TJSObject; external name 'firebaseConfig';
  41. Const
  42. TheVAPIDKey = 'The VAPID key for your FCM application';
  43. { TDemoApp }
  44. procedure TDemoApp.HandleReceivedMessage(aMessage: TJSObject);
  45. begin
  46. if assigned(aMessage) then
  47. console.debug('Message received: ',aMessage);
  48. end;
  49. procedure TDemoApp.DoRun;
  50. begin
  51. RPCModule:=TRPCModule.Create(Self);
  52. pnlToken:=GetHTMLElement('pnlToken');
  53. lblToken:=GetHTMLElement('lblToken');
  54. edtMessage:=TJSHTMLInputElement(GetHTMLElement('edtMessage'));
  55. btnSend:=TJSHTMLButtonElement(GetHTMLElement('btnSend'));
  56. btnSend.addEventListener('click',@HandleSend);
  57. btnRegister:=TJSHTMLButtonElement(GetHTMLElement('btnRegister'));
  58. btnRegister.addEventListener('click',@HandleRegister);
  59. Writeln('Initializing application...');
  60. App:=Firebase.initializeApp(config);
  61. App.messaging.onMessage(@HandleReceivedMessage);
  62. Window.Navigator.serviceWorker.register('firebase-messaging-sw.js')._then(function (js : JSValue) :JSValue
  63. begin
  64. reg:=weborworker.TJSServiceWorkerRegistration(js);
  65. if assigned(Reg) then
  66. Writeln('Registered service worker...')
  67. end,function (js : JSValue) :JSValue
  68. begin
  69. Writeln('Unable to register service worker')
  70. end);
  71. end;
  72. procedure TDemoApp.ShowToken(aToken : string);
  73. begin
  74. pnlToken.classlist.remove('is-hidden');
  75. lblToken.innerText:=aToken;
  76. Writeln(aToken);
  77. end;
  78. procedure TDemoApp.SendToken(aToken : string);
  79. procedure DoOK(aResult: JSValue);
  80. begin
  81. Writeln('Registered token on server');
  82. end;
  83. procedure DoFail(Sender: TObject; const aError: TRPCError);
  84. begin
  85. Writeln('Failed to register token on server: '+aError.Message);
  86. end;
  87. begin
  88. Writeln('Sending token to server: ',aToken);
  89. RPCModule.Service.RegisterSubscription(aToken,@DoOK,@DoFail);
  90. end;
  91. procedure TDemoApp.HaveToken(aToken : string);
  92. begin
  93. Showtoken(aToken);
  94. Sendtoken(aToken);
  95. btnSend.disabled:=False;
  96. btnRegister.disabled:=False;
  97. end;
  98. procedure TDemoApp.requestPermission;
  99. function onpermission (permission : jsvalue) : jsvalue;
  100. var
  101. token : string;
  102. begin
  103. if (permission='granted') then
  104. begin
  105. writeln('Notification permission granted.');
  106. handleregister(nil);
  107. end;
  108. end;
  109. begin
  110. Writeln('Requesting permission...');
  111. TJSNotification.requestPermission()._then(@OnPermission)
  112. end;
  113. procedure TDemoApp.handleregister(event: TJSEvent);
  114. var
  115. Token : string;
  116. opt : TMessagingGetTokenOptions;
  117. begin
  118. opt:=TMessagingGetTokenOptions.New;
  119. opt.serviceworkerRegistration:=self.Reg;
  120. opt.vapidKey:=TheVAPIDKey;
  121. Token:=Await(App.messaging.getToken(opt));
  122. if (token='') then
  123. RequestPermission
  124. else
  125. HaveToken(token);
  126. end;
  127. procedure TDemoApp.handlesend(event: TJSEvent);
  128. procedure DoOK(aResult: JSValue);
  129. begin
  130. Writeln('Message transferred to server for sending');
  131. end;
  132. procedure DoFail(Sender: TObject; const aError: TRPCError);
  133. begin
  134. Writeln('Failed to transfer message to server for sending: '+aError.Message);
  135. end;
  136. var
  137. Msg : TJSObject;
  138. begin
  139. Msg:=New([
  140. 'title','Free Pascal FCM demo',
  141. 'body',edtMessage.Value,
  142. 'image','https://www.freepascal.org/favicon.png'
  143. ]);
  144. RPCModule.Service.SendNotification(Msg,@DoOK,@DoFail);
  145. end;
  146. begin
  147. Application:=TDemoApp.Create(Nil);
  148. Application.Initialize;
  149. Application.Run;
  150. end.