@react-native-kakao/share 3.1.0-next.0 → 3.1.0-next.1

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 (32) hide show
  1. package/CHANGELOG.md +26 -0
  2. package/RNCKakaoShare.podspec +0 -1
  3. package/android/build.gradle +1 -2
  4. package/android/src/main/java/net/mjstudio/rnkakao/share/RNCKakaoShareModule.kt +323 -11
  5. package/android/src/main/java/net/mjstudio/rnkakao/share/RNCKakaoShareTemplates.kt +5 -2
  6. package/ios/RNCKakaoShare.mm +64 -5
  7. package/ios/RNCKakaoShareManager.swift +315 -36
  8. package/lib/commonjs/index.js +137 -29
  9. package/lib/commonjs/index.js.map +1 -1
  10. package/lib/commonjs/index.web.js +199 -21
  11. package/lib/commonjs/index.web.js.map +1 -1
  12. package/lib/commonjs/spec/NativeKakaoShare.ts +76 -3
  13. package/lib/commonjs/validateSharePickerSettings.js +33 -0
  14. package/lib/commonjs/validateSharePickerSettings.js.map +1 -0
  15. package/lib/module/index.js +128 -29
  16. package/lib/module/index.js.map +1 -1
  17. package/lib/module/index.web.js +190 -21
  18. package/lib/module/index.web.js.map +1 -1
  19. package/lib/module/spec/NativeKakaoShare.ts +76 -3
  20. package/lib/module/validateSharePickerSettings.js +29 -0
  21. package/lib/module/validateSharePickerSettings.js.map +1 -0
  22. package/lib/typescript/src/index.d.ts +83 -23
  23. package/lib/typescript/src/index.d.ts.map +1 -1
  24. package/lib/typescript/src/spec/NativeKakaoShare.d.ts +72 -1
  25. package/lib/typescript/src/spec/NativeKakaoShare.d.ts.map +1 -1
  26. package/lib/typescript/src/validateSharePickerSettings.d.ts +6 -0
  27. package/lib/typescript/src/validateSharePickerSettings.d.ts.map +1 -0
  28. package/package.json +3 -3
  29. package/src/index.ts +258 -15
  30. package/src/index.web.ts +232 -36
  31. package/src/spec/NativeKakaoShare.ts +76 -3
  32. package/src/validateSharePickerSettings.ts +38 -0
package/src/index.web.ts CHANGED
@@ -3,12 +3,33 @@ import {
3
3
  replaceJsonValuesRecursively,
4
4
  snakeCaseObject,
5
5
  } from '@mj-studio/js-util';
6
- import { kRunWebAPI } from '@react-native-kakao/core';
6
+ import { kCreateWebError, kRunWebAPI } from '@react-native-kakao/core';
7
7
 
8
- import type { KakaoImageUploadResult, KakaoShareAPI } from './index';
8
+ import type {
9
+ KakaoFriendMessageResult,
10
+ KakaoImageUploadResult,
11
+ KakaoMessageSendResult,
12
+ KakaoShareAPI,
13
+ KakaoSharePickerSettings,
14
+ } from './index';
15
+ import { validateSharePickerSettings } from './validateSharePickerSettings';
9
16
 
10
17
  declare const Kakao: {
11
18
  Share: {
19
+ uploadImage: (args: { file: Blob[] }) => Promise<{
20
+ infos: {
21
+ original: Omit<KakaoImageUploadResult['infos']['original'], 'contentType'> & {
22
+ content_type: string;
23
+ };
24
+ };
25
+ }>;
26
+ sendScrap: (args: {
27
+ requestUrl: string;
28
+ templateId?: number;
29
+ templateArgs: Record<string, string>;
30
+ serverCallbackArgs: Record<string, string>;
31
+ pickerSettings?: KakaoSharePickerSettings;
32
+ }) => void;
12
33
  scrapImage: (args: { imageUrl: string }) => Promise<{
13
34
  infos: {
14
35
  original: Omit<KakaoImageUploadResult['infos']['original'], 'contentType'> & {
@@ -26,10 +47,12 @@ function createShareDefault({
26
47
  serverCallbackArgs,
27
48
  template,
28
49
  objectType,
50
+ pickerSettings,
29
51
  }: {
30
52
  objectType: string;
31
53
  template: any;
32
54
  serverCallbackArgs?: Record<string, string>;
55
+ pickerSettings?: KakaoSharePickerSettings;
33
56
  }) {
34
57
  return kRunWebAPI(() =>
35
58
  Kakao.Share.sendDefault(
@@ -37,6 +60,7 @@ function createShareDefault({
37
60
  objectType,
38
61
  ...serializeExecutionParams(template),
39
62
  serverCallbackArgs,
63
+ pickerSettings: validateSharePickerSettings(pickerSettings),
40
64
  }),
41
65
  ),
42
66
  );
@@ -53,14 +77,42 @@ function createSendDefaultMe({ template, objectType }: { objectType: string; tem
53
77
  });
54
78
  }
55
79
 
56
- function createSendDefaultFriends({
80
+ type WebMessageSendResult = {
81
+ successful_receiver_uuids?: string[];
82
+ failure_info?: { code: number; msg: string; receiver_uuids: string[] }[];
83
+ };
84
+
85
+ function getFriendMessageResult<T extends boolean = false>(
86
+ response: WebMessageSendResult,
87
+ includeFailureInfo?: T,
88
+ ): KakaoFriendMessageResult<T>;
89
+ function getFriendMessageResult(
90
+ response: WebMessageSendResult,
91
+ includeFailureInfo?: boolean,
92
+ ): string[] | KakaoMessageSendResult {
93
+ const successfulReceiverUuids = response.successful_receiver_uuids ?? [];
94
+
95
+ return includeFailureInfo
96
+ ? {
97
+ successfulReceiverUuids,
98
+ failureInfos: (response.failure_info ?? []).map(({ receiver_uuids, ...failure }) => ({
99
+ ...failure,
100
+ receiverUuids: receiver_uuids,
101
+ })),
102
+ }
103
+ : successfulReceiverUuids;
104
+ }
105
+
106
+ function createSendDefaultFriends<T extends boolean = false>({
57
107
  objectType,
58
108
  template,
59
109
  receiverUuids,
110
+ includeFailureInfo,
60
111
  }: {
61
112
  template: any;
62
113
  objectType: any;
63
114
  receiverUuids: string[];
115
+ includeFailureInfo?: T;
64
116
  }) {
65
117
  return kRunWebAPI(() =>
66
118
  Kakao.API.request({
@@ -69,9 +121,8 @@ function createSendDefaultFriends({
69
121
  template_object: serializeMessageTemplate(objectType, template),
70
122
  receiver_uuids: receiverUuids,
71
123
  },
72
- }).then(
73
- (response: { successful_receiver_uuids?: string[] }) =>
74
- response.successful_receiver_uuids ?? [],
124
+ }).then((response: WebMessageSendResult) =>
125
+ getFriendMessageResult(response, includeFailureInfo),
75
126
  ),
76
127
  );
77
128
  }
@@ -99,6 +150,115 @@ function serializeExecutionParams(template: object) {
99
150
  }
100
151
 
101
152
  const KakaoShare: KakaoShareAPI = {
153
+ isKakaoTalkSharingAvailable: async () => false,
154
+ getShareTemplateDiagnostics: async () => {
155
+ kCreateWebError({
156
+ code: 'Package-UnsupportedPlatform',
157
+ message: 'The Kakao JavaScript SDK does not expose sharing template diagnostics.',
158
+ });
159
+ },
160
+ makeDefaultTemplateUrl: unsupportedUrlBuilder,
161
+ makeCustomTemplateUrl: unsupportedUrlBuilder,
162
+ makeScrapTemplateUrl: unsupportedUrlBuilder,
163
+ uploadImage: ({ imageUri, secureResource = true }) =>
164
+ kRunWebAPI(async () => {
165
+ const response = await fetch(imageUri);
166
+ if (!response.ok) {
167
+ throw new Error(`Failed to read image: HTTP ${response.status}`);
168
+ }
169
+
170
+ const reader = response.body?.getReader();
171
+ if (!reader) {
172
+ throw new Error('Image response has no body');
173
+ }
174
+
175
+ const chunks: BlobPart[] = [];
176
+ let length = 0;
177
+ try {
178
+ while (true) {
179
+ const { done, value } = await reader.read();
180
+ if (done) {
181
+ break;
182
+ }
183
+
184
+ length += value.byteLength;
185
+ if (length > 5 * 1024 * 1024) {
186
+ await reader.cancel();
187
+ throw new Error('Image must be no larger than 5 MB');
188
+ }
189
+
190
+ chunks.push(value);
191
+ }
192
+ } finally {
193
+ reader.releaseLock();
194
+ }
195
+
196
+ const image = new Blob(chunks, { type: response.headers.get('content-type') ?? '' });
197
+
198
+ const { infos } = await Kakao.Share.uploadImage({ file: [image] });
199
+ const { content_type: contentType, ...original } = infos.original;
200
+
201
+ return {
202
+ infos: {
203
+ original: {
204
+ ...original,
205
+ url: original.url.replace(/^https?:/, secureResource ? 'https:' : 'http:'),
206
+ contentType,
207
+ },
208
+ },
209
+ };
210
+ }),
211
+ shareScrapTemplate: ({
212
+ requestUrl,
213
+ templateId,
214
+ templateArgs = {},
215
+ serverCallbackArgs = {},
216
+ pickerSettings,
217
+ }) =>
218
+ kRunWebAPI(() =>
219
+ Kakao.Share.sendScrap(
220
+ filterNonNullishKeys({
221
+ requestUrl,
222
+ templateId,
223
+ templateArgs,
224
+ serverCallbackArgs,
225
+ pickerSettings: validateSharePickerSettings(pickerSettings),
226
+ }),
227
+ ),
228
+ ),
229
+ sendScrapTemplateToMe: async ({ requestUrl, templateId, templateArgs }) => {
230
+ await kRunWebAPI(() =>
231
+ Kakao.API.request({
232
+ url: '/v2/api/talk/memo/scrap/send',
233
+ data: filterNonNullishKeys({
234
+ request_url: requestUrl,
235
+ template_id: templateId,
236
+ template_args: templateArgs,
237
+ }),
238
+ }),
239
+ );
240
+ },
241
+ sendScrapTemplateToFriends: async ({
242
+ requestUrl,
243
+ templateId,
244
+ templateArgs,
245
+ receiverUuids,
246
+ includeFailureInfo,
247
+ }) => {
248
+ const response: WebMessageSendResult = await kRunWebAPI(() =>
249
+ Kakao.API.request({
250
+ url: '/v1/api/talk/friends/message/scrap/send',
251
+ data: filterNonNullishKeys({
252
+ request_url: requestUrl,
253
+ template_id: templateId,
254
+ template_args: templateArgs,
255
+ receiver_uuids: receiverUuids,
256
+ }),
257
+ }),
258
+ );
259
+
260
+ return getFriendMessageResult(response, includeFailureInfo);
261
+ },
102
262
  scrapImage: ({ imageUrl, secureResource = true }) =>
103
263
  kRunWebAPI(async () => {
104
264
  const { infos } = await Kakao.Share.scrapImage({ imageUrl });
@@ -114,10 +274,15 @@ const KakaoShare: KakaoShareAPI = {
114
274
  },
115
275
  };
116
276
  }),
117
- shareCustomTemplate: ({ templateArgs, templateId, serverCallbackArgs }) =>
277
+ shareCustomTemplate: ({ templateArgs, templateId, serverCallbackArgs, pickerSettings }) =>
118
278
  kRunWebAPI(() =>
119
279
  Kakao.Share.sendCustom(
120
- filterNonNullishKeys({ templateId, templateArgs, serverCallbackArgs }),
280
+ filterNonNullishKeys({
281
+ templateId,
282
+ templateArgs,
283
+ serverCallbackArgs,
284
+ pickerSettings: validateSharePickerSettings(pickerSettings),
285
+ }),
121
286
  ),
122
287
  ),
123
288
  sendCustomTemplateToMe: ({ templateId, templateArgs }) =>
@@ -127,7 +292,7 @@ const KakaoShare: KakaoShareAPI = {
127
292
  data: filterNonNullishKeys({ template_id: templateId, template_args: templateArgs }),
128
293
  });
129
294
  }),
130
- sendCustomTemplateToFriends: ({ templateArgs, templateId, receiverUuids }) =>
295
+ sendCustomTemplateToFriends: ({ templateArgs, templateId, receiverUuids, includeFailureInfo }) =>
131
296
  kRunWebAPI(() =>
132
297
  Kakao.API.request({
133
298
  url: '/v1/api/talk/friends/message/send',
@@ -136,46 +301,77 @@ const KakaoShare: KakaoShareAPI = {
136
301
  template_args: templateArgs,
137
302
  receiver_uuids: receiverUuids,
138
303
  }),
139
- }).then(
140
- (response: { successful_receiver_uuids?: string[] }) =>
141
- response.successful_receiver_uuids ?? [],
304
+ }).then((response: WebMessageSendResult) =>
305
+ getFriendMessageResult(response, includeFailureInfo),
142
306
  ),
143
307
  ),
144
- shareFeedTemplate: ({ template, serverCallbackArgs }) =>
145
- createShareDefault({ template, serverCallbackArgs, objectType: 'feed' }),
308
+ shareFeedTemplate: ({ template, serverCallbackArgs, pickerSettings }) =>
309
+ createShareDefault({ template, serverCallbackArgs, pickerSettings, objectType: 'feed' }),
146
310
  sendFeedTemplateToMe: ({ template }) => createSendDefaultMe({ template, objectType: 'feed' }),
147
- sendFeedTemplateToFriends: ({ template, receiverUuids }) =>
148
- createSendDefaultFriends({ template, receiverUuids, objectType: 'feed' }),
149
- shareListTemplate: ({ template, serverCallbackArgs }) =>
150
- createShareDefault({ template, serverCallbackArgs, objectType: 'list' }),
311
+ sendFeedTemplateToFriends: ({ template, receiverUuids, includeFailureInfo }) =>
312
+ createSendDefaultFriends({ template, receiverUuids, includeFailureInfo, objectType: 'feed' }),
313
+ shareListTemplate: ({ template, serverCallbackArgs, pickerSettings }) =>
314
+ createShareDefault({ template, serverCallbackArgs, pickerSettings, objectType: 'list' }),
151
315
  sendListTemplateToMe: ({ template }) => createSendDefaultMe({ template, objectType: 'list' }),
152
- sendListTemplateToFriends: ({ template, receiverUuids }) =>
153
- createSendDefaultFriends({ template, receiverUuids, objectType: 'list' }),
154
- shareLocationTemplate: ({ template, serverCallbackArgs }) =>
155
- createShareDefault({ template, serverCallbackArgs, objectType: 'location' }),
316
+ sendListTemplateToFriends: ({ template, receiverUuids, includeFailureInfo }) =>
317
+ createSendDefaultFriends({ template, receiverUuids, includeFailureInfo, objectType: 'list' }),
318
+ shareLocationTemplate: ({ template, serverCallbackArgs, pickerSettings }) =>
319
+ createShareDefault({ template, serverCallbackArgs, pickerSettings, objectType: 'location' }),
156
320
  sendLocationTemplateToMe: ({ template }) =>
157
321
  createSendDefaultMe({ template, objectType: 'location' }),
158
- sendLocationTemplateToFriends: ({ template, receiverUuids }) =>
159
- createSendDefaultFriends({ template, receiverUuids, objectType: 'location' }),
160
- shareCommerceTemplate: ({ template, serverCallbackArgs }) =>
161
- createShareDefault({ template, serverCallbackArgs, objectType: 'commerce' }),
322
+ sendLocationTemplateToFriends: ({ template, receiverUuids, includeFailureInfo }) =>
323
+ createSendDefaultFriends({
324
+ template,
325
+ receiverUuids,
326
+ includeFailureInfo,
327
+ objectType: 'location',
328
+ }),
329
+ shareCommerceTemplate: ({ template, serverCallbackArgs, pickerSettings }) =>
330
+ createShareDefault({ template, serverCallbackArgs, pickerSettings, objectType: 'commerce' }),
162
331
  sendCommerceTemplateToMe: ({ template }) =>
163
332
  createSendDefaultMe({ template, objectType: 'commerce' }),
164
- sendCommerceTemplateToFriends: ({ template, receiverUuids }) =>
165
- createSendDefaultFriends({ template, receiverUuids, objectType: 'commerce' }),
166
- shareTextTemplate: ({ template, serverCallbackArgs }) =>
167
- createShareDefault({ template, serverCallbackArgs, objectType: 'text' }),
333
+ sendCommerceTemplateToFriends: ({ template, receiverUuids, includeFailureInfo }) =>
334
+ createSendDefaultFriends({
335
+ template,
336
+ receiverUuids,
337
+ includeFailureInfo,
338
+ objectType: 'commerce',
339
+ }),
340
+ shareTextTemplate: ({ template, serverCallbackArgs, pickerSettings }) =>
341
+ createShareDefault({ template, serverCallbackArgs, pickerSettings, objectType: 'text' }),
168
342
  sendTextTemplateToMe: ({ template }) => createSendDefaultMe({ template, objectType: 'text' }),
169
- sendTextTemplateToFriends: ({ template, receiverUuids }) =>
170
- createSendDefaultFriends({ template, receiverUuids, objectType: 'text' }),
171
- shareCalendarTemplate: ({ template, serverCallbackArgs }) =>
172
- createShareDefault({ template, serverCallbackArgs, objectType: 'calendar' }),
343
+ sendTextTemplateToFriends: ({ template, receiverUuids, includeFailureInfo }) =>
344
+ createSendDefaultFriends({ template, receiverUuids, includeFailureInfo, objectType: 'text' }),
345
+ shareCalendarTemplate: ({ template, serverCallbackArgs, pickerSettings }) =>
346
+ createShareDefault({ template, serverCallbackArgs, pickerSettings, objectType: 'calendar' }),
173
347
  sendCalendarTemplateToMe: ({ template }) =>
174
348
  createSendDefaultMe({ template, objectType: 'calendar' }),
175
- sendCalendarTemplateToFriends: ({ template, receiverUuids }) =>
176
- createSendDefaultFriends({ template, receiverUuids, objectType: 'calendar' }),
349
+ sendCalendarTemplateToFriends: ({ template, receiverUuids, includeFailureInfo }) =>
350
+ createSendDefaultFriends({
351
+ template,
352
+ receiverUuids,
353
+ includeFailureInfo,
354
+ objectType: 'calendar',
355
+ }),
177
356
  };
357
+
358
+ async function unsupportedUrlBuilder(): Promise<never> {
359
+ kCreateWebError({
360
+ code: 'Package-UnsupportedPlatform',
361
+ message: 'The Kakao JavaScript SDK does not provide sharing URL builders.',
362
+ });
363
+ }
364
+
178
365
  export const {
366
+ isKakaoTalkSharingAvailable,
367
+ getShareTemplateDiagnostics,
368
+ makeDefaultTemplateUrl,
369
+ makeCustomTemplateUrl,
370
+ makeScrapTemplateUrl,
371
+ uploadImage,
372
+ shareScrapTemplate,
373
+ sendScrapTemplateToMe,
374
+ sendScrapTemplateToFriends,
179
375
  scrapImage,
180
376
  sendCalendarTemplateToFriends,
181
377
  sendCalendarTemplateToMe,
@@ -228,22 +228,95 @@ export type KakaoImageUploadResult = {
228
228
  };
229
229
  };
230
230
 
231
+ export type KakaoMessageSendResult = {
232
+ successfulReceiverUuids: string[];
233
+ failureInfos: {
234
+ code: Int32;
235
+ msg: string;
236
+ receiverUuids: string[];
237
+ }[];
238
+ };
239
+
240
+ export type KakaoSharePickerSettings = {
241
+ type?: 'default' | 'friend' | 'chat';
242
+ limit?: number;
243
+ };
244
+
245
+ export type KakaoDefaultTemplateParams = (
246
+ | { templateType: 'feed'; template: KakaoFeedTemplate }
247
+ | { templateType: 'list'; template: KakaoListTemplate }
248
+ | { templateType: 'location'; template: KakaoLocationTemplate }
249
+ | { templateType: 'commerce'; template: KakaoCommerceTemplate }
250
+ | { templateType: 'text'; template: KakaoTextTemplate }
251
+ | { templateType: 'calendar'; template: KakaoCalendarTemplate }
252
+ ) & { serverCallbackArgs?: Readonly<Record<string, string>> };
253
+
254
+ export type KakaoShareTemplateDiagnosticsParams = (
255
+ | KakaoDefaultTemplateParams
256
+ | {
257
+ templateType: 'custom';
258
+ templateId: Double;
259
+ templateArgs?: Readonly<Record<string, string>>;
260
+ }
261
+ | {
262
+ templateType: 'scrap';
263
+ requestUrl: string;
264
+ templateId?: Double;
265
+ templateArgs?: Readonly<Record<string, string>>;
266
+ }
267
+ ) & {
268
+ serverCallbackArgs?: Readonly<Record<string, string>>;
269
+ pickerSettings?: KakaoSharePickerSettings;
270
+ };
271
+
272
+ export type KakaoShareTemplateDiagnostics = {
273
+ warningMsg: Readonly<{ [key: string]: string }>;
274
+ argumentMsg: Readonly<{ [key: string]: string }>;
275
+ };
276
+
231
277
  export interface Spec extends TurboModule {
278
+ isKakaoTalkSharingAvailable(): Promise<boolean>;
279
+ makeTemplateUrl(
280
+ templateType: string,
281
+ templateId: Double,
282
+ templateJson: UnsafeObject,
283
+ templateArgs: Readonly<{ [key: string]: string }>,
284
+ serverCallbackArgs: Readonly<{ [key: string]: string }>,
285
+ ): Promise<string>;
286
+ getTemplateDiagnostics(
287
+ templateType: string,
288
+ templateId: Double,
289
+ templateJson: UnsafeObject,
290
+ templateArgs: Readonly<{ [key: string]: string }>,
291
+ serverCallbackArgs: Readonly<{ [key: string]: string }>,
292
+ pickerSettings?: UnsafeObject,
293
+ ): Promise<KakaoShareTemplateDiagnostics>;
294
+ uploadImage(imageUri: string, secureResource: boolean): Promise<KakaoImageUploadResult>;
295
+ shareScrapTemplate(
296
+ requestUrl: string,
297
+ useWebBrowserIfKakaoTalkNotAvailable: boolean,
298
+ templateId?: Double,
299
+ templateArgs?: Readonly<{ [key: string]: string }>,
300
+ serverCallbackArgs?: Readonly<{ [key: string]: string }>,
301
+ pickerSettings?: UnsafeObject,
302
+ ): Promise<void>;
303
+
232
304
  scrapImage(imageUrl: string, secureResource: boolean): Promise<KakaoImageUploadResult>;
233
305
  shareOrSendMeOrSendFriendOrWhatever(
234
306
  /* share, send-me, send-friend */
235
307
  sendType: string,
236
- /* custom, feed, list, location, commerce, text, calendar */
308
+ /* custom, scrap, feed, list, location, commerce, text, calendar */
237
309
  templateType: string,
238
- /* only for custom */
310
+ /* only for custom or scrap (-1 uses the default scrap template) */
239
311
  templateId: Double,
240
- /* only for default templates */
312
+ /* default template fields or { requestUrl } for scrap */
241
313
  templateJson: UnsafeObject,
242
314
  /* only for pass friend uuid directly */
243
315
  receiverUuids: ReadonlyArray<string>,
244
316
  useWebBrowserIfKakaoTalkNotAvailable: boolean,
245
317
  templateArgs: Readonly<{ [key: string]: string }>,
246
318
  serverCallbackArgs: Readonly<{ [key: string]: string }>,
319
+ pickerSettings?: UnsafeObject,
247
320
  ): Promise<any>;
248
321
  }
249
322
 
@@ -0,0 +1,38 @@
1
+ import { kAssert } from '@react-native-kakao/core';
2
+
3
+ import type { KakaoSharePickerSettings } from './spec/NativeKakaoShare';
4
+
5
+ const minSelectionLimit = 1;
6
+ const maxSelectionLimit = 10;
7
+
8
+ export function validateSharePickerSettings(pickerSettings?: KakaoSharePickerSettings) {
9
+ if (pickerSettings == null) {
10
+ return undefined;
11
+ }
12
+
13
+ kAssert(
14
+ typeof pickerSettings === 'object' && !Array.isArray(pickerSettings),
15
+ '[share] pickerSettings must be an object',
16
+ );
17
+
18
+ const { type, limit } = pickerSettings;
19
+ kAssert(
20
+ type == null || ['default', 'friend', 'chat'].includes(type),
21
+ '[share] pickerSettings.type must be default, friend, or chat',
22
+ );
23
+
24
+ kAssert(
25
+ limit == null ||
26
+ (Number.isInteger(limit) && limit >= minSelectionLimit && limit <= maxSelectionLimit),
27
+ `[share] pickerSettings.limit must be an integer between ${minSelectionLimit} and ${maxSelectionLimit}`,
28
+ );
29
+
30
+ if (type == null && limit == null) {
31
+ return undefined;
32
+ }
33
+
34
+ return {
35
+ ...(type != null && { type }),
36
+ ...(limit != null && { limit }),
37
+ };
38
+ }