UNPKG

@freshworks/react-native-freshdesk-sdk

Version:
297 lines (273 loc) 8.33 kB
import { nativeModule, eventEmitter, isNativeModuleAvailable } from './FreshdeskModule'; import { FreshdeskEvents } from './events'; import { parseDiagnosticReport } from './diagnostics'; import { normalizeFreshdeskHost } from './utils/normalizeHost'; export { FreshdeskEvents } from './events'; export { UserState, FreshdeskErrorCode } from './types'; export { formatDiagnosticReport, parseDiagnosticReport } from './diagnostics'; export { normalizeFreshdeskHost, isBareFreshdeskHost } from './utils/normalizeHost'; /** * Initialize the Freshdesk SDK with configuration * Must be called before any other SDK methods * @param config SDK configuration */ export function initialize(config) { if (!isNativeModuleAvailable) { return Promise.reject(new Error('Freshdesk native module not available')); } return nativeModule.initialize({ ...config, host: normalizeFreshdeskHost(config.host) }); } /** * Open the Freshdesk support home screen */ export function openSupport() { return nativeModule.openSupport(); } /** * Open the Freshdesk knowledge base / FAQ screen */ export function openKnowledgeBase() { return nativeModule.openKnowledgeBase(); } /** * Open a specific support topic * @param topic Topic information (name and optional ID) */ export function openTopic(topic) { return nativeModule.openTopic(topic.topicName, topic.topicId ?? ''); } /** * Get the current unread message count * * Platform note: on Android this resolves a cached, broadcast-driven value and * is `0` until the first broadcast arrives after `initialize()`; on iOS it is * live. Prefer {@link addUnreadCountListener} for a value you can trust * immediately on both platforms. See PLATFORM_DIFFERENCES.md. * * @returns Promise resolving to the unread count */ export function getUnreadCount() { return nativeModule.getUnreadCount(); } /** * Track a user event for analytics and context * @param name Event name * @param properties Event properties */ export function trackEvent(name, properties) { return nativeModule.trackEvent(name, properties ?? {}); } /** * Set user properties (only for non-JWT enforced SDKs) * @param properties User properties */ export function setUserProperties(properties) { return nativeModule.setUserProperties(properties); } /** * Set ticket properties * @param properties Ticket properties */ export function setTicketProperties(properties) { return nativeModule.setTicketProperties(properties); } /** * Authenticate or update user with JWT token * @param jwt JWT token */ export function authenticateAndUpdate(jwt) { return nativeModule.authenticateAndUpdate(jwt); } /** * Reset the current user and clear session data * Call this when user logs out * * Platform note: Android can resolve `{ success: false, error }` on a genuine * reset failure; iOS's native SDK has no failure callback for this operation * and always resolves `{ success: true }` once initialized (it only rejects * for the not-initialized usage error). Don't rely on `success: false` as a * cross-platform signal. See PLATFORM_DIFFERENCES.md. */ export function resetUser() { return nativeModule.resetUser().then(r => { const result = { success: r.success }; if (r.message) { result.message = r.message; } if (r.error) { result.error = r.error; } return result; }); } /** * Dismiss any open Freshdesk views */ export function dismiss() { return nativeModule.dismiss(); } /** * Set a custom link handler * When a link is pressed in the SDK, an event will be emitted * @param handler Callback function to handle link presses * @returns EmitterSubscription to remove the listener */ export function setLinkHandler(handler) { if (!eventEmitter) { console.warn('Freshdesk event emitter not available'); return null; } // Enable link handler in native module nativeModule.setLinkHandlerEnabled(true).catch(err => { console.warn('Failed to enable link handler:', err); }); return eventEmitter.addListener(FreshdeskEvents.ON_LINK_PRESSED, handler); } /** * Add a listener for unread count changes * @param listener Callback function receiving the unread count * @returns EmitterSubscription to remove the listener */ export function addUnreadCountListener(listener) { if (!eventEmitter) { console.warn('Freshdesk event emitter not available'); return null; } return eventEmitter.addListener(FreshdeskEvents.UNREAD_COUNT_CHANGED, listener); } /** * Add a listener for user state changes * @param listener Callback function receiving the user state * @returns EmitterSubscription to remove the listener */ export function addUserStateListener(listener) { if (!eventEmitter) { console.warn('Freshdesk event emitter not available'); return null; } return eventEmitter.addListener(FreshdeskEvents.USER_STATE_CHANGED, listener); } /** * Add a listener for user creation events * @param listener Callback function receiving user creation event * @returns EmitterSubscription to remove the listener */ export function addUserCreatedListener(listener) { if (!eventEmitter) { console.warn('Freshdesk event emitter not available'); return null; } return eventEmitter.addListener(FreshdeskEvents.USER_CREATED, listener); } /** * Remove all Freshdesk event listeners * Call this when cleaning up (e.g., on component unmount) */ export function removeAllListeners() { if (!eventEmitter) { return; } eventEmitter.removeAllListeners(FreshdeskEvents.UNREAD_COUNT_CHANGED); eventEmitter.removeAllListeners(FreshdeskEvents.USER_STATE_CHANGED); eventEmitter.removeAllListeners(FreshdeskEvents.USER_CREATED); eventEmitter.removeAllListeners(FreshdeskEvents.ON_LINK_PRESSED); // Disable link handler nativeModule.setLinkHandlerEnabled(false).catch(() => { // Ignore errors when disabling }); } /** * Get the SDK version string * @returns Promise resolving to SDK version (e.g., "1.0.1") */ export function getSDKVersion() { if (!isNativeModuleAvailable) { return Promise.resolve('unknown'); } return nativeModule.getSDKVersion(); } /** * Get the current user information from the SDK * @returns Promise resolving to user data object */ export async function getUser() { if (!isNativeModuleAvailable) { return Promise.resolve({}); } const userJson = await nativeModule.getUser(); try { return JSON.parse(userJson); } catch { return {}; } } /** * Set content configuration to customize SDK UI text * @param config Content configuration for headers, placeholders, etc. */ export function setContentConfiguration(config) { if (!isNativeModuleAvailable) { return Promise.reject(new Error('Freshdesk native module not available')); } const configString = JSON.stringify(config); return nativeModule.setContentConfiguration(configString); } /** * Enable or disable Freshdesk SDK debug logs * * Platform note: reliable at runtime on iOS only. On Android, debug logging * can only be set at `initialize()` time (`debugMode: true`); calling this * afterward is a no-op there. See PLATFORM_DIFFERENCES.md. * * @param enabled Whether debug logging should be enabled */ export function enableDebugLogs(enabled) { if (!isNativeModuleAvailable) { return Promise.reject(new Error('Freshdesk native module not available')); } return nativeModule.enableDebugLogs(enabled); } /** * Run Freshdesk SDK diagnostics and return a structured report */ export async function runDiagnostics() { if (!isNativeModuleAvailable) { return parseDiagnosticReport(await nativeModule.runDiagnostics()); } const raw = await nativeModule.runDiagnostics(); return parseDiagnosticReport(raw); } /** * Freshdesk SDK object for convenient access */ export const FreshdeskSDK = { initialize, openSupport, openKnowledgeBase, openTopic, getUnreadCount, trackEvent, setUserProperties, setTicketProperties, authenticateAndUpdate, resetUser, dismiss, setLinkHandler, addUnreadCountListener, addUserStateListener, addUserCreatedListener, removeAllListeners, getSDKVersion, getUser, setContentConfiguration, enableDebugLogs, runDiagnostics, events: FreshdeskEvents }; export default FreshdeskSDK; //# sourceMappingURL=index.js.map