@react-native-kakao/share 3.0.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 +41 -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 +359 -11
  5. package/android/src/main/java/net/mjstudio/rnkakao/share/RNCKakaoShareTemplates.kt +5 -2
  6. package/ios/RNCKakaoShare.mm +69 -5
  7. package/ios/RNCKakaoShareManager.swift +349 -36
  8. package/lib/commonjs/index.js +145 -29
  9. package/lib/commonjs/index.js.map +1 -1
  10. package/lib/commonjs/index.web.js +267 -48
  11. package/lib/commonjs/index.web.js.map +1 -1
  12. package/lib/commonjs/spec/NativeKakaoShare.ts +89 -3
  13. package/lib/commonjs/validateSharePickerSettings.js +33 -0
  14. package/lib/commonjs/validateSharePickerSettings.js.map +1 -0
  15. package/lib/module/index.js +135 -29
  16. package/lib/module/index.js.map +1 -1
  17. package/lib/module/index.web.js +258 -49
  18. package/lib/module/index.web.js.map +1 -1
  19. package/lib/module/spec/NativeKakaoShare.ts +89 -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 +88 -23
  23. package/lib/typescript/src/index.d.ts.map +1 -1
  24. package/lib/typescript/src/spec/NativeKakaoShare.d.ts +84 -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 +5 -5
  29. package/src/index.ts +271 -15
  30. package/src/index.web.ts +305 -62
  31. package/src/spec/NativeKakaoShare.ts +89 -3
  32. package/src/validateSharePickerSettings.ts +38 -0
package/src/index.web.ts CHANGED
@@ -1,10 +1,42 @@
1
- import { filterNonNullishKeys, snakeCaseObject } from '@mj-studio/js-util';
2
- import { kRunWebAPI } from '@react-native-kakao/core';
1
+ import {
2
+ filterNonNullishKeys,
3
+ replaceJsonValuesRecursively,
4
+ snakeCaseObject,
5
+ } from '@mj-studio/js-util';
6
+ import { kCreateWebError, kRunWebAPI } from '@react-native-kakao/core';
3
7
 
4
- import type { KakaoShareAPI } from './index';
8
+ import type {
9
+ KakaoFriendMessageResult,
10
+ KakaoImageUploadResult,
11
+ KakaoMessageSendResult,
12
+ KakaoShareAPI,
13
+ KakaoSharePickerSettings,
14
+ } from './index';
15
+ import { validateSharePickerSettings } from './validateSharePickerSettings';
5
16
 
6
17
  declare const Kakao: {
7
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;
33
+ scrapImage: (args: { imageUrl: string }) => Promise<{
34
+ infos: {
35
+ original: Omit<KakaoImageUploadResult['infos']['original'], 'contentType'> & {
36
+ content_type: string;
37
+ };
38
+ };
39
+ }>;
8
40
  sendDefault: (args: any) => Promise<any>;
9
41
  sendCustom: (args: any) => Promise<any>;
10
42
  };
@@ -15,121 +47,332 @@ function createShareDefault({
15
47
  serverCallbackArgs,
16
48
  template,
17
49
  objectType,
50
+ pickerSettings,
18
51
  }: {
19
52
  objectType: string;
20
53
  template: any;
21
54
  serverCallbackArgs?: Record<string, string>;
55
+ pickerSettings?: KakaoSharePickerSettings;
22
56
  }) {
23
57
  return kRunWebAPI(() =>
24
- Kakao.Share.sendDefault({
25
- objectType,
26
- ...template,
27
- serverCallbackArgs,
28
- }),
58
+ Kakao.Share.sendDefault(
59
+ filterNonNullishKeys({
60
+ objectType,
61
+ ...serializeExecutionParams(template),
62
+ serverCallbackArgs,
63
+ pickerSettings: validateSharePickerSettings(pickerSettings),
64
+ }),
65
+ ),
29
66
  );
30
67
  }
31
68
 
32
69
  function createSendDefaultMe({ template, objectType }: { objectType: string; template: any }) {
33
- return kRunWebAPI(() =>
34
- Kakao.API.request({
70
+ return kRunWebAPI(async () => {
71
+ await Kakao.API.request({
35
72
  url: '/v2/api/talk/memo/default/send',
36
73
  data: {
37
- template_object: snakeCaseObject({
38
- objectType,
39
- ...template,
40
- }),
74
+ template_object: serializeMessageTemplate(objectType, template),
41
75
  },
42
- }),
43
- );
76
+ });
77
+ });
78
+ }
79
+
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;
44
104
  }
45
105
 
46
- function createSendDefaultFriends({
106
+ function createSendDefaultFriends<T extends boolean = false>({
47
107
  objectType,
48
108
  template,
49
109
  receiverUuids,
110
+ includeFailureInfo,
50
111
  }: {
51
112
  template: any;
52
113
  objectType: any;
53
114
  receiverUuids: string[];
115
+ includeFailureInfo?: T;
54
116
  }) {
55
117
  return kRunWebAPI(() =>
56
118
  Kakao.API.request({
57
119
  url: '/v1/api/talk/friends/message/default/send',
58
120
  data: {
59
- template_object: snakeCaseObject(
60
- filterNonNullishKeys({
61
- objectType,
62
- ...template,
63
- }),
64
- ),
121
+ template_object: serializeMessageTemplate(objectType, template),
65
122
  receiver_uuids: receiverUuids,
66
123
  },
67
- }),
124
+ }).then((response: WebMessageSendResult) =>
125
+ getFriendMessageResult(response, includeFailureInfo),
126
+ ),
68
127
  );
69
128
  }
70
129
 
130
+ function serializeMessageTemplate(objectType: string, template: object) {
131
+ return snakeCaseObject({ objectType, ...serializeExecutionParams(template) });
132
+ }
133
+
134
+ function serializeExecutionParams(template: object) {
135
+ return replaceJsonValuesRecursively(template, {
136
+ stripUndefined: true,
137
+ replacer: {
138
+ androidExecutionParams: encodeExecutionParams,
139
+ iosExecutionParams: encodeExecutionParams,
140
+ },
141
+ });
142
+
143
+ function encodeExecutionParams(params?: Record<string, string>) {
144
+ return params == null
145
+ ? undefined
146
+ : Object.entries(params)
147
+ .map(([key, value]) => `${encodeURIComponent(key)}=${encodeURIComponent(value)}`)
148
+ .join('&');
149
+ }
150
+ }
151
+
71
152
  const KakaoShare: KakaoShareAPI = {
72
- shareCustomTemplate: ({ templateArgs, templateId, serverCallbackArgs }) =>
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
+ }) =>
73
218
  kRunWebAPI(() =>
74
- Kakao.Share.sendCustom({
75
- templateId,
76
- templateArgs,
77
- serverCallbackArgs,
78
- }),
219
+ Kakao.Share.sendScrap(
220
+ filterNonNullishKeys({
221
+ requestUrl,
222
+ templateId,
223
+ templateArgs,
224
+ serverCallbackArgs,
225
+ pickerSettings: validateSharePickerSettings(pickerSettings),
226
+ }),
227
+ ),
79
228
  ),
80
- sendCustomTemplateToMe: ({ templateId, templateArgs }) =>
81
- kRunWebAPI(() =>
229
+ sendScrapTemplateToMe: async ({ requestUrl, templateId, templateArgs }) => {
230
+ await kRunWebAPI(() =>
82
231
  Kakao.API.request({
83
- url: '/v2/api/talk/memo/send',
84
- data: { template_id: templateId, template_args: templateArgs },
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
+ }),
85
257
  }),
258
+ );
259
+
260
+ return getFriendMessageResult(response, includeFailureInfo);
261
+ },
262
+ scrapImage: ({ imageUrl, secureResource = true }) =>
263
+ kRunWebAPI(async () => {
264
+ const { infos } = await Kakao.Share.scrapImage({ imageUrl });
265
+ const { content_type: contentType, ...original } = infos.original;
266
+
267
+ return {
268
+ infos: {
269
+ original: {
270
+ ...original,
271
+ url: original.url.replace(/^https?:/, secureResource ? 'https:' : 'http:'),
272
+ contentType,
273
+ },
274
+ },
275
+ };
276
+ }),
277
+ shareCustomTemplate: ({ templateArgs, templateId, serverCallbackArgs, pickerSettings }) =>
278
+ kRunWebAPI(() =>
279
+ Kakao.Share.sendCustom(
280
+ filterNonNullishKeys({
281
+ templateId,
282
+ templateArgs,
283
+ serverCallbackArgs,
284
+ pickerSettings: validateSharePickerSettings(pickerSettings),
285
+ }),
286
+ ),
86
287
  ),
87
- sendCustomTemplateToFriends: ({ templateArgs, templateId, receiverUuids }) =>
288
+ sendCustomTemplateToMe: ({ templateId, templateArgs }) =>
289
+ kRunWebAPI(async () => {
290
+ await Kakao.API.request({
291
+ url: '/v2/api/talk/memo/send',
292
+ data: filterNonNullishKeys({ template_id: templateId, template_args: templateArgs }),
293
+ });
294
+ }),
295
+ sendCustomTemplateToFriends: ({ templateArgs, templateId, receiverUuids, includeFailureInfo }) =>
88
296
  kRunWebAPI(() =>
89
297
  Kakao.API.request({
90
298
  url: '/v1/api/talk/friends/message/send',
91
- data: {
299
+ data: filterNonNullishKeys({
92
300
  template_id: templateId,
93
301
  template_args: templateArgs,
94
302
  receiver_uuids: receiverUuids,
95
- },
96
- }),
303
+ }),
304
+ }).then((response: WebMessageSendResult) =>
305
+ getFriendMessageResult(response, includeFailureInfo),
306
+ ),
97
307
  ),
98
- shareFeedTemplate: ({ template, serverCallbackArgs }) =>
99
- createShareDefault({ template, serverCallbackArgs, objectType: 'feed' }),
308
+ shareFeedTemplate: ({ template, serverCallbackArgs, pickerSettings }) =>
309
+ createShareDefault({ template, serverCallbackArgs, pickerSettings, objectType: 'feed' }),
100
310
  sendFeedTemplateToMe: ({ template }) => createSendDefaultMe({ template, objectType: 'feed' }),
101
- sendFeedTemplateToFriends: ({ template, receiverUuids }) =>
102
- createSendDefaultFriends({ template, receiverUuids, objectType: 'feed' }),
103
- shareListTemplate: ({ template, serverCallbackArgs }) =>
104
- 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' }),
105
315
  sendListTemplateToMe: ({ template }) => createSendDefaultMe({ template, objectType: 'list' }),
106
- sendListTemplateToFriends: ({ template, receiverUuids }) =>
107
- createSendDefaultFriends({ template, receiverUuids, objectType: 'list' }),
108
- shareLocationTemplate: ({ template, serverCallbackArgs }) =>
109
- 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' }),
110
320
  sendLocationTemplateToMe: ({ template }) =>
111
321
  createSendDefaultMe({ template, objectType: 'location' }),
112
- sendLocationTemplateToFriends: ({ template, receiverUuids }) =>
113
- createSendDefaultFriends({ template, receiverUuids, objectType: 'location' }),
114
- shareCommerceTemplate: ({ template, serverCallbackArgs }) =>
115
- 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' }),
116
331
  sendCommerceTemplateToMe: ({ template }) =>
117
332
  createSendDefaultMe({ template, objectType: 'commerce' }),
118
- sendCommerceTemplateToFriends: ({ template, receiverUuids }) =>
119
- createSendDefaultFriends({ template, receiverUuids, objectType: 'commerce' }),
120
- shareTextTemplate: ({ template, serverCallbackArgs }) =>
121
- 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' }),
122
342
  sendTextTemplateToMe: ({ template }) => createSendDefaultMe({ template, objectType: 'text' }),
123
- sendTextTemplateToFriends: ({ template, receiverUuids }) =>
124
- createSendDefaultFriends({ template, receiverUuids, objectType: 'text' }),
125
- shareCalendarTemplate: ({ template, serverCallbackArgs }) =>
126
- 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' }),
127
347
  sendCalendarTemplateToMe: ({ template }) =>
128
348
  createSendDefaultMe({ template, objectType: 'calendar' }),
129
- sendCalendarTemplateToFriends: ({ template, receiverUuids }) =>
130
- createSendDefaultFriends({ template, receiverUuids, objectType: 'calendar' }),
349
+ sendCalendarTemplateToFriends: ({ template, receiverUuids, includeFailureInfo }) =>
350
+ createSendDefaultFriends({
351
+ template,
352
+ receiverUuids,
353
+ includeFailureInfo,
354
+ objectType: 'calendar',
355
+ }),
131
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
+
132
365
  export const {
366
+ isKakaoTalkSharingAvailable,
367
+ getShareTemplateDiagnostics,
368
+ makeDefaultTemplateUrl,
369
+ makeCustomTemplateUrl,
370
+ makeScrapTemplateUrl,
371
+ uploadImage,
372
+ shareScrapTemplate,
373
+ sendScrapTemplateToMe,
374
+ sendScrapTemplateToFriends,
375
+ scrapImage,
133
376
  sendCalendarTemplateToFriends,
134
377
  sendCalendarTemplateToMe,
135
378
  sendCommerceTemplateToFriends,
@@ -216,21 +216,107 @@ export interface KakaoCalendarTemplate {
216
216
  buttons?: KakaoTemplateButton[];
217
217
  }
218
218
 
219
+ export type KakaoImageUploadResult = {
220
+ infos: {
221
+ original: {
222
+ url: string;
223
+ contentType: string;
224
+ length: Double;
225
+ width: Double;
226
+ height: Double;
227
+ };
228
+ };
229
+ };
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
+
219
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
+
304
+ scrapImage(imageUrl: string, secureResource: boolean): Promise<KakaoImageUploadResult>;
220
305
  shareOrSendMeOrSendFriendOrWhatever(
221
306
  /* share, send-me, send-friend */
222
307
  sendType: string,
223
- /* custom, feed, list, location, commerce, text, calendar */
308
+ /* custom, scrap, feed, list, location, commerce, text, calendar */
224
309
  templateType: string,
225
- /* only for custom */
310
+ /* only for custom or scrap (-1 uses the default scrap template) */
226
311
  templateId: Double,
227
- /* only for default templates */
312
+ /* default template fields or { requestUrl } for scrap */
228
313
  templateJson: UnsafeObject,
229
314
  /* only for pass friend uuid directly */
230
315
  receiverUuids: ReadonlyArray<string>,
231
316
  useWebBrowserIfKakaoTalkNotAvailable: boolean,
232
317
  templateArgs: Readonly<{ [key: string]: string }>,
233
318
  serverCallbackArgs: Readonly<{ [key: string]: string }>,
319
+ pickerSettings?: UnsafeObject,
234
320
  ): Promise<any>;
235
321
  }
236
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
+ }