mirror of
https://github.com/mattermost/mattermost-mobile.git
synced 2026-11-06 19:00:14 +00:00
* Expo-Router partial migration * Full migration to ExpoRouter * i18n * add tests * Merge branch 'main' into expo-router * align package-lock.json * i18n * feedback review * feedback review * android 16kb patch * Refactored emoji picker keyboard using a state machine * set android launch_screen in drawables instead of layout * no conditional hooks * remove duplicate call in test * address feedback * fix tests and address more feedback * small corrections * small corrections * small corrections * fix draft test * fix draft test 2 * remove navigateToScreen in draff test * fix nit in draft test * remove doc file * Feedback review * fix snapshots * improve test coverage * fix i18n * Upgrade t o RN 0.83, other dependencies and new architecture (#9737) * library hardware-keyboard android new arch support fix * library rnshare android new arch support fix * library rnutils android new arch support fix * library secure-pdf-viewer add new arch support * Enable new arch on iOS and Android * update emm and network client with new-arch * update intune to use new-arch * performance improvements * fix tests * fixes post input on new-arch * fix android emoji picker * remove doc * run tests in parallel * upgrade to React Native 0.83.9, Expo 55, React 19, and New Architecture Bumps core dependencies to their latest versions: - React Native 0.77.3 → 0.83.9 (New Architecture enabled) - React 18.3.1 → 19.2.5 - Expo SDK 52 → 55 - TypeScript 5.8.3 → 6.0.3 - Node.js 22.16.0 → 24.15.0 - react-native-reanimated 3.17.3 → 4.3.0 - Various other dependency upgrades Migrates iOS AppDelegate from Objective-C to Swift, updates Android build tooling and Gradle wrapper, refreshes all patches and font assets, and adapts app code, tests, and CI workflows throughout for API changes introduced by these upgrades. * remove unecessary dismissKeyboard in notifications * feedback review * update intune to use new-arch * update @mattermost deps * missing i18n string * additional fixes * update fastlane
99 lines
3.1 KiB
TypeScript
99 lines
3.1 KiB
TypeScript
// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
|
|
// See LICENSE.txt for license information.
|
|
|
|
import React, {useMemo} from 'react';
|
|
import {useWindowDimensions} from 'react-native';
|
|
import {useSharedValue} from 'react-native-reanimated';
|
|
|
|
import {isGif as isGifImage} from '@utils/file';
|
|
import {galleryItemToFileInfo} from '@utils/gallery';
|
|
import * as vec from '@utils/gallery/vectors';
|
|
import {calculateDimensions} from '@utils/images';
|
|
|
|
import {TransfrormerProvider, type TransformerSharedValues} from './context';
|
|
import ImageTransformer from './transformer';
|
|
|
|
import type {GalleryPagerItem} from '@typings/screens/gallery';
|
|
|
|
function ImageRenderer({
|
|
height,
|
|
isPageActive,
|
|
isPagerInProgress,
|
|
item,
|
|
onPageStateChange,
|
|
width,
|
|
pagerPanGesture,
|
|
pagerTapGesture,
|
|
lightboxPanGesture,
|
|
}: GalleryPagerItem) {
|
|
const windowDimensions = useWindowDimensions();
|
|
const targetDimensions = useMemo(() => ({height, width}), [height, width]);
|
|
const interactionsEnabled = useSharedValue(false);
|
|
const scale = useSharedValue(1);
|
|
const scaleOffset = useSharedValue(1);
|
|
const translation = vec.useSharedVector(0, 0);
|
|
const panVelocity = vec.useSharedVector(0, 0);
|
|
const scaleTranslation = vec.useSharedVector(0, 0);
|
|
const offset = vec.useSharedVector(0, 0);
|
|
const canvas = vec.create(windowDimensions.width, windowDimensions.height);
|
|
const {width: targetWidth, height: targetHeight} = useMemo(() => calculateDimensions(
|
|
item.height,
|
|
item.width,
|
|
targetDimensions.width,
|
|
targetDimensions.height,
|
|
true,
|
|
), [item.width, item.height, targetDimensions.width, targetDimensions.height]);
|
|
const image = vec.create(targetWidth, targetHeight);
|
|
|
|
const sharedValues: TransformerSharedValues = useMemo(() => ({
|
|
interactionsEnabled,
|
|
isPagerInProgress,
|
|
scale,
|
|
scaleOffset,
|
|
translation,
|
|
panVelocity,
|
|
offset,
|
|
scaleTranslation,
|
|
canvas,
|
|
image,
|
|
targetDimensions,
|
|
targetHeight,
|
|
}), [
|
|
interactionsEnabled,
|
|
isPagerInProgress,
|
|
scale,
|
|
scaleOffset,
|
|
translation,
|
|
panVelocity,
|
|
offset,
|
|
scaleTranslation,
|
|
canvas,
|
|
image,
|
|
targetDimensions,
|
|
targetHeight,
|
|
]);
|
|
|
|
const autoplay = useMemo(() => isGifImage(galleryItemToFileInfo(item)), [item]);
|
|
|
|
return (
|
|
<TransfrormerProvider sharedValues={sharedValues}>
|
|
<ImageTransformer
|
|
autoplay={autoplay}
|
|
cacheKey={item.cacheKey}
|
|
isPageActive={isPageActive}
|
|
targetDimensions={targetDimensions}
|
|
height={targetHeight}
|
|
isSvg={item.extension === 'svg'}
|
|
onPageStateChange={onPageStateChange}
|
|
source={item.uri}
|
|
width={targetWidth}
|
|
pagerPanGesture={pagerPanGesture}
|
|
pagerTapGesture={pagerTapGesture}
|
|
lightboxPanGesture={lightboxPanGesture}
|
|
/>
|
|
</TransfrormerProvider>
|
|
);
|
|
}
|
|
|
|
export default ImageRenderer;
|