@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.
- package/README.md +107 -8
- package/dist/{MobileClient-CfVZXTcz.cjs → MobileClient-M4oC4lrX.cjs} +258 -16
- package/dist/MobileClient-M4oC4lrX.cjs.map +1 -0
- package/dist/MobileClient.cjs +1 -1
- package/dist/MobileClient.d.cts +146 -16
- package/dist/MobileClient.d.cts.map +1 -1
- package/dist/MobileClient.d.ts +146 -16
- package/dist/MobileClient.d.ts.map +1 -1
- package/dist/MobileClient.js +258 -16
- package/dist/MobileClient.js.map +1 -1
- package/dist/{MobileServerFailureError-BZVwlsMg.d.ts → MobileServerFailureError-C9iqNsxI.d.ts} +2 -3
- package/dist/MobileServerFailureError-C9iqNsxI.d.ts.map +1 -0
- package/dist/{MobileServerFailureError-CbtK8kD4.d.cts → MobileServerFailureError-MtS2reel.d.cts} +2 -3
- package/dist/MobileServerFailureError-MtS2reel.d.cts.map +1 -0
- package/dist/MobileUnsupportedNotificationRouteError-DpiNBvvY.d.cts +15 -0
- package/dist/MobileUnsupportedNotificationRouteError-DpiNBvvY.d.cts.map +1 -0
- package/dist/MobileUnsupportedNotificationRouteError-DpiNBvvY.d.ts +15 -0
- package/dist/MobileUnsupportedNotificationRouteError-DpiNBvvY.d.ts.map +1 -0
- package/dist/{buildSignedMobileRequest-UeeWdYGU.d.ts → buildSignedMobileRequest-BR-KJhIF.d.ts} +2 -2
- package/dist/{buildSignedMobileRequest-UeeWdYGU.d.ts.map → buildSignedMobileRequest-BR-KJhIF.d.ts.map} +1 -1
- package/dist/{buildSignedMobileRequest-C1v0flCR.d.cts → buildSignedMobileRequest-DyKCK34Y.d.cts} +2 -2
- package/dist/{buildSignedMobileRequest-C1v0flCR.d.cts.map → buildSignedMobileRequest-DyKCK34Y.d.cts.map} +1 -1
- package/dist/{canonicalize-5eeZrkzQ.d.ts → canonicalize-Bv6UIAbR.d.ts} +2 -2
- package/dist/canonicalize-Bv6UIAbR.d.ts.map +1 -0
- package/dist/{canonicalize-CBaZprTo.d.cts → canonicalize-CWh3XZzj.d.cts} +2 -2
- package/dist/canonicalize-CWh3XZzj.d.cts.map +1 -0
- package/dist/{clientTypes-C9dJufxk.d.ts → clientTypes-BUn5_OzK.d.ts} +297 -20
- package/dist/clientTypes-BUn5_OzK.d.ts.map +1 -0
- package/dist/{clientTypes-_mEgzmNs.d.cts → clientTypes-DOpUcu80.d.cts} +297 -20
- package/dist/clientTypes-DOpUcu80.d.cts.map +1 -0
- package/dist/dataMappers.cjs +203 -5
- package/dist/dataMappers.cjs.map +1 -1
- package/dist/dataMappers.d.cts +70 -7
- package/dist/dataMappers.d.cts.map +1 -1
- package/dist/dataMappers.d.ts +70 -7
- package/dist/dataMappers.d.ts.map +1 -1
- package/dist/dataMappers.js +192 -6
- package/dist/dataMappers.js.map +1 -1
- package/dist/{eip712MethodByType-D8jLoxDu.d.cts → eip712MethodByType-CJ6BoayT.d.cts} +2 -2
- package/dist/eip712MethodByType-CJ6BoayT.d.cts.map +1 -0
- package/dist/{eip712MethodByType-DcUh8h-l.d.ts → eip712MethodByType-Dx4mvgni.d.ts} +2 -2
- package/dist/eip712MethodByType-Dx4mvgni.d.ts.map +1 -0
- package/dist/{feed-DTJlsg8W.d.ts → feed-DErOLaoY.d.cts} +4 -2
- package/dist/feed-DErOLaoY.d.cts.map +1 -0
- package/dist/{feed-DTJlsg8W.d.cts → feed-DErOLaoY.d.ts} +4 -2
- package/dist/feed-DErOLaoY.d.ts.map +1 -0
- package/dist/index.cjs +7 -2
- package/dist/index.d.cts +14 -16
- package/dist/index.d.ts +14 -16
- package/dist/index.js +4 -3
- package/dist/{mobileErrorCodes-CmjYEIYm.d.ts → mobileErrorCodes-vD6rbFuF.d.cts} +8 -3
- package/dist/mobileErrorCodes-vD6rbFuF.d.cts.map +1 -0
- package/dist/{mobileErrorCodes-CmjYEIYm.d.cts → mobileErrorCodes-vD6rbFuF.d.ts} +8 -3
- package/dist/mobileErrorCodes-vD6rbFuF.d.ts.map +1 -0
- package/dist/{payloadHash-DhHmgRqL.d.cts → payloadHash-CdkF2Ocr.d.cts} +2 -2
- package/dist/payloadHash-CdkF2Ocr.d.cts.map +1 -0
- package/dist/{payloadHash-E1_8fpLW.d.ts → payloadHash-HD29K77M.d.ts} +2 -2
- package/dist/payloadHash-HD29K77M.d.ts.map +1 -0
- package/dist/{serverExecuteTypes-B-OJok19.d.cts → serverExecuteTypes-5JyyIXRK.d.ts} +21 -5
- package/dist/serverExecuteTypes-5JyyIXRK.d.ts.map +1 -0
- package/dist/{serverExecuteTypes-BwWGspOg.d.ts → serverExecuteTypes-CHrQ9Rtq.d.cts} +21 -5
- package/dist/serverExecuteTypes-CHrQ9Rtq.d.cts.map +1 -0
- package/dist/{serverModelTypes-CiA-dy1R.d.ts → serverModelTypes-CGUZCi0y.d.cts} +163 -8
- package/dist/serverModelTypes-CGUZCi0y.d.cts.map +1 -0
- package/dist/{serverModelTypes-CiA-dy1R.d.cts → serverModelTypes-CGUZCi0y.d.ts} +163 -8
- package/dist/serverModelTypes-CGUZCi0y.d.ts.map +1 -0
- package/dist/{serverResponseGuards-CShiXpHT.d.ts → serverResponseGuards-Bvw8ltYJ.d.ts} +2 -2
- package/dist/{serverResponseGuards-CShiXpHT.d.ts.map → serverResponseGuards-Bvw8ltYJ.d.ts.map} +1 -1
- package/dist/{serverResponseGuards-BW69PS7O.d.cts → serverResponseGuards-i1njcYKN.d.cts} +2 -2
- package/dist/{serverResponseGuards-BW69PS7O.d.cts.map → serverResponseGuards-i1njcYKN.d.cts.map} +1 -1
- package/dist/signing/buildSignedMobileRequest.d.cts +1 -1
- package/dist/signing/buildSignedMobileRequest.d.ts +1 -1
- package/dist/signing/canonicalize.cjs +51 -2
- package/dist/signing/canonicalize.cjs.map +1 -1
- package/dist/signing/canonicalize.d.cts +1 -1
- package/dist/signing/canonicalize.d.ts +1 -1
- package/dist/signing/canonicalize.js +51 -2
- package/dist/signing/canonicalize.js.map +1 -1
- package/dist/signing/eip712MethodByType.cjs +7 -0
- package/dist/signing/eip712MethodByType.cjs.map +1 -1
- package/dist/signing/eip712MethodByType.d.cts +1 -1
- package/dist/signing/eip712MethodByType.d.ts +1 -1
- package/dist/signing/eip712MethodByType.js +7 -0
- package/dist/signing/eip712MethodByType.js.map +1 -1
- package/dist/signing/index.d.cts +5 -5
- package/dist/signing/index.d.ts +5 -5
- package/dist/signing/payloadHash.cjs +1 -1
- package/dist/signing/payloadHash.d.cts +1 -1
- package/dist/signing/payloadHash.d.ts +1 -1
- package/dist/signing/payloadHash.js +1 -1
- package/dist/signing/types.d.cts +1 -1
- package/dist/signing/types.d.ts +1 -1
- package/dist/types/MobileServerFailureError.d.cts +1 -1
- package/dist/types/MobileServerFailureError.d.ts +1 -1
- package/dist/types/MobileUnsupportedNotificationRouteError.cjs +19 -0
- package/dist/types/MobileUnsupportedNotificationRouteError.cjs.map +1 -0
- package/dist/types/MobileUnsupportedNotificationRouteError.d.cts +2 -0
- package/dist/types/MobileUnsupportedNotificationRouteError.d.ts +2 -0
- package/dist/types/MobileUnsupportedNotificationRouteError.js +18 -0
- package/dist/types/MobileUnsupportedNotificationRouteError.js.map +1 -0
- package/dist/types/clientTypes.d.cts +2 -2
- package/dist/types/clientTypes.d.ts +2 -2
- package/dist/types/index.cjs +4 -0
- package/dist/types/index.d.cts +8 -9
- package/dist/types/index.d.ts +8 -9
- package/dist/types/index.js +3 -2
- package/dist/types/mobileErrorCodes.cjs +11 -1
- package/dist/types/mobileErrorCodes.cjs.map +1 -1
- package/dist/types/mobileErrorCodes.d.cts +1 -1
- package/dist/types/mobileErrorCodes.d.ts +1 -1
- package/dist/types/mobileErrorCodes.js +11 -1
- package/dist/types/mobileErrorCodes.js.map +1 -1
- package/dist/types/serverBaseTypes.d.cts +1 -1
- package/dist/types/serverBaseTypes.d.ts +1 -1
- package/dist/types/serverExecuteTypes.d.cts +2 -2
- package/dist/types/serverExecuteTypes.d.ts +2 -2
- package/dist/types/serverModelTypes.cjs +15 -0
- package/dist/types/serverModelTypes.cjs.map +1 -1
- package/dist/types/serverModelTypes.d.cts +2 -2
- package/dist/types/serverModelTypes.d.ts +2 -2
- package/dist/types/serverModelTypes.js +14 -1
- package/dist/types/serverModelTypes.js.map +1 -1
- package/dist/types/serverQueryTypes.d.cts +2 -2
- package/dist/types/serverQueryTypes.d.ts +2 -2
- package/dist/types/serverRequestTypes.d.cts +2 -2
- package/dist/types/serverRequestTypes.d.ts +2 -2
- package/dist/types-C9YE4EIt.d.cts +794 -0
- package/dist/types-C9YE4EIt.d.cts.map +1 -0
- package/dist/types-Cwy1y_9x.d.ts +794 -0
- package/dist/types-Cwy1y_9x.d.ts.map +1 -0
- package/dist/utils/buildMobileFeedImageMultipart.cjs +31 -0
- package/dist/utils/buildMobileFeedImageMultipart.cjs.map +1 -0
- package/dist/utils/buildMobileFeedImageMultipart.d.cts +15 -0
- package/dist/utils/buildMobileFeedImageMultipart.d.cts.map +1 -0
- package/dist/utils/buildMobileFeedImageMultipart.d.ts +15 -0
- package/dist/utils/buildMobileFeedImageMultipart.d.ts.map +1 -0
- package/dist/utils/buildMobileFeedImageMultipart.js +30 -0
- package/dist/utils/buildMobileFeedImageMultipart.js.map +1 -0
- package/dist/utils/feed.cjs +3 -0
- package/dist/utils/feed.cjs.map +1 -1
- package/dist/utils/feed.d.cts +2 -2
- package/dist/utils/feed.d.ts +2 -2
- package/dist/utils/feed.js +3 -1
- package/dist/utils/feed.js.map +1 -1
- package/dist/utils/index.cjs +2 -1
- package/dist/utils/index.d.cts +3 -3
- package/dist/utils/index.d.ts +3 -3
- package/dist/utils/index.js +2 -2
- package/dist/utils/serverResponseGuards.d.cts +1 -1
- package/dist/utils/serverResponseGuards.d.ts +1 -1
- package/package.json +3 -3
- package/src/MobileClient.ts +388 -11
- package/src/dataMappers.test.ts +108 -2
- package/src/dataMappers.ts +253 -5
- package/src/feedImages.test.ts +309 -0
- package/src/notifications.test.ts +950 -0
- package/src/signing/canonicalize.ts +66 -0
- package/src/signing/eip712MethodByType.ts +10 -0
- package/src/signing/signing.test.ts +16 -1
- package/src/signing/types.ts +51 -9
- package/src/socialFeed.test.ts +38 -2
- package/src/types/MobileUnsupportedNotificationRouteError.ts +16 -0
- package/src/types/clientTypes.ts +372 -16
- package/src/types/index.ts +1 -0
- package/src/types/mobileErrorCodes.ts +10 -0
- package/src/types/serverExecuteTypes.ts +20 -0
- package/src/types/serverModelTypes.ts +205 -6
- package/src/types/serverQueryTypes.ts +74 -5
- package/src/types/serverRequestTypes.ts +101 -12
- package/src/utils/buildMobileFeedImageMultipart.test.ts +45 -0
- package/src/utils/buildMobileFeedImageMultipart.ts +36 -0
- package/src/utils/feed.ts +3 -0
- package/dist/MobileClient-CfVZXTcz.cjs.map +0 -1
- package/dist/MobileServerFailureError-BZVwlsMg.d.ts.map +0 -1
- package/dist/MobileServerFailureError-CbtK8kD4.d.cts.map +0 -1
- package/dist/canonicalize-5eeZrkzQ.d.ts.map +0 -1
- package/dist/canonicalize-CBaZprTo.d.cts.map +0 -1
- package/dist/clientTypes-C9dJufxk.d.ts.map +0 -1
- package/dist/clientTypes-_mEgzmNs.d.cts.map +0 -1
- package/dist/eip712MethodByType-D8jLoxDu.d.cts.map +0 -1
- package/dist/eip712MethodByType-DcUh8h-l.d.ts.map +0 -1
- package/dist/feed-DTJlsg8W.d.cts.map +0 -1
- package/dist/feed-DTJlsg8W.d.ts.map +0 -1
- package/dist/mobileErrorCodes-CmjYEIYm.d.cts.map +0 -1
- package/dist/mobileErrorCodes-CmjYEIYm.d.ts.map +0 -1
- package/dist/payloadHash-DhHmgRqL.d.cts.map +0 -1
- package/dist/payloadHash-E1_8fpLW.d.ts.map +0 -1
- package/dist/serverBaseTypes-B5J1_TyC.d.cts +0 -25
- package/dist/serverBaseTypes-B5J1_TyC.d.cts.map +0 -1
- package/dist/serverBaseTypes-DnLzsdm-.d.ts +0 -25
- package/dist/serverBaseTypes-DnLzsdm-.d.ts.map +0 -1
- package/dist/serverExecuteTypes-B-OJok19.d.cts.map +0 -1
- package/dist/serverExecuteTypes-BwWGspOg.d.ts.map +0 -1
- package/dist/serverModelTypes-CiA-dy1R.d.cts.map +0 -1
- package/dist/serverModelTypes-CiA-dy1R.d.ts.map +0 -1
- package/dist/serverQueryTypes-CJcjLB7n.d.ts +0 -283
- package/dist/serverQueryTypes-CJcjLB7n.d.ts.map +0 -1
- package/dist/serverQueryTypes-V1f9yE7L.d.cts +0 -283
- package/dist/serverQueryTypes-V1f9yE7L.d.cts.map +0 -1
- package/dist/serverRequestTypes-CRlkNSu5.d.cts +0 -270
- package/dist/serverRequestTypes-CRlkNSu5.d.cts.map +0 -1
- package/dist/serverRequestTypes-DZoOhV2o.d.ts +0 -270
- package/dist/serverRequestTypes-DZoOhV2o.d.ts.map +0 -1
- package/dist/types-BiRmH5Iv.d.cts +0 -108
- package/dist/types-BiRmH5Iv.d.cts.map +0 -1
- package/dist/types-DoJuq0Ij.d.ts +0 -108
- package/dist/types-DoJuq0Ij.d.ts.map +0 -1
package/src/dataMappers.test.ts
CHANGED
|
@@ -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
|
-
|
|
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,
|
package/src/dataMappers.ts
CHANGED
|
@@ -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
|
|
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,
|