import React, { useEffect, useState } from 'react';
import { I18nManager, StyleSheet } from 'react-native';
import type { SharedValue } from 'react-native-reanimated';
import { render, screen, waitFor } from '@testing-library/react-native';
import dayjs from 'dayjs';
import duration from 'dayjs/plugin/duration';
import { LocalMessage } from 'stream-chat';
import {
ImageGalleryContext,
ImageGalleryContextValue,
} from '../../../contexts/imageGalleryContext/ImageGalleryContext';
import { OverlayProvider } from '../../../contexts/overlayContext/OverlayProvider';
import {
generateGiphyAttachment,
generateImageAttachment,
generateVideoAttachment,
} from '../../../mock-builders/generator/attachment';
import { generateMessage } from '../../../mock-builders/generator/message';
import { ImageGalleryStateStore } from '../../../state-store/image-gallery-state-store';
import { ImageGallery, ImageGalleryProps } from '../ImageGallery';
dayjs.extend(duration);
jest.mock('../../../native.ts', () => {
const { View } = require('react-native');
return {
isFileSystemAvailable: jest.fn(() => true),
isImageMediaLibraryAvailable: jest.fn(() => true),
isShareImageAvailable: jest.fn(() => true),
isVideoPlayerAvailable: jest.fn(() => true),
NativeHandlers: {
Video: View,
},
};
});
const ImageGalleryComponent = (props: ImageGalleryProps & { message: LocalMessage }) => {
const [imageGalleryStateStore] = useState(() => new ImageGalleryStateStore());
useEffect(() => {
const unsubscribe = imageGalleryStateStore.registerSubscriptions();
return () => {
unsubscribe();
};
}, [imageGalleryStateStore]);
const { attachments } = props.message;
imageGalleryStateStore.openImageGallery({
messages: [props.message],
selectedAttachmentUrl: attachments?.[0]?.asset_url || attachments?.[0]?.image_url || '',
});
return (
}}>
);
};
describe('ImageGallery', () => {
const originalIsRTL = I18nManager.isRTL;
const setRTL = (value: boolean) => {
Object.defineProperty(I18nManager, 'isRTL', {
configurable: true,
value,
});
};
afterEach(() => {
setRTL(originalIsRTL);
});
it('render image gallery component', async () => {
render(
,
);
await waitFor(() => {
expect(screen.queryAllByLabelText('Image Item')).toHaveLength(2);
expect(screen.queryAllByLabelText('Image Gallery Video')).toHaveLength(1);
});
});
it('keeps the pager in ltr coordinates when rtl is enabled', async () => {
setRTL(true);
render(
,
);
await waitFor(() => {
const pagerStyle = StyleSheet.flatten(screen.getByTestId('image-gallery-pager').props.style);
expect(pagerStyle.direction).toBe('ltr');
});
});
});