2
0

utils.pp 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  1. unit utils;
  2. {$mode objfpc}{$H+}
  3. interface
  4. uses
  5. sysutils, JS, web;
  6. var
  7. fakeSlowNetwork : boolean;
  8. function wait(ms : NativeInt) : TJSPromise;
  9. function get(url : string) : TJSPromise;
  10. function getJson(url : string) : TJSPromise;
  11. procedure addHtmlToPage(Content : string);
  12. Procedure addTextToPage(content : string) ;
  13. Procedure InitSlowNetwork;
  14. implementation
  15. function wait(ms : NativeInt) : TJSPromise;
  16. procedure doTimeout(resolve,reject : TJSPromiseResolver) ;
  17. begin
  18. window.setTimeout(TJSTimerCallBack(resolve),ms);
  19. end;
  20. begin
  21. Result := TJSPromise.New(@doTimeOut);
  22. end;
  23. Procedure InitSlowNetwork;
  24. Const
  25. lsKey = 'fake-slow-network';
  26. Var
  27. networkFakeDiv : TJSHTMLElement;
  28. checkbox : TJSHTMLInputElement;
  29. procedure doChange;
  30. begin
  31. window.localStorage.setItem(lsKey,IntToStr(Ord(checkbox.checked)));
  32. window.location.reload(false);
  33. end;
  34. begin
  35. networkFakeDiv:=TJSHTMLElement(document.querySelector('.network-fake'));
  36. checkbox:=TJSHTMLInputElement(networkFakeDiv.querySelector('input'));
  37. fakeSlowNetwork:=window.localStorage.getItem(lsKey)='1';
  38. networkFakeDiv.style.setProperty('display','block');
  39. checkbox.checked:=fakeSlowNetwork;
  40. checkbox.addEventListener('change',@doChange)
  41. end;
  42. function get(url : string) : TJSPromise;
  43. // Return a new promise.
  44. // We do all the work within the constructor callback.
  45. procedure DoRequest(resolve,reject : TJSPromiseResolver) ;
  46. var
  47. req : TJSXMLHttpRequest;
  48. function DoOnLoad(event : TEventListenerEvent) : boolean;
  49. begin
  50. // On error we reject, otherwise we resolve
  51. if (req.status=200) then
  52. resolve(req.responseText)
  53. else
  54. reject(TJSError.New(req.statusText));
  55. end;
  56. function DoOnError(event : TEventListenerEvent) : boolean;
  57. begin
  58. // On error we reject
  59. reject(TJSError.New('Network Error'));
  60. end;
  61. begin
  62. req:=TJSXMLHttpRequest.new;
  63. req.open('get', url);
  64. req.addEventListener('load',@DoOnLoad);
  65. req.addEventListener('error',@DoOnError);
  66. req.send();
  67. end;
  68. function ReturnResult(res: JSValue) : JSValue;
  69. begin
  70. // Result is an array of resolve values of the 2 promises, so we need the second one.
  71. Result:=TJSArray(res)[1];
  72. end;
  73. var
  74. fakeNetworkWait,
  75. requestPromise : TJSPromise;
  76. begin
  77. fakeNetworkWait := Wait(trunc(3000 * random * Ord(fakeSlowNetwork)));
  78. requestPromise:=TJSPromise.New(@DoRequest);
  79. Result:=TJSPromise.all([fakeNetworkWait, requestPromise])._then(@ReturnResult);
  80. end;
  81. function getJson(url : string) : TJSPromise;
  82. Function DoConvert(aValue : JSValue) : JSValue;
  83. begin
  84. Result:=TJSJSON.parse(String(aValue));
  85. end;
  86. begin
  87. Result:=get(url)._then(@DoConvert);
  88. end;
  89. procedure addHtmlToPage(Content : string);
  90. var
  91. aDiv, storyDiv : TJSElement;
  92. begin
  93. aDiv:=document.createElement('div');
  94. StoryDiv:=document.querySelector('.story');
  95. aDiv.innerHTML:=content;
  96. storyDiv.appendChild(aDiv);
  97. end;
  98. Procedure addTextToPage(content : string) ;
  99. var
  100. aDiv, storyDiv : TJSElement;
  101. begin
  102. aDiv:=document.createElement('p');
  103. StoryDiv:=document.querySelector('.story');
  104. aDiv.textContent:=content;
  105. storyDiv.appendChild(aDiv);
  106. end;
  107. end.