stream-chat-react-native-core
Version:
The official React Native and Expo components for Stream Chat, a service for building chat applications
285 lines • 11.5 kB
JavaScript
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.useShouldTeleportToClosingPortal = exports.useOverlayController = exports.useIsOverlayClosing = exports.useIsOverlayActive = exports.useHasActiveId = exports.useClosingPortalLayouts = exports.useClosingPortalHostBlacklistState = exports.useClosingPortalHostBlacklist = exports.setOverlayTopH = exports.setOverlayMessageH = exports.setOverlayBottomH = exports.setClosingPortalLayout = exports.scheduleActionOnClose = exports.registerOverlaySharedValueController = exports.overlayStore = exports.openOverlay = exports.finalizeCloseOverlay = exports.createClosingPortalLayoutRegistrationId = exports.closeOverlay = exports.clearClosingPortalLayout = exports.bumpOverlayLayoutRevision = exports.activeIdSelector = void 0;
var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
var _react = require("react");
var _reactNativeReanimated = require("react-native-reanimated");
var _streamChat = require("stream-chat");
var _shim = require("use-sync-external-store/shim");
var _hooks = require("../hooks");
var DefaultState = {
closingPortalHostBlacklist: [],
closing: false,
id: undefined,
messageId: undefined
};
var DefaultClosingPortalLayoutsState = {
layouts: {}
};
var closingPortalLayoutRegistrationCounter = 0;
var closingPortalHostBlacklistRegistrationCounter = 0;
var closingPortalHostBlacklistStack = [];
var sharedValueController;
var registerOverlaySharedValueController = controller => {
sharedValueController = controller;
return () => {
if (sharedValueController === controller) {
sharedValueController = undefined;
}
};
};
exports.registerOverlaySharedValueController = registerOverlaySharedValueController;
var setOverlayMessageH = messageH => {
var _sharedValueControlle;
(_sharedValueControlle = sharedValueController) == null || _sharedValueControlle.setMessageH(messageH);
};
exports.setOverlayMessageH = setOverlayMessageH;
var setOverlayTopH = topH => {
var _sharedValueControlle2;
(_sharedValueControlle2 = sharedValueController) == null || _sharedValueControlle2.setTopH(topH);
};
exports.setOverlayTopH = setOverlayTopH;
var setOverlayBottomH = bottomH => {
var _sharedValueControlle3;
(_sharedValueControlle3 = sharedValueController) == null || _sharedValueControlle3.setBottomH(bottomH);
};
exports.setOverlayBottomH = setOverlayBottomH;
var bumpOverlayLayoutRevision = (closeCorrectionDeltaY = 0) => {
var _sharedValueControlle4;
(_sharedValueControlle4 = sharedValueController) == null || _sharedValueControlle4.incrementCloseCorrectionY(closeCorrectionDeltaY);
};
exports.bumpOverlayLayoutRevision = bumpOverlayLayoutRevision;
var openOverlay = params => {
var _sharedValueControlle5;
var overlayPayload = typeof params === 'string' ? {
id: params,
messageId: undefined
} : params;
(_sharedValueControlle5 = sharedValueController) == null || _sharedValueControlle5.resetCloseCorrectionY();
overlayStore.partialNext({
closing: false,
closingPortalHostBlacklist: getCurrentClosingPortalHostBlacklist(),
...overlayPayload
});
};
exports.openOverlay = openOverlay;
var closeOverlay = () => {
if (!overlayStore.getLatestValue().id) {
return;
}
requestAnimationFrame(() => {
if (!overlayStore.getLatestValue().id) {
return;
}
overlayStore.partialNext({
closing: true
});
});
};
exports.closeOverlay = closeOverlay;
var actionQueue = [];
var scheduleActionOnClose = action => {
var _overlayStore$getLate = overlayStore.getLatestValue(),
id = _overlayStore$getLate.id;
if (id) {
actionQueue.push(action);
return;
}
action();
};
exports.scheduleActionOnClose = scheduleActionOnClose;
var finalizeCloseOverlay = () => {
var _sharedValueControlle6;
if (!overlayStore.getLatestValue().id) {
return;
}
overlayStore.next({
...DefaultState,
closingPortalHostBlacklist: getCurrentClosingPortalHostBlacklist()
});
(_sharedValueControlle6 = sharedValueController) == null || _sharedValueControlle6.reset();
};
exports.finalizeCloseOverlay = finalizeCloseOverlay;
var overlayStore = exports.overlayStore = new _streamChat.StateStore(DefaultState);
var closingPortalLayoutsStore = new _streamChat.StateStore(DefaultClosingPortalLayoutsState);
var createClosingPortalLayoutRegistrationId = () => `closing-portal-layout-${closingPortalLayoutRegistrationCounter++}`;
exports.createClosingPortalLayoutRegistrationId = createClosingPortalLayoutRegistrationId;
var getCurrentClosingPortalHostBlacklist = () => {
var _closingPortalHostBla, _closingPortalHostBla2;
return (_closingPortalHostBla = (_closingPortalHostBla2 = closingPortalHostBlacklistStack[closingPortalHostBlacklistStack.length - 1]) == null ? void 0 : _closingPortalHostBla2.hostNames) != null ? _closingPortalHostBla : [];
};
var syncClosingPortalHostBlacklist = () => {
overlayStore.partialNext({
closingPortalHostBlacklist: getCurrentClosingPortalHostBlacklist()
});
};
var createClosingPortalHostBlacklistRegistrationId = () => `closing-portal-host-blacklist-${closingPortalHostBlacklistRegistrationCounter++}`;
var setClosingPortalHostBlacklist = (id, hostNames) => {
var existingEntryIndex = closingPortalHostBlacklistStack.findIndex(entry => entry.id === id);
if (existingEntryIndex === -1) {
closingPortalHostBlacklistStack = [...closingPortalHostBlacklistStack, {
hostNames,
id
}];
} else {
closingPortalHostBlacklistStack = closingPortalHostBlacklistStack.map((entry, index) => index === existingEntryIndex ? {
...entry,
hostNames
} : entry);
}
syncClosingPortalHostBlacklist();
};
var clearClosingPortalHostBlacklist = id => {
var nextBlacklistStack = closingPortalHostBlacklistStack.filter(entry => entry.id !== id);
if (nextBlacklistStack.length === closingPortalHostBlacklistStack.length) {
return;
}
closingPortalHostBlacklistStack = nextBlacklistStack;
syncClosingPortalHostBlacklist();
};
var setClosingPortalLayout = (hostName, id, layout) => {
var _layouts$hostName;
var _closingPortalLayouts = closingPortalLayoutsStore.getLatestValue(),
layouts = _closingPortalLayouts.layouts;
var hostEntries = (_layouts$hostName = layouts[hostName]) != null ? _layouts$hostName : [];
var existingEntry = hostEntries.find(entry => entry.id === id);
if (existingEntry) {
existingEntry.layout.value = layout;
return;
}
if (!layout) return;
closingPortalLayoutsStore.next({
layouts: {
...layouts,
[hostName]: [...hostEntries, {
id,
layout: (0, _reactNativeReanimated.makeMutable)(layout)
}]
}
});
};
exports.setClosingPortalLayout = setClosingPortalLayout;
var clearClosingPortalLayout = (hostName, id) => {
var _closingPortalLayouts2 = closingPortalLayoutsStore.getLatestValue(),
layouts = _closingPortalLayouts2.layouts;
var hostEntries = layouts[hostName];
if (!(hostEntries != null && hostEntries.length)) {
return;
}
var nextHostEntries = hostEntries.filter(entry => entry.id !== id);
var nextLayouts = {
...layouts
};
if (nextHostEntries.length === 0) {
delete nextLayouts[hostName];
} else {
nextLayouts[hostName] = nextHostEntries;
}
closingPortalLayoutsStore.next({
layouts: nextLayouts
});
};
exports.clearClosingPortalLayout = clearClosingPortalLayout;
var actionQueueSelector = nextState => ({
active: !!nextState.id
});
overlayStore.subscribeWithSelector(actionQueueSelector, function () {
var _ref = (0, _asyncToGenerator2.default)(function* ({
active
}) {
if (!active) {
for (var _i = 0, _actionQueue = actionQueue; _i < _actionQueue.length; _i++) {
var action = _actionQueue[_i];
yield action();
}
actionQueue = [];
}
});
return function (_x) {
return _ref.apply(this, arguments);
};
}());
var selector = nextState => ({
closing: nextState.closing,
id: nextState.id,
messageId: nextState.messageId
});
var useOverlayController = () => {
return (0, _hooks.useStateStore)(overlayStore, selector);
};
exports.useOverlayController = useOverlayController;
var overlayClosingSelector = nextState => ({
closing: nextState.closing
});
var closingPortalHostBlacklistSelector = nextState => ({
closingPortalHostBlacklist: nextState.closingPortalHostBlacklist
});
var useIsOverlayClosing = () => {
return (0, _hooks.useStateStore)(overlayStore, overlayClosingSelector).closing;
};
exports.useIsOverlayClosing = useIsOverlayClosing;
var useClosingPortalHostBlacklistState = () => {
return (0, _hooks.useStateStore)(overlayStore, closingPortalHostBlacklistSelector).closingPortalHostBlacklist;
};
exports.useClosingPortalHostBlacklistState = useClosingPortalHostBlacklistState;
var useShouldTeleportToClosingPortal = (hostName, id) => {
var _hostEntries;
var closing = useIsOverlayClosing();
var closingPortalHostBlacklist = useClosingPortalHostBlacklistState();
var closingPortalLayouts = useClosingPortalLayouts();
var hostEntries = closingPortalLayouts[hostName];
return !!overlayStore.getLatestValue().id && closing && !closingPortalHostBlacklist.includes(hostName) && (hostEntries == null || (_hostEntries = hostEntries[hostEntries.length - 1]) == null ? void 0 : _hostEntries.id) === id;
};
exports.useShouldTeleportToClosingPortal = useShouldTeleportToClosingPortal;
var useClosingPortalHostBlacklist = (hostNames, enabled = true) => {
var registrationIdRef = (0, _react.useRef)(null);
if (!registrationIdRef.current) {
registrationIdRef.current = createClosingPortalHostBlacklistRegistrationId();
}
var registrationId = registrationIdRef.current;
var serializedNormalizedHostNames = JSON.stringify([...new Set(hostNames)]);
(0, _react.useEffect)(() => {
if (!enabled) {
clearClosingPortalHostBlacklist(registrationId);
return;
}
setClosingPortalHostBlacklist(registrationId, JSON.parse(serializedNormalizedHostNames));
return () => {
clearClosingPortalHostBlacklist(registrationId);
};
}, [enabled, registrationId, serializedNormalizedHostNames]);
};
exports.useClosingPortalHostBlacklist = useClosingPortalHostBlacklist;
var useClosingPortalLayouts = () => {
var subscribe = (0, _react.useCallback)(listener => closingPortalLayoutsStore.subscribe(() => {
listener();
}), []);
var getSnapshot = (0, _react.useCallback)(() => closingPortalLayoutsStore.getLatestValue().layouts, []);
return (0, _shim.useSyncExternalStore)(subscribe, getSnapshot, getSnapshot);
};
exports.useClosingPortalLayouts = useClosingPortalLayouts;
var noOpObject = {
active: false,
closing: false
};
var useIsOverlayActive = id => {
var messageOverlaySelector = (0, _react.useCallback)(nextState => nextState.id === id ? {
active: true,
closing: nextState.closing
} : noOpObject, [id]);
return (0, _hooks.useStateStore)(overlayStore, messageOverlaySelector);
};
exports.useIsOverlayActive = useIsOverlayActive;
var activeIdSelector = nextState => ({
id: nextState.id
});
exports.activeIdSelector = activeIdSelector;
var useHasActiveId = () => {
var _useStateStore = (0, _hooks.useStateStore)(overlayStore, activeIdSelector),
id = _useStateStore.id;
return !!id;
};
exports.useHasActiveId = useHasActiveId;
//# sourceMappingURL=message-overlay-store.js.map