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
JavaScript
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