UNPKG

react-native-ui-lib

Version:

[![SWUbanner](https://raw.githubusercontent.com/vshymanskyy/StandWithUkraine/main/banner-direct.svg)](https://stand-with-ukraine.pp.ua)

53 lines (48 loc) 1.74 kB
import { Easing, useSharedValue } from 'react-native-reanimated'; import Constants from "../../commons/Constants"; export const WINDOW_WIDTH = Constants.windowWidth; export const DEFAULT_NO_OF_COLUMNS = 3; export const animationConfig = { easing: Easing.inOut(Easing.ease), duration: 350 }; const usePresenter = (numOfColumns, itemSize, itemSpacing) => { const itemLayout = useSharedValue(undefined); return { updateItemLayout: layout => { 'worklet'; if (itemLayout.value === undefined) { itemLayout.value = layout; } }, getTranslationByOrderChange: (newOrder, oldOrder) => { 'worklet'; const oldRow = Math.floor(oldOrder / numOfColumns); const oldColumn = oldOrder % numOfColumns; const newRow = Math.floor(newOrder / numOfColumns); const newColumn = newOrder % numOfColumns; const translation = { x: (Constants.isRTL ? -1 : 1) * (newColumn - oldColumn) * ((itemLayout.value?.width ?? 0) + itemSpacing), y: (newRow - oldRow) * ((itemLayout.value?.height ?? 0) + itemSpacing) }; return translation; }, getOrderByPosition: (positionX, positionY) => { 'worklet'; const width = itemLayout.value?.width || itemSize; const height = itemLayout.value?.height || itemSize; const col = (Constants.isRTL ? -1 : 1) * Math.round(positionX / width); const row = Math.round(positionY / height); return row * numOfColumns + col; }, getItemOrderById: (itemsOrder, itemId) => { 'worklet'; return itemsOrder.indexOf(itemId); }, getIdByItemOrder: (itemsOrder, orderIndex) => { 'worklet'; return itemsOrder[orderIndex]; } }; }; export default usePresenter;