UNPKG

@nutrient-sdk/react-native

Version:
268 lines (267 loc) 10.1 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.PDFErrorCode = exports.DocumentLoadFailedCode = exports.NotificationCenter = void 0; var react_native_1 = require("react-native"); // Detect New Architecture using shared ArchitectureDetector var ArchitectureDetector_1 = require("../ArchitectureDetector"); var isNA = (0, ArchitectureDetector_1.isNewArchitectureEnabled)(); /** * @class NotificationCenter * @description The Notification Center for the Nutrient React Native SDK. * @hideconstructor */ var NotificationCenter = /** @class */ (function () { /** * @ignore */ function NotificationCenter(pdfViewRef) { this.subscribedEvents = new Map(); this.eventEmitter = new react_native_1.NativeEventEmitter(react_native_1.NativeModules.Nutrient); this.pdfViewRef = pdfViewRef; } /** * @private * @method getComponentId * @description Helper method to get the current componentId dynamically. * This ensures we always use the latest value, even after hot reload. */ NotificationCenter.prototype.getComponentId = function () { return isNA ? this.pdfViewRef : (0, react_native_1.findNodeHandle)(this.pdfViewRef); }; /** * @private * @method shouldDeliverEvent * @description Checks if an event should be delivered to this component instance. * Events are delivered if the componentID matches, or if it's an analytics event (global). */ NotificationCenter.prototype.shouldDeliverEvent = function (payload, event) { var currentComponentId = this.getComponentId(); var payloadComponentId = payload === null || payload === void 0 ? void 0 : payload.componentID; var isAnalytics = event === NotificationCenter.AnalyticsEvent.ANALYTICS; return payloadComponentId === currentComponentId || isAnalytics; }; /** * @method subscribe * @memberof NotificationCenter * @param {string} event The event to subscribe to. Use NotificationCenter.DocumentEvent, NotificationCenter.AnnotationsEvent, etc. for type-safe events. * @param {function} callback The callback to be called when the event is triggered. The payload type is automatically inferred based on the event type. * @description Subscribes to a given Notification Center event. * @example * this.pdfRef.current?.notificationCenter().subscribe(NotificationCenter.DocumentEvent.LOADED, (payload: NotificationCenter.DocumentLoadedPayload) => { * console.log('Document ID: ' + payload.documentID); // payload is typed as DocumentLoadedPayload * }); */ NotificationCenter.prototype.subscribe = function (event, callback) { var _this = this; if (isNA) { // New Architecture: subscribe via typed TurboModule EventEmitter properties // Lazy load the codegen module to avoid import errors in Paper architecture try { // @ts-ignore - dynamically require to avoid import errors in Paper architecture var Nutrient = require('../specs/NativeNutrientModule').default; // @ts-ignore dynamic property access for event name var emitter = Nutrient[event]; if (typeof emitter === 'function') { var subscription = emitter(function (payload) { if (_this.shouldDeliverEvent(payload, event)) { callback(payload.data); } }); this.subscribedEvents.set(event, subscription); } else { var subscription = this.eventEmitter.addListener(event, function (payload) { if (_this.shouldDeliverEvent(payload, event)) { callback(payload.data); } }); this.subscribedEvents.set(event, subscription); } } catch (e) { // Fallback to old emitter if codegen module is not available var subscription = this.eventEmitter.addListener(event, function (payload) { if (_this.shouldDeliverEvent(payload, event)) { callback(payload.data); } }); this.subscribedEvents.set(event, subscription); } } else { // Old Architecture: Use NativeEventEmitter var subscription = this.eventEmitter.addListener(event, function (payload) { // Only deliver events to the specific ref it is subscribed to. Allow any analytics events to be delivered since they are not associated with a specific view. if (_this.shouldDeliverEvent(payload, event)) { callback(payload.data); } }); this.subscribedEvents.set(event, subscription); } react_native_1.NativeModules.Nutrient.handleListenerAdded(event, this.getComponentId()); }; /** * @method unsubscribe * @memberof NotificationCenter * @param {string} event The event to unsubscribe from. * @description Unsubscribes from a given Notification Center event. * @example * this.pdfRef.current?.notificationCenter().unsubscribe('documentLoaded'); */ NotificationCenter.prototype.unsubscribe = function (event) { var subscription = this.subscribedEvents.get(event); if (subscription) { subscription.remove(); this.subscribedEvents.delete(event); react_native_1.NativeModules.Nutrient.handleListenerRemoved(event, this.getComponentId()); } }; /** * @method unsubscribeAllEvents * @memberof NotificationCenter * @description Unsubscribes from all Notification Center events. * @example * this.pdfRef.current?.notificationCenter().unsubscribeAllEvents(); */ NotificationCenter.prototype.unsubscribeAllEvents = function () { var _this = this; this.subscribedEvents.forEach(function (subscription, event) { subscription.remove(); _this.subscribedEvents.delete(event); react_native_1.NativeModules.Nutrient.handleListenerRemoved(event, _this.getComponentId()); }); }; return NotificationCenter; }()); exports.NotificationCenter = NotificationCenter; (function (NotificationCenter) { /** * Document events. * @readonly * @enum {string} DocumentEvent */ NotificationCenter.DocumentEvent = { /** * Called when the document has been loaded. */ LOADED: 'documentLoaded', /** * Called when the document failed to load. */ LOAD_FAILED: 'documentLoadFailed', /** * Called when the document page changed. */ PAGE_CHANGED: 'documentPageChanged', /** * Called when the document is scrolled. */ SCROLLED: 'documentScrolled', /** * Called when the document is tapped. */ TAPPED: 'documentTapped', }; /** * Document load failure error codes. * @readonly * @enum {string} DocumentLoadFailedCode */ NotificationCenter.DocumentLoadFailedCode = { /** * Document is corrupted or invalid. */ CORRUPT: 'CORRUPTED', /** * Document is encrypted and requires a password. */ ENCRYPTED: 'ENCRYPTED', }; /** * Annotation events. * @readonly * @enum {string} AnnotationsEvent */ NotificationCenter.AnnotationsEvent = { /** * Called when one or more annotations have been added. */ ADDED: 'annotationsAdded', /** * Called when an existing annotation has been changed. */ CHANGED: 'annotationChanged', /** * Called when one or more annotations have been removed. */ REMOVED: 'annotationsRemoved', /** * Called when one or more annotations have been selected. */ SELECTED: 'annotationsSelected', /** * Called when one or more annotations have been deselected. */ DESELECTED: 'annotationsDeselected', /** * Called when a user taps on an annotation. */ TAPPED: 'annotationTapped', }; /** * Text Selection events. * @readonly * @enum {string} TextEvent */ NotificationCenter.TextEvent = { /** * Called when a text selection has been made. */ SELECTED: 'textSelected', }; /** * FormField events. * @readonly * @enum {string} FormFieldEvent */ NotificationCenter.FormFieldEvent = { /** * Called when form field values have changed. */ VALUES_UPDATED: 'formFieldValuesUpdated', /** * Called when a form field has been selected. */ SELECTED: 'formFieldSelected', /** * Called when a form field has been deselected. */ DESELECTED: 'formFieldDeselected', }; /** * Bookmarks events. * @readonly * @enum {string} BookmarksEvent */ NotificationCenter.BookmarksEvent = { /** * Called when the bookmarks have been changed. */ CHANGED: 'bookmarksChanged', }; /** * Analytics events. * @readonly * @enum {string} AnalyticsEvent */ NotificationCenter.AnalyticsEvent = { /** * Called when any analytics event has been triggered. */ ANALYTICS: 'analytics', }; })(NotificationCenter || (exports.NotificationCenter = NotificationCenter = {})); // Re-export error code enum with a more convenient name exports.DocumentLoadFailedCode = NotificationCenter.DocumentLoadFailedCode; // Alias for convenience (users can use either name) exports.PDFErrorCode = NotificationCenter.DocumentLoadFailedCode;