* Update transform to make Android's post list scroll smooth * set start since metric when appStarted is false * Refactor Formatted components * Downgrade RNN to 7.13.0 & patch XCDYouTube to allow video playback * Refactor Post list and all related components * review suggestion rename hour12 to isMilitaryTime * feedback review use aliases * feedback review deconstruct actions in markdown_link * feedback review simplify if/else statement in combined_used_activity * Simplify if statement for consecutive posts * Specify npm version to build iOS on CI * Refactor network_indicator * render Icon in file gallery with transparent background * Increase timeout to scroll to bottom when posting a new message * fix: scroll when tapping on the new messages bar * fix: dismiss all modals * fix navigation tests * Handle dismissAllModals for iOS to prevent blank screens * Prevent modal from dismissing when showing the thread screen in the stack * Update app/components/image_viewport.tsx Co-authored-by: Miguel Alatzar <migbot@users.noreply.github.com> * Update app/utils/post.ts Co-authored-by: Miguel Alatzar <migbot@users.noreply.github.com> * Apply suggestions from code review Co-authored-by: Miguel Alatzar <migbot@users.noreply.github.com> * fix: rename selector and prop * Fix XCDYouTube patch * Fix posting from a thread in the right channel * do not render reply bar on the thread screen * close previous permalink before showing a new one * move XCDYouTube patch to ios/patches folder * closePermalink directly instead of using an onClose prop Co-authored-by: Miguel Alatzar <migbot@users.noreply.github.com> Co-authored-by: Miguel Alatzar <this.migbot@gmail.com>
91 lines
2.7 KiB
TypeScript
91 lines
2.7 KiB
TypeScript
// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
|
|
// See LICENSE.txt for license information.
|
|
|
|
import {Dimensions} from 'react-native';
|
|
|
|
import {DeviceTypes} from '@constants';
|
|
import {
|
|
IMAGE_MAX_HEIGHT,
|
|
IMAGE_MIN_DIMENSION,
|
|
MAX_GIF_SIZE,
|
|
VIEWPORT_IMAGE_OFFSET,
|
|
VIEWPORT_IMAGE_REPLY_OFFSET,
|
|
} from '@constants/image';
|
|
|
|
import {PostImage} from '@mm-redux/types/posts';
|
|
|
|
export const calculateDimensions = (height: number, width: number, viewPortWidth = 0, viewPortHeight = 0) => {
|
|
if (!height || !width) {
|
|
return {
|
|
height: 0,
|
|
width: 0,
|
|
};
|
|
}
|
|
|
|
const ratio = height / width;
|
|
const heightRatio = width / height;
|
|
|
|
let imageWidth = width;
|
|
let imageHeight = height;
|
|
|
|
if (width > viewPortWidth) {
|
|
imageWidth = viewPortWidth;
|
|
imageHeight = imageWidth * ratio;
|
|
} else if (width < IMAGE_MIN_DIMENSION) {
|
|
imageWidth = IMAGE_MIN_DIMENSION;
|
|
imageHeight = imageWidth * ratio;
|
|
}
|
|
|
|
if (
|
|
(
|
|
imageHeight > IMAGE_MAX_HEIGHT ||
|
|
(viewPortHeight && imageHeight > viewPortHeight)
|
|
) && viewPortHeight <= IMAGE_MAX_HEIGHT
|
|
) {
|
|
imageHeight = viewPortHeight || IMAGE_MAX_HEIGHT;
|
|
imageWidth = imageHeight * heightRatio;
|
|
} else if (
|
|
imageHeight < IMAGE_MIN_DIMENSION &&
|
|
IMAGE_MIN_DIMENSION * heightRatio <= viewPortWidth
|
|
) {
|
|
imageHeight = IMAGE_MIN_DIMENSION;
|
|
imageWidth = imageHeight * heightRatio;
|
|
} else if (viewPortHeight && imageHeight > viewPortHeight) {
|
|
imageHeight = viewPortHeight;
|
|
imageWidth = imageHeight * heightRatio;
|
|
}
|
|
|
|
return {
|
|
height: imageHeight,
|
|
width: imageWidth,
|
|
};
|
|
};
|
|
|
|
export function getViewPortWidth(isReplyPost: boolean, permanentSidebar = false) {
|
|
const {width, height} = Dimensions.get('window');
|
|
let portraitPostWidth = Math.min(width, height) - VIEWPORT_IMAGE_OFFSET;
|
|
|
|
if (permanentSidebar) {
|
|
portraitPostWidth -= DeviceTypes.TABLET_WIDTH;
|
|
}
|
|
|
|
if (isReplyPost) {
|
|
portraitPostWidth -= VIEWPORT_IMAGE_REPLY_OFFSET;
|
|
}
|
|
|
|
return portraitPostWidth;
|
|
}
|
|
|
|
// isGifTooLarge returns true if we think that the GIF may cause the device to run out of memory when rendered
|
|
// based on the image's dimensions and frame count.
|
|
export function isGifTooLarge(imageMetadata?: PostImage) {
|
|
if (imageMetadata?.format !== 'gif') {
|
|
// Not a gif or from an older server that doesn't count frames
|
|
return false;
|
|
}
|
|
|
|
const {frame_count: frameCount, height, width} = imageMetadata;
|
|
|
|
// Try to estimate the in-memory size of the gif to prevent the device out of memory
|
|
return width * height * (frameCount || 1) > MAX_GIF_SIZE;
|
|
}
|