@ion299/sdk-react-native 0.1.0-beta.5 → 0.1.0-beta.7

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 (59) hide show
  1. package/CHANGELOG.md +26 -0
  2. package/README.md +69 -11
  3. package/android/src/main/java/com/chatplatform/sdk/ChatSdkAudioPlayerModule.kt +201 -0
  4. package/android/src/main/java/com/chatplatform/sdk/ChatSdkPackage.kt +1 -0
  5. package/ios/ChatSdkAudioPlayer.m +25 -0
  6. package/ios/ChatSdkAudioPlayer.swift +193 -0
  7. package/lib/commonjs/ChatSDK.js +16 -3
  8. package/lib/commonjs/ChatSDK.js.map +1 -1
  9. package/lib/commonjs/api.js +29 -0
  10. package/lib/commonjs/api.js.map +1 -1
  11. package/lib/commonjs/audio/audioController.js +145 -0
  12. package/lib/commonjs/audio/audioController.js.map +1 -0
  13. package/lib/commonjs/components/AudioMessage.js +198 -0
  14. package/lib/commonjs/components/AudioMessage.js.map +1 -0
  15. package/lib/commonjs/components/MessageBubble.js +9 -0
  16. package/lib/commonjs/components/MessageBubble.js.map +1 -1
  17. package/lib/commonjs/native/NativeChatSdkAudioPlayer.js +28 -0
  18. package/lib/commonjs/native/NativeChatSdkAudioPlayer.js.map +1 -0
  19. package/lib/module/ChatSDK.js +16 -3
  20. package/lib/module/ChatSDK.js.map +1 -1
  21. package/lib/module/api.js +29 -0
  22. package/lib/module/api.js.map +1 -1
  23. package/lib/module/audio/audioController.js +140 -0
  24. package/lib/module/audio/audioController.js.map +1 -0
  25. package/lib/module/components/AudioMessage.js +193 -0
  26. package/lib/module/components/AudioMessage.js.map +1 -0
  27. package/lib/module/components/MessageBubble.js +9 -0
  28. package/lib/module/components/MessageBubble.js.map +1 -1
  29. package/lib/module/native/NativeChatSdkAudioPlayer.js +23 -0
  30. package/lib/module/native/NativeChatSdkAudioPlayer.js.map +1 -0
  31. package/lib/typescript/commonjs/ChatSDK.d.ts +3 -0
  32. package/lib/typescript/commonjs/ChatSDK.d.ts.map +1 -1
  33. package/lib/typescript/commonjs/api.d.ts +3 -0
  34. package/lib/typescript/commonjs/api.d.ts.map +1 -1
  35. package/lib/typescript/commonjs/audio/audioController.d.ts +25 -0
  36. package/lib/typescript/commonjs/audio/audioController.d.ts.map +1 -0
  37. package/lib/typescript/commonjs/components/AudioMessage.d.ts +11 -0
  38. package/lib/typescript/commonjs/components/AudioMessage.d.ts.map +1 -0
  39. package/lib/typescript/commonjs/components/MessageBubble.d.ts.map +1 -1
  40. package/lib/typescript/commonjs/native/NativeChatSdkAudioPlayer.d.ts +20 -0
  41. package/lib/typescript/commonjs/native/NativeChatSdkAudioPlayer.d.ts.map +1 -0
  42. package/lib/typescript/module/ChatSDK.d.ts +3 -0
  43. package/lib/typescript/module/ChatSDK.d.ts.map +1 -1
  44. package/lib/typescript/module/api.d.ts +3 -0
  45. package/lib/typescript/module/api.d.ts.map +1 -1
  46. package/lib/typescript/module/audio/audioController.d.ts +25 -0
  47. package/lib/typescript/module/audio/audioController.d.ts.map +1 -0
  48. package/lib/typescript/module/components/AudioMessage.d.ts +11 -0
  49. package/lib/typescript/module/components/AudioMessage.d.ts.map +1 -0
  50. package/lib/typescript/module/components/MessageBubble.d.ts.map +1 -1
  51. package/lib/typescript/module/native/NativeChatSdkAudioPlayer.d.ts +20 -0
  52. package/lib/typescript/module/native/NativeChatSdkAudioPlayer.d.ts.map +1 -0
  53. package/package.json +1 -1
  54. package/src/ChatSDK.ts +18 -3
  55. package/src/api.ts +37 -0
  56. package/src/audio/audioController.ts +144 -0
  57. package/src/components/AudioMessage.tsx +198 -0
  58. package/src/components/MessageBubble.tsx +6 -0
  59. package/src/native/NativeChatSdkAudioPlayer.ts +54 -0
@@ -1 +1 @@
1
- {"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../../src/api.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,eAAe,EACf,YAAY,EACZ,gBAAgB,EAChB,aAAa,EACb,oBAAoB,EACpB,eAAe,EAChB,MAAM,SAAS,CAAA;AAEhB,qBAAa,eAAe;IAC1B,OAAO,CAAC,OAAO,CAAQ;IACvB,OAAO,CAAC,KAAK,CAAQ;IACrB,OAAO,CAAC,YAAY,CAAsB;IAC1C,OAAO,CAAC,SAAS,CAAsB;IACvC,OAAO,CAAC,WAAW,CAAyC;gBAEhD,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM;IAK1C,UAAU,CAAC,YAAY,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI;IAKzD,cAAc,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,GAAG,IAAI;IAIjE,YAAY,IAAI,IAAI;IAMpB,YAAY,IAAI,MAAM,GAAG,IAAI;IAIvB,aAAa,CACjB,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,EAC3C,MAAM,EAAE,aAAa,GACpB,OAAO,CAAC,eAAe,CAAC;IAqBrB,SAAS,IAAI,OAAO,CAAC,YAAY,CAAC;IAKlC,WAAW,IAAI,OAAO,CAAC,gBAAgB,CAAC;IAQxC,WAAW,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAQxE,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,eAAe,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IA+BnE,eAAe,CAAC,mBAAmB,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,oBAAoB,CAAC;IAe5E,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAQ1D,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAQ1E,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM;IAIzC,0BAA0B,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM;IASrE,wBAAwB,IAAI,MAAM;IAIlC,cAAc,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;IAIxC,OAAO,CAAC,aAAa;IAMrB,OAAO,CAAC,WAAW;YAML,GAAG;YAWH,IAAI;YAqBJ,gBAAgB;CAc/B"}
1
+ {"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../../src/api.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,eAAe,EACf,YAAY,EACZ,gBAAgB,EAChB,aAAa,EACb,oBAAoB,EACpB,eAAe,EAChB,MAAM,SAAS,CAAA;AAEhB,qBAAa,eAAe;IAC1B,OAAO,CAAC,OAAO,CAAQ;IACvB,OAAO,CAAC,KAAK,CAAQ;IACrB,OAAO,CAAC,YAAY,CAAsB;IAC1C,OAAO,CAAC,SAAS,CAAsB;IACvC,OAAO,CAAC,WAAW,CAAyC;gBAEhD,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM;IAK1C,UAAU,CAAC,YAAY,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI;IAKzD,cAAc,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,GAAG,IAAI;IAIjE,YAAY,IAAI,IAAI;IAMpB,YAAY,IAAI,MAAM,GAAG,IAAI;IAIvB,aAAa,CACjB,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,EAC3C,MAAM,EAAE,aAAa,GACpB,OAAO,CAAC,eAAe,CAAC;IAqBrB,SAAS,IAAI,OAAO,CAAC,YAAY,CAAC;IAKlC,WAAW,IAAI,OAAO,CAAC,gBAAgB,CAAC;IAQxC,WAAW,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAQxE,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,eAAe,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IA+BnE,eAAe,CAAC,mBAAmB,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,oBAAoB,CAAC;IAe5E,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAQ1D,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAQpE,iBAAiB,CAAC,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,GAAG,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAQ/E,eAAe,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAQzD,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM;IAIzC,0BAA0B,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM;IASrE,wBAAwB,IAAI,MAAM;IAIlC,cAAc,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;IAIxC,OAAO,CAAC,aAAa;IAMrB,OAAO,CAAC,WAAW;YAML,GAAG;YAWH,IAAI;YAqBJ,GAAG;YAqBH,gBAAgB;CAc/B"}
@@ -0,0 +1,25 @@
1
+ export interface AudioPlaybackState {
2
+ state: 'idle' | 'loading' | 'playing' | 'paused' | 'error';
3
+ positionMillis: number;
4
+ durationMillis: number;
5
+ }
6
+ type Listener = (state: AudioPlaybackState) => void;
7
+ declare class AudioController {
8
+ private listeners;
9
+ private states;
10
+ private activeKey;
11
+ private subscribed;
12
+ get isAvailable(): boolean;
13
+ private ensureSubscribed;
14
+ private handleEvent;
15
+ private setState;
16
+ getState(key: string): AudioPlaybackState;
17
+ subscribe(key: string, listener: Listener): () => void;
18
+ play(key: string, url: string, headers?: Record<string, string>): Promise<void>;
19
+ pause(key: string): Promise<void>;
20
+ seek(key: string, positionMillis: number): Promise<void>;
21
+ stop(key: string): Promise<void>;
22
+ }
23
+ export declare const audioController: AudioController;
24
+ export {};
25
+ //# sourceMappingURL=audioController.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"audioController.d.ts","sourceRoot":"","sources":["../../../../src/audio/audioController.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS,GAAG,QAAQ,GAAG,OAAO,CAAA;IAC1D,cAAc,EAAE,MAAM,CAAA;IACtB,cAAc,EAAE,MAAM,CAAA;CACvB;AAED,KAAK,QAAQ,GAAG,CAAC,KAAK,EAAE,kBAAkB,KAAK,IAAI,CAAA;AAInD,cAAM,eAAe;IACnB,OAAO,CAAC,SAAS,CAAmC;IACpD,OAAO,CAAC,MAAM,CAAwC;IACtD,OAAO,CAAC,SAAS,CAAsB;IACvC,OAAO,CAAC,UAAU,CAAQ;IAE1B,IAAI,WAAW,IAAI,OAAO,CAEzB;IAED,OAAO,CAAC,gBAAgB;IAMxB,OAAO,CAAC,WAAW;IAqCnB,OAAO,CAAC,QAAQ;IAKhB,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,kBAAkB;IAIzC,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,GAAG,MAAM,IAAI;IAehD,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAuBnF,KAAK,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IASjC,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IASxD,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAQvC;AAED,eAAO,MAAM,eAAe,iBAAwB,CAAA"}
@@ -0,0 +1,11 @@
1
+ import React from 'react';
2
+ import type { ChatAttachment } from '../types';
3
+ import type { ChatTheme } from '../theme';
4
+ interface Props {
5
+ attachment: ChatAttachment;
6
+ isOutbound: boolean;
7
+ theme: ChatTheme;
8
+ }
9
+ export declare function AudioMessage({ attachment, isOutbound, theme }: Props): React.JSX.Element;
10
+ export {};
11
+ //# sourceMappingURL=AudioMessage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AudioMessage.d.ts","sourceRoot":"","sources":["../../../../src/components/AudioMessage.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA8B,MAAM,OAAO,CAAA;AAWlD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,UAAU,CAAA;AAC9C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,UAAU,CAAA;AAEzC,UAAU,KAAK;IACb,UAAU,EAAE,cAAc,CAAA;IAC1B,UAAU,EAAE,OAAO,CAAA;IACnB,KAAK,EAAE,SAAS,CAAA;CACjB;AAcD,wBAAgB,YAAY,CAAC,EAAE,UAAU,EAAE,UAAU,EAAE,KAAK,EAAE,EAAE,KAAK,qBAmFpE"}
@@ -1 +1 @@
1
- {"version":3,"file":"MessageBubble.d.ts","sourceRoot":"","sources":["../../../../src/components/MessageBubble.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AAGzB,OAAO,KAAK,EAAE,cAAc,EAAc,WAAW,EAAE,MAAM,UAAU,CAAA;AACvE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,UAAU,CAAA;AAEzC,UAAU,KAAK;IACb,OAAO,EAAE,WAAW,CAAA;IACpB,KAAK,EAAE,SAAS,CAAA;IAChB,aAAa,CAAC,EAAE,CAAC,YAAY,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,KAAK,IAAI,CAAA;IACvE,iBAAiB,CAAC,EAAE,CAAC,UAAU,EAAE,cAAc,KAAK,IAAI,CAAA;CACzD;AAED,wBAAgB,aAAa,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,aAAa,EAAE,iBAAiB,EAAE,EAAE,KAAK,qBAgFxF"}
1
+ {"version":3,"file":"MessageBubble.d.ts","sourceRoot":"","sources":["../../../../src/components/MessageBubble.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AAKzB,OAAO,KAAK,EAAE,cAAc,EAAc,WAAW,EAAE,MAAM,UAAU,CAAA;AACvE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,UAAU,CAAA;AAEzC,UAAU,KAAK;IACb,OAAO,EAAE,WAAW,CAAA;IACpB,KAAK,EAAE,SAAS,CAAA;IAChB,aAAa,CAAC,EAAE,CAAC,YAAY,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,KAAK,IAAI,CAAA;IACvE,iBAAiB,CAAC,EAAE,CAAC,UAAU,EAAE,cAAc,KAAK,IAAI,CAAA;CACzD;AAED,wBAAgB,aAAa,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,aAAa,EAAE,iBAAiB,EAAE,EAAE,KAAK,qBAgFxF"}
@@ -0,0 +1,20 @@
1
+ import type { EventSubscription, TurboModule } from 'react-native';
2
+ export type NativeAudioState = 'loading' | 'playing' | 'paused' | 'ended' | 'stopped' | 'error';
3
+ export interface AudioStateEvent {
4
+ key: string;
5
+ positionMillis: number;
6
+ durationMillis: number;
7
+ state: NativeAudioState;
8
+ }
9
+ export interface Spec extends TurboModule {
10
+ play(key: string, url: string, headers: Record<string, string>): Promise<void>;
11
+ pause(key: string): Promise<void>;
12
+ seek(key: string, positionMillis: number): Promise<void>;
13
+ stop(key: string): Promise<void>;
14
+ addListener(eventName: string): void;
15
+ removeListeners(count: number): void;
16
+ }
17
+ declare const moduleRef: Spec | null;
18
+ export default moduleRef;
19
+ export declare function onAudioState(handler: (event: AudioStateEvent) => void): EventSubscription | null;
20
+ //# sourceMappingURL=NativeChatSdkAudioPlayer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NativeChatSdkAudioPlayer.d.ts","sourceRoot":"","sources":["../../../../src/native/NativeChatSdkAudioPlayer.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,iBAAiB,EAAE,WAAW,EAAE,MAAM,cAAc,CAAA;AAElE,MAAM,MAAM,gBAAgB,GACxB,SAAS,GACT,SAAS,GACT,QAAQ,GACR,OAAO,GACP,SAAS,GACT,OAAO,CAAA;AAEX,MAAM,WAAW,eAAe;IAC9B,GAAG,EAAE,MAAM,CAAA;IACX,cAAc,EAAE,MAAM,CAAA;IACtB,cAAc,EAAE,MAAM,CAAA;IACtB,KAAK,EAAE,gBAAgB,CAAA;CACxB;AAED,MAAM,WAAW,IAAK,SAAQ,WAAW;IACvC,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAC9E,KAAK,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IACjC,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IACxD,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAChC,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;IACpC,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;CACrC;AAYD,QAAA,MAAM,SAAS,aAAe,CAAA;AAE9B,eAAe,SAAS,CAAA;AAUxB,wBAAgB,YAAY,CAC1B,OAAO,EAAE,CAAC,KAAK,EAAE,eAAe,KAAK,IAAI,GACxC,iBAAiB,GAAG,IAAI,CAE1B"}
@@ -19,10 +19,13 @@ declare class ChatSDKSingleton {
19
19
  private lastError;
20
20
  private currentUser;
21
21
  private listeners;
22
+ private pushDeviceToken;
22
23
  init(raw: ChatSDKConfig): void;
23
24
  getLastError(): string | null;
24
25
  login(user: ChatSDKUser, device?: ChatSDKDevice): Promise<void>;
25
26
  logout(): Promise<void>;
27
+ registerPushToken(deviceToken: string, platform?: 'fcm' | 'apns'): Promise<void>;
28
+ unregisterPushToken(deviceToken?: string): Promise<void>;
26
29
  handleNotification(_payload: NotificationPayload): void;
27
30
  getApi(): MobileApiClient;
28
31
  getSDKConfig(): MobileConfig | null;
@@ -1 +1 @@
1
- {"version":3,"file":"ChatSDK.d.ts","sourceRoot":"","sources":["../../../src/ChatSDK.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,OAAO,CAAA;AAEvC,OAAO,KAAK,EACV,WAAW,EACX,YAAY,EACZ,aAAa,EACb,aAAa,EACb,WAAW,EACX,2BAA2B,EAC3B,YAAY,EACZ,sBAAsB,EACtB,mBAAmB,EACnB,2BAA2B,EAC3B,QAAQ,EACT,MAAM,SAAS,CAAA;AAEhB,KAAK,WAAW,GAAG;IACjB,WAAW,EAAE,QAAQ,CAAA;IACrB,KAAK,EAAE,OAAO,CAAA;IACd,eAAe,EAAE,2BAA2B,CAAA;IAC5C,UAAU,EAAE,sBAAsB,CAAA;IAClC,eAAe,EAAE,2BAA2B,CAAA;IAC5C,eAAe,EAAE,OAAO,CAAA;CACzB,CAAA;AAED,KAAK,SAAS,GAAG,MAAM,WAAW,CAAA;AAClC,KAAK,YAAY,CAAC,CAAC,SAAS,SAAS,GAAG,SAAS,IAAI,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC,CAAC,KAAK,IAAI,CAAA;AAEnF,cAAM,gBAAgB;IACpB,OAAO,CAAC,MAAM,CAA6B;IAC3C,OAAO,CAAC,GAAG,CAA+B;IAC1C,OAAO,CAAC,SAAS,CAA4B;IAC7C,OAAO,CAAC,OAAO,CAA8B;IAC7C,OAAO,CAAC,KAAK,CAAmB;IAChC,OAAO,CAAC,SAAS,CAAsB;IACvC,OAAO,CAAC,WAAW,CAA2B;IAC9C,OAAO,CAAC,SAAS,CAA+C;IAIhE,IAAI,CAAC,GAAG,EAAE,aAAa,GAAG,IAAI;IA4B9B,YAAY,IAAI,MAAM,GAAG,IAAI;IAIvB,KAAK,CAAC,IAAI,EAAE,WAAW,EAAE,MAAM,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;IAsC/D,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;IAU7B,kBAAkB,CAAC,QAAQ,EAAE,mBAAmB,GAAG,IAAI;IASvD,MAAM,IAAI,eAAe;IAKzB,YAAY,IAAI,YAAY,GAAG,IAAI;IAInC,UAAU,IAAI,MAAM;IAIpB,QAAQ,IAAI,QAAQ;IAIpB,eAAe,IAAI,OAAO;IAI1B,OAAO,IAAI,WAAW,GAAG,IAAI;IAI7B,yEAAyE;IACzE,WAAW,IAAI,WAAW,EAAE;IAI5B,WAAW,IAAI,YAAY,GAAG,IAAI;IAIlC,mBAAmB,IAAI,OAAO;IAI9B,8FAA8F;IAC9F,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC;IAMhC,EAAE,CAAC,CAAC,SAAS,SAAS,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,YAAY,CAAC,CAAC,CAAC,GAAG,MAAM,IAAI;IAWvE,OAAO,CAAC,YAAY;IAmBpB,OAAO,CAAC,QAAQ;IAKhB,OAAO,CAAC,IAAI;IAIZ,OAAO,CAAC,iBAAiB;IAMzB,0EAA0E;IAC1E,OAAO,CAAC,MAAM,CAAC,aAAa;CAc7B;AAED,eAAO,MAAM,OAAO,kBAAyB,CAAA"}
1
+ {"version":3,"file":"ChatSDK.d.ts","sourceRoot":"","sources":["../../../src/ChatSDK.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,OAAO,CAAA;AAEvC,OAAO,KAAK,EACV,WAAW,EACX,YAAY,EACZ,aAAa,EACb,aAAa,EACb,WAAW,EACX,2BAA2B,EAC3B,YAAY,EACZ,sBAAsB,EACtB,mBAAmB,EACnB,2BAA2B,EAC3B,QAAQ,EACT,MAAM,SAAS,CAAA;AAEhB,KAAK,WAAW,GAAG;IACjB,WAAW,EAAE,QAAQ,CAAA;IACrB,KAAK,EAAE,OAAO,CAAA;IACd,eAAe,EAAE,2BAA2B,CAAA;IAC5C,UAAU,EAAE,sBAAsB,CAAA;IAClC,eAAe,EAAE,2BAA2B,CAAA;IAC5C,eAAe,EAAE,OAAO,CAAA;CACzB,CAAA;AAED,KAAK,SAAS,GAAG,MAAM,WAAW,CAAA;AAClC,KAAK,YAAY,CAAC,CAAC,SAAS,SAAS,GAAG,SAAS,IAAI,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC,CAAC,KAAK,IAAI,CAAA;AAEnF,cAAM,gBAAgB;IACpB,OAAO,CAAC,MAAM,CAA6B;IAC3C,OAAO,CAAC,GAAG,CAA+B;IAC1C,OAAO,CAAC,SAAS,CAA4B;IAC7C,OAAO,CAAC,OAAO,CAA8B;IAC7C,OAAO,CAAC,KAAK,CAAmB;IAChC,OAAO,CAAC,SAAS,CAAsB;IACvC,OAAO,CAAC,WAAW,CAA2B;IAC9C,OAAO,CAAC,SAAS,CAA+C;IAChE,OAAO,CAAC,eAAe,CAAsB;IAI7C,IAAI,CAAC,GAAG,EAAE,aAAa,GAAG,IAAI;IA4B9B,YAAY,IAAI,MAAM,GAAG,IAAI;IAIvB,KAAK,CAAC,IAAI,EAAE,WAAW,EAAE,MAAM,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;IAsC/D,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;IAWvB,iBAAiB,CAAC,WAAW,EAAE,MAAM,EAAE,QAAQ,GAAE,KAAK,GAAG,MAAc,GAAG,OAAO,CAAC,IAAI,CAAC;IAMvF,mBAAmB,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAU9D,kBAAkB,CAAC,QAAQ,EAAE,mBAAmB,GAAG,IAAI;IAMvD,MAAM,IAAI,eAAe;IAKzB,YAAY,IAAI,YAAY,GAAG,IAAI;IAInC,UAAU,IAAI,MAAM;IAIpB,QAAQ,IAAI,QAAQ;IAIpB,eAAe,IAAI,OAAO;IAI1B,OAAO,IAAI,WAAW,GAAG,IAAI;IAI7B,yEAAyE;IACzE,WAAW,IAAI,WAAW,EAAE;IAI5B,WAAW,IAAI,YAAY,GAAG,IAAI;IAIlC,mBAAmB,IAAI,OAAO;IAI9B,8FAA8F;IAC9F,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC;IAMhC,EAAE,CAAC,CAAC,SAAS,SAAS,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,YAAY,CAAC,CAAC,CAAC,GAAG,MAAM,IAAI;IAWvE,OAAO,CAAC,YAAY;IAmBpB,OAAO,CAAC,QAAQ;IAKhB,OAAO,CAAC,IAAI;IAIZ,OAAO,CAAC,iBAAiB;IAMzB,0EAA0E;IAC1E,OAAO,CAAC,MAAM,CAAC,aAAa;CAc7B;AAED,eAAO,MAAM,OAAO,kBAAyB,CAAA"}
@@ -18,6 +18,8 @@ export declare class MobileApiClient {
18
18
  getSurveyConfig(closeEventCreatedAt?: number): Promise<SurveyConfigResponse>;
19
19
  submitCsi(rating: number, comment?: string): Promise<void>;
20
20
  sendCallback(messageId: number, callbackData: string): Promise<void>;
21
+ registerPushToken(deviceToken: string, platform: 'fcm' | 'apns'): Promise<void>;
22
+ deletePushToken(deviceToken: string): Promise<void>;
21
23
  getDownloadUrl(contactId: string): string;
22
24
  buildAttachmentDownloadUrl(fileUrl: string, filename: string): string;
23
25
  getBroadcastAuthEndpoint(): string;
@@ -26,6 +28,7 @@ export declare class MobileApiClient {
26
28
  private authHeaders;
27
29
  private get;
28
30
  private post;
31
+ private del;
29
32
  private fetchWithTimeout;
30
33
  }
31
34
  //# sourceMappingURL=api.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../../src/api.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,eAAe,EACf,YAAY,EACZ,gBAAgB,EAChB,aAAa,EACb,oBAAoB,EACpB,eAAe,EAChB,MAAM,SAAS,CAAA;AAEhB,qBAAa,eAAe;IAC1B,OAAO,CAAC,OAAO,CAAQ;IACvB,OAAO,CAAC,KAAK,CAAQ;IACrB,OAAO,CAAC,YAAY,CAAsB;IAC1C,OAAO,CAAC,SAAS,CAAsB;IACvC,OAAO,CAAC,WAAW,CAAyC;gBAEhD,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM;IAK1C,UAAU,CAAC,YAAY,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI;IAKzD,cAAc,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,GAAG,IAAI;IAIjE,YAAY,IAAI,IAAI;IAMpB,YAAY,IAAI,MAAM,GAAG,IAAI;IAIvB,aAAa,CACjB,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,EAC3C,MAAM,EAAE,aAAa,GACpB,OAAO,CAAC,eAAe,CAAC;IAqBrB,SAAS,IAAI,OAAO,CAAC,YAAY,CAAC;IAKlC,WAAW,IAAI,OAAO,CAAC,gBAAgB,CAAC;IAQxC,WAAW,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAQxE,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,eAAe,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IA+BnE,eAAe,CAAC,mBAAmB,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,oBAAoB,CAAC;IAe5E,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAQ1D,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAQ1E,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM;IAIzC,0BAA0B,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM;IASrE,wBAAwB,IAAI,MAAM;IAIlC,cAAc,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;IAIxC,OAAO,CAAC,aAAa;IAMrB,OAAO,CAAC,WAAW;YAML,GAAG;YAWH,IAAI;YAqBJ,gBAAgB;CAc/B"}
1
+ {"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../../src/api.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,eAAe,EACf,YAAY,EACZ,gBAAgB,EAChB,aAAa,EACb,oBAAoB,EACpB,eAAe,EAChB,MAAM,SAAS,CAAA;AAEhB,qBAAa,eAAe;IAC1B,OAAO,CAAC,OAAO,CAAQ;IACvB,OAAO,CAAC,KAAK,CAAQ;IACrB,OAAO,CAAC,YAAY,CAAsB;IAC1C,OAAO,CAAC,SAAS,CAAsB;IACvC,OAAO,CAAC,WAAW,CAAyC;gBAEhD,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM;IAK1C,UAAU,CAAC,YAAY,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI;IAKzD,cAAc,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,GAAG,IAAI;IAIjE,YAAY,IAAI,IAAI;IAMpB,YAAY,IAAI,MAAM,GAAG,IAAI;IAIvB,aAAa,CACjB,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,EAC3C,MAAM,EAAE,aAAa,GACpB,OAAO,CAAC,eAAe,CAAC;IAqBrB,SAAS,IAAI,OAAO,CAAC,YAAY,CAAC;IAKlC,WAAW,IAAI,OAAO,CAAC,gBAAgB,CAAC;IAQxC,WAAW,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAQxE,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,eAAe,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IA+BnE,eAAe,CAAC,mBAAmB,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,oBAAoB,CAAC;IAe5E,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAQ1D,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAQpE,iBAAiB,CAAC,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,GAAG,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAQ/E,eAAe,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAQzD,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM;IAIzC,0BAA0B,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM;IASrE,wBAAwB,IAAI,MAAM;IAIlC,cAAc,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;IAIxC,OAAO,CAAC,aAAa;IAMrB,OAAO,CAAC,WAAW;YAML,GAAG;YAWH,IAAI;YAqBJ,GAAG;YAqBH,gBAAgB;CAc/B"}
@@ -0,0 +1,25 @@
1
+ export interface AudioPlaybackState {
2
+ state: 'idle' | 'loading' | 'playing' | 'paused' | 'error';
3
+ positionMillis: number;
4
+ durationMillis: number;
5
+ }
6
+ type Listener = (state: AudioPlaybackState) => void;
7
+ declare class AudioController {
8
+ private listeners;
9
+ private states;
10
+ private activeKey;
11
+ private subscribed;
12
+ get isAvailable(): boolean;
13
+ private ensureSubscribed;
14
+ private handleEvent;
15
+ private setState;
16
+ getState(key: string): AudioPlaybackState;
17
+ subscribe(key: string, listener: Listener): () => void;
18
+ play(key: string, url: string, headers?: Record<string, string>): Promise<void>;
19
+ pause(key: string): Promise<void>;
20
+ seek(key: string, positionMillis: number): Promise<void>;
21
+ stop(key: string): Promise<void>;
22
+ }
23
+ export declare const audioController: AudioController;
24
+ export {};
25
+ //# sourceMappingURL=audioController.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"audioController.d.ts","sourceRoot":"","sources":["../../../../src/audio/audioController.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS,GAAG,QAAQ,GAAG,OAAO,CAAA;IAC1D,cAAc,EAAE,MAAM,CAAA;IACtB,cAAc,EAAE,MAAM,CAAA;CACvB;AAED,KAAK,QAAQ,GAAG,CAAC,KAAK,EAAE,kBAAkB,KAAK,IAAI,CAAA;AAInD,cAAM,eAAe;IACnB,OAAO,CAAC,SAAS,CAAmC;IACpD,OAAO,CAAC,MAAM,CAAwC;IACtD,OAAO,CAAC,SAAS,CAAsB;IACvC,OAAO,CAAC,UAAU,CAAQ;IAE1B,IAAI,WAAW,IAAI,OAAO,CAEzB;IAED,OAAO,CAAC,gBAAgB;IAMxB,OAAO,CAAC,WAAW;IAqCnB,OAAO,CAAC,QAAQ;IAKhB,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,kBAAkB;IAIzC,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,GAAG,MAAM,IAAI;IAehD,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAuBnF,KAAK,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IASjC,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IASxD,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAQvC;AAED,eAAO,MAAM,eAAe,iBAAwB,CAAA"}
@@ -0,0 +1,11 @@
1
+ import React from 'react';
2
+ import type { ChatAttachment } from '../types';
3
+ import type { ChatTheme } from '../theme';
4
+ interface Props {
5
+ attachment: ChatAttachment;
6
+ isOutbound: boolean;
7
+ theme: ChatTheme;
8
+ }
9
+ export declare function AudioMessage({ attachment, isOutbound, theme }: Props): React.JSX.Element;
10
+ export {};
11
+ //# sourceMappingURL=AudioMessage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AudioMessage.d.ts","sourceRoot":"","sources":["../../../../src/components/AudioMessage.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA8B,MAAM,OAAO,CAAA;AAWlD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,UAAU,CAAA;AAC9C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,UAAU,CAAA;AAEzC,UAAU,KAAK;IACb,UAAU,EAAE,cAAc,CAAA;IAC1B,UAAU,EAAE,OAAO,CAAA;IACnB,KAAK,EAAE,SAAS,CAAA;CACjB;AAcD,wBAAgB,YAAY,CAAC,EAAE,UAAU,EAAE,UAAU,EAAE,KAAK,EAAE,EAAE,KAAK,qBAmFpE"}
@@ -1 +1 @@
1
- {"version":3,"file":"MessageBubble.d.ts","sourceRoot":"","sources":["../../../../src/components/MessageBubble.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AAGzB,OAAO,KAAK,EAAE,cAAc,EAAc,WAAW,EAAE,MAAM,UAAU,CAAA;AACvE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,UAAU,CAAA;AAEzC,UAAU,KAAK;IACb,OAAO,EAAE,WAAW,CAAA;IACpB,KAAK,EAAE,SAAS,CAAA;IAChB,aAAa,CAAC,EAAE,CAAC,YAAY,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,KAAK,IAAI,CAAA;IACvE,iBAAiB,CAAC,EAAE,CAAC,UAAU,EAAE,cAAc,KAAK,IAAI,CAAA;CACzD;AAED,wBAAgB,aAAa,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,aAAa,EAAE,iBAAiB,EAAE,EAAE,KAAK,qBAgFxF"}
1
+ {"version":3,"file":"MessageBubble.d.ts","sourceRoot":"","sources":["../../../../src/components/MessageBubble.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AAKzB,OAAO,KAAK,EAAE,cAAc,EAAc,WAAW,EAAE,MAAM,UAAU,CAAA;AACvE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,UAAU,CAAA;AAEzC,UAAU,KAAK;IACb,OAAO,EAAE,WAAW,CAAA;IACpB,KAAK,EAAE,SAAS,CAAA;IAChB,aAAa,CAAC,EAAE,CAAC,YAAY,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,KAAK,IAAI,CAAA;IACvE,iBAAiB,CAAC,EAAE,CAAC,UAAU,EAAE,cAAc,KAAK,IAAI,CAAA;CACzD;AAED,wBAAgB,aAAa,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,aAAa,EAAE,iBAAiB,EAAE,EAAE,KAAK,qBAgFxF"}
@@ -0,0 +1,20 @@
1
+ import type { EventSubscription, TurboModule } from 'react-native';
2
+ export type NativeAudioState = 'loading' | 'playing' | 'paused' | 'ended' | 'stopped' | 'error';
3
+ export interface AudioStateEvent {
4
+ key: string;
5
+ positionMillis: number;
6
+ durationMillis: number;
7
+ state: NativeAudioState;
8
+ }
9
+ export interface Spec extends TurboModule {
10
+ play(key: string, url: string, headers: Record<string, string>): Promise<void>;
11
+ pause(key: string): Promise<void>;
12
+ seek(key: string, positionMillis: number): Promise<void>;
13
+ stop(key: string): Promise<void>;
14
+ addListener(eventName: string): void;
15
+ removeListeners(count: number): void;
16
+ }
17
+ declare const moduleRef: Spec | null;
18
+ export default moduleRef;
19
+ export declare function onAudioState(handler: (event: AudioStateEvent) => void): EventSubscription | null;
20
+ //# sourceMappingURL=NativeChatSdkAudioPlayer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NativeChatSdkAudioPlayer.d.ts","sourceRoot":"","sources":["../../../../src/native/NativeChatSdkAudioPlayer.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,iBAAiB,EAAE,WAAW,EAAE,MAAM,cAAc,CAAA;AAElE,MAAM,MAAM,gBAAgB,GACxB,SAAS,GACT,SAAS,GACT,QAAQ,GACR,OAAO,GACP,SAAS,GACT,OAAO,CAAA;AAEX,MAAM,WAAW,eAAe;IAC9B,GAAG,EAAE,MAAM,CAAA;IACX,cAAc,EAAE,MAAM,CAAA;IACtB,cAAc,EAAE,MAAM,CAAA;IACtB,KAAK,EAAE,gBAAgB,CAAA;CACxB;AAED,MAAM,WAAW,IAAK,SAAQ,WAAW;IACvC,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAC9E,KAAK,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IACjC,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IACxD,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAChC,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;IACpC,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;CACrC;AAYD,QAAA,MAAM,SAAS,aAAe,CAAA;AAE9B,eAAe,SAAS,CAAA;AAUxB,wBAAgB,YAAY,CAC1B,OAAO,EAAE,CAAC,KAAK,EAAE,eAAe,KAAK,IAAI,GACxC,iBAAiB,GAAG,IAAI,CAE1B"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ion299/sdk-react-native",
3
- "version": "0.1.0-beta.5",
3
+ "version": "0.1.0-beta.7",
4
4
  "description": "React Native SDK for Chat Platform",
5
5
  "main": "./lib/commonjs/index.js",
6
6
  "module": "./lib/module/index.js",
package/src/ChatSDK.ts CHANGED
@@ -35,6 +35,7 @@ class ChatSDKSingleton {
35
35
  private lastError: string | null = null
36
36
  private currentUser: ChatSDKUser | null = null
37
37
  private listeners: Map<EventName, Set<EventHandler>> = new Map()
38
+ private pushDeviceToken: string | null = null
38
39
 
39
40
  // ─── Lifecycle ────────────────────────────────────────────────────────────
40
41
 
@@ -109,6 +110,7 @@ class ChatSDKSingleton {
109
110
  }
110
111
 
111
112
  async logout(): Promise<void> {
113
+ await this.unregisterPushToken().catch(() => {})
112
114
  this.currentUser = null
113
115
  this.session?.destroy()
114
116
  this.session = null
@@ -117,12 +119,25 @@ class ChatSDKSingleton {
117
119
  }
118
120
 
119
121
  // ─── Push ─────────────────────────────────────────────────────────────────
122
+
123
+ async registerPushToken(deviceToken: string, platform: 'fcm' | 'apns' = 'fcm'): Promise<void> {
124
+ this.assertInitialized()
125
+ await this.api!.registerPushToken(deviceToken, platform)
126
+ this.pushDeviceToken = deviceToken
127
+ }
128
+
129
+ async unregisterPushToken(deviceToken?: string): Promise<void> {
130
+ const target = deviceToken ?? this.pushDeviceToken
131
+ if (!target || !this.api) return
132
+ try {
133
+ await this.api.deletePushToken(target)
134
+ } finally {
135
+ if (target === this.pushDeviceToken) this.pushDeviceToken = null
136
+ }
137
+ }
120
138
 
121
139
  handleNotification(_payload: NotificationPayload): void {
122
- // Навигация обрабатывается в host app через onNotification callback.
123
- // SDK только проверяет, что payload относится к нашему токену.
124
140
  if (_payload.token !== this.config?.token) return
125
- // В будущем: открыть ChatScreen если приложение foreground
126
141
  }
127
142
 
128
143
  // ─── Getters ──────────────────────────────────────────────────────────────
package/src/api.ts CHANGED
@@ -146,6 +146,22 @@ export class MobileApiClient {
146
146
  )
147
147
  }
148
148
 
149
+ async registerPushToken(deviceToken: string, platform: 'fcm' | 'apns'): Promise<void> {
150
+ this.assertSession()
151
+ await this.post(
152
+ `/api/mobile/${this.token}/contact/${this.contactId}/push-token`,
153
+ { device_token: deviceToken, platform },
154
+ )
155
+ }
156
+
157
+ async deletePushToken(deviceToken: string): Promise<void> {
158
+ this.assertSession()
159
+ await this.del(
160
+ `/api/mobile/${this.token}/contact/${this.contactId}/push-token`,
161
+ { device_token: deviceToken },
162
+ )
163
+ }
164
+
149
165
  getDownloadUrl(contactId: string): string {
150
166
  return `${this.baseUrl}/api/mobile/${this.token}/contact/${contactId}/download`
151
167
  }
@@ -211,6 +227,27 @@ export class MobileApiClient {
211
227
  return res.json()
212
228
  }
213
229
 
230
+ private async del(path: string, body: unknown, timeoutMs = 30_000): Promise<unknown> {
231
+ const res = await this.fetchWithTimeout(
232
+ `${this.baseUrl}${path}`,
233
+ {
234
+ method: 'DELETE',
235
+ headers: {
236
+ 'Content-Type': 'application/json',
237
+ Accept: 'application/json',
238
+ ...this.authHeaders(),
239
+ },
240
+ body: JSON.stringify(body),
241
+ },
242
+ timeoutMs,
243
+ )
244
+ if (!res.ok) {
245
+ const json = await res.json().catch(() => ({}))
246
+ throw new Error(json?.message ?? `HTTP ${res.status}`)
247
+ }
248
+ return res.json()
249
+ }
250
+
214
251
  private async fetchWithTimeout(url: string, options: RequestInit, timeoutMs = 30000): Promise<Response> {
215
252
  const controller = new AbortController()
216
253
  const timer = setTimeout(() => controller.abort(), timeoutMs)
@@ -0,0 +1,144 @@
1
+ import AudioModule, {
2
+ onAudioState,
3
+ type AudioStateEvent,
4
+ } from '../native/NativeChatSdkAudioPlayer'
5
+
6
+ export interface AudioPlaybackState {
7
+ state: 'idle' | 'loading' | 'playing' | 'paused' | 'error'
8
+ positionMillis: number
9
+ durationMillis: number
10
+ }
11
+
12
+ type Listener = (state: AudioPlaybackState) => void
13
+
14
+ const IDLE: AudioPlaybackState = { state: 'idle', positionMillis: 0, durationMillis: 0 }
15
+
16
+ class AudioController {
17
+ private listeners = new Map<string, Set<Listener>>()
18
+ private states = new Map<string, AudioPlaybackState>()
19
+ private activeKey: string | null = null
20
+ private subscribed = false
21
+
22
+ get isAvailable(): boolean {
23
+ return !!AudioModule
24
+ }
25
+
26
+ private ensureSubscribed() {
27
+ if (this.subscribed || !AudioModule) return
28
+ this.subscribed = true
29
+ onAudioState((event) => this.handleEvent(event))
30
+ }
31
+
32
+ private handleEvent(event: AudioStateEvent) {
33
+ const prev = this.getState(event.key)
34
+ let next: AudioPlaybackState
35
+
36
+ switch (event.state) {
37
+ case 'loading':
38
+ next = { state: 'loading', positionMillis: 0, durationMillis: event.durationMillis }
39
+ break
40
+ case 'playing':
41
+ next = {
42
+ state: 'playing',
43
+ positionMillis: event.positionMillis,
44
+ durationMillis: event.durationMillis || prev.durationMillis,
45
+ }
46
+ break
47
+ case 'paused':
48
+ next = {
49
+ state: 'paused',
50
+ positionMillis: event.positionMillis,
51
+ durationMillis: event.durationMillis || prev.durationMillis,
52
+ }
53
+ break
54
+ case 'ended':
55
+ case 'stopped':
56
+ next = { state: 'idle', positionMillis: 0, durationMillis: event.durationMillis || prev.durationMillis }
57
+ if (this.activeKey === event.key) this.activeKey = null
58
+ break
59
+ case 'error':
60
+ default:
61
+ next = { state: 'error', positionMillis: 0, durationMillis: 0 }
62
+ if (this.activeKey === event.key) this.activeKey = null
63
+ break
64
+ }
65
+
66
+ this.setState(event.key, next)
67
+ }
68
+
69
+ private setState(key: string, state: AudioPlaybackState) {
70
+ this.states.set(key, state)
71
+ this.listeners.get(key)?.forEach((listener) => listener(state))
72
+ }
73
+
74
+ getState(key: string): AudioPlaybackState {
75
+ return this.states.get(key) ?? IDLE
76
+ }
77
+
78
+ subscribe(key: string, listener: Listener): () => void {
79
+ this.ensureSubscribed()
80
+ let set = this.listeners.get(key)
81
+ if (!set) {
82
+ set = new Set()
83
+ this.listeners.set(key, set)
84
+ }
85
+ set.add(listener)
86
+ listener(this.getState(key))
87
+ return () => {
88
+ set!.delete(listener)
89
+ if (set!.size === 0) this.listeners.delete(key)
90
+ }
91
+ }
92
+
93
+ async play(key: string, url: string, headers: Record<string, string> = {}): Promise<void> {
94
+ if (!AudioModule) return
95
+ this.ensureSubscribed()
96
+
97
+ if (this.activeKey && this.activeKey !== key) {
98
+ const prevKey = this.activeKey
99
+ const prev = this.getState(prevKey)
100
+ this.setState(prevKey, { state: 'idle', positionMillis: 0, durationMillis: prev.durationMillis })
101
+ }
102
+ this.activeKey = key
103
+
104
+ const current = this.getState(key)
105
+ if (current.state === 'idle' || current.state === 'error') {
106
+ this.setState(key, { ...current, state: 'loading', positionMillis: 0 })
107
+ }
108
+
109
+ try {
110
+ await AudioModule.play(key, url, headers)
111
+ } catch {
112
+ this.setState(key, { state: 'error', positionMillis: 0, durationMillis: 0 })
113
+ }
114
+ }
115
+
116
+ async pause(key: string): Promise<void> {
117
+ if (!AudioModule) return
118
+ try {
119
+ await AudioModule.pause(key)
120
+ } catch {
121
+
122
+ }
123
+ }
124
+
125
+ async seek(key: string, positionMillis: number): Promise<void> {
126
+ if (!AudioModule) return
127
+ try {
128
+ await AudioModule.seek(key, positionMillis)
129
+ } catch {
130
+
131
+ }
132
+ }
133
+
134
+ async stop(key: string): Promise<void> {
135
+ if (!AudioModule) return
136
+ try {
137
+ await AudioModule.stop(key)
138
+ } catch {
139
+
140
+ }
141
+ }
142
+ }
143
+
144
+ export const audioController = new AudioController()