@nadohq/mobile-client 0.65.0 → 0.66.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (207) hide show
  1. package/README.md +107 -8
  2. package/dist/{MobileClient-CfVZXTcz.cjs → MobileClient-M4oC4lrX.cjs} +258 -16
  3. package/dist/MobileClient-M4oC4lrX.cjs.map +1 -0
  4. package/dist/MobileClient.cjs +1 -1
  5. package/dist/MobileClient.d.cts +146 -16
  6. package/dist/MobileClient.d.cts.map +1 -1
  7. package/dist/MobileClient.d.ts +146 -16
  8. package/dist/MobileClient.d.ts.map +1 -1
  9. package/dist/MobileClient.js +258 -16
  10. package/dist/MobileClient.js.map +1 -1
  11. package/dist/{MobileServerFailureError-BZVwlsMg.d.ts → MobileServerFailureError-C9iqNsxI.d.ts} +2 -3
  12. package/dist/MobileServerFailureError-C9iqNsxI.d.ts.map +1 -0
  13. package/dist/{MobileServerFailureError-CbtK8kD4.d.cts → MobileServerFailureError-MtS2reel.d.cts} +2 -3
  14. package/dist/MobileServerFailureError-MtS2reel.d.cts.map +1 -0
  15. package/dist/MobileUnsupportedNotificationRouteError-DpiNBvvY.d.cts +15 -0
  16. package/dist/MobileUnsupportedNotificationRouteError-DpiNBvvY.d.cts.map +1 -0
  17. package/dist/MobileUnsupportedNotificationRouteError-DpiNBvvY.d.ts +15 -0
  18. package/dist/MobileUnsupportedNotificationRouteError-DpiNBvvY.d.ts.map +1 -0
  19. package/dist/{buildSignedMobileRequest-UeeWdYGU.d.ts → buildSignedMobileRequest-BR-KJhIF.d.ts} +2 -2
  20. package/dist/{buildSignedMobileRequest-UeeWdYGU.d.ts.map → buildSignedMobileRequest-BR-KJhIF.d.ts.map} +1 -1
  21. package/dist/{buildSignedMobileRequest-C1v0flCR.d.cts → buildSignedMobileRequest-DyKCK34Y.d.cts} +2 -2
  22. package/dist/{buildSignedMobileRequest-C1v0flCR.d.cts.map → buildSignedMobileRequest-DyKCK34Y.d.cts.map} +1 -1
  23. package/dist/{canonicalize-5eeZrkzQ.d.ts → canonicalize-Bv6UIAbR.d.ts} +2 -2
  24. package/dist/canonicalize-Bv6UIAbR.d.ts.map +1 -0
  25. package/dist/{canonicalize-CBaZprTo.d.cts → canonicalize-CWh3XZzj.d.cts} +2 -2
  26. package/dist/canonicalize-CWh3XZzj.d.cts.map +1 -0
  27. package/dist/{clientTypes-C9dJufxk.d.ts → clientTypes-BUn5_OzK.d.ts} +297 -20
  28. package/dist/clientTypes-BUn5_OzK.d.ts.map +1 -0
  29. package/dist/{clientTypes-_mEgzmNs.d.cts → clientTypes-DOpUcu80.d.cts} +297 -20
  30. package/dist/clientTypes-DOpUcu80.d.cts.map +1 -0
  31. package/dist/dataMappers.cjs +203 -5
  32. package/dist/dataMappers.cjs.map +1 -1
  33. package/dist/dataMappers.d.cts +70 -7
  34. package/dist/dataMappers.d.cts.map +1 -1
  35. package/dist/dataMappers.d.ts +70 -7
  36. package/dist/dataMappers.d.ts.map +1 -1
  37. package/dist/dataMappers.js +192 -6
  38. package/dist/dataMappers.js.map +1 -1
  39. package/dist/{eip712MethodByType-D8jLoxDu.d.cts → eip712MethodByType-CJ6BoayT.d.cts} +2 -2
  40. package/dist/eip712MethodByType-CJ6BoayT.d.cts.map +1 -0
  41. package/dist/{eip712MethodByType-DcUh8h-l.d.ts → eip712MethodByType-Dx4mvgni.d.ts} +2 -2
  42. package/dist/eip712MethodByType-Dx4mvgni.d.ts.map +1 -0
  43. package/dist/{feed-DTJlsg8W.d.ts → feed-DErOLaoY.d.cts} +4 -2
  44. package/dist/feed-DErOLaoY.d.cts.map +1 -0
  45. package/dist/{feed-DTJlsg8W.d.cts → feed-DErOLaoY.d.ts} +4 -2
  46. package/dist/feed-DErOLaoY.d.ts.map +1 -0
  47. package/dist/index.cjs +7 -2
  48. package/dist/index.d.cts +14 -16
  49. package/dist/index.d.ts +14 -16
  50. package/dist/index.js +4 -3
  51. package/dist/{mobileErrorCodes-CmjYEIYm.d.ts → mobileErrorCodes-vD6rbFuF.d.cts} +8 -3
  52. package/dist/mobileErrorCodes-vD6rbFuF.d.cts.map +1 -0
  53. package/dist/{mobileErrorCodes-CmjYEIYm.d.cts → mobileErrorCodes-vD6rbFuF.d.ts} +8 -3
  54. package/dist/mobileErrorCodes-vD6rbFuF.d.ts.map +1 -0
  55. package/dist/{payloadHash-DhHmgRqL.d.cts → payloadHash-CdkF2Ocr.d.cts} +2 -2
  56. package/dist/payloadHash-CdkF2Ocr.d.cts.map +1 -0
  57. package/dist/{payloadHash-E1_8fpLW.d.ts → payloadHash-HD29K77M.d.ts} +2 -2
  58. package/dist/payloadHash-HD29K77M.d.ts.map +1 -0
  59. package/dist/{serverExecuteTypes-B-OJok19.d.cts → serverExecuteTypes-5JyyIXRK.d.ts} +21 -5
  60. package/dist/serverExecuteTypes-5JyyIXRK.d.ts.map +1 -0
  61. package/dist/{serverExecuteTypes-BwWGspOg.d.ts → serverExecuteTypes-CHrQ9Rtq.d.cts} +21 -5
  62. package/dist/serverExecuteTypes-CHrQ9Rtq.d.cts.map +1 -0
  63. package/dist/{serverModelTypes-CiA-dy1R.d.ts → serverModelTypes-CGUZCi0y.d.cts} +163 -8
  64. package/dist/serverModelTypes-CGUZCi0y.d.cts.map +1 -0
  65. package/dist/{serverModelTypes-CiA-dy1R.d.cts → serverModelTypes-CGUZCi0y.d.ts} +163 -8
  66. package/dist/serverModelTypes-CGUZCi0y.d.ts.map +1 -0
  67. package/dist/{serverResponseGuards-CShiXpHT.d.ts → serverResponseGuards-Bvw8ltYJ.d.ts} +2 -2
  68. package/dist/{serverResponseGuards-CShiXpHT.d.ts.map → serverResponseGuards-Bvw8ltYJ.d.ts.map} +1 -1
  69. package/dist/{serverResponseGuards-BW69PS7O.d.cts → serverResponseGuards-i1njcYKN.d.cts} +2 -2
  70. package/dist/{serverResponseGuards-BW69PS7O.d.cts.map → serverResponseGuards-i1njcYKN.d.cts.map} +1 -1
  71. package/dist/signing/buildSignedMobileRequest.d.cts +1 -1
  72. package/dist/signing/buildSignedMobileRequest.d.ts +1 -1
  73. package/dist/signing/canonicalize.cjs +51 -2
  74. package/dist/signing/canonicalize.cjs.map +1 -1
  75. package/dist/signing/canonicalize.d.cts +1 -1
  76. package/dist/signing/canonicalize.d.ts +1 -1
  77. package/dist/signing/canonicalize.js +51 -2
  78. package/dist/signing/canonicalize.js.map +1 -1
  79. package/dist/signing/eip712MethodByType.cjs +7 -0
  80. package/dist/signing/eip712MethodByType.cjs.map +1 -1
  81. package/dist/signing/eip712MethodByType.d.cts +1 -1
  82. package/dist/signing/eip712MethodByType.d.ts +1 -1
  83. package/dist/signing/eip712MethodByType.js +7 -0
  84. package/dist/signing/eip712MethodByType.js.map +1 -1
  85. package/dist/signing/index.d.cts +5 -5
  86. package/dist/signing/index.d.ts +5 -5
  87. package/dist/signing/payloadHash.cjs +1 -1
  88. package/dist/signing/payloadHash.d.cts +1 -1
  89. package/dist/signing/payloadHash.d.ts +1 -1
  90. package/dist/signing/payloadHash.js +1 -1
  91. package/dist/signing/types.d.cts +1 -1
  92. package/dist/signing/types.d.ts +1 -1
  93. package/dist/types/MobileServerFailureError.d.cts +1 -1
  94. package/dist/types/MobileServerFailureError.d.ts +1 -1
  95. package/dist/types/MobileUnsupportedNotificationRouteError.cjs +19 -0
  96. package/dist/types/MobileUnsupportedNotificationRouteError.cjs.map +1 -0
  97. package/dist/types/MobileUnsupportedNotificationRouteError.d.cts +2 -0
  98. package/dist/types/MobileUnsupportedNotificationRouteError.d.ts +2 -0
  99. package/dist/types/MobileUnsupportedNotificationRouteError.js +18 -0
  100. package/dist/types/MobileUnsupportedNotificationRouteError.js.map +1 -0
  101. package/dist/types/clientTypes.d.cts +2 -2
  102. package/dist/types/clientTypes.d.ts +2 -2
  103. package/dist/types/index.cjs +4 -0
  104. package/dist/types/index.d.cts +8 -9
  105. package/dist/types/index.d.ts +8 -9
  106. package/dist/types/index.js +3 -2
  107. package/dist/types/mobileErrorCodes.cjs +11 -1
  108. package/dist/types/mobileErrorCodes.cjs.map +1 -1
  109. package/dist/types/mobileErrorCodes.d.cts +1 -1
  110. package/dist/types/mobileErrorCodes.d.ts +1 -1
  111. package/dist/types/mobileErrorCodes.js +11 -1
  112. package/dist/types/mobileErrorCodes.js.map +1 -1
  113. package/dist/types/serverBaseTypes.d.cts +1 -1
  114. package/dist/types/serverBaseTypes.d.ts +1 -1
  115. package/dist/types/serverExecuteTypes.d.cts +2 -2
  116. package/dist/types/serverExecuteTypes.d.ts +2 -2
  117. package/dist/types/serverModelTypes.cjs +15 -0
  118. package/dist/types/serverModelTypes.cjs.map +1 -1
  119. package/dist/types/serverModelTypes.d.cts +2 -2
  120. package/dist/types/serverModelTypes.d.ts +2 -2
  121. package/dist/types/serverModelTypes.js +14 -1
  122. package/dist/types/serverModelTypes.js.map +1 -1
  123. package/dist/types/serverQueryTypes.d.cts +2 -2
  124. package/dist/types/serverQueryTypes.d.ts +2 -2
  125. package/dist/types/serverRequestTypes.d.cts +2 -2
  126. package/dist/types/serverRequestTypes.d.ts +2 -2
  127. package/dist/types-C9YE4EIt.d.cts +794 -0
  128. package/dist/types-C9YE4EIt.d.cts.map +1 -0
  129. package/dist/types-Cwy1y_9x.d.ts +794 -0
  130. package/dist/types-Cwy1y_9x.d.ts.map +1 -0
  131. package/dist/utils/buildMobileFeedImageMultipart.cjs +31 -0
  132. package/dist/utils/buildMobileFeedImageMultipart.cjs.map +1 -0
  133. package/dist/utils/buildMobileFeedImageMultipart.d.cts +15 -0
  134. package/dist/utils/buildMobileFeedImageMultipart.d.cts.map +1 -0
  135. package/dist/utils/buildMobileFeedImageMultipart.d.ts +15 -0
  136. package/dist/utils/buildMobileFeedImageMultipart.d.ts.map +1 -0
  137. package/dist/utils/buildMobileFeedImageMultipart.js +30 -0
  138. package/dist/utils/buildMobileFeedImageMultipart.js.map +1 -0
  139. package/dist/utils/feed.cjs +3 -0
  140. package/dist/utils/feed.cjs.map +1 -1
  141. package/dist/utils/feed.d.cts +2 -2
  142. package/dist/utils/feed.d.ts +2 -2
  143. package/dist/utils/feed.js +3 -1
  144. package/dist/utils/feed.js.map +1 -1
  145. package/dist/utils/index.cjs +2 -1
  146. package/dist/utils/index.d.cts +3 -3
  147. package/dist/utils/index.d.ts +3 -3
  148. package/dist/utils/index.js +2 -2
  149. package/dist/utils/serverResponseGuards.d.cts +1 -1
  150. package/dist/utils/serverResponseGuards.d.ts +1 -1
  151. package/package.json +3 -3
  152. package/src/MobileClient.ts +388 -11
  153. package/src/dataMappers.test.ts +108 -2
  154. package/src/dataMappers.ts +253 -5
  155. package/src/feedImages.test.ts +309 -0
  156. package/src/notifications.test.ts +950 -0
  157. package/src/signing/canonicalize.ts +66 -0
  158. package/src/signing/eip712MethodByType.ts +10 -0
  159. package/src/signing/signing.test.ts +16 -1
  160. package/src/signing/types.ts +51 -9
  161. package/src/socialFeed.test.ts +38 -2
  162. package/src/types/MobileUnsupportedNotificationRouteError.ts +16 -0
  163. package/src/types/clientTypes.ts +372 -16
  164. package/src/types/index.ts +1 -0
  165. package/src/types/mobileErrorCodes.ts +10 -0
  166. package/src/types/serverExecuteTypes.ts +20 -0
  167. package/src/types/serverModelTypes.ts +205 -6
  168. package/src/types/serverQueryTypes.ts +74 -5
  169. package/src/types/serverRequestTypes.ts +101 -12
  170. package/src/utils/buildMobileFeedImageMultipart.test.ts +45 -0
  171. package/src/utils/buildMobileFeedImageMultipart.ts +36 -0
  172. package/src/utils/feed.ts +3 -0
  173. package/dist/MobileClient-CfVZXTcz.cjs.map +0 -1
  174. package/dist/MobileServerFailureError-BZVwlsMg.d.ts.map +0 -1
  175. package/dist/MobileServerFailureError-CbtK8kD4.d.cts.map +0 -1
  176. package/dist/canonicalize-5eeZrkzQ.d.ts.map +0 -1
  177. package/dist/canonicalize-CBaZprTo.d.cts.map +0 -1
  178. package/dist/clientTypes-C9dJufxk.d.ts.map +0 -1
  179. package/dist/clientTypes-_mEgzmNs.d.cts.map +0 -1
  180. package/dist/eip712MethodByType-D8jLoxDu.d.cts.map +0 -1
  181. package/dist/eip712MethodByType-DcUh8h-l.d.ts.map +0 -1
  182. package/dist/feed-DTJlsg8W.d.cts.map +0 -1
  183. package/dist/feed-DTJlsg8W.d.ts.map +0 -1
  184. package/dist/mobileErrorCodes-CmjYEIYm.d.cts.map +0 -1
  185. package/dist/mobileErrorCodes-CmjYEIYm.d.ts.map +0 -1
  186. package/dist/payloadHash-DhHmgRqL.d.cts.map +0 -1
  187. package/dist/payloadHash-E1_8fpLW.d.ts.map +0 -1
  188. package/dist/serverBaseTypes-B5J1_TyC.d.cts +0 -25
  189. package/dist/serverBaseTypes-B5J1_TyC.d.cts.map +0 -1
  190. package/dist/serverBaseTypes-DnLzsdm-.d.ts +0 -25
  191. package/dist/serverBaseTypes-DnLzsdm-.d.ts.map +0 -1
  192. package/dist/serverExecuteTypes-B-OJok19.d.cts.map +0 -1
  193. package/dist/serverExecuteTypes-BwWGspOg.d.ts.map +0 -1
  194. package/dist/serverModelTypes-CiA-dy1R.d.cts.map +0 -1
  195. package/dist/serverModelTypes-CiA-dy1R.d.ts.map +0 -1
  196. package/dist/serverQueryTypes-CJcjLB7n.d.ts +0 -283
  197. package/dist/serverQueryTypes-CJcjLB7n.d.ts.map +0 -1
  198. package/dist/serverQueryTypes-V1f9yE7L.d.cts +0 -283
  199. package/dist/serverQueryTypes-V1f9yE7L.d.cts.map +0 -1
  200. package/dist/serverRequestTypes-CRlkNSu5.d.cts +0 -270
  201. package/dist/serverRequestTypes-CRlkNSu5.d.cts.map +0 -1
  202. package/dist/serverRequestTypes-DZoOhV2o.d.ts +0 -270
  203. package/dist/serverRequestTypes-DZoOhV2o.d.ts.map +0 -1
  204. package/dist/types-BiRmH5Iv.d.cts +0 -108
  205. package/dist/types-BiRmH5Iv.d.cts.map +0 -1
  206. package/dist/types-DoJuq0Ij.d.ts +0 -108
  207. package/dist/types-DoJuq0Ij.d.ts.map +0 -1
@@ -6,6 +6,7 @@ import {
6
6
  mapMobileSocialFeedDrawingResult,
7
7
  mapMobileSocialFeedItem,
8
8
  mapMobileSocialFeedItemPatch,
9
+ mapMobileSocialFeedItemResponse,
9
10
  mapMobileSocialFeedMentionToServer,
10
11
  mapMobileSocialFeedPage,
11
12
  mapMobileSocialFeedPositionAction,
@@ -52,6 +53,7 @@ const post: MobileServerSocialFeedPost = {
52
53
  can_comment: true,
53
54
  can_record_view: true,
54
55
  },
56
+ images: [],
55
57
  text: 'BTC 回踩后继续持有多仓。',
56
58
  mentions: [],
57
59
  position: {
@@ -136,6 +138,7 @@ const reply: MobileServerSocialFeedReply = {
136
138
  can_comment: true,
137
139
  can_record_view: false,
138
140
  },
141
+ images: [],
139
142
  text: '我会继续观察支撑位。',
140
143
  mentions: [],
141
144
  root_item_id: '11111111-1111-4111-8111-111111111111',
@@ -280,6 +283,7 @@ const history: MobileServerSocialFeedPositionHistoryResponse = {
280
283
  can_comment: true,
281
284
  can_record_view: true,
282
285
  },
286
+ images: [],
283
287
  text: '持有这一仓位,关注后续价格变化。',
284
288
  mentions: [],
285
289
  position: {
@@ -362,8 +366,7 @@ const history: MobileServerSocialFeedPositionHistoryResponse = {
362
366
  update_cursor: null,
363
367
  viewer_token: 'viewer_example_opaque',
364
368
  view_tracking: {
365
- min_visible_ratio: 0.5,
366
- min_duration_ms: 1000,
369
+ mode: 'detail_visit',
367
370
  },
368
371
  },
369
372
  };
@@ -499,6 +502,109 @@ describe('[mobile-client]: content mapping', () => {
499
502
  });
500
503
  });
501
504
 
505
+ it('maps empty image arrays in feeds, item details, and comments', () => {
506
+ const serverReply = { ...reply };
507
+ const serverPost = {
508
+ ...post,
509
+ comment_preview: {
510
+ ...post.comment_preview,
511
+ items: [serverReply],
512
+ },
513
+ };
514
+ const serverCard = {
515
+ ...serverPost,
516
+ kind: 'trade_card',
517
+ action: 'opened',
518
+ } as const;
519
+ const items: MobileServerSocialFeedItem[] = [
520
+ serverPost,
521
+ serverCard,
522
+ serverReply,
523
+ ];
524
+ const page = mapMobileSocialFeedPage({
525
+ items,
526
+ next_cursor: null,
527
+ watermark: 'Watermark',
528
+ read_session: history.read_session,
529
+ });
530
+ expect(page.items).toMatchObject([
531
+ {
532
+ kind: 'post',
533
+ images: [],
534
+ commentPreview: { items: [{ images: [] }] },
535
+ },
536
+ {
537
+ kind: 'trade_card',
538
+ images: [],
539
+ commentPreview: { items: [{ images: [] }] },
540
+ },
541
+ { kind: 'reply', images: [] },
542
+ ]);
543
+ for (const item of items) {
544
+ expect(
545
+ mapMobileSocialFeedItemResponse({
546
+ item,
547
+ read_session: history.read_session,
548
+ }).item,
549
+ ).toMatchObject({ kind: item.kind, images: [] });
550
+ }
551
+ const comments = mapMobileSocialFeedCommentsPage({
552
+ comments: [serverReply],
553
+ total_count: 1,
554
+ next_cursor: null,
555
+ previous_cursor: null,
556
+ anchor_reply_id: null,
557
+ read_session: history.read_session,
558
+ });
559
+ expect(comments.comments).toMatchObject([{ kind: 'reply', images: [] }]);
560
+ });
561
+
562
+ it('maps feed images and detail-visit read sessions', () => {
563
+ const mapped = mapMobileSocialFeedItem({
564
+ ...post,
565
+ images: [
566
+ {
567
+ image_id: '88888888-8888-4888-8888-888888888888',
568
+ url: '/v1/mobile/feed/images/88888888-8888-4888-8888-888888888888/standard',
569
+ width: 1024,
570
+ height: 256,
571
+ content_type: 'image/png',
572
+ byte_size: 123456,
573
+ thumbnail: {
574
+ url: '/v1/mobile/feed/images/88888888-8888-4888-8888-888888888888/thumbnail',
575
+ width: 512,
576
+ height: 128,
577
+ },
578
+ },
579
+ ],
580
+ });
581
+ expect(mapped.kind).toBe('post');
582
+ if (mapped.kind !== 'post') throw new Error('Expected post');
583
+ expect(mapped.images).toEqual([
584
+ {
585
+ imageId: '88888888-8888-4888-8888-888888888888',
586
+ url: '/v1/mobile/feed/images/88888888-8888-4888-8888-888888888888/standard',
587
+ width: 1024,
588
+ height: 256,
589
+ contentType: 'image/png',
590
+ byteSize: 123456,
591
+ thumbnail: {
592
+ url: '/v1/mobile/feed/images/88888888-8888-4888-8888-888888888888/thumbnail',
593
+ width: 512,
594
+ height: 128,
595
+ },
596
+ },
597
+ ]);
598
+ expect(
599
+ mapMobileSocialFeedPage({
600
+ items: [],
601
+ next_cursor: null,
602
+ watermark: 'w',
603
+ read_session: history.read_session,
604
+ }).readSession.viewTracking,
605
+ ).toEqual({ mode: 'detail_visit' });
606
+ });
607
+
502
608
  it('maps posts, drawings, reply previews, and nullable badges from the documented response', () => {
503
609
  const mapped = mapMobileSocialFeedItem({
504
610
  ...post,
@@ -11,8 +11,18 @@ import {
11
11
  MobileFollowMutationResult,
12
12
  MobileFollowSummary,
13
13
  MobileIdentitySummary,
14
+ MobileNotificationCapabilities,
15
+ MobileNotificationInboxV2,
16
+ MobileNotificationPayloadV2,
14
17
  MobileNotificationPreferenceScope,
15
18
  MobileNotificationPreferences,
19
+ MobileNotificationRegistrationV2,
20
+ MobileNotificationRoute,
21
+ MobileNotificationSettings,
22
+ MobileNotificationSettingsV2,
23
+ MobileNotificationSubscriptions,
24
+ MobileNotificationSubscriptionsUpdate,
25
+ MobileProductEvent,
16
26
  MobileProfileSearchPage,
17
27
  MobileProfilesInclude,
18
28
  MobilePublicProfile,
@@ -31,6 +41,7 @@ import {
31
41
  MobileSocialFeedDrawingResult,
32
42
  MobileSocialFeedHistoryMetrics,
33
43
  MobileSocialFeedHistoryTake,
44
+ MobileSocialFeedImage,
34
45
  MobileSocialFeedInteraction,
35
46
  MobileSocialFeedItem,
36
47
  MobileSocialFeedItemBase,
@@ -70,6 +81,7 @@ import {
70
81
  SearchMobileProfilesParams,
71
82
  } from './types/clientTypes';
72
83
  import { MobileUnsupportedFeedItemError } from './types/MobileUnsupportedFeedItemError';
84
+ import { MobileUnsupportedNotificationRouteError } from './types/MobileUnsupportedNotificationRouteError';
73
85
  import {
74
86
  MobileServerAvatarUploadResponse,
75
87
  MobileServerFollowBatchResponse,
@@ -86,8 +98,12 @@ import {
86
98
  MobileServerFeedTrade,
87
99
  MobileServerFollowSummary,
88
100
  MobileServerIdentitySummary,
101
+ MobileServerNotificationPayloadV2,
89
102
  MobileServerNotificationPreferenceScope,
90
103
  MobileServerNotificationPreferences,
104
+ MobileServerNotificationRoute,
105
+ MobileServerNotificationSettings,
106
+ MobileServerProductEvent,
91
107
  MobileServerProfile,
92
108
  MobileServerSocialFeedActionCandidate,
93
109
  MobileServerSocialFeedActionMarker,
@@ -98,6 +114,7 @@ import {
98
114
  MobileServerSocialFeedDrawing,
99
115
  MobileServerSocialFeedHistoryMetrics,
100
116
  MobileServerSocialFeedHistoryTake,
117
+ MobileServerSocialFeedImage,
101
118
  MobileServerSocialFeedInteraction,
102
119
  MobileServerSocialFeedItem,
103
120
  MobileServerSocialFeedItemBase,
@@ -123,6 +140,10 @@ import {
123
140
  import {
124
141
  MobileServerFeedResponse,
125
142
  MobileServerFollowListResponse,
143
+ MobileServerNotificationInboxV2Response,
144
+ MobileServerNotificationRegistrationV2Response,
145
+ MobileServerNotificationSettingsV2Response,
146
+ MobileServerNotificationSubscriptionsResponse,
126
147
  MobileServerRegisteredWalletResponse,
127
148
  MobileServerSearchProfilesResponse,
128
149
  MobileServerSocialFeedActionResolutionResponse,
@@ -141,7 +162,9 @@ import {
141
162
  } from './types/serverQueryTypes';
142
163
  import {
143
164
  MobileServerFollowListRequest,
165
+ MobileServerNotificationSubscriptionsUpdate,
144
166
  MobileServerProfilesInclude,
167
+ MobileServerRegisterExpoTokenV2Params,
145
168
  MobileServerSearchProfilesRequest,
146
169
  MobileServerSocialFeedListParams,
147
170
  MobileServerSocialFeedReadParams,
@@ -170,6 +193,209 @@ export function mapMobileAvatarUpload(
170
193
  };
171
194
  }
172
195
 
196
+ /** Maps a saved notification registration to the client model without the response envelope.
197
+ * @param server - Registration payload.
198
+ * @returns Saved generation and capabilities.
199
+ */
200
+ export function mapMobileNotificationRegistrationV2(
201
+ server: MobileServerNotificationRegistrationV2Response,
202
+ ): MobileNotificationRegistrationV2 {
203
+ return {
204
+ registrationGeneration: server.registration_generation,
205
+ capabilities: {
206
+ payloadVersions: server.capabilities.payload_versions,
207
+ typeIds: server.capabilities.type_ids,
208
+ routes: server.capabilities.routes,
209
+ },
210
+ };
211
+ }
212
+
213
+ /** Maps a v2 capability declaration to the registration wire format.
214
+ * @param capabilities - Device-supported features.
215
+ * @returns V2-only registration capabilities.
216
+ */
217
+ export function mapMobileNotificationCapabilitiesToServer(
218
+ capabilities: MobileNotificationCapabilities,
219
+ ): MobileServerRegisterExpoTokenV2Params['capabilities'] {
220
+ return {
221
+ payload_versions: capabilities.payloadVersions,
222
+ type_ids: capabilities.typeIds,
223
+ routes: capabilities.routes,
224
+ };
225
+ }
226
+
227
+ /** Maps complete notification settings to the client model.
228
+ * @param server - Saved settings.
229
+ * @returns CamelCase settings.
230
+ */
231
+ export function mapMobileNotificationSettings(
232
+ server: MobileServerNotificationSettings,
233
+ ): MobileNotificationSettings {
234
+ return {
235
+ myPositions: server.my_positions,
236
+ positionThresholds: server.position_thresholds,
237
+ myOrders: server.my_orders,
238
+ followingTrades: server.following_trades,
239
+ followingPosts: server.following_posts,
240
+ minTradeSizeUsd: server.min_trade_size_usd,
241
+ newFollowers: server.new_followers,
242
+ announcements: server.announcements,
243
+ discovery: server.discovery,
244
+ };
245
+ }
246
+
247
+ /** Maps a complete replacement settings document to wire format.
248
+ * @param settings - Complete client settings.
249
+ * @returns Settings accepted by the service.
250
+ */
251
+ export function mapMobileNotificationSettingsToServer(
252
+ settings: MobileNotificationSettings,
253
+ ): MobileServerNotificationSettings {
254
+ return {
255
+ my_positions: settings.myPositions,
256
+ position_thresholds: settings.positionThresholds,
257
+ my_orders: settings.myOrders,
258
+ following_trades: settings.followingTrades,
259
+ following_posts: settings.followingPosts,
260
+ min_trade_size_usd: settings.minTradeSizeUsd,
261
+ new_followers: settings.newFollowers,
262
+ announcements: settings.announcements,
263
+ discovery: settings.discovery,
264
+ };
265
+ }
266
+
267
+ /** Maps a revisioned settings response without the response envelope.
268
+ * @param server - Versioned settings payload.
269
+ * @returns Client settings and their revision.
270
+ */
271
+ export function mapMobileNotificationSettingsV2(
272
+ server: MobileServerNotificationSettingsV2Response,
273
+ ): MobileNotificationSettingsV2 {
274
+ return {
275
+ schemaVersion: server.schema_version,
276
+ revision: server.revision,
277
+ settings: mapMobileNotificationSettings(server.settings),
278
+ };
279
+ }
280
+
281
+ /** Maps wallet market subscriptions and Identity bells.
282
+ * @param server - Subscription payload.
283
+ * @returns Client subscription state without the response envelope.
284
+ */
285
+ export function mapMobileNotificationSubscriptions(
286
+ server: MobileServerNotificationSubscriptionsResponse,
287
+ ): MobileNotificationSubscriptions {
288
+ return {
289
+ revision: server.revision,
290
+ favoritesImported: server.favorites_imported,
291
+ marketIds: server.market_ids,
292
+ traderBells: server.trader_bells,
293
+ };
294
+ }
295
+
296
+ /** Maps one subscription operation, explicitly nulling unused wire operations.
297
+ * @param update - Exactly one revision-guarded operation.
298
+ * @returns The complete signed inner operation fields.
299
+ */
300
+ export function mapMobileNotificationSubscriptionsUpdateToServer(
301
+ update: MobileNotificationSubscriptionsUpdate,
302
+ ): MobileServerNotificationSubscriptionsUpdate {
303
+ return {
304
+ expected_revision: update.expectedRevision,
305
+ trader_bell:
306
+ update.traderBell == null
307
+ ? null
308
+ : {
309
+ subaccount: subaccountToHex(update.traderBell.subaccount),
310
+ enabled: update.traderBell.enabled,
311
+ },
312
+ market:
313
+ update.market == null
314
+ ? null
315
+ : {
316
+ product_id: update.market.productId,
317
+ subscribed: update.market.subscribed,
318
+ },
319
+ import_markets: update.importMarkets ?? null,
320
+ };
321
+ }
322
+
323
+ /** Maps an allowlisted notification destination.
324
+ * @param server - Named backend destination.
325
+ * @returns Client navigation data, never an arbitrary URL.
326
+ * @throws {MobileUnsupportedNotificationRouteError} If the service returns an unsupported route name.
327
+ */
328
+ export function mapMobileNotificationRoute(
329
+ server: MobileServerNotificationRoute,
330
+ ): MobileNotificationRoute {
331
+ const name = server.name;
332
+ switch (name) {
333
+ case 'market':
334
+ return { name: server.name, productId: server.product_id };
335
+ case 'profile':
336
+ return { name: server.name, subaccount: server.subaccount };
337
+ case 'portfolio':
338
+ return { name: server.name };
339
+ default:
340
+ throw new MobileUnsupportedNotificationRouteError(name satisfies never);
341
+ }
342
+ }
343
+
344
+ /** Maps v2 push or inbox navigation data.
345
+ * @param server - Wire-format notification payload.
346
+ * @returns Client notification data.
347
+ * @throws {MobileUnsupportedNotificationRouteError} If the service returns an unsupported route name.
348
+ */
349
+ export function mapMobileNotificationPayloadV2(
350
+ server: MobileServerNotificationPayloadV2,
351
+ ): MobileNotificationPayloadV2 {
352
+ return {
353
+ payloadVersion: server.payload_version,
354
+ notificationId: server.notification_id,
355
+ recipientWallet: server.recipient_wallet,
356
+ typeId: server.type_id,
357
+ templateVersion: server.template_version,
358
+ route: mapMobileNotificationRoute(server.route),
359
+ };
360
+ }
361
+
362
+ /** Maps a private notification page without the response envelope.
363
+ * @param server - Newest-first inbox payload.
364
+ * @returns Client items, attribution flags, and the next cursor.
365
+ * @throws {MobileUnsupportedNotificationRouteError} If a notification has an unsupported route name.
366
+ */
367
+ export function mapMobileNotificationInboxV2(
368
+ server: MobileServerNotificationInboxV2Response,
369
+ ): MobileNotificationInboxV2 {
370
+ return {
371
+ notifications: server.notifications.map((item) => ({
372
+ notificationId: item.notification_id,
373
+ typeId: item.type_id,
374
+ data: mapMobileNotificationPayloadV2(item.data),
375
+ createdAt: item.created_at,
376
+ tradeWithin24h: item.trade_within_24h,
377
+ })),
378
+ nextCursor: server.next_cursor,
379
+ };
380
+ }
381
+
382
+ /** Maps a typed analytics interaction, nulling unused wire fields.
383
+ * @param event - Event-specific client data.
384
+ * @returns Complete signed wire event.
385
+ */
386
+ export function mapMobileProductEventToServer(
387
+ event: MobileProductEvent,
388
+ ): MobileServerProductEvent {
389
+ return {
390
+ client_event_id: event.clientEventId,
391
+ event_name: event.eventName,
392
+ notification_id: event.notificationId ?? null,
393
+ occurred_at: event.occurredAt,
394
+ product_id: event.productId ?? null,
395
+ query: event.query ?? null,
396
+ };
397
+ }
398
+
173
399
  /**
174
400
  * Maps a client-side avatar selection to the signed wire payload; null clears the saved avatar.
175
401
  */
@@ -568,6 +794,29 @@ export function mapMobileSocialFeedInteraction(
568
794
  };
569
795
  }
570
796
 
797
+ /**
798
+ * Maps uploaded image metadata; bytes remain behind a protected GET.
799
+ * @param server - The service response.
800
+ * @returns The mapped feed image.
801
+ */
802
+ export function mapMobileSocialFeedImage(
803
+ server: MobileServerSocialFeedImage,
804
+ ): MobileSocialFeedImage {
805
+ return {
806
+ imageId: server.image_id,
807
+ url: server.url,
808
+ width: server.width,
809
+ height: server.height,
810
+ contentType: server.content_type,
811
+ byteSize: server.byte_size,
812
+ thumbnail: {
813
+ url: server.thumbnail.url,
814
+ width: server.thumbnail.width,
815
+ height: server.thumbnail.height,
816
+ },
817
+ };
818
+ }
819
+
571
820
  /**
572
821
  * Maps common item metadata and server capabilities.
573
822
  * @param server - The service response.
@@ -606,6 +855,7 @@ export function mapMobileSocialFeedContentBase(
606
855
  ): MobileSocialFeedContentBase {
607
856
  return {
608
857
  ...mapMobileSocialFeedItemBase(server),
858
+ images: server.images.map(mapMobileSocialFeedImage),
609
859
  text: server.text,
610
860
  mentions: server.mentions,
611
861
  position: mapMobileSocialFeedPositionCard(server.position),
@@ -715,7 +965,7 @@ export function mapMobileSocialFeedItem(
715
965
  }
716
966
 
717
967
  /**
718
- * Maps a fixed reading session, preserving opaque credentials and cursors.
968
+ * Maps a reading session and its current idle expiration, preserving opaque credentials and cursors.
719
969
  * @param server - The service response.
720
970
  * @returns The mapped feed read session.
721
971
  */
@@ -726,10 +976,7 @@ export function mapMobileSocialFeedReadSession(
726
976
  sessionId: server.session_id,
727
977
  mode: server.mode,
728
978
  expiresAtMs: server.expires_at_ms,
729
- viewTracking: {
730
- minVisibleRatio: server.view_tracking.min_visible_ratio,
731
- minDurationMs: server.view_tracking.min_duration_ms,
732
- },
979
+ viewTracking: { mode: server.view_tracking.mode },
733
980
  updateCursor: server.update_cursor,
734
981
  viewerToken: server.viewer_token,
735
982
  };
@@ -1023,6 +1270,7 @@ export function mapMobileSocialFeedReply(
1023
1270
  return {
1024
1271
  ...mapMobileSocialFeedItemBase(server),
1025
1272
  kind: server.kind,
1273
+ images: server.images.map(mapMobileSocialFeedImage),
1026
1274
  text: server.text,
1027
1275
  mentions: server.mentions,
1028
1276
  rootItemId: server.root_item_id,