FBH5Impl.ts 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154
  1. import AppConfig from "@scripts/app/AppConfig";
  2. import {
  3. FacebookImpl,
  4. IFBEventParams,
  5. IFBLoginRes,
  6. IFBShareOptions,
  7. IFBShareRes,
  8. } from "./FacebookImpl";
  9. export class FBH5Impl extends FacebookImpl {
  10. private _isLogined = false;
  11. init() {
  12. try {
  13. //@ts-ignore
  14. window.fbAsyncInit = () => {
  15. //@ts-ignore
  16. FB.init({
  17. appId: AppConfig.FBAppID,
  18. cookie: true,
  19. xfbml: true,
  20. version: 'v26.0'
  21. })
  22. //@ts-ignore
  23. FB.AppEvents.logPageView();
  24. console.log("fb sdk init!!!");
  25. this.onInited();
  26. };
  27. const script = document.createElement('script');
  28. script.id = 'facebook-jssdk';
  29. script.async = true;
  30. script.defer = true;
  31. script.crossOrigin = 'anonymous';
  32. script.src = 'https://connect.facebook.net/en_US/sdk.js';
  33. script.onerror = () => {
  34. console.error('[FaceBook] Facebook JavaScript SDK 下载失败');
  35. };
  36. document.head.appendChild(script);
  37. } catch (e) {
  38. console.error("[FaceBook]", e);
  39. }
  40. this._isLogined = false;
  41. }
  42. private async getLoginStatus() {
  43. return new Promise<boolean>((resolve, reject) => {
  44. //@ts-ignore
  45. FB.getLoginStatus(response => {
  46. console.log('[Facebook] login status:', response);
  47. this._isLogined = response?.status === 'connected';
  48. resolve(response?.status === 'connected');
  49. });
  50. })
  51. }
  52. protected async onLogin() {
  53. if (this._isLogined) {
  54. await this.logOut();
  55. }
  56. return new Promise<IFBLoginRes>((resolve, reject) => {
  57. //@ts-ignore
  58. FB.login(response => {
  59. console.log('[Facebook] login response: ', response);
  60. const res: IFBLoginRes = {
  61. accessToken: "",
  62. isCancel: false
  63. }
  64. if (response.authResponse) {
  65. res.accessToken = response.authResponse?.accessToken || "";
  66. }
  67. this._isLogined = !!res.accessToken;
  68. if (!res.accessToken) {
  69. res.isCancel = true;
  70. }
  71. resolve(res);
  72. })
  73. });
  74. }
  75. async logOut() {
  76. if (!this._isLogined) return true;
  77. return new Promise<boolean>((resolve, reject) => {
  78. //@ts-ignore
  79. FB.logout(response => {
  80. this._isLogined = false;
  81. console.log('[Facebook] logout: ', response);
  82. resolve(true);
  83. })
  84. })
  85. }
  86. async share(options: IFBShareOptions): Promise<IFBShareRes> {
  87. return new Promise<IFBShareRes>((resolve) => {
  88. //@ts-ignore
  89. FB.ui({
  90. method: 'share',
  91. href: options.url,
  92. hashtag: options.hashtag,
  93. quote: options.quote,
  94. }, (response) => {
  95. resolve({
  96. success: Boolean(response),
  97. isCancel: !response,
  98. postId: response?.post_id,
  99. });
  100. });
  101. });
  102. }
  103. async logEvent(
  104. eventName: string,
  105. parameters: IFBEventParams = {},
  106. valueToSum?: number,
  107. ): Promise<boolean> {
  108. try {
  109. //@ts-ignore
  110. FB.AppEvents.logEvent(eventName, valueToSum, parameters);
  111. return true;
  112. } catch (error) {
  113. console.error(`[Facebook][Web] 事件 ${eventName} 记录失败:`, error);
  114. return false;
  115. }
  116. }
  117. async logPurchase(
  118. amount: number,
  119. currency: string,
  120. parameters: IFBEventParams = {},
  121. ): Promise<boolean> {
  122. try {
  123. //@ts-ignore
  124. FB.AppEvents.logPurchase(amount, currency, parameters);
  125. return true;
  126. } catch (error) {
  127. console.error('[Facebook][Web] 购买事件记录失败:', error);
  128. return false;
  129. }
  130. }
  131. async flushEvents(): Promise<boolean> {
  132. // Facebook JavaScript SDK 没有公开的手动 flush API,由 SDK 自行批量上报。
  133. return true;
  134. }
  135. }