UNPKG

stream-chat-react-native-core

Version:

The official React Native and Expo components for Stream Chat, a service for building chat applications

100 lines 3.77 kB
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.usePendingAttachmentUpload = usePendingAttachmentUpload; var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray")); var _react = require("react"); var _useStateStore = require("./useStateStore"); var _ChatContext = require("../contexts/chatContext/ChatContext"); var idle = { isUploading: false, uploadProgress: undefined }; var completed = { isUploading: true, uploadProgress: 100 }; var COMPLETION_HOLD_MS = 350; var COMPLETION_READY_PROGRESS = 90; var now = () => Date.now(); function usePendingAttachmentUpload(localId) { var _result$isUploading; var _useChatContext = (0, _ChatContext.useChatContext)(), client = _useChatContext.client; var _useState = (0, _react.useState)(0), _useState2 = (0, _slicedToArray2.default)(_useState, 2), setRenderTick = _useState2[1]; var completedHoldUntilRef = (0, _react.useRef)(0); var holdTimeoutRef = (0, _react.useRef)(undefined); var lastUploadProgressRef = (0, _react.useRef)(undefined); var previousLocalIdRef = (0, _react.useRef)(localId); var wasUploadingRef = (0, _react.useRef)(false); var selector = (0, _react.useCallback)(state => { if (!localId) { return idle; } var record = state.uploads[localId]; if (!record) { return idle; } return { isUploading: true, uploadProgress: record.uploadProgress }; }, [localId]); var result = (0, _useStateStore.useStateStore)(localId ? client.uploadManager.state : undefined, selector); var isUploading = (_result$isUploading = result == null ? void 0 : result.isUploading) != null ? _result$isUploading : false; var uploadProgress = result == null ? void 0 : result.uploadProgress; if (previousLocalIdRef.current !== localId) { previousLocalIdRef.current = localId; completedHoldUntilRef.current = 0; wasUploadingRef.current = false; lastUploadProgressRef.current = undefined; } var pendingAttachmentUpload = result != null ? result : idle; if (localId && isUploading) { completedHoldUntilRef.current = 0; wasUploadingRef.current = true; if (typeof uploadProgress === 'number') { lastUploadProgressRef.current = uploadProgress; } } else if (localId && completedHoldUntilRef.current > now()) { pendingAttachmentUpload = completed; } else if (localId) { var shouldStartCompletionHold = wasUploadingRef.current && typeof lastUploadProgressRef.current === 'number' && lastUploadProgressRef.current >= COMPLETION_READY_PROGRESS; wasUploadingRef.current = false; lastUploadProgressRef.current = undefined; if (shouldStartCompletionHold) { completedHoldUntilRef.current = now() + COMPLETION_HOLD_MS; pendingAttachmentUpload = completed; } else { completedHoldUntilRef.current = 0; } } else { completedHoldUntilRef.current = 0; wasUploadingRef.current = false; lastUploadProgressRef.current = undefined; } (0, _react.useEffect)(() => { if (holdTimeoutRef.current) { clearTimeout(holdTimeoutRef.current); holdTimeoutRef.current = undefined; } var holdForMs = completedHoldUntilRef.current - now(); if (holdForMs <= 0) { return; } holdTimeoutRef.current = setTimeout(() => { holdTimeoutRef.current = undefined; setRenderTick(tick => tick + 1); }, holdForMs); }, [localId, pendingAttachmentUpload]); (0, _react.useEffect)(() => () => { if (holdTimeoutRef.current) { clearTimeout(holdTimeoutRef.current); } }, []); return pendingAttachmentUpload; } //# sourceMappingURL=usePendingAttachmentUpload.js.map