Merge branch 'develop' into TC-782-Mobile-Troubleshoot-notifications
This commit is contained in:
commit
93372d4dd3
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
|
@ -1,8 +1,6 @@
|
||||||
import React from 'react';
|
import React from 'react';
|
||||||
import { act, fireEvent, render, screen } from '@testing-library/react-native';
|
import { act, fireEvent, render, screen, userEvent } from '@testing-library/react-native';
|
||||||
import { Provider } from 'react-redux';
|
import { Provider } from 'react-redux';
|
||||||
import { NavigationContainer } from '@react-navigation/native';
|
|
||||||
import { createStackNavigator } from '@react-navigation/stack';
|
|
||||||
|
|
||||||
import { MessageComposerContainer } from './MessageComposerContainer';
|
import { MessageComposerContainer } from './MessageComposerContainer';
|
||||||
import { setPermissions } from '../../actions/permissions';
|
import { setPermissions } from '../../actions/permissions';
|
||||||
|
@ -27,7 +25,7 @@ const initialStoreState = () => {
|
||||||
initialStoreState();
|
initialStoreState();
|
||||||
|
|
||||||
const initialContext = {
|
const initialContext = {
|
||||||
rid: '',
|
rid: 'rid',
|
||||||
tmid: undefined,
|
tmid: undefined,
|
||||||
sharing: false,
|
sharing: false,
|
||||||
action: null,
|
action: null,
|
||||||
|
@ -38,33 +36,15 @@ const initialContext = {
|
||||||
onRemoveQuoteMessage: jest.fn()
|
onRemoveQuoteMessage: jest.fn()
|
||||||
};
|
};
|
||||||
|
|
||||||
const Stack = createStackNavigator();
|
|
||||||
|
|
||||||
// const Navigation = ({ children }: { children: any }) => (
|
|
||||||
// <NavigationContainer>
|
|
||||||
// <Stack.Navigator>
|
|
||||||
// <Stack.Screen name='A' component={children} />
|
|
||||||
// </Stack.Navigator>
|
|
||||||
// </NavigationContainer>
|
|
||||||
// );
|
|
||||||
|
|
||||||
// const Content = () => (
|
|
||||||
// <MessageComposerContainer />
|
|
||||||
// )
|
|
||||||
|
|
||||||
const Render = ({ context }: { context?: Partial<IRoomContext> }) => (
|
const Render = ({ context }: { context?: Partial<IRoomContext> }) => (
|
||||||
<Provider store={mockedStore}>
|
<Provider store={mockedStore}>
|
||||||
<RoomContext.Provider value={{ ...initialContext, ...context }}>
|
<RoomContext.Provider value={{ ...initialContext, ...context }}>
|
||||||
<NavigationContainer>
|
<MessageComposerContainer />
|
||||||
<Stack.Navigator>
|
|
||||||
<Stack.Screen name='MessageComposer' component={MessageComposerContainer} />
|
|
||||||
</Stack.Navigator>
|
|
||||||
</NavigationContainer>
|
|
||||||
</RoomContext.Provider>
|
</RoomContext.Provider>
|
||||||
</Provider>
|
</Provider>
|
||||||
);
|
);
|
||||||
|
|
||||||
describe.skip('MessageComposer', () => {
|
describe('MessageComposer', () => {
|
||||||
test('renders correctly', () => {
|
test('renders correctly', () => {
|
||||||
render(<Render />);
|
render(<Render />);
|
||||||
expect(screen.getByTestId('message-composer-input')).toBeOnTheScreen();
|
expect(screen.getByTestId('message-composer-input')).toBeOnTheScreen();
|
||||||
|
@ -76,14 +56,14 @@ describe.skip('MessageComposer', () => {
|
||||||
test('renders correctly with audio recorder disabled', () => {
|
test('renders correctly with audio recorder disabled', () => {
|
||||||
mockedStore.dispatch(addSettings({ Message_AudioRecorderEnabled: false }));
|
mockedStore.dispatch(addSettings({ Message_AudioRecorderEnabled: false }));
|
||||||
render(<Render />);
|
render(<Render />);
|
||||||
expect(screen.queryByTestId('message-composer-send-audio')).toBeNull();
|
expect(screen.queryByTestId('message-composer-send-audio')).not.toBeOnTheScreen();
|
||||||
expect(screen.toJSON()).toMatchSnapshot();
|
expect(screen.toJSON()).toMatchSnapshot();
|
||||||
});
|
});
|
||||||
|
|
||||||
test('renders correctly without audio upload permissions', () => {
|
test('renders correctly without audio upload permissions', () => {
|
||||||
mockedStore.dispatch(setPermissions({}));
|
mockedStore.dispatch(setPermissions({}));
|
||||||
render(<Render />);
|
render(<Render />);
|
||||||
expect(screen.queryByTestId('message-composer-send-audio')).toBeNull();
|
expect(screen.queryByTestId('message-composer-send-audio')).not.toBeOnTheScreen();
|
||||||
expect(screen.toJSON()).toMatchSnapshot();
|
expect(screen.toJSON()).toMatchSnapshot();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -91,7 +71,7 @@ describe.skip('MessageComposer', () => {
|
||||||
mockedStore.dispatch(addSettings({ Message_AudioRecorderEnabled: false }));
|
mockedStore.dispatch(addSettings({ Message_AudioRecorderEnabled: false }));
|
||||||
mockedStore.dispatch(setPermissions({}));
|
mockedStore.dispatch(setPermissions({}));
|
||||||
render(<Render />);
|
render(<Render />);
|
||||||
expect(screen.queryByTestId('message-composer-send-audio')).toBeNull();
|
expect(screen.queryByTestId('message-composer-send-audio')).not.toBeOnTheScreen();
|
||||||
expect(screen.toJSON()).toMatchSnapshot();
|
expect(screen.toJSON()).toMatchSnapshot();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -100,9 +80,9 @@ describe.skip('MessageComposer', () => {
|
||||||
render(<Render />);
|
render(<Render />);
|
||||||
expect(screen.getByTestId('message-composer-actions')).toBeOnTheScreen();
|
expect(screen.getByTestId('message-composer-actions')).toBeOnTheScreen();
|
||||||
expect(screen.getByTestId('message-composer-send-audio')).toBeOnTheScreen();
|
expect(screen.getByTestId('message-composer-send-audio')).toBeOnTheScreen();
|
||||||
expect(screen.queryByTestId('message-composer-open-emoji')).toBeNull();
|
expect(screen.queryByTestId('message-composer-open-emoji')).not.toBeOnTheScreen();
|
||||||
expect(screen.queryByTestId('message-composer-open-markdown')).toBeNull();
|
expect(screen.queryByTestId('message-composer-open-markdown')).not.toBeOnTheScreen();
|
||||||
expect(screen.queryByTestId('message-composer-mention')).toBeNull();
|
expect(screen.queryByTestId('message-composer-mention')).not.toBeOnTheScreen();
|
||||||
|
|
||||||
await act(async () => {
|
await act(async () => {
|
||||||
await fireEvent(screen.getByTestId('message-composer-input'), 'focus');
|
await fireEvent(screen.getByTestId('message-composer-input'), 'focus');
|
||||||
|
@ -116,21 +96,26 @@ describe.skip('MessageComposer', () => {
|
||||||
});
|
});
|
||||||
|
|
||||||
test('send message', async () => {
|
test('send message', async () => {
|
||||||
|
const user = userEvent.setup();
|
||||||
const onSendMessage = jest.fn();
|
const onSendMessage = jest.fn();
|
||||||
render(<Render context={{ onSendMessage }} />);
|
render(<Render context={{ onSendMessage }} />);
|
||||||
expect(screen.getByTestId('message-composer-send-audio')).toBeOnTheScreen();
|
expect(screen.getByTestId('message-composer-send-audio')).toBeOnTheScreen();
|
||||||
await act(async () => {
|
|
||||||
await fireEvent.changeText(screen.getByTestId('message-composer-input'), 'test');
|
await user.type(screen.getByTestId('message-composer-input'), 'test');
|
||||||
expect(screen.queryByTestId('message-composer-send-audio')).toBeNull();
|
expect(screen.queryByTestId('message-composer-send-audio')).not.toBeOnTheScreen();
|
||||||
expect(screen.getByTestId('message-composer-send')).toBeOnTheScreen();
|
expect(screen.getByTestId('message-composer-send')).toBeOnTheScreen();
|
||||||
|
|
||||||
|
await act(async () => {
|
||||||
await fireEvent.press(screen.getByTestId('message-composer-send'));
|
await fireEvent.press(screen.getByTestId('message-composer-send'));
|
||||||
});
|
});
|
||||||
|
|
||||||
expect(onSendMessage).toHaveBeenCalledTimes(1);
|
expect(onSendMessage).toHaveBeenCalledTimes(1);
|
||||||
expect(onSendMessage).toHaveBeenCalledWith('test', undefined);
|
expect(onSendMessage).toHaveBeenCalledWith('test', undefined);
|
||||||
expect(screen.toJSON()).toMatchSnapshot();
|
expect(screen.toJSON()).toMatchSnapshot();
|
||||||
});
|
});
|
||||||
|
|
||||||
test('tap actions from toolbar', async () => {
|
describe('Toolbar', () => {
|
||||||
|
test('tap actions', async () => {
|
||||||
render(<Render />);
|
render(<Render />);
|
||||||
|
|
||||||
await act(async () => {
|
await act(async () => {
|
||||||
|
@ -151,205 +136,209 @@ describe.skip('MessageComposer', () => {
|
||||||
expect(screen.toJSON()).toMatchSnapshot();
|
expect(screen.toJSON()).toMatchSnapshot();
|
||||||
});
|
});
|
||||||
|
|
||||||
// describe('Markdown', () => {
|
describe('Markdown', () => {
|
||||||
// test('tap markdown', async () => {
|
test('tap markdown', async () => {
|
||||||
// render(<Render />);
|
|
||||||
|
|
||||||
// await act(async () => {
|
|
||||||
// await fireEvent(screen.getByTestId('message-composer-input'), 'focus');
|
|
||||||
// await fireEvent.press(screen.getByTestId('message-composer-open-markdown'));
|
|
||||||
// });
|
|
||||||
// expect(screen.getByTestId('message-composer-close-markdown')).toBeOnTheScreen();
|
|
||||||
// expect(screen.getByTestId('message-composer-bold')).toBeOnTheScreen();
|
|
||||||
// expect(screen.getByTestId('message-composer-italic')).toBeOnTheScreen();
|
|
||||||
// expect(screen.getByTestId('message-composer-strike')).toBeOnTheScreen();
|
|
||||||
// expect(screen.getByTestId('message-composer-code')).toBeOnTheScreen();
|
|
||||||
// expect(screen.getByTestId('message-composer-code-block')).toBeOnTheScreen();
|
|
||||||
// expect(screen.toJSON()).toMatchSnapshot();
|
|
||||||
// });
|
|
||||||
|
|
||||||
// test('tap bold', async () => {
|
|
||||||
// const onSendMessage = jest.fn();
|
|
||||||
// render(<Render context={{ onSendMessage }} />);
|
|
||||||
|
|
||||||
// await act(async () => {
|
|
||||||
// await fireEvent(screen.getByTestId('message-composer-input'), 'focus');
|
|
||||||
// // await waitFor(() => fireEvent.press(screen.getByTestId('message-composer-open-markdown')), { timeout: 1000 });
|
|
||||||
// await fireEvent.press(screen.getByTestId('message-composer-open-markdown'));
|
|
||||||
// await fireEvent.press(screen.getByTestId('message-composer-bold'));
|
|
||||||
// await fireEvent.press(screen.getByTestId('message-composer-send'));
|
|
||||||
// });
|
|
||||||
// expect(onSendMessage).toHaveBeenCalledTimes(1);
|
|
||||||
// expect(onSendMessage).toHaveBeenCalledWith('**', undefined);
|
|
||||||
// expect(screen.toJSON()).toMatchSnapshot();
|
|
||||||
// });
|
|
||||||
|
|
||||||
// test('type test and tap bold', async () => {
|
|
||||||
// const onSendMessage = jest.fn();
|
|
||||||
// render(<Render context={{ onSendMessage }} />);
|
|
||||||
|
|
||||||
// await act(async () => {
|
|
||||||
// await fireEvent.changeText(screen.getByTestId('message-composer-input'), 'test');
|
|
||||||
// await fireEvent(screen.getByTestId('message-composer-input'), 'focus');
|
|
||||||
// await fireEvent(screen.getByTestId('message-composer-input'), 'selectionChange', {
|
|
||||||
// nativeEvent: { selection: { start: 0, end: 4 } }
|
|
||||||
// });
|
|
||||||
// await fireEvent.press(screen.getByTestId('message-composer-open-markdown'));
|
|
||||||
// await fireEvent.press(screen.getByTestId('message-composer-bold'));
|
|
||||||
// await fireEvent.press(screen.getByTestId('message-composer-send'));
|
|
||||||
// });
|
|
||||||
// expect(onSendMessage).toHaveBeenCalledTimes(1);
|
|
||||||
// expect(onSendMessage).toHaveBeenCalledWith('*test*', undefined);
|
|
||||||
// expect(screen.toJSON()).toMatchSnapshot();
|
|
||||||
// });
|
|
||||||
|
|
||||||
// test('tap italic', async () => {
|
|
||||||
// const onSendMessage = jest.fn();
|
|
||||||
// render(<Render context={{ onSendMessage }} />);
|
|
||||||
|
|
||||||
// await act(async () => {
|
|
||||||
// await fireEvent(screen.getByTestId('message-composer-input'), 'focus');
|
|
||||||
// await fireEvent.press(screen.getByTestId('message-composer-open-markdown'));
|
|
||||||
// await fireEvent.press(screen.getByTestId('message-composer-italic'));
|
|
||||||
// await fireEvent.press(screen.getByTestId('message-composer-send'));
|
|
||||||
// });
|
|
||||||
// expect(onSendMessage).toHaveBeenCalledTimes(1);
|
|
||||||
// expect(onSendMessage).toHaveBeenCalledWith('__', undefined);
|
|
||||||
// expect(screen.toJSON()).toMatchSnapshot();
|
|
||||||
// });
|
|
||||||
|
|
||||||
// test('type test and tap italic', async () => {
|
|
||||||
// const onSendMessage = jest.fn();
|
|
||||||
// render(<Render context={{ onSendMessage }} />);
|
|
||||||
|
|
||||||
// await act(async () => {
|
|
||||||
// await fireEvent.changeText(screen.getByTestId('message-composer-input'), 'test');
|
|
||||||
// await fireEvent(screen.getByTestId('message-composer-input'), 'focus');
|
|
||||||
// await fireEvent(screen.getByTestId('message-composer-input'), 'selectionChange', {
|
|
||||||
// nativeEvent: { selection: { start: 0, end: 4 } }
|
|
||||||
// });
|
|
||||||
// await fireEvent.press(screen.getByTestId('message-composer-open-markdown'));
|
|
||||||
// await fireEvent.press(screen.getByTestId('message-composer-italic'));
|
|
||||||
// await fireEvent.press(screen.getByTestId('message-composer-send'));
|
|
||||||
// });
|
|
||||||
// expect(onSendMessage).toHaveBeenCalledTimes(1);
|
|
||||||
// expect(onSendMessage).toHaveBeenCalledWith('_test_', undefined);
|
|
||||||
// expect(screen.toJSON()).toMatchSnapshot();
|
|
||||||
// });
|
|
||||||
|
|
||||||
// test('tap strike', async () => {
|
|
||||||
// const onSendMessage = jest.fn();
|
|
||||||
// render(<Render context={{ onSendMessage }} />);
|
|
||||||
|
|
||||||
// await act(async () => {
|
|
||||||
// await fireEvent(screen.getByTestId('message-composer-input'), 'focus');
|
|
||||||
// await fireEvent.press(screen.getByTestId('message-composer-open-markdown'));
|
|
||||||
// await fireEvent.press(screen.getByTestId('message-composer-strike'));
|
|
||||||
// await fireEvent.press(screen.getByTestId('message-composer-send'));
|
|
||||||
// });
|
|
||||||
// expect(onSendMessage).toHaveBeenCalledTimes(1);
|
|
||||||
// expect(onSendMessage).toHaveBeenCalledWith('~~', undefined);
|
|
||||||
// expect(screen.toJSON()).toMatchSnapshot();
|
|
||||||
// });
|
|
||||||
|
|
||||||
// test('type test and tap strike', async () => {
|
|
||||||
// const onSendMessage = jest.fn();
|
|
||||||
// render(<Render context={{ onSendMessage }} />);
|
|
||||||
|
|
||||||
// await act(async () => {
|
|
||||||
// await fireEvent.changeText(screen.getByTestId('message-composer-input'), 'test');
|
|
||||||
// await fireEvent(screen.getByTestId('message-composer-input'), 'focus');
|
|
||||||
// await fireEvent(screen.getByTestId('message-composer-input'), 'selectionChange', {
|
|
||||||
// nativeEvent: { selection: { start: 0, end: 4 } }
|
|
||||||
// });
|
|
||||||
// await fireEvent.press(screen.getByTestId('message-composer-open-markdown'));
|
|
||||||
// await fireEvent.press(screen.getByTestId('message-composer-strike'));
|
|
||||||
// await fireEvent.press(screen.getByTestId('message-composer-send'));
|
|
||||||
// });
|
|
||||||
// expect(onSendMessage).toHaveBeenCalledTimes(1);
|
|
||||||
// expect(onSendMessage).toHaveBeenCalledWith('~test~', undefined);
|
|
||||||
// expect(screen.toJSON()).toMatchSnapshot();
|
|
||||||
// });
|
|
||||||
|
|
||||||
// test('tap code', async () => {
|
|
||||||
// const onSendMessage = jest.fn();
|
|
||||||
// render(<Render context={{ onSendMessage }} />);
|
|
||||||
|
|
||||||
// await act(async () => {
|
|
||||||
// await fireEvent(screen.getByTestId('message-composer-input'), 'focus');
|
|
||||||
// await fireEvent.press(screen.getByTestId('message-composer-open-markdown'));
|
|
||||||
// await fireEvent.press(screen.getByTestId('message-composer-code'));
|
|
||||||
// await fireEvent.press(screen.getByTestId('message-composer-send'));
|
|
||||||
// });
|
|
||||||
// expect(onSendMessage).toHaveBeenCalledTimes(1);
|
|
||||||
// expect(onSendMessage).toHaveBeenCalledWith('``', undefined);
|
|
||||||
// expect(screen.toJSON()).toMatchSnapshot();
|
|
||||||
// });
|
|
||||||
|
|
||||||
// test('type test and tap code', async () => {
|
|
||||||
// const onSendMessage = jest.fn();
|
|
||||||
// render(<Render context={{ onSendMessage }} />);
|
|
||||||
|
|
||||||
// await act(async () => {
|
|
||||||
// await fireEvent.changeText(screen.getByTestId('message-composer-input'), 'test');
|
|
||||||
// await fireEvent(screen.getByTestId('message-composer-input'), 'focus');
|
|
||||||
// await fireEvent(screen.getByTestId('message-composer-input'), 'selectionChange', {
|
|
||||||
// nativeEvent: { selection: { start: 0, end: 4 } }
|
|
||||||
// });
|
|
||||||
// await fireEvent.press(screen.getByTestId('message-composer-open-markdown'));
|
|
||||||
// await fireEvent.press(screen.getByTestId('message-composer-code'));
|
|
||||||
// await fireEvent.press(screen.getByTestId('message-composer-send'));
|
|
||||||
// });
|
|
||||||
// expect(onSendMessage).toHaveBeenCalledTimes(1);
|
|
||||||
// expect(onSendMessage).toHaveBeenCalledWith('`test`', undefined);
|
|
||||||
// expect(screen.toJSON()).toMatchSnapshot();
|
|
||||||
// });
|
|
||||||
|
|
||||||
// test('tap code-block', async () => {
|
|
||||||
// const onSendMessage = jest.fn();
|
|
||||||
// render(<Render context={{ onSendMessage }} />);
|
|
||||||
|
|
||||||
// await act(async () => {
|
|
||||||
// await fireEvent(screen.getByTestId('message-composer-input'), 'focus');
|
|
||||||
// await fireEvent.press(screen.getByTestId('message-composer-open-markdown'));
|
|
||||||
// await fireEvent.press(screen.getByTestId('message-composer-code-block'));
|
|
||||||
// await fireEvent.press(screen.getByTestId('message-composer-send'));
|
|
||||||
// });
|
|
||||||
// expect(onSendMessage).toHaveBeenCalledTimes(1);
|
|
||||||
// expect(onSendMessage).toHaveBeenCalledWith('``````', undefined);
|
|
||||||
// expect(screen.toJSON()).toMatchSnapshot();
|
|
||||||
// });
|
|
||||||
|
|
||||||
// test('type test and tap code-block', async () => {
|
|
||||||
// const onSendMessage = jest.fn();
|
|
||||||
// render(<Render context={{ onSendMessage }} />);
|
|
||||||
|
|
||||||
// await act(async () => {
|
|
||||||
// await fireEvent.changeText(screen.getByTestId('message-composer-input'), 'test');
|
|
||||||
// await fireEvent(screen.getByTestId('message-composer-input'), 'focus');
|
|
||||||
// await fireEvent(screen.getByTestId('message-composer-input'), 'selectionChange', {
|
|
||||||
// nativeEvent: { selection: { start: 0, end: 4 } }
|
|
||||||
// });
|
|
||||||
// await fireEvent.press(screen.getByTestId('message-composer-open-markdown'));
|
|
||||||
// await fireEvent.press(screen.getByTestId('message-composer-code-block'));
|
|
||||||
// await fireEvent.press(screen.getByTestId('message-composer-send'));
|
|
||||||
// });
|
|
||||||
// expect(onSendMessage).toHaveBeenCalledTimes(1);
|
|
||||||
// expect(onSendMessage).toHaveBeenCalledWith('```test```', undefined);
|
|
||||||
// expect(screen.toJSON()).toMatchSnapshot();
|
|
||||||
// });
|
|
||||||
// });
|
|
||||||
|
|
||||||
test('tap mention', async () => {
|
|
||||||
render(<Render />);
|
render(<Render />);
|
||||||
|
|
||||||
await act(async () => {
|
await act(async () => {
|
||||||
await fireEvent(screen.getByTestId('message-composer-input'), 'focus');
|
await fireEvent(screen.getByTestId('message-composer-input'), 'focus');
|
||||||
// await fireEvent.press(screen.getByTestId('message-composer-mention'));
|
await fireEvent.press(screen.getByTestId('message-composer-open-markdown'));
|
||||||
});
|
});
|
||||||
|
expect(screen.getByTestId('message-composer-close-markdown')).toBeOnTheScreen();
|
||||||
|
expect(screen.getByTestId('message-composer-bold')).toBeOnTheScreen();
|
||||||
|
expect(screen.getByTestId('message-composer-italic')).toBeOnTheScreen();
|
||||||
|
expect(screen.getByTestId('message-composer-strike')).toBeOnTheScreen();
|
||||||
|
expect(screen.getByTestId('message-composer-code')).toBeOnTheScreen();
|
||||||
|
expect(screen.getByTestId('message-composer-code-block')).toBeOnTheScreen();
|
||||||
expect(screen.toJSON()).toMatchSnapshot();
|
expect(screen.toJSON()).toMatchSnapshot();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
test('tap bold', async () => {
|
||||||
|
const onSendMessage = jest.fn();
|
||||||
|
render(<Render context={{ onSendMessage }} />);
|
||||||
|
|
||||||
|
await act(async () => {
|
||||||
|
await fireEvent(screen.getByTestId('message-composer-input'), 'focus');
|
||||||
|
await fireEvent.press(screen.getByTestId('message-composer-open-markdown'));
|
||||||
|
await fireEvent.press(screen.getByTestId('message-composer-bold'));
|
||||||
|
await fireEvent.press(screen.getByTestId('message-composer-send'));
|
||||||
|
});
|
||||||
|
expect(onSendMessage).toHaveBeenCalledTimes(1);
|
||||||
|
expect(onSendMessage).toHaveBeenCalledWith('**', undefined);
|
||||||
|
expect(screen.toJSON()).toMatchSnapshot();
|
||||||
|
});
|
||||||
|
|
||||||
|
test('type test and tap bold', async () => {
|
||||||
|
const onSendMessage = jest.fn();
|
||||||
|
render(<Render context={{ onSendMessage }} />);
|
||||||
|
|
||||||
|
await act(async () => {
|
||||||
|
await fireEvent.changeText(screen.getByTestId('message-composer-input'), 'test');
|
||||||
|
await fireEvent(screen.getByTestId('message-composer-input'), 'focus');
|
||||||
|
await fireEvent(screen.getByTestId('message-composer-input'), 'selectionChange', {
|
||||||
|
nativeEvent: { selection: { start: 0, end: 4 } }
|
||||||
|
});
|
||||||
|
await fireEvent.press(screen.getByTestId('message-composer-open-markdown'));
|
||||||
|
await fireEvent.press(screen.getByTestId('message-composer-bold'));
|
||||||
|
await fireEvent.press(screen.getByTestId('message-composer-send'));
|
||||||
|
});
|
||||||
|
expect(onSendMessage).toHaveBeenCalledTimes(1);
|
||||||
|
expect(onSendMessage).toHaveBeenCalledWith('*test*', undefined);
|
||||||
|
expect(screen.toJSON()).toMatchSnapshot();
|
||||||
|
});
|
||||||
|
|
||||||
|
test('tap italic', async () => {
|
||||||
|
const onSendMessage = jest.fn();
|
||||||
|
render(<Render context={{ onSendMessage }} />);
|
||||||
|
|
||||||
|
await act(async () => {
|
||||||
|
await fireEvent(screen.getByTestId('message-composer-input'), 'focus');
|
||||||
|
await fireEvent.press(screen.getByTestId('message-composer-open-markdown'));
|
||||||
|
await fireEvent.press(screen.getByTestId('message-composer-italic'));
|
||||||
|
await fireEvent.press(screen.getByTestId('message-composer-send'));
|
||||||
|
});
|
||||||
|
expect(onSendMessage).toHaveBeenCalledTimes(1);
|
||||||
|
expect(onSendMessage).toHaveBeenCalledWith('__', undefined);
|
||||||
|
expect(screen.toJSON()).toMatchSnapshot();
|
||||||
|
});
|
||||||
|
|
||||||
|
test('type test and tap italic', async () => {
|
||||||
|
const onSendMessage = jest.fn();
|
||||||
|
render(<Render context={{ onSendMessage }} />);
|
||||||
|
|
||||||
|
await act(async () => {
|
||||||
|
await fireEvent.changeText(screen.getByTestId('message-composer-input'), 'test');
|
||||||
|
await fireEvent(screen.getByTestId('message-composer-input'), 'focus');
|
||||||
|
await fireEvent(screen.getByTestId('message-composer-input'), 'selectionChange', {
|
||||||
|
nativeEvent: { selection: { start: 0, end: 4 } }
|
||||||
|
});
|
||||||
|
await fireEvent.press(screen.getByTestId('message-composer-open-markdown'));
|
||||||
|
await fireEvent.press(screen.getByTestId('message-composer-italic'));
|
||||||
|
await fireEvent.press(screen.getByTestId('message-composer-send'));
|
||||||
|
});
|
||||||
|
expect(onSendMessage).toHaveBeenCalledTimes(1);
|
||||||
|
expect(onSendMessage).toHaveBeenCalledWith('_test_', undefined);
|
||||||
|
expect(screen.toJSON()).toMatchSnapshot();
|
||||||
|
});
|
||||||
|
|
||||||
|
test('tap strike', async () => {
|
||||||
|
const onSendMessage = jest.fn();
|
||||||
|
render(<Render context={{ onSendMessage }} />);
|
||||||
|
|
||||||
|
await act(async () => {
|
||||||
|
await fireEvent(screen.getByTestId('message-composer-input'), 'focus');
|
||||||
|
await fireEvent.press(screen.getByTestId('message-composer-open-markdown'));
|
||||||
|
await fireEvent.press(screen.getByTestId('message-composer-strike'));
|
||||||
|
await fireEvent.press(screen.getByTestId('message-composer-send'));
|
||||||
|
});
|
||||||
|
expect(onSendMessage).toHaveBeenCalledTimes(1);
|
||||||
|
expect(onSendMessage).toHaveBeenCalledWith('~~', undefined);
|
||||||
|
expect(screen.toJSON()).toMatchSnapshot();
|
||||||
|
});
|
||||||
|
|
||||||
|
test('type test and tap strike', async () => {
|
||||||
|
const onSendMessage = jest.fn();
|
||||||
|
render(<Render context={{ onSendMessage }} />);
|
||||||
|
|
||||||
|
await act(async () => {
|
||||||
|
await fireEvent.changeText(screen.getByTestId('message-composer-input'), 'test');
|
||||||
|
await fireEvent(screen.getByTestId('message-composer-input'), 'focus');
|
||||||
|
await fireEvent(screen.getByTestId('message-composer-input'), 'selectionChange', {
|
||||||
|
nativeEvent: { selection: { start: 0, end: 4 } }
|
||||||
|
});
|
||||||
|
await fireEvent.press(screen.getByTestId('message-composer-open-markdown'));
|
||||||
|
await fireEvent.press(screen.getByTestId('message-composer-strike'));
|
||||||
|
await fireEvent.press(screen.getByTestId('message-composer-send'));
|
||||||
|
});
|
||||||
|
expect(onSendMessage).toHaveBeenCalledTimes(1);
|
||||||
|
expect(onSendMessage).toHaveBeenCalledWith('~test~', undefined);
|
||||||
|
expect(screen.toJSON()).toMatchSnapshot();
|
||||||
|
});
|
||||||
|
|
||||||
|
test('tap code', async () => {
|
||||||
|
const onSendMessage = jest.fn();
|
||||||
|
render(<Render context={{ onSendMessage }} />);
|
||||||
|
|
||||||
|
await act(async () => {
|
||||||
|
await fireEvent(screen.getByTestId('message-composer-input'), 'focus');
|
||||||
|
await fireEvent.press(screen.getByTestId('message-composer-open-markdown'));
|
||||||
|
await fireEvent.press(screen.getByTestId('message-composer-code'));
|
||||||
|
await fireEvent.press(screen.getByTestId('message-composer-send'));
|
||||||
|
});
|
||||||
|
expect(onSendMessage).toHaveBeenCalledTimes(1);
|
||||||
|
expect(onSendMessage).toHaveBeenCalledWith('``', undefined);
|
||||||
|
expect(screen.toJSON()).toMatchSnapshot();
|
||||||
|
});
|
||||||
|
|
||||||
|
test('type test and tap code', async () => {
|
||||||
|
const onSendMessage = jest.fn();
|
||||||
|
render(<Render context={{ onSendMessage }} />);
|
||||||
|
|
||||||
|
await act(async () => {
|
||||||
|
await fireEvent.changeText(screen.getByTestId('message-composer-input'), 'test');
|
||||||
|
await fireEvent(screen.getByTestId('message-composer-input'), 'focus');
|
||||||
|
await fireEvent(screen.getByTestId('message-composer-input'), 'selectionChange', {
|
||||||
|
nativeEvent: { selection: { start: 0, end: 4 } }
|
||||||
|
});
|
||||||
|
await fireEvent.press(screen.getByTestId('message-composer-open-markdown'));
|
||||||
|
await fireEvent.press(screen.getByTestId('message-composer-code'));
|
||||||
|
await fireEvent.press(screen.getByTestId('message-composer-send'));
|
||||||
|
});
|
||||||
|
expect(onSendMessage).toHaveBeenCalledTimes(1);
|
||||||
|
expect(onSendMessage).toHaveBeenCalledWith('`test`', undefined);
|
||||||
|
expect(screen.toJSON()).toMatchSnapshot();
|
||||||
|
});
|
||||||
|
|
||||||
|
test('tap code-block', async () => {
|
||||||
|
const onSendMessage = jest.fn();
|
||||||
|
render(<Render context={{ onSendMessage }} />);
|
||||||
|
|
||||||
|
await act(async () => {
|
||||||
|
await fireEvent(screen.getByTestId('message-composer-input'), 'focus');
|
||||||
|
await fireEvent.press(screen.getByTestId('message-composer-open-markdown'));
|
||||||
|
await fireEvent.press(screen.getByTestId('message-composer-code-block'));
|
||||||
|
await fireEvent.press(screen.getByTestId('message-composer-send'));
|
||||||
|
});
|
||||||
|
expect(onSendMessage).toHaveBeenCalledTimes(1);
|
||||||
|
expect(onSendMessage).toHaveBeenCalledWith('``````', undefined);
|
||||||
|
expect(screen.toJSON()).toMatchSnapshot();
|
||||||
|
});
|
||||||
|
|
||||||
|
test('type test and tap code-block', async () => {
|
||||||
|
const onSendMessage = jest.fn();
|
||||||
|
render(<Render context={{ onSendMessage }} />);
|
||||||
|
|
||||||
|
await act(async () => {
|
||||||
|
await fireEvent.changeText(screen.getByTestId('message-composer-input'), 'test');
|
||||||
|
await fireEvent(screen.getByTestId('message-composer-input'), 'focus');
|
||||||
|
await fireEvent(screen.getByTestId('message-composer-input'), 'selectionChange', {
|
||||||
|
nativeEvent: { selection: { start: 0, end: 4 } }
|
||||||
|
});
|
||||||
|
await fireEvent.press(screen.getByTestId('message-composer-open-markdown'));
|
||||||
|
await fireEvent.press(screen.getByTestId('message-composer-code-block'));
|
||||||
|
await fireEvent.press(screen.getByTestId('message-composer-send'));
|
||||||
|
});
|
||||||
|
expect(onSendMessage).toHaveBeenCalledTimes(1);
|
||||||
|
expect(onSendMessage).toHaveBeenCalledWith('```test```', undefined);
|
||||||
|
expect(screen.toJSON()).toMatchSnapshot();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test('tap mention', async () => {
|
||||||
|
const onSendMessage = jest.fn();
|
||||||
|
render(<Render context={{ onSendMessage }} />);
|
||||||
|
|
||||||
|
await act(async () => {
|
||||||
|
await fireEvent(screen.getByTestId('message-composer-input'), 'focus');
|
||||||
|
await fireEvent.press(screen.getByTestId('message-composer-mention'));
|
||||||
|
await fireEvent.press(screen.getByTestId('message-composer-send'));
|
||||||
|
});
|
||||||
|
expect(onSendMessage).toHaveBeenCalledTimes(1);
|
||||||
|
expect(onSendMessage).toHaveBeenCalledWith('@', undefined);
|
||||||
|
expect(screen.toJSON()).toMatchSnapshot();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
describe('edit message', () => {
|
describe('edit message', () => {
|
||||||
const onSendMessage = jest.fn();
|
const onSendMessage = jest.fn();
|
||||||
const editCancel = jest.fn();
|
const editCancel = jest.fn();
|
||||||
|
@ -362,19 +351,26 @@ describe.skip('MessageComposer', () => {
|
||||||
await screen.findByTestId('message-composer');
|
await screen.findByTestId('message-composer');
|
||||||
expect(screen.getByTestId('message-composer')).toHaveStyle({ backgroundColor: colors.light.statusBackgroundWarning2 });
|
expect(screen.getByTestId('message-composer')).toHaveStyle({ backgroundColor: colors.light.statusBackgroundWarning2 });
|
||||||
expect(screen.getByTestId('message-composer-actions')).toBeOnTheScreen();
|
expect(screen.getByTestId('message-composer-actions')).toBeOnTheScreen();
|
||||||
expect(screen.queryByTestId('message-composer-send-audio')).toBeNull();
|
expect(screen.queryByTestId('message-composer-send-audio')).not.toBeOnTheScreen();
|
||||||
expect(screen.getByTestId('message-composer-cancel-edit')).toBeOnTheScreen();
|
expect(screen.getByTestId('message-composer-cancel-edit')).toBeOnTheScreen();
|
||||||
});
|
});
|
||||||
test('cancel', async () => {
|
test('cancel', async () => {
|
||||||
await screen.findByTestId('message-composer');
|
await screen.findByTestId('message-composer');
|
||||||
expect(screen.getByTestId('message-composer')).toHaveStyle({ backgroundColor: colors.light.statusBackgroundWarning2 });
|
expect(screen.getByTestId('message-composer')).toHaveStyle({ backgroundColor: colors.light.statusBackgroundWarning2 });
|
||||||
fireEvent.press(screen.getByTestId('message-composer-cancel-edit'));
|
await act(async () => {
|
||||||
|
await fireEvent.press(screen.getByTestId('message-composer-cancel-edit'));
|
||||||
|
});
|
||||||
expect(editCancel).toHaveBeenCalledTimes(1);
|
expect(editCancel).toHaveBeenCalledTimes(1);
|
||||||
|
expect(screen.getByTestId('message-composer-actions')).toBeOnTheScreen();
|
||||||
|
expect(screen.queryByTestId('message-composer-send-audio')).not.toBeOnTheScreen();
|
||||||
|
expect(screen.getByTestId('message-composer-cancel-edit')).toBeOnTheScreen();
|
||||||
});
|
});
|
||||||
test('send', async () => {
|
test('send', async () => {
|
||||||
await screen.findByTestId('message-composer');
|
await screen.findByTestId('message-composer');
|
||||||
expect(screen.getByTestId('message-composer')).toHaveStyle({ backgroundColor: colors.light.statusBackgroundWarning2 });
|
expect(screen.getByTestId('message-composer')).toHaveStyle({ backgroundColor: colors.light.statusBackgroundWarning2 });
|
||||||
fireEvent.press(screen.getByTestId('message-composer-send'));
|
await act(async () => {
|
||||||
|
await fireEvent.press(screen.getByTestId('message-composer-send'));
|
||||||
|
});
|
||||||
expect(editRequest).toHaveBeenCalledTimes(1);
|
expect(editRequest).toHaveBeenCalledTimes(1);
|
||||||
expect(editRequest).toHaveBeenCalledWith({ id, msg: `Message ${id}`, rid: 'rid' });
|
expect(editRequest).toHaveBeenCalledWith({ id, msg: `Message ${id}`, rid: 'rid' });
|
||||||
});
|
});
|
||||||
|
@ -404,34 +400,46 @@ describe.skip('MessageComposer', () => {
|
||||||
}));
|
}));
|
||||||
|
|
||||||
describe('Quote', () => {
|
describe('Quote', () => {
|
||||||
test('Adding/removing quotes', () => {
|
test('Add quote `abc`', async () => {
|
||||||
|
render(<Render context={{ action: 'quote', selectedMessages: ['abc'] }} />);
|
||||||
|
await act(async () => {
|
||||||
|
await screen.findByTestId('composer-quote-abc');
|
||||||
|
expect(screen.queryByTestId('composer-quote-abc')).toBeOnTheScreen();
|
||||||
|
expect(screen.toJSON()).toMatchSnapshot();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test('Add quote `def`', async () => {
|
||||||
|
render(<Render context={{ action: 'quote', selectedMessages: ['abc', 'def'] }} />);
|
||||||
|
await act(async () => {
|
||||||
|
await screen.findByTestId('composer-quote-abc');
|
||||||
|
expect(screen.queryByTestId('composer-quote-abc')).toBeOnTheScreen();
|
||||||
|
expect(screen.queryByTestId('composer-quote-def')).toBeOnTheScreen();
|
||||||
|
expect(screen.toJSON()).toMatchSnapshot();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test('Remove a quote', async () => {
|
||||||
const onRemoveQuoteMessage = jest.fn();
|
const onRemoveQuoteMessage = jest.fn();
|
||||||
|
render(<Render context={{ action: 'quote', selectedMessages: ['abc', 'def'], onRemoveQuoteMessage }} />);
|
||||||
// Render without quotes
|
await act(async () => {
|
||||||
const { rerender } = render(<Render context={{ selectedMessages: [], onRemoveQuoteMessage }} />);
|
await screen.findByTestId('composer-quote-def');
|
||||||
expect(screen.queryByTestId('composer-quote-abc')).toBeNull();
|
await fireEvent.press(screen.getByTestId('composer-quote-remove-def'));
|
||||||
expect(screen.queryByTestId('composer-quote-def')).toBeNull();
|
});
|
||||||
expect(screen.toJSON()).toMatchSnapshot();
|
|
||||||
|
|
||||||
// Add a quote
|
|
||||||
rerender(<Render context={{ action: 'quote', selectedMessages: ['abc'], onRemoveQuoteMessage }} />);
|
|
||||||
expect(screen.getByTestId('composer-quote-abc')).toBeOnTheScreen();
|
|
||||||
expect(screen.queryByTestId('composer-quote-def')).toBeNull();
|
|
||||||
expect(screen.toJSON()).toMatchSnapshot();
|
|
||||||
|
|
||||||
// Add another quote
|
|
||||||
rerender(<Render context={{ action: 'quote', selectedMessages: ['abc', 'def'], onRemoveQuoteMessage }} />);
|
|
||||||
expect(screen.getByTestId('composer-quote-abc')).toBeOnTheScreen();
|
|
||||||
expect(screen.getByTestId('composer-quote-def')).toBeOnTheScreen();
|
|
||||||
expect(screen.toJSON()).toMatchSnapshot();
|
|
||||||
|
|
||||||
// Remove a quote
|
|
||||||
fireEvent.press(screen.getByTestId('composer-quote-remove-def'));
|
|
||||||
expect(onRemoveQuoteMessage).toHaveBeenCalledTimes(1);
|
expect(onRemoveQuoteMessage).toHaveBeenCalledTimes(1);
|
||||||
expect(onRemoveQuoteMessage).toHaveBeenCalledWith('def');
|
expect(onRemoveQuoteMessage).toHaveBeenCalledWith('def');
|
||||||
|
expect(screen.toJSON()).toMatchSnapshot();
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
// TODO: need to create proper mocks for getMessageById and getPermalinkMessage
|
describe('Audio', () => {
|
||||||
// test('Send message with a quote', async () => {});
|
test('tap record', async () => {
|
||||||
|
render(<Render />);
|
||||||
|
expect(screen.getByTestId('message-composer-send-audio')).toBeOnTheScreen();
|
||||||
|
await act(async () => {
|
||||||
|
await fireEvent.press(screen.getByTestId('message-composer-send-audio'));
|
||||||
|
});
|
||||||
|
expect(screen.toJSON()).toMatchSnapshot();
|
||||||
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
|
@ -66,8 +66,13 @@ export const MessageComposer = ({
|
||||||
const showEmojiKeyboard = useShowEmojiKeyboard();
|
const showEmojiKeyboard = useShowEmojiKeyboard();
|
||||||
const showEmojiSearchbar = useShowEmojiSearchbar();
|
const showEmojiSearchbar = useShowEmojiSearchbar();
|
||||||
const alsoSendThreadToChannel = useAlsoSendThreadToChannel();
|
const alsoSendThreadToChannel = useAlsoSendThreadToChannel();
|
||||||
const { openSearchEmojiKeyboard, closeEmojiKeyboard, closeSearchEmojiKeyboard, setTrackingViewHeight } =
|
const {
|
||||||
useMessageComposerApi();
|
openSearchEmojiKeyboard,
|
||||||
|
closeEmojiKeyboard,
|
||||||
|
closeSearchEmojiKeyboard,
|
||||||
|
setTrackingViewHeight,
|
||||||
|
setAlsoSendThreadToChannel
|
||||||
|
} = useMessageComposerApi();
|
||||||
const recordingAudio = useRecordingAudio();
|
const recordingAudio = useRecordingAudio();
|
||||||
useKeyboardListener(trackingViewRef);
|
useKeyboardListener(trackingViewRef);
|
||||||
|
|
||||||
|
@ -101,6 +106,10 @@ export const MessageComposer = ({
|
||||||
const handleSendMessage = async () => {
|
const handleSendMessage = async () => {
|
||||||
if (!rid) return;
|
if (!rid) return;
|
||||||
|
|
||||||
|
if (alsoSendThreadToChannel) {
|
||||||
|
setAlsoSendThreadToChannel(false);
|
||||||
|
}
|
||||||
|
|
||||||
if (sharing) {
|
if (sharing) {
|
||||||
onSendMessage?.();
|
onSendMessage?.();
|
||||||
return;
|
return;
|
||||||
|
@ -200,7 +209,6 @@ export const MessageComposer = ({
|
||||||
const backgroundColor = action === 'edit' ? colors.statusBackgroundWarning2 : colors.surfaceLight;
|
const backgroundColor = action === 'edit' ? colors.statusBackgroundWarning2 : colors.surfaceLight;
|
||||||
|
|
||||||
const renderContent = () => {
|
const renderContent = () => {
|
||||||
console.count('[MessageComposer] renderContent');
|
|
||||||
if (recordingAudio) {
|
if (recordingAudio) {
|
||||||
return <RecordAudio />;
|
return <RecordAudio />;
|
||||||
}
|
}
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -340,7 +340,8 @@ export const ComposerInput = memo(
|
||||||
defaultValue=''
|
defaultValue=''
|
||||||
multiline
|
multiline
|
||||||
keyboardAppearance={theme === 'light' ? 'light' : 'dark'}
|
keyboardAppearance={theme === 'light' ? 'light' : 'dark'}
|
||||||
testID={`message-composer-input${tmid ? '-thread' : ''}`}
|
// eslint-disable-next-line no-nested-ternary
|
||||||
|
testID={`message-composer-input${tmid ? '-thread' : sharing ? '-share' : ''}`}
|
||||||
/>
|
/>
|
||||||
);
|
);
|
||||||
})
|
})
|
||||||
|
|
|
@ -51,8 +51,7 @@ export const SendThreadToChannel = (): React.ReactElement | null => {
|
||||||
* */
|
* */
|
||||||
if (alsoSendThreadToChannelUserPref === 'default') {
|
if (alsoSendThreadToChannelUserPref === 'default') {
|
||||||
const db = database.active;
|
const db = database.active;
|
||||||
const observable = db.get('threads').query(Q.where('tmid', tmid)).observe();
|
const observable = db.get('threads').query(Q.where('id', tmid)).observe();
|
||||||
|
|
||||||
subscription.current = observable.subscribe(result => {
|
subscription.current = observable.subscribe(result => {
|
||||||
setAlsoSendThreadToChannel(!result.length);
|
setAlsoSendThreadToChannel(!result.length);
|
||||||
});
|
});
|
||||||
|
|
|
@ -1,6 +1,5 @@
|
||||||
import { Alert } from 'react-native';
|
import { Alert } from 'react-native';
|
||||||
import DocumentPicker from 'react-native-document-picker';
|
import DocumentPicker from 'react-native-document-picker';
|
||||||
import ImagePicker, { ImageOrVideo } from 'react-native-image-crop-picker';
|
|
||||||
|
|
||||||
import { IMAGE_PICKER_CONFIG, LIBRARY_PICKER_CONFIG, VIDEO_PICKER_CONFIG } from '../constants';
|
import { IMAGE_PICKER_CONFIG, LIBRARY_PICKER_CONFIG, VIDEO_PICKER_CONFIG } from '../constants';
|
||||||
import { forceJpgExtension } from '../helpers';
|
import { forceJpgExtension } from '../helpers';
|
||||||
|
@ -12,6 +11,7 @@ import { getThreadById } from '../../../lib/database/services/Thread';
|
||||||
import Navigation from '../../../lib/navigation/appNavigation';
|
import Navigation from '../../../lib/navigation/appNavigation';
|
||||||
import { useAppSelector } from '../../../lib/hooks';
|
import { useAppSelector } from '../../../lib/hooks';
|
||||||
import { useRoomContext } from '../../../views/RoomView/context';
|
import { useRoomContext } from '../../../views/RoomView/context';
|
||||||
|
import ImagePicker, { ImageOrVideo } from '../../../lib/methods/helpers/ImagePicker/ImagePicker';
|
||||||
|
|
||||||
export const useChooseMedia = ({
|
export const useChooseMedia = ({
|
||||||
rid,
|
rid,
|
||||||
|
|
|
@ -44,7 +44,7 @@ const methods: IMethods = {
|
||||||
keyboardType: 'numeric'
|
keyboardType: 'numeric'
|
||||||
},
|
},
|
||||||
email: {
|
email: {
|
||||||
text: 'Verify_your_email_for_the_code_we_sent',
|
text: 'Enter_the_code',
|
||||||
keyboardType: 'numeric'
|
keyboardType: 'numeric'
|
||||||
},
|
},
|
||||||
password: {
|
password: {
|
||||||
|
@ -129,7 +129,7 @@ const TwoFactor = React.memo(({ isMasterDetail }: { isMasterDetail: boolean }) =
|
||||||
/>
|
/>
|
||||||
{isEmail ? (
|
{isEmail ? (
|
||||||
<Text style={[styles.sendEmail, { color }]} onPress={sendEmail}>
|
<Text style={[styles.sendEmail, { color }]} onPress={sendEmail}>
|
||||||
{I18n.t('Send_me_the_code_again')}
|
{I18n.t('Resend_email')}
|
||||||
</Text>
|
</Text>
|
||||||
) : null}
|
) : null}
|
||||||
<View style={styles.buttonContainer}>
|
<View style={styles.buttonContainer}>
|
||||||
|
@ -140,7 +140,7 @@ const TwoFactor = React.memo(({ isMasterDetail }: { isMasterDetail: boolean }) =
|
||||||
style={styles.button}
|
style={styles.button}
|
||||||
onPress={onCancel}
|
onPress={onCancel}
|
||||||
/>
|
/>
|
||||||
<Button title={I18n.t('Send')} type='primary' style={styles.button} onPress={onSubmit} testID='two-factor-send' />
|
<Button title={I18n.t('Verify')} type='primary' style={styles.button} onPress={onSubmit} testID='two-factor-send' />
|
||||||
</View>
|
</View>
|
||||||
</View>
|
</View>
|
||||||
</View>
|
</View>
|
||||||
|
|
|
@ -1,9 +1,11 @@
|
||||||
import React from 'react';
|
|
||||||
import { KaTeX as KaTeXProps } from '@rocket.chat/message-parser';
|
import { KaTeX as KaTeXProps } from '@rocket.chat/message-parser';
|
||||||
|
import React from 'react';
|
||||||
|
import { StyleProp, ViewStyle } from 'react-native';
|
||||||
|
import Katex from 'react-native-katex';
|
||||||
// eslint-disable-next-line import/no-unresolved
|
// eslint-disable-next-line import/no-unresolved
|
||||||
import MathView, { MathText } from 'react-native-math-view';
|
import MathView, { MathText } from 'react-native-math-view';
|
||||||
import Katex from 'react-native-katex';
|
|
||||||
|
|
||||||
|
import { isAndroid } from '../../../lib/methods/helpers';
|
||||||
import { useTheme } from '../../../theme';
|
import { useTheme } from '../../../theme';
|
||||||
import { DEFAULT_MESSAGE_HEIGHT } from '../../message/utils';
|
import { DEFAULT_MESSAGE_HEIGHT } from '../../message/utils';
|
||||||
|
|
||||||
|
@ -13,11 +15,14 @@ interface IKaTeXProps {
|
||||||
|
|
||||||
export const KaTeX = ({ value }: IKaTeXProps): React.ReactElement | null => {
|
export const KaTeX = ({ value }: IKaTeXProps): React.ReactElement | null => {
|
||||||
const { colors } = useTheme();
|
const { colors } = useTheme();
|
||||||
|
const fixAndroidWebviewCrashStyle: StyleProp<ViewStyle> = isAndroid ? { opacity: 0.99, overflow: 'hidden' } : {};
|
||||||
return (
|
return (
|
||||||
<MathView
|
<MathView
|
||||||
math={value}
|
math={value}
|
||||||
style={{ color: colors.bodyText }}
|
style={{ color: colors.bodyText }}
|
||||||
renderError={() => <Katex expression={value} style={{ flex: 1, height: DEFAULT_MESSAGE_HEIGHT }} />}
|
renderError={() => (
|
||||||
|
<Katex expression={value} style={[{ flex: 1, height: DEFAULT_MESSAGE_HEIGHT }, fixAndroidWebviewCrashStyle]} />
|
||||||
|
)}
|
||||||
/>
|
/>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
|
@ -98,7 +98,7 @@ const User = React.memo(
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<View style={styles.container}>
|
<View style={styles.container}>
|
||||||
<TouchableOpacity style={styles.titleContainer} onPress={onUserPress}>
|
<TouchableOpacity testID={`username-header-${username}`} style={styles.titleContainer} onPress={onUserPress}>
|
||||||
<Text style={[styles.username, { color: colors.titleText }]} numberOfLines={1}>
|
<Text style={[styles.username, { color: colors.titleText }]} numberOfLines={1}>
|
||||||
{textContent}
|
{textContent}
|
||||||
</Text>
|
</Text>
|
||||||
|
|
|
@ -331,7 +331,6 @@
|
||||||
"Send_audio_message": "إرسال رسالة صوتية",
|
"Send_audio_message": "إرسال رسالة صوتية",
|
||||||
"Send_crash_report": "إرسال تقرير الأعطال",
|
"Send_crash_report": "إرسال تقرير الأعطال",
|
||||||
"Send_message": "إرسال الرسالة",
|
"Send_message": "إرسال الرسالة",
|
||||||
"Send_me_the_code_again": "أرسل الرمز مرة أخرى",
|
|
||||||
"Send_to": "إرسال إلى...",
|
"Send_to": "إرسال إلى...",
|
||||||
"Sending_to": "يتم الإرسال إلى",
|
"Sending_to": "يتم الإرسال إلى",
|
||||||
"Server": "سرفر",
|
"Server": "سرفر",
|
||||||
|
@ -391,7 +390,6 @@
|
||||||
"Uses_server_configuration": "يستخدم إعداد الخادم",
|
"Uses_server_configuration": "يستخدم إعداد الخادم",
|
||||||
"Registration_Succeeded": "تم التسجيل بنجاح",
|
"Registration_Succeeded": "تم التسجيل بنجاح",
|
||||||
"Verify_email_desc": "لقد أرسلنا إليك بريداً إلكترونياً لتأكيد تسجيلك. إذا لم تتلق البريد الإلكتروني قريباً، فيرجى العودة والمحاولة مرة أخرى",
|
"Verify_email_desc": "لقد أرسلنا إليك بريداً إلكترونياً لتأكيد تسجيلك. إذا لم تتلق البريد الإلكتروني قريباً، فيرجى العودة والمحاولة مرة أخرى",
|
||||||
"Verify_your_email_for_the_code_we_sent": "يرجى تأكيد البريد الإلكتروني عبر الرمز المرسل",
|
|
||||||
"View_Original": "عرض المحتوى الأصلي",
|
"View_Original": "عرض المحتوى الأصلي",
|
||||||
"Waiting_for_network": "بانتظار توفر شبكة...",
|
"Waiting_for_network": "بانتظار توفر شبكة...",
|
||||||
"Websocket_disabled": "تم تعطيل Websocket لهذا الخادم.\n{{contact}}",
|
"Websocket_disabled": "تم تعطيل Websocket لهذا الخادم.\n{{contact}}",
|
||||||
|
|
|
@ -365,7 +365,6 @@
|
||||||
"Send_audio_message": "অডিও মেসেজ পাঠান",
|
"Send_audio_message": "অডিও মেসেজ পাঠান",
|
||||||
"Send_crash_report": "ক্র্যাশ রিপোর্ট পাঠান",
|
"Send_crash_report": "ক্র্যাশ রিপোর্ট পাঠান",
|
||||||
"Send_message": "মেসেজ পাঠান",
|
"Send_message": "মেসেজ পাঠান",
|
||||||
"Send_me_the_code_again": "আবার কোড পাঠান",
|
|
||||||
"Send_to": "পাঠান...",
|
"Send_to": "পাঠান...",
|
||||||
"Sending_to": "পাঠাচ্ছি",
|
"Sending_to": "পাঠাচ্ছি",
|
||||||
"Server": "ওয়ার্কস্পেস",
|
"Server": "ওয়ার্কস্পেস",
|
||||||
|
@ -433,7 +432,6 @@
|
||||||
"Uses_server_configuration": "ওয়ার্কস্পেস কনফিগারেশন ব্যবহার করে",
|
"Uses_server_configuration": "ওয়ার্কস্পেস কনফিগারেশন ব্যবহার করে",
|
||||||
"Registration_Succeeded": "নিবন্ধন সফল!",
|
"Registration_Succeeded": "নিবন্ধন সফল!",
|
||||||
"Verify_email_desc": "আমরা আপনার নিবন্ধন নিশ্চিত করতে একটি ইমেল পাঠিয়েছি। যদি আপনি শীঘ্রই একটি ইমেল পাননি, তবে দয়া করে ফিরে এসে আবার চেষ্টা করুন।",
|
"Verify_email_desc": "আমরা আপনার নিবন্ধন নিশ্চিত করতে একটি ইমেল পাঠিয়েছি। যদি আপনি শীঘ্রই একটি ইমেল পাননি, তবে দয়া করে ফিরে এসে আবার চেষ্টা করুন।",
|
||||||
"Verify_your_email_for_the_code_we_sent": "আমরা পাঠায় কোডের জন্য আপনার ইমেল যাচাই করুন",
|
|
||||||
"View_Original": "মৌলিক দেখুন",
|
"View_Original": "মৌলিক দেখুন",
|
||||||
"Waiting_for_network": "নেটওয়ার্কের জন্য অপেক্ষা করছে...",
|
"Waiting_for_network": "নেটওয়ার্কের জন্য অপেক্ষা করছে...",
|
||||||
"Websocket_disabled": "এই ওয়ার্কস্পেসের জন্য ওয়েবসকেট অক্ষম রয়েছে।\n{{contact}}",
|
"Websocket_disabled": "এই ওয়ার্কস্পেসের জন্য ওয়েবসকেট অক্ষম রয়েছে।\n{{contact}}",
|
||||||
|
|
|
@ -365,7 +365,6 @@
|
||||||
"Send_audio_message": "Audio-Nachricht senden",
|
"Send_audio_message": "Audio-Nachricht senden",
|
||||||
"Send_crash_report": "Absturzbericht senden",
|
"Send_crash_report": "Absturzbericht senden",
|
||||||
"Send_message": "Nachricht senden",
|
"Send_message": "Nachricht senden",
|
||||||
"Send_me_the_code_again": "Den Code neu versenden",
|
|
||||||
"Send_to": "Senden an …",
|
"Send_to": "Senden an …",
|
||||||
"Sending_to": "Sende an",
|
"Sending_to": "Sende an",
|
||||||
"Server": "Server",
|
"Server": "Server",
|
||||||
|
@ -434,7 +433,6 @@
|
||||||
"Uses_server_configuration": "Nutzt Servereinstellungen",
|
"Uses_server_configuration": "Nutzt Servereinstellungen",
|
||||||
"Registration_Succeeded": "Registrierung erfolgreich!",
|
"Registration_Succeeded": "Registrierung erfolgreich!",
|
||||||
"Verify_email_desc": "Wir haben Ihnen eine Email geschickt um Ihre Anmeldung zu bestätigen. Wenn Sie keine Email erhalten, versuchen Sie es später noch einmal.",
|
"Verify_email_desc": "Wir haben Ihnen eine Email geschickt um Ihre Anmeldung zu bestätigen. Wenn Sie keine Email erhalten, versuchen Sie es später noch einmal.",
|
||||||
"Verify_your_email_for_the_code_we_sent": "Prüfen Sie Ihre Mails auf den Code, den wir Ihnen eben geschickt haben.",
|
|
||||||
"View_Original": "Original anzeigen",
|
"View_Original": "Original anzeigen",
|
||||||
"Waiting_for_network": "Warte auf das Netzwerk …",
|
"Waiting_for_network": "Warte auf das Netzwerk …",
|
||||||
"Websocket_disabled": "Websockets sind auf diesem Server nicht aktiviert.\n{{contact}}",
|
"Websocket_disabled": "Websockets sind auf diesem Server nicht aktiviert.\n{{contact}}",
|
||||||
|
|
|
@ -367,7 +367,6 @@
|
||||||
"Send_audio_message": "Send audio message",
|
"Send_audio_message": "Send audio message",
|
||||||
"Send_crash_report": "Send crash report",
|
"Send_crash_report": "Send crash report",
|
||||||
"Send_message": "Send message",
|
"Send_message": "Send message",
|
||||||
"Send_me_the_code_again": "Send me the code again",
|
|
||||||
"Send_to": "Send to...",
|
"Send_to": "Send to...",
|
||||||
"Sending_to": "Sending to",
|
"Sending_to": "Sending to",
|
||||||
"Server": "Workspace",
|
"Server": "Workspace",
|
||||||
|
@ -437,7 +436,6 @@
|
||||||
"Uses_server_configuration": "Uses workspace configuration",
|
"Uses_server_configuration": "Uses workspace configuration",
|
||||||
"Registration_Succeeded": "Registration succeeded!",
|
"Registration_Succeeded": "Registration succeeded!",
|
||||||
"Verify_email_desc": "We have sent you an email to confirm your registration. If you do not receive an email shortly, please come back and try again.",
|
"Verify_email_desc": "We have sent you an email to confirm your registration. If you do not receive an email shortly, please come back and try again.",
|
||||||
"Verify_your_email_for_the_code_we_sent": "Verify your email for the code we sent",
|
|
||||||
"View_Original": "View original",
|
"View_Original": "View original",
|
||||||
"Waiting_for_network": "Waiting for network...",
|
"Waiting_for_network": "Waiting for network...",
|
||||||
"Websocket_disabled": "Websocket is disabled for this workspace.\n{{contact}}",
|
"Websocket_disabled": "Websocket is disabled for this workspace.\n{{contact}}",
|
||||||
|
@ -824,5 +822,8 @@
|
||||||
"Microphone_access_needed_to_record_audio": "Microphone access needed to record audio",
|
"Microphone_access_needed_to_record_audio": "Microphone access needed to record audio",
|
||||||
"Go_to_your_device_settings_and_allow_microphone": "Go to your device settings and allow microphone access for Rocket.Chat",
|
"Go_to_your_device_settings_and_allow_microphone": "Go to your device settings and allow microphone access for Rocket.Chat",
|
||||||
"Check_again": "Check again",
|
"Check_again": "Check again",
|
||||||
"error-no-tokens-for-this-user": "There are no tokens for this user"
|
"error-no-tokens-for-this-user": "There are no tokens for this user",
|
||||||
|
"Enter_the_code": "Enter the code we just emailed you.",
|
||||||
|
"Resend_email": "Resend email",
|
||||||
|
"Verify": "Verify"
|
||||||
}
|
}
|
|
@ -365,7 +365,6 @@
|
||||||
"Send_audio_message": "Lähetä ääniviesti",
|
"Send_audio_message": "Lähetä ääniviesti",
|
||||||
"Send_crash_report": "Lähetä kaatumisraportti",
|
"Send_crash_report": "Lähetä kaatumisraportti",
|
||||||
"Send_message": "Lähetä viesti",
|
"Send_message": "Lähetä viesti",
|
||||||
"Send_me_the_code_again": "Lähetä koodi uudelleen",
|
|
||||||
"Send_to": "Lähetä kohteeseen...",
|
"Send_to": "Lähetä kohteeseen...",
|
||||||
"Sending_to": "Lähetetään kohteeseen",
|
"Sending_to": "Lähetetään kohteeseen",
|
||||||
"Server": "Palvelin",
|
"Server": "Palvelin",
|
||||||
|
@ -434,7 +433,6 @@
|
||||||
"Uses_server_configuration": "Käyttää palvelimen määrityksiä",
|
"Uses_server_configuration": "Käyttää palvelimen määrityksiä",
|
||||||
"Registration_Succeeded": "Rekisteröinti onnistui!",
|
"Registration_Succeeded": "Rekisteröinti onnistui!",
|
||||||
"Verify_email_desc": "Lähetimme rekisteröitymisvahvistuksen sähköpostiisi. Jos et saa sähköpostia pian, yritä uudelleen.",
|
"Verify_email_desc": "Lähetimme rekisteröitymisvahvistuksen sähköpostiisi. Jos et saa sähköpostia pian, yritä uudelleen.",
|
||||||
"Verify_your_email_for_the_code_we_sent": "Vahvista sähköpostiosoitteesi lähettämällämme koodilla",
|
|
||||||
"View_Original": "Näytä alkuperäinen",
|
"View_Original": "Näytä alkuperäinen",
|
||||||
"Waiting_for_network": "Odotetaan verkkoa...",
|
"Waiting_for_network": "Odotetaan verkkoa...",
|
||||||
"Websocket_disabled": "Websocket ei ole käytössä tässä palvelimessa.\n{{contact}}",
|
"Websocket_disabled": "Websocket ei ole käytössä tässä palvelimessa.\n{{contact}}",
|
||||||
|
|
|
@ -340,7 +340,6 @@
|
||||||
"Send_audio_message": "Envoyer un message audio",
|
"Send_audio_message": "Envoyer un message audio",
|
||||||
"Send_crash_report": "Envoyer un rapport de plantage",
|
"Send_crash_report": "Envoyer un rapport de plantage",
|
||||||
"Send_message": "Envoyer un message",
|
"Send_message": "Envoyer un message",
|
||||||
"Send_me_the_code_again": "Envoyez-moi à nouveau le code",
|
|
||||||
"Send_to": "Envoyer à...",
|
"Send_to": "Envoyer à...",
|
||||||
"Sending_to": "Envoi à",
|
"Sending_to": "Envoi à",
|
||||||
"Server": "Serveur",
|
"Server": "Serveur",
|
||||||
|
@ -401,7 +400,6 @@
|
||||||
"Uses_server_configuration": "Utilise la configuration du serveur",
|
"Uses_server_configuration": "Utilise la configuration du serveur",
|
||||||
"Registration_Succeeded": "Inscription réussie !",
|
"Registration_Succeeded": "Inscription réussie !",
|
||||||
"Verify_email_desc": "Nous vous avons envoyé un e-mail pour confirmer votre inscription. Si vous ne recevez pas d'e-mail sous peu, veuillez revenir et réessayer.",
|
"Verify_email_desc": "Nous vous avons envoyé un e-mail pour confirmer votre inscription. Si vous ne recevez pas d'e-mail sous peu, veuillez revenir et réessayer.",
|
||||||
"Verify_your_email_for_the_code_we_sent": "Vérifiez votre e-mail pour le code que nous avons envoyé",
|
|
||||||
"View_Original": "Voir l'original",
|
"View_Original": "Voir l'original",
|
||||||
"Waiting_for_network": "En attente du réseau...",
|
"Waiting_for_network": "En attente du réseau...",
|
||||||
"Websocket_disabled": "Le Websocket est désactivé pour ce serveur.\n{{contact}}",
|
"Websocket_disabled": "Le Websocket est désactivé pour ce serveur.\n{{contact}}",
|
||||||
|
|
|
@ -365,7 +365,6 @@
|
||||||
"Send_audio_message": "ऑडियो संदेश भेजें",
|
"Send_audio_message": "ऑडियो संदेश भेजें",
|
||||||
"Send_crash_report": "क्रैश रिपोर्ट भेजें",
|
"Send_crash_report": "क्रैश रिपोर्ट भेजें",
|
||||||
"Send_message": "संदेश भेजें",
|
"Send_message": "संदेश भेजें",
|
||||||
"Send_me_the_code_again": "मुझे कोड फिर से भेजें",
|
|
||||||
"Send_to": "भेजें को...",
|
"Send_to": "भेजें को...",
|
||||||
"Sending_to": "भेजा जा रहा है",
|
"Sending_to": "भेजा जा रहा है",
|
||||||
"Server": "कार्यस्थान",
|
"Server": "कार्यस्थान",
|
||||||
|
@ -433,7 +432,6 @@
|
||||||
"Uses_server_configuration": "कार्यस्थान समरूपण का उपयोग करता है",
|
"Uses_server_configuration": "कार्यस्थान समरूपण का उपयोग करता है",
|
||||||
"Registration_Succeeded": "पंजीकरण सफल हुआ!",
|
"Registration_Succeeded": "पंजीकरण सफल हुआ!",
|
||||||
"Verify_email_desc": "हमने आपको आपके पंजीकरण की पुष्टि के लिए एक ईमेल भेजा है। यदि आपको शीघ्र एक ईमेल प्राप्त नहीं होता है, तो कृपया वापस आकर पुनः प्रयास करें।",
|
"Verify_email_desc": "हमने आपको आपके पंजीकरण की पुष्टि के लिए एक ईमेल भेजा है। यदि आपको शीघ्र एक ईमेल प्राप्त नहीं होता है, तो कृपया वापस आकर पुनः प्रयास करें।",
|
||||||
"Verify_your_email_for_the_code_we_sent": "हमने आपको भेजे गए कोड के लिए अपनी ईमेल की पुष्टि करें",
|
|
||||||
"View_Original": "मूल देखें",
|
"View_Original": "मूल देखें",
|
||||||
"Waiting_for_network": "नेटवर्क के लिए प्रतीक्षा कर रहा है...",
|
"Waiting_for_network": "नेटवर्क के लिए प्रतीक्षा कर रहा है...",
|
||||||
"Websocket_disabled": "इस कार्यस्थान के लिए वेबसॉकेट निष्क्रिय है।\n{{संपर्क}}",
|
"Websocket_disabled": "इस कार्यस्थान के लिए वेबसॉकेट निष्क्रिय है।\n{{संपर्क}}",
|
||||||
|
|
|
@ -365,7 +365,6 @@
|
||||||
"Send_audio_message": "Hangüzenet küldése",
|
"Send_audio_message": "Hangüzenet küldése",
|
||||||
"Send_crash_report": "Összeomlás jelentés küldése",
|
"Send_crash_report": "Összeomlás jelentés küldése",
|
||||||
"Send_message": "Üzenet küldése",
|
"Send_message": "Üzenet küldése",
|
||||||
"Send_me_the_code_again": "Küldje el nekem a kódot újra",
|
|
||||||
"Send_to": "Küldje el...",
|
"Send_to": "Küldje el...",
|
||||||
"Sending_to": "Küldés a",
|
"Sending_to": "Küldés a",
|
||||||
"Server": "Munkaterület",
|
"Server": "Munkaterület",
|
||||||
|
@ -434,7 +433,6 @@
|
||||||
"Uses_server_configuration": "Használja a munkaterület konfigurációját",
|
"Uses_server_configuration": "Használja a munkaterület konfigurációját",
|
||||||
"Registration_Succeeded": "A regisztráció sikeres",
|
"Registration_Succeeded": "A regisztráció sikeres",
|
||||||
"Verify_email_desc": "Küldtünk Önnek egy e-mailt a regisztrációja megerősítéséhez. Ha nem kap rövidesen e-mailt, akkor térjen vissza, és próbálja meg újra.",
|
"Verify_email_desc": "Küldtünk Önnek egy e-mailt a regisztrációja megerősítéséhez. Ha nem kap rövidesen e-mailt, akkor térjen vissza, és próbálja meg újra.",
|
||||||
"Verify_your_email_for_the_code_we_sent": "Ellenőrizze az e-mail-címét azzal a kóddal, amit küldtünk",
|
|
||||||
"View_Original": "Eredeti megtekintése",
|
"View_Original": "Eredeti megtekintése",
|
||||||
"Waiting_for_network": "Hálózatra várva...",
|
"Waiting_for_network": "Hálózatra várva...",
|
||||||
"Websocket_disabled": "A websocket ki van kapcsolva ehhez a munkaterülethez. {{contact}}",
|
"Websocket_disabled": "A websocket ki van kapcsolva ehhez a munkaterülethez. {{contact}}",
|
||||||
|
|
|
@ -345,7 +345,6 @@
|
||||||
"Send_audio_message": "Invia messaggio audio",
|
"Send_audio_message": "Invia messaggio audio",
|
||||||
"Send_crash_report": "Invia report sui crash",
|
"Send_crash_report": "Invia report sui crash",
|
||||||
"Send_message": "Invia messaggio",
|
"Send_message": "Invia messaggio",
|
||||||
"Send_me_the_code_again": "Inviami nuovamente il codice",
|
|
||||||
"Send_to": "Invia a...",
|
"Send_to": "Invia a...",
|
||||||
"Sending_to": "Invio a",
|
"Sending_to": "Invio a",
|
||||||
"Server": "Server",
|
"Server": "Server",
|
||||||
|
@ -405,7 +404,6 @@
|
||||||
"Uses_server_configuration": "Usa la configurazione del server",
|
"Uses_server_configuration": "Usa la configurazione del server",
|
||||||
"Registration_Succeeded": "Registrazione completata!",
|
"Registration_Succeeded": "Registrazione completata!",
|
||||||
"Verify_email_desc": "Ti abbiamo inviato una e-mail per confermare la tua registrazione. Se non la ricevi, ritorna qui e riprova",
|
"Verify_email_desc": "Ti abbiamo inviato una e-mail per confermare la tua registrazione. Se non la ricevi, ritorna qui e riprova",
|
||||||
"Verify_your_email_for_the_code_we_sent": "Controlla l'e-mail con il codice che ti abbiamo inviato",
|
|
||||||
"View_Original": "Mostra originale",
|
"View_Original": "Mostra originale",
|
||||||
"Waiting_for_network": "In attesa di connessione ...",
|
"Waiting_for_network": "In attesa di connessione ...",
|
||||||
"Websocket_disabled": "Websocket disabilitata per questo server.\n{{contact}}",
|
"Websocket_disabled": "Websocket disabilitata per questo server.\n{{contact}}",
|
||||||
|
|
|
@ -340,7 +340,6 @@
|
||||||
"Send_audio_message": "Audiobericht verzenden",
|
"Send_audio_message": "Audiobericht verzenden",
|
||||||
"Send_crash_report": "Crashrapport verzenden",
|
"Send_crash_report": "Crashrapport verzenden",
|
||||||
"Send_message": "Bericht verzenden",
|
"Send_message": "Bericht verzenden",
|
||||||
"Send_me_the_code_again": "Stuur me de code opnieuw",
|
|
||||||
"Send_to": "Verzenden naar...",
|
"Send_to": "Verzenden naar...",
|
||||||
"Sending_to": "Verzenden naar",
|
"Sending_to": "Verzenden naar",
|
||||||
"Server": "Server",
|
"Server": "Server",
|
||||||
|
@ -401,7 +400,6 @@
|
||||||
"Uses_server_configuration": "Gebruikt serverconfiguratie",
|
"Uses_server_configuration": "Gebruikt serverconfiguratie",
|
||||||
"Registration_Succeeded": "Registratie geslaagd!",
|
"Registration_Succeeded": "Registratie geslaagd!",
|
||||||
"Verify_email_desc": "We hebben je een e-mail gestuurd om je inschrijving te bevestigen. Als je binnenkort geen e-mail ontvangt, gelieve terug te komen en het opnieuw te proberen.",
|
"Verify_email_desc": "We hebben je een e-mail gestuurd om je inschrijving te bevestigen. Als je binnenkort geen e-mail ontvangt, gelieve terug te komen en het opnieuw te proberen.",
|
||||||
"Verify_your_email_for_the_code_we_sent": "Verifieer je e-mail voor de code die we hebben gestuurd",
|
|
||||||
"View_Original": "Bekijk origineel",
|
"View_Original": "Bekijk origineel",
|
||||||
"Waiting_for_network": "Wachten op netwerk...",
|
"Waiting_for_network": "Wachten op netwerk...",
|
||||||
"Websocket_disabled": "Websocket is uitgeschakeld voor deze server.\n{{contact}}",
|
"Websocket_disabled": "Websocket is uitgeschakeld voor deze server.\n{{contact}}",
|
||||||
|
|
|
@ -365,7 +365,6 @@
|
||||||
"Send_audio_message": "Enviar mensagem de áudio",
|
"Send_audio_message": "Enviar mensagem de áudio",
|
||||||
"Send_crash_report": "Enviar relatório de erros",
|
"Send_crash_report": "Enviar relatório de erros",
|
||||||
"Send_message": "Enviar mensagem",
|
"Send_message": "Enviar mensagem",
|
||||||
"Send_me_the_code_again": "Envie-me o código novamente",
|
|
||||||
"Send_to": "Enviar para...",
|
"Send_to": "Enviar para...",
|
||||||
"Sending_to": "Envio para",
|
"Sending_to": "Envio para",
|
||||||
"Server": "Workspace",
|
"Server": "Workspace",
|
||||||
|
@ -435,7 +434,6 @@
|
||||||
"Uses_server_configuration": "Usar configuração da workspace",
|
"Uses_server_configuration": "Usar configuração da workspace",
|
||||||
"Registration_Succeeded": "Registrado com sucesso!",
|
"Registration_Succeeded": "Registrado com sucesso!",
|
||||||
"Verify_email_desc": "Nós lhe enviamos um e-mail para confirmar o seu registro. Se você não receber um e-mail em breve, por favor retorne e tente novamente.",
|
"Verify_email_desc": "Nós lhe enviamos um e-mail para confirmar o seu registro. Se você não receber um e-mail em breve, por favor retorne e tente novamente.",
|
||||||
"Verify_your_email_for_the_code_we_sent": "Verifique em seu e-mail o código que enviamos",
|
|
||||||
"View_Original": "Visualizar original",
|
"View_Original": "Visualizar original",
|
||||||
"Waiting_for_network": "Aguardando rede...",
|
"Waiting_for_network": "Aguardando rede...",
|
||||||
"Websocket_disabled": "Websocket está desativado para essa workspace.\n{{contact}}",
|
"Websocket_disabled": "Websocket está desativado para essa workspace.\n{{contact}}",
|
||||||
|
@ -785,10 +783,6 @@
|
||||||
"Jitsi_authentication_before_making_calls": "Jitsi pode exigir autenticação antes de fazer chamadas. Para saber mais sobre suas políticas, visite o site do Jitsi.",
|
"Jitsi_authentication_before_making_calls": "Jitsi pode exigir autenticação antes de fazer chamadas. Para saber mais sobre suas políticas, visite o site do Jitsi.",
|
||||||
"Jitsi_authentication_before_making_calls_ask_admin": "Se você acredita que há problemas com o Jitsi e sua autenticação, peça ajuda a um administrador do espaço de trabalho.",
|
"Jitsi_authentication_before_making_calls_ask_admin": "Se você acredita que há problemas com o Jitsi e sua autenticação, peça ajuda a um administrador do espaço de trabalho.",
|
||||||
"Continue": "Continuar",
|
"Continue": "Continuar",
|
||||||
"decline": "Recusar",
|
|
||||||
"accept": "Aceitar",
|
|
||||||
"Incoming_call_from": "Chamada recebida de",
|
|
||||||
"Call_started": "Chamada Iniciada",
|
|
||||||
"Your_push_was_sent_to_s_devices": "A sua notificação foi enviada para {{s}} dispositivos",
|
"Your_push_was_sent_to_s_devices": "A sua notificação foi enviada para {{s}} dispositivos",
|
||||||
"Message_has_been_shared": "Menssagem foi compartilhada",
|
"Message_has_been_shared": "Menssagem foi compartilhada",
|
||||||
"No_channels_in_team": "Nenhum canal nesta equipe",
|
"No_channels_in_team": "Nenhum canal nesta equipe",
|
||||||
|
@ -816,5 +810,8 @@
|
||||||
"In_app_message_notifications": "Notificações de mensagens in-app",
|
"In_app_message_notifications": "Notificações de mensagens in-app",
|
||||||
"Vibrate": "Vibrar",
|
"Vibrate": "Vibrar",
|
||||||
"Check_again": "Verificar novamente",
|
"Check_again": "Verificar novamente",
|
||||||
"error-no-tokens-for-this-user": "Não existem tokens para este usuário"
|
"error-no-tokens-for-this-user": "Não existem tokens para este usuário",
|
||||||
|
"Enter_the_code": "Insira o código que acabamos de enviar por e-mail.",
|
||||||
|
"Resend_email": "Reenviar e-mail",
|
||||||
|
"Verify": "Verificar"
|
||||||
}
|
}
|
|
@ -351,7 +351,6 @@
|
||||||
"Send_audio_message": "Отправить аудиосообщение",
|
"Send_audio_message": "Отправить аудиосообщение",
|
||||||
"Send_crash_report": "Отправить отчет об ошибке",
|
"Send_crash_report": "Отправить отчет об ошибке",
|
||||||
"Send_message": "Отправить сообщение",
|
"Send_message": "Отправить сообщение",
|
||||||
"Send_me_the_code_again": "Отправить мне код снова",
|
|
||||||
"Send_to": "Отправить...",
|
"Send_to": "Отправить...",
|
||||||
"Sending_to": "Отправляется",
|
"Sending_to": "Отправляется",
|
||||||
"Server": "Сервер",
|
"Server": "Сервер",
|
||||||
|
@ -412,7 +411,6 @@
|
||||||
"Uses_server_configuration": "Используется конфигурация сервера",
|
"Uses_server_configuration": "Используется конфигурация сервера",
|
||||||
"Registration_Succeeded": "Регистрация Успешна!",
|
"Registration_Succeeded": "Регистрация Успешна!",
|
||||||
"Verify_email_desc": "Вам был отправлен email для подтверждения регистрации. Если вы не получили этого сообщения, пожалуйста, попробуйте еще раз.",
|
"Verify_email_desc": "Вам был отправлен email для подтверждения регистрации. Если вы не получили этого сообщения, пожалуйста, попробуйте еще раз.",
|
||||||
"Verify_your_email_for_the_code_we_sent": "Проверка вашего email с помощью отправленного нами кода",
|
|
||||||
"View_Original": "Посмотреть оригинал",
|
"View_Original": "Посмотреть оригинал",
|
||||||
"Waiting_for_network": "Ожидание сети...",
|
"Waiting_for_network": "Ожидание сети...",
|
||||||
"Websocket_disabled": "Websocket отключен для этого сервера.\n{{contact}}",
|
"Websocket_disabled": "Websocket отключен для этого сервера.\n{{contact}}",
|
||||||
|
|
|
@ -348,7 +348,6 @@
|
||||||
"Send_audio_message": "Pošljite zvočno sporočilo",
|
"Send_audio_message": "Pošljite zvočno sporočilo",
|
||||||
"Send_crash_report": "Pošlji poročilo o sesutju",
|
"Send_crash_report": "Pošlji poročilo o sesutju",
|
||||||
"Send_message": "Pošlji sporočilo",
|
"Send_message": "Pošlji sporočilo",
|
||||||
"Send_me_the_code_again": "Pošljite mi kodo še enkrat",
|
|
||||||
"Send_to": "Pošlji...",
|
"Send_to": "Pošlji...",
|
||||||
"Sending_to": "Pošiljanje na",
|
"Sending_to": "Pošiljanje na",
|
||||||
"Server": "Strežnik",
|
"Server": "Strežnik",
|
||||||
|
@ -409,7 +408,6 @@
|
||||||
"Uses_server_configuration": "Uporablja konfiguracijo strežnika",
|
"Uses_server_configuration": "Uporablja konfiguracijo strežnika",
|
||||||
"Registration_Succeeded": "Registracija je bila uspešna",
|
"Registration_Succeeded": "Registracija je bila uspešna",
|
||||||
"Verify_email_desc": "Poslali smo vam e -poštno sporočilo za potrditev vaše registracije. Če v kratkem ne prejmete e -pošte, se vrnite in poskusite znova.",
|
"Verify_email_desc": "Poslali smo vam e -poštno sporočilo za potrditev vaše registracije. Če v kratkem ne prejmete e -pošte, se vrnite in poskusite znova.",
|
||||||
"Verify_your_email_for_the_code_we_sent": "Preverite svoj e -poštni naslov za kodo, ki smo jo poslali",
|
|
||||||
"View_Original": "Pogled original",
|
"View_Original": "Pogled original",
|
||||||
"Waiting_for_network": "Čakanje na omrežje ...",
|
"Waiting_for_network": "Čakanje na omrežje ...",
|
||||||
"Websocket_disabled": "WebSocket je onemogočen za ta strežnik.\n{{contact}}",
|
"Websocket_disabled": "WebSocket je onemogočen za ta strežnik.\n{{contact}}",
|
||||||
|
|
|
@ -365,7 +365,6 @@
|
||||||
"Send_audio_message": "Skicka ljudmeddelande",
|
"Send_audio_message": "Skicka ljudmeddelande",
|
||||||
"Send_crash_report": "Skicka kraschrapport",
|
"Send_crash_report": "Skicka kraschrapport",
|
||||||
"Send_message": "Skicka meddelande",
|
"Send_message": "Skicka meddelande",
|
||||||
"Send_me_the_code_again": "Skicka mig koden igen",
|
|
||||||
"Send_to": "Skicka till...",
|
"Send_to": "Skicka till...",
|
||||||
"Sending_to": "Skickar till",
|
"Sending_to": "Skickar till",
|
||||||
"Server": "Server",
|
"Server": "Server",
|
||||||
|
@ -432,7 +431,6 @@
|
||||||
"Uses_server_configuration": "Använder serverkonfiguration",
|
"Uses_server_configuration": "Använder serverkonfiguration",
|
||||||
"Registration_Succeeded": "Registreringen är klar.",
|
"Registration_Succeeded": "Registreringen är klar.",
|
||||||
"Verify_email_desc": "Vi har skickat ett e-postmeddelande för att bekräfta din registrering. Om du inte får e-postmeddelandet försöker du igen.",
|
"Verify_email_desc": "Vi har skickat ett e-postmeddelande för att bekräfta din registrering. Om du inte får e-postmeddelandet försöker du igen.",
|
||||||
"Verify_your_email_for_the_code_we_sent": "Titta efter koden i din e-post",
|
|
||||||
"View_Original": "Visa original",
|
"View_Original": "Visa original",
|
||||||
"Waiting_for_network": "Väntar på nätverket...",
|
"Waiting_for_network": "Väntar på nätverket...",
|
||||||
"Websocket_disabled": "Websocket är inaktiverad för servern.\n{{contact}}",
|
"Websocket_disabled": "Websocket är inaktiverad för servern.\n{{contact}}",
|
||||||
|
|
|
@ -365,7 +365,6 @@
|
||||||
"Send_audio_message": "ஒரு ஒலி செய்தியை அனுப்பு",
|
"Send_audio_message": "ஒரு ஒலி செய்தியை அனுப்பு",
|
||||||
"Send_crash_report": "குழப்பத்தின் அறிகையை அனுப்பு",
|
"Send_crash_report": "குழப்பத்தின் அறிகையை அனுப்பு",
|
||||||
"Send_message": "செய்தியை அனுப்பு",
|
"Send_message": "செய்தியை அனுப்பு",
|
||||||
"Send_me_the_code_again": "எனக்கு குறியீடுக்கு மீண்டும் அனுப்பு",
|
|
||||||
"Send_to": "அனுப்பு...",
|
"Send_to": "அனுப்பு...",
|
||||||
"Sending_to": "அனுப்பினது",
|
"Sending_to": "அனுப்பினது",
|
||||||
"Server": "பணி இடம்",
|
"Server": "பணி இடம்",
|
||||||
|
@ -433,7 +432,6 @@
|
||||||
"Uses_server_configuration": "பணியில் உள்ளேயே உபயோகிக்குகின்றது",
|
"Uses_server_configuration": "பணியில் உள்ளேயே உபயோகிக்குகின்றது",
|
||||||
"Registration_Succeeded": "பதிவு செய்தது வெற்றிகரமாகின்றது!",
|
"Registration_Succeeded": "பதிவு செய்தது வெற்றிகரமாகின்றது!",
|
||||||
"Verify_email_desc": "உங்களுக்கு உங்கள் பதிவுக்கு உறுதிப்படுத்த ஒரு மின்னஞ்சல் அனுப்பினோம். உங்களுக்கு விரைவில் ஒரு மின்னஞ்சல் பெறாதிருக்கின்றார்கள், தயவுசெய்து மீண்டும் வாருங்கள் மற்றும் முயற்சிக்கவும்.",
|
"Verify_email_desc": "உங்களுக்கு உங்கள் பதிவுக்கு உறுதிப்படுத்த ஒரு மின்னஞ்சல் அனுப்பினோம். உங்களுக்கு விரைவில் ஒரு மின்னஞ்சல் பெறாதிருக்கின்றார்கள், தயவுசெய்து மீண்டும் வாருங்கள் மற்றும் முயற்சிக்கவும்.",
|
||||||
"Verify_your_email_for_the_code_we_sent": "நாங்கள் அனுப்பிய குறியீடுக்கு உங்கள் மின்னஞ்சலை சரிபார்க்கவும்",
|
|
||||||
"View_Original": "மூலத்தைக் காண்",
|
"View_Original": "மூலத்தைக் காண்",
|
||||||
"Waiting_for_network": "பிணையத்தைக் காத்திருக்கின்றது...",
|
"Waiting_for_network": "பிணையத்தைக் காத்திருக்கின்றது...",
|
||||||
"Websocket_disabled": "இந்த பணியில் Websocket முடக்கப்பட்டுள்ளது.\n{{contact}}",
|
"Websocket_disabled": "இந்த பணியில் Websocket முடக்கப்பட்டுள்ளது.\n{{contact}}",
|
||||||
|
|
|
@ -365,7 +365,6 @@
|
||||||
"Send_audio_message": "ఆడియో సందేశాన్ని పంపండి",
|
"Send_audio_message": "ఆడియో సందేశాన్ని పంపండి",
|
||||||
"Send_crash_report": "క్రాష్ నివేదించండి",
|
"Send_crash_report": "క్రాష్ నివేదించండి",
|
||||||
"Send_message": "సందేశాన్ని పంపండి",
|
"Send_message": "సందేశాన్ని పంపండి",
|
||||||
"Send_me_the_code_again": "మళ్ళీ కోడ్ను పంపండి",
|
|
||||||
"Send_to": "పంపండి...",
|
"Send_to": "పంపండి...",
|
||||||
"Sending_to": "పంపిస్తోంది",
|
"Sending_to": "పంపిస్తోంది",
|
||||||
"Server": "పనితనం",
|
"Server": "పనితనం",
|
||||||
|
@ -433,7 +432,6 @@
|
||||||
"Uses_server_configuration": "పనితనం ఆకృతి ఉపయోగిస్తుంది",
|
"Uses_server_configuration": "పనితనం ఆకృతి ఉపయోగిస్తుంది",
|
||||||
"Registration_Succeeded": "నమోదు విజయవంతంగా చేయబడింది!",
|
"Registration_Succeeded": "నమోదు విజయవంతంగా చేయబడింది!",
|
||||||
"Verify_email_desc": "మేము మీ నమోదుని ధ్యానంలోకి పెంపొందాం. మీరు తక్షణం ఒక ఇమెయిల్ పొందరాక, దయచేసి మళ్ళీ ప్రయత్నించండి.",
|
"Verify_email_desc": "మేము మీ నమోదుని ధ్యానంలోకి పెంపొందాం. మీరు తక్షణం ఒక ఇమెయిల్ పొందరాక, దయచేసి మళ్ళీ ప్రయత్నించండి.",
|
||||||
"Verify_your_email_for_the_code_we_sent": "మేము పంపిన కోడ్ కోసం మీ ఇమెయిల్ని ధ్యానంలోకి పెంచండి",
|
|
||||||
"View_Original": "అసలు చూడండి",
|
"View_Original": "అసలు చూడండి",
|
||||||
"Waiting_for_network": "నెట్వర్క్ కోసం వేచి ఉండి...",
|
"Waiting_for_network": "నెట్వర్క్ కోసం వేచి ఉండి...",
|
||||||
"Websocket_disabled": "ఈ పనితనంలో వెబ్సాకెట్ నిషేధించబడింది.\n{{contact}}",
|
"Websocket_disabled": "ఈ పనితనంలో వెబ్సాకెట్ నిషేధించబడింది.\n{{contact}}",
|
||||||
|
|
|
@ -328,7 +328,6 @@
|
||||||
"Send_audio_message": "Sesli ileti gönder",
|
"Send_audio_message": "Sesli ileti gönder",
|
||||||
"Send_crash_report": "Çökme raporu gönder",
|
"Send_crash_report": "Çökme raporu gönder",
|
||||||
"Send_message": "İleti gönder",
|
"Send_message": "İleti gönder",
|
||||||
"Send_me_the_code_again": "Kodu tekrar gönder",
|
|
||||||
"Send_to": "Gönderiliyor...",
|
"Send_to": "Gönderiliyor...",
|
||||||
"Sending_to": "Gönderiliyor:",
|
"Sending_to": "Gönderiliyor:",
|
||||||
"Server": "Sunucu",
|
"Server": "Sunucu",
|
||||||
|
@ -388,7 +387,6 @@
|
||||||
"Uses_server_configuration": "Sunucu yapılandırmasını kullanır",
|
"Uses_server_configuration": "Sunucu yapılandırmasını kullanır",
|
||||||
"Registration_Succeeded": "Kayıt Başarılı!",
|
"Registration_Succeeded": "Kayıt Başarılı!",
|
||||||
"Verify_email_desc": "Kaydınızı onaylamak için size bir e-posta gönderdik. Kısa süre içinde bir e-posta almazsanız, lütfen geri gelin ve tekrar deneyin.",
|
"Verify_email_desc": "Kaydınızı onaylamak için size bir e-posta gönderdik. Kısa süre içinde bir e-posta almazsanız, lütfen geri gelin ve tekrar deneyin.",
|
||||||
"Verify_your_email_for_the_code_we_sent": "Gönderdiğimiz kod için e-postanızı doğrulayın",
|
|
||||||
"View_Original": "Orijinali Görüntüle",
|
"View_Original": "Orijinali Görüntüle",
|
||||||
"Waiting_for_network": "Ağ bağlantısı bekleniyor ...",
|
"Waiting_for_network": "Ağ bağlantısı bekleniyor ...",
|
||||||
"Websocket_disabled": "Bu sunucu için Websocket devre dışı bırakıldı.\n{{contact}}",
|
"Websocket_disabled": "Bu sunucu için Websocket devre dışı bırakıldı.\n{{contact}}",
|
||||||
|
|
|
@ -324,7 +324,6 @@
|
||||||
"Send_audio_message": "发送音频信息",
|
"Send_audio_message": "发送音频信息",
|
||||||
"Send_crash_report": "送出当机报告",
|
"Send_crash_report": "送出当机报告",
|
||||||
"Send_message": "发送信息",
|
"Send_message": "发送信息",
|
||||||
"Send_me_the_code_again": "再次发送代码给我",
|
|
||||||
"Send_to": "发送到",
|
"Send_to": "发送到",
|
||||||
"Sending_to": "正发送到",
|
"Sending_to": "正发送到",
|
||||||
"Server": "服务器",
|
"Server": "服务器",
|
||||||
|
@ -384,7 +383,6 @@
|
||||||
"Uses_server_configuration": "使用服务器设置",
|
"Uses_server_configuration": "使用服务器设置",
|
||||||
"Registration_Succeeded": "注册成功",
|
"Registration_Succeeded": "注册成功",
|
||||||
"Verify_email_desc": "我们已经送出一封电子邮件,以确认您的注册。如果您没有很快收到,请再试一次。",
|
"Verify_email_desc": "我们已经送出一封电子邮件,以确认您的注册。如果您没有很快收到,请再试一次。",
|
||||||
"Verify_your_email_for_the_code_we_sent": "检查您的电子邮件以取得我们发送的代码",
|
|
||||||
"View_Original": "检视原文",
|
"View_Original": "检视原文",
|
||||||
"Waiting_for_network": "等待网路连接",
|
"Waiting_for_network": "等待网路连接",
|
||||||
"Websocket_disabled": "Websocket 已于此伺服器上禁用。 \\n{{contact}}",
|
"Websocket_disabled": "Websocket 已于此伺服器上禁用。 \\n{{contact}}",
|
||||||
|
|
|
@ -330,7 +330,6 @@
|
||||||
"Send_audio_message": "發送語音訊息",
|
"Send_audio_message": "發送語音訊息",
|
||||||
"Send_crash_report": "送出當機報告",
|
"Send_crash_report": "送出當機報告",
|
||||||
"Send_message": "發送訊息",
|
"Send_message": "發送訊息",
|
||||||
"Send_me_the_code_again": "再次發送代碼給我",
|
|
||||||
"Send_to": "發送到",
|
"Send_to": "發送到",
|
||||||
"Sending_to": "正發送到",
|
"Sending_to": "正發送到",
|
||||||
"Server": "伺服器",
|
"Server": "伺服器",
|
||||||
|
@ -390,7 +389,6 @@
|
||||||
"Uses_server_configuration": "使用伺服器設定",
|
"Uses_server_configuration": "使用伺服器設定",
|
||||||
"Registration_Succeeded": "註冊成功",
|
"Registration_Succeeded": "註冊成功",
|
||||||
"Verify_email_desc": "我們已經送出一封電子郵件,以確認您的註冊。如果您沒有很快收到,請再試一次。",
|
"Verify_email_desc": "我們已經送出一封電子郵件,以確認您的註冊。如果您沒有很快收到,請再試一次。",
|
||||||
"Verify_your_email_for_the_code_we_sent": "檢查您的電子郵件以取得我們發送的代碼",
|
|
||||||
"View_Original": "檢視原文",
|
"View_Original": "檢視原文",
|
||||||
"Waiting_for_network": "等待網路連線",
|
"Waiting_for_network": "等待網路連線",
|
||||||
"Websocket_disabled": "Websocket 已於此伺服器上禁用。\\n{{contact}}",
|
"Websocket_disabled": "Websocket 已於此伺服器上禁用。\\n{{contact}}",
|
||||||
|
|
File diff suppressed because one or more lines are too long
|
@ -0,0 +1,5 @@
|
||||||
|
import ImagePicker, { Image as ImageInterface, ImageOrVideo as ImageOrVideoType } from 'react-native-image-crop-picker';
|
||||||
|
|
||||||
|
export type Image = ImageInterface;
|
||||||
|
export type ImageOrVideo = ImageOrVideoType;
|
||||||
|
export default ImagePicker;
|
|
@ -7,7 +7,7 @@ export interface IInAppFeedbackState {
|
||||||
|
|
||||||
export const initialState: IInAppFeedbackState = {};
|
export const initialState: IInAppFeedbackState = {};
|
||||||
|
|
||||||
export default function activeUsers(state = initialState, action: TApplicationActions): IInAppFeedbackState {
|
export default function inAppFeedback(state = initialState, action: TApplicationActions): IInAppFeedbackState {
|
||||||
switch (action.type) {
|
switch (action.type) {
|
||||||
case IN_APP_FEEDBACK.SET:
|
case IN_APP_FEEDBACK.SET:
|
||||||
const { msgId } = action;
|
const { msgId } = action;
|
||||||
|
|
|
@ -25,7 +25,7 @@ import { IAvatar } from '../../definitions';
|
||||||
import AvatarSuggestion from './AvatarSuggestion';
|
import AvatarSuggestion from './AvatarSuggestion';
|
||||||
import log from '../../lib/methods/helpers/log';
|
import log from '../../lib/methods/helpers/log';
|
||||||
import { changeRoomsAvatar, changeUserAvatar, resetUserAvatar } from './submitServices';
|
import { changeRoomsAvatar, changeUserAvatar, resetUserAvatar } from './submitServices';
|
||||||
import ImagePicker, { Image } from './ImagePicker';
|
import ImagePicker, { Image } from '../../lib/methods/helpers/ImagePicker/ImagePicker';
|
||||||
|
|
||||||
enum AvatarStateActions {
|
enum AvatarStateActions {
|
||||||
CHANGE_AVATAR = 'CHANGE_AVATAR',
|
CHANGE_AVATAR = 'CHANGE_AVATAR',
|
||||||
|
|
|
@ -159,7 +159,7 @@ const RoomInfoView = (): React.ReactElement => {
|
||||||
const loadUser = async () => {
|
const loadUser = async () => {
|
||||||
if (isEmpty(roomUser)) {
|
if (isEmpty(roomUser)) {
|
||||||
try {
|
try {
|
||||||
const roomUserId = getUidDirectMessage(room || { rid, t, itsMe });
|
const roomUserId = getUidDirectMessage({ ...(room || { rid, t }), itsMe });
|
||||||
const result = await Services.getUserInfo(roomUserId);
|
const result = await Services.getUserInfo(roomUserId);
|
||||||
if (result.success) {
|
if (result.success) {
|
||||||
const { user } = result;
|
const { user } = result;
|
||||||
|
|
|
@ -690,7 +690,6 @@ class RoomView extends React.Component<IRoomViewProps, IRoomViewState> {
|
||||||
|
|
||||||
onEditInit = (messageId: string) => {
|
onEditInit = (messageId: string) => {
|
||||||
const { action } = this.state;
|
const { action } = this.state;
|
||||||
// TODO: implement multiple actions running. Quoting, then edit. Edit then quote.
|
|
||||||
if (action) {
|
if (action) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -739,7 +738,6 @@ class RoomView extends React.Component<IRoomViewProps, IRoomViewState> {
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
// TODO: implement multiple actions running. Quoting, then edit. Edit then quote.
|
|
||||||
if (action) {
|
if (action) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -776,7 +774,6 @@ class RoomView extends React.Component<IRoomViewProps, IRoomViewState> {
|
||||||
};
|
};
|
||||||
|
|
||||||
onReactionInit = (messageId: string) => {
|
onReactionInit = (messageId: string) => {
|
||||||
// TODO: implement multiple actions running. Quoting, then edit. Edit then quote.
|
|
||||||
if (this.state.action) {
|
if (this.state.action) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -793,7 +790,6 @@ class RoomView extends React.Component<IRoomViewProps, IRoomViewState> {
|
||||||
|
|
||||||
onMessageLongPress = (message: TAnyMessageModel) => {
|
onMessageLongPress = (message: TAnyMessageModel) => {
|
||||||
const { action } = this.state;
|
const { action } = this.state;
|
||||||
// TODO: implement multiple actions running. Quoting, then edit. Edit then quote.
|
|
||||||
if (action && action !== 'quote') {
|
if (action && action !== 'quote') {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
|
@ -126,7 +126,7 @@ class ShareView extends Component<IShareViewProps, IShareViewState> {
|
||||||
|
|
||||||
// if is share extension show default back button
|
// if is share extension show default back button
|
||||||
if (!this.isShareExtension) {
|
if (!this.isShareExtension) {
|
||||||
options.headerLeft = () => <HeaderButton.CloseModal navigation={navigation} color={themes[theme].previewTintColor} />;
|
options.headerLeft = () => <HeaderButton.CloseModal navigation={navigation} color={themes[theme].previewTintColor} testID='share-view-close' />;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!attachments.length && !readOnly) {
|
if (!attachments.length && !readOnly) {
|
||||||
|
|
|
@ -7,7 +7,8 @@ const defaultTextStyle: TextStyle = {
|
||||||
backgroundColor: 'transparent',
|
backgroundColor: 'transparent',
|
||||||
...Platform.select({
|
...Platform.select({
|
||||||
android: {
|
android: {
|
||||||
includeFontPadding: false
|
includeFontPadding: false,
|
||||||
|
alignSelf: 'stretch'
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
};
|
};
|
||||||
|
|
|
@ -143,6 +143,20 @@ async function navigateToRoom(room: string) {
|
||||||
await checkRoomTitle(room);
|
await checkRoomTitle(room);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async function navigateToRecentRoom(room: string) {
|
||||||
|
await waitFor(element(by.id('rooms-list-view')))
|
||||||
|
.toExist()
|
||||||
|
.withTimeout(10000);
|
||||||
|
await tapAndWaitFor(element(by.id('rooms-list-view-search')), element(by.id('rooms-list-view-search-input')), 5000);
|
||||||
|
await waitFor(element(by.id(`rooms-list-view-item-${room}`)))
|
||||||
|
.toBeVisible()
|
||||||
|
.withTimeout(10000);
|
||||||
|
await element(by.id(`rooms-list-view-item-${room}`)).tap();
|
||||||
|
await waitFor(element(by.id(`room-view-title-${room}`)))
|
||||||
|
.toBeVisible()
|
||||||
|
.withTimeout(10000);
|
||||||
|
}
|
||||||
|
|
||||||
async function tryTapping(
|
async function tryTapping(
|
||||||
theElement: Detox.IndexableNativeElement | Detox.NativeElement,
|
theElement: Detox.IndexableNativeElement | Detox.NativeElement,
|
||||||
timeout: number,
|
timeout: number,
|
||||||
|
@ -261,5 +275,6 @@ export {
|
||||||
checkServer,
|
checkServer,
|
||||||
platformTypes,
|
platformTypes,
|
||||||
expectValidRegisterOrRetry,
|
expectValidRegisterOrRetry,
|
||||||
jumpToQuotedMessage
|
jumpToQuotedMessage,
|
||||||
|
navigateToRecentRoom
|
||||||
};
|
};
|
||||||
|
|
|
@ -22,7 +22,7 @@ import random from '../../helpers/random';
|
||||||
|
|
||||||
const DEEPLINK_METHODS = { AUTH: 'auth', ROOM: 'room' };
|
const DEEPLINK_METHODS = { AUTH: 'auth', ROOM: 'room' };
|
||||||
|
|
||||||
let amp = '&';
|
const amp = '&';
|
||||||
|
|
||||||
const getDeepLink = (method: string, server: string, params?: string) => {
|
const getDeepLink = (method: string, server: string, params?: string) => {
|
||||||
const deeplink = `rocketchat://${method}?host=${server.replace(/^(http:\/\/|https:\/\/)/, '')}${amp}${params}`;
|
const deeplink = `rocketchat://${method}?host=${server.replace(/^(http:\/\/|https:\/\/)/, '')}${amp}${params}`;
|
||||||
|
@ -47,7 +47,6 @@ describe('Deep linking', () => {
|
||||||
const loginResult = await login(user.username, user.password);
|
const loginResult = await login(user.username, user.password);
|
||||||
({ userId, authToken } = loginResult);
|
({ userId, authToken } = loginResult);
|
||||||
const deviceType = device.getPlatform();
|
const deviceType = device.getPlatform();
|
||||||
amp = deviceType === 'android' ? '\\&' : '&';
|
|
||||||
({ textMatcher } = platformTypes[deviceType]);
|
({ textMatcher } = platformTypes[deviceType]);
|
||||||
// create a thread with api
|
// create a thread with api
|
||||||
const result = await sendMessage(user, room, threadMessage);
|
const result = await sendMessage(user, room, threadMessage);
|
||||||
|
|
|
@ -5,21 +5,15 @@ import {
|
||||||
login,
|
login,
|
||||||
tapBack,
|
tapBack,
|
||||||
sleep,
|
sleep,
|
||||||
searchRoom,
|
|
||||||
tryTapping,
|
tryTapping,
|
||||||
platformTypes,
|
platformTypes,
|
||||||
TTextMatcher,
|
TTextMatcher,
|
||||||
mockMessage
|
mockMessage,
|
||||||
|
navigateToRoom,
|
||||||
|
navigateToRecentRoom
|
||||||
} from '../../helpers/app';
|
} from '../../helpers/app';
|
||||||
import { createRandomRoom, createRandomUser, ITestUser, sendMessage } from '../../helpers/data_setup';
|
import { createRandomRoom, createRandomUser, deleteCreatedUsers, ITestUser, sendMessage } from '../../helpers/data_setup';
|
||||||
|
import data from '../../data';
|
||||||
async function navigateToRoom(roomName: string) {
|
|
||||||
await searchRoom(`${roomName}`);
|
|
||||||
await element(by.id(`rooms-list-view-item-${roomName}`)).tap();
|
|
||||||
await waitFor(element(by.id('room-view')))
|
|
||||||
.toBeVisible()
|
|
||||||
.withTimeout(5000);
|
|
||||||
}
|
|
||||||
|
|
||||||
describe('Room screen', () => {
|
describe('Room screen', () => {
|
||||||
let room: string;
|
let room: string;
|
||||||
|
@ -244,6 +238,39 @@ describe('Room screen', () => {
|
||||||
await element(by.id('action-sheet-handle')).swipe('down', 'fast', 0.5);
|
await element(by.id('action-sheet-handle')).swipe('down', 'fast', 0.5);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('should open the profile view tapping on his username', async () => {
|
||||||
|
const { username } = user;
|
||||||
|
await waitFor(element(by.id(`username-header-${username}`)))
|
||||||
|
.toExist()
|
||||||
|
.withTimeout(2000);
|
||||||
|
await element(by.id(`username-header-${username}`)).tap();
|
||||||
|
await waitFor(element(by.id('room-info-view-username')))
|
||||||
|
.toExist()
|
||||||
|
.withTimeout(2000);
|
||||||
|
await waitFor(element(by[textMatcher](`@${username}`)))
|
||||||
|
.toExist()
|
||||||
|
.withTimeout(2000);
|
||||||
|
await tapBack();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should open the profile view tapping on other username', async () => {
|
||||||
|
const otherUser = await createRandomUser();
|
||||||
|
const { username } = otherUser;
|
||||||
|
await sendMessage(otherUser, room, 'new message');
|
||||||
|
await waitFor(element(by.id(`username-header-${username}`)))
|
||||||
|
.toExist()
|
||||||
|
.withTimeout(2000);
|
||||||
|
await element(by.id(`username-header-${username}`)).tap();
|
||||||
|
await waitFor(element(by.id('room-info-view-username')))
|
||||||
|
.toExist()
|
||||||
|
.withTimeout(2000);
|
||||||
|
await waitFor(element(by[textMatcher](`@${username}`)))
|
||||||
|
.toExist()
|
||||||
|
.withTimeout(2000);
|
||||||
|
await tapBack();
|
||||||
|
await deleteCreatedUsers([{ server: data.server, username }]);
|
||||||
|
});
|
||||||
|
|
||||||
it('should edit message', async () => {
|
it('should edit message', async () => {
|
||||||
const editMessage = await mockMessage('edit');
|
const editMessage = await mockMessage('edit');
|
||||||
const editedMessage = `${editMessage}ed`;
|
const editedMessage = `${editMessage}ed`;
|
||||||
|
@ -371,6 +398,103 @@ describe('Room screen', () => {
|
||||||
.toExist()
|
.toExist()
|
||||||
.withTimeout(60000);
|
.withTimeout(60000);
|
||||||
await element(by[textMatcher](replyMessage)).atIndex(0).tap();
|
await element(by[textMatcher](replyMessage)).atIndex(0).tap();
|
||||||
|
await tapBack();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should save message and quote draft correctly', async () => {
|
||||||
|
const newUser = await createRandomUser();
|
||||||
|
const { name: draftRoom } = await createRandomRoom(newUser, 'c');
|
||||||
|
const draftMessage = 'draft';
|
||||||
|
const originalMessage = '123';
|
||||||
|
const quoteMessage = '123456';
|
||||||
|
await sendMessage(newUser, draftRoom, originalMessage);
|
||||||
|
await waitFor(element(by.id('rooms-list-view')))
|
||||||
|
.toBeVisible()
|
||||||
|
.withTimeout(5000);
|
||||||
|
await navigateToRoom(draftRoom);
|
||||||
|
await waitFor(element(by[textMatcher](originalMessage)).atIndex(0))
|
||||||
|
.toBeVisible()
|
||||||
|
.withTimeout(10000);
|
||||||
|
await element(by.id('room-view-join-button')).tap();
|
||||||
|
await waitFor(element(by.id('room-view-join-button')))
|
||||||
|
.not.toBeVisible()
|
||||||
|
.withTimeout(10000);
|
||||||
|
// add draft
|
||||||
|
await element(by.id('message-composer-input')).typeText(draftMessage);
|
||||||
|
await tapBack();
|
||||||
|
await navigateToRecentRoom(draftRoom);
|
||||||
|
await sleep(500); // wait for animation
|
||||||
|
await expect(element(by.id('message-composer-input'))).toHaveText(draftMessage);
|
||||||
|
// add quote to draft
|
||||||
|
await tryTapping(element(by[textMatcher](originalMessage)).atIndex(0), 2000, true);
|
||||||
|
await waitFor(element(by.id('action-sheet')))
|
||||||
|
.toExist()
|
||||||
|
.withTimeout(5000);
|
||||||
|
await expect(element(by.id('action-sheet-handle'))).toBeVisible();
|
||||||
|
await element(by.id('action-sheet-handle')).swipe('up', 'fast', 0.5);
|
||||||
|
await element(by[textMatcher]('Quote')).atIndex(0).tap();
|
||||||
|
await waitFor(element(by.id(`markdown-preview-${originalMessage}`)))
|
||||||
|
.toBeVisible()
|
||||||
|
.withTimeout(10000);
|
||||||
|
await tapBack();
|
||||||
|
await navigateToRecentRoom(draftRoom);
|
||||||
|
await sleep(500); // wait for animation
|
||||||
|
await waitFor(element(by.id(`markdown-preview-${originalMessage}`)))
|
||||||
|
.toBeVisible()
|
||||||
|
.withTimeout(10000);
|
||||||
|
// edit draft with quote
|
||||||
|
await element(by.id('message-composer-input')).replaceText(quoteMessage);
|
||||||
|
await tapBack();
|
||||||
|
await navigateToRecentRoom(draftRoom);
|
||||||
|
await sleep(500); // wait for animation
|
||||||
|
await expect(element(by.id('message-composer-input'))).toHaveText(quoteMessage);
|
||||||
|
// send message
|
||||||
|
await waitFor(element(by.id('message-composer-send')))
|
||||||
|
.toExist()
|
||||||
|
.withTimeout(5000);
|
||||||
|
await element(by.id('message-composer-send')).tap();
|
||||||
|
await waitFor(element(by.id(`reply-${newUser.name}-${originalMessage}`).withDescendant(by[textMatcher](originalMessage))))
|
||||||
|
.toBeVisible()
|
||||||
|
.withTimeout(5000);
|
||||||
|
await expect(element(by.id('message-composer-input'))).toHaveText('');
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should edit message on shareview and after close the text needs to be changed on roomView', async () => {
|
||||||
|
const draftShareMessage = 'draftShare';
|
||||||
|
const originalMessage = '123';
|
||||||
|
await element(by.id('message-composer-input')).typeText(draftShareMessage);
|
||||||
|
await element(by.id('message-composer-actions')).tap();
|
||||||
|
await waitFor(element(by.id('action-sheet')))
|
||||||
|
.toExist()
|
||||||
|
.withTimeout(2000);
|
||||||
|
await element(by[textMatcher]('Choose from library')).atIndex(0).tap();
|
||||||
|
await sleep(300); // wait for animation
|
||||||
|
await waitFor(element(by.id('message-composer-input-share')))
|
||||||
|
.toHaveText(draftShareMessage)
|
||||||
|
.withTimeout(2000);
|
||||||
|
await element(by.id('message-composer-input-share')).replaceText(draftShareMessage + originalMessage);
|
||||||
|
await element(by.id('share-view-close')).tap();
|
||||||
|
await sleep(500); // wait for animation
|
||||||
|
await waitFor(element(by.id('message-composer-input')))
|
||||||
|
.toHaveText(draftShareMessage + originalMessage)
|
||||||
|
.withTimeout(2000);
|
||||||
|
// add quote to draft
|
||||||
|
await tryTapping(element(by[textMatcher](originalMessage)).atIndex(0), 2000, true);
|
||||||
|
await waitFor(element(by.id('action-sheet')))
|
||||||
|
.toExist()
|
||||||
|
.withTimeout(2000);
|
||||||
|
await expect(element(by.id('action-sheet-handle'))).toBeVisible();
|
||||||
|
await element(by.id('action-sheet-handle')).swipe('up', 'fast', 0.5);
|
||||||
|
await element(by[textMatcher]('Quote')).atIndex(0).tap();
|
||||||
|
await element(by.id('message-composer-actions')).tap();
|
||||||
|
await waitFor(element(by.id('action-sheet')))
|
||||||
|
.toExist()
|
||||||
|
.withTimeout(2000);
|
||||||
|
await element(by[textMatcher]('Choose from library')).atIndex(0).tap();
|
||||||
|
await sleep(500); // wait for animation
|
||||||
|
await waitFor(element(by.id(`markdown-preview-${originalMessage}`)).atIndex(0))
|
||||||
|
.toExist()
|
||||||
|
.withTimeout(20000);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
|
@ -1,6 +1,5 @@
|
||||||
import React from 'react';
|
import React from 'react';
|
||||||
import '@testing-library/react-native/extend-expect';
|
import '@testing-library/react-native/extend-expect';
|
||||||
import '@testing-library/jest-native/legacy-extend-expect';
|
|
||||||
import mockClipboard from '@react-native-clipboard/clipboard/jest/clipboard-mock.js';
|
import mockClipboard from '@react-native-clipboard/clipboard/jest/clipboard-mock.js';
|
||||||
import mockAsyncStorage from '@react-native-async-storage/async-storage/jest/async-storage-mock';
|
import mockAsyncStorage from '@react-native-async-storage/async-storage/jest/async-storage-mock';
|
||||||
|
|
||||||
|
@ -17,6 +16,10 @@ jest.mock('react-native-safe-area-context', () => {
|
||||||
};
|
};
|
||||||
});
|
});
|
||||||
|
|
||||||
|
jest.mock('./node_modules/react-native/Libraries/Interaction/InteractionManager', () => ({
|
||||||
|
runAfterInteractions: callback => callback()
|
||||||
|
}));
|
||||||
|
|
||||||
// @ts-ignore
|
// @ts-ignore
|
||||||
global.__reanimatedWorkletInit = () => {};
|
global.__reanimatedWorkletInit = () => {};
|
||||||
jest.mock('react-native-reanimated', () => require('react-native-reanimated/mock'));
|
jest.mock('react-native-reanimated', () => require('react-native-reanimated/mock'));
|
||||||
|
@ -41,6 +44,24 @@ jest.mock('react-native-file-viewer', () => ({
|
||||||
|
|
||||||
jest.mock('expo-haptics', () => jest.fn(() => null));
|
jest.mock('expo-haptics', () => jest.fn(() => null));
|
||||||
|
|
||||||
|
jest.mock('expo-av', () => ({
|
||||||
|
...jest.requireActual('expo-av'),
|
||||||
|
Audio: {
|
||||||
|
...jest.requireActual('expo-av').Audio,
|
||||||
|
getPermissionsAsync: jest.fn(() => ({ status: 'granted', granted: true, canAskAgain: true })),
|
||||||
|
Recording: jest.fn(() => ({
|
||||||
|
prepareToRecordAsync: jest.fn(),
|
||||||
|
startAsync: jest.fn(),
|
||||||
|
stopAndUnloadAsync: jest.fn(),
|
||||||
|
setOnRecordingStatusUpdate: jest.fn()
|
||||||
|
}))
|
||||||
|
}
|
||||||
|
}));
|
||||||
|
|
||||||
|
jest.mock('./app/lib/methods/search', () => ({
|
||||||
|
search: () => []
|
||||||
|
}));
|
||||||
|
|
||||||
jest.mock('./app/lib/database', () => jest.fn(() => null));
|
jest.mock('./app/lib/database', () => jest.fn(() => null));
|
||||||
|
|
||||||
jest.mock('./app/containers/MessageComposer/components/EmojiKeyboard', () => jest.fn(() => null));
|
jest.mock('./app/containers/MessageComposer/components/EmojiKeyboard', () => jest.fn(() => null));
|
||||||
|
@ -60,20 +81,24 @@ jest.mock('./app/lib/database/services/Message', () => ({
|
||||||
})
|
})
|
||||||
}));
|
}));
|
||||||
|
|
||||||
const mockedNavigate = jest.fn();
|
jest.mock('@react-navigation/native', () => {
|
||||||
|
const actualNav = jest.requireActual('@react-navigation/native');
|
||||||
jest.mock('@react-navigation/native', () => ({
|
const { useEffect } = require('react');
|
||||||
...jest.requireActual('@react-navigation/native'),
|
return {
|
||||||
|
...actualNav,
|
||||||
|
useFocusEffect: useEffect,
|
||||||
|
isFocused: () => true,
|
||||||
|
useIsFocused: () => true,
|
||||||
|
useRoute: () => jest.fn(),
|
||||||
useNavigation: () => ({
|
useNavigation: () => ({
|
||||||
navigate: jest.fn(),
|
navigate: jest.fn(),
|
||||||
addListener: jest.fn().mockImplementation((event, callback) => {
|
addListener: () => jest.fn()
|
||||||
callback();
|
}),
|
||||||
return {
|
createNavigationContainerRef: jest.fn(),
|
||||||
remove: jest.fn()
|
navigate: jest.fn(),
|
||||||
|
addListener: jest.fn(() => jest.fn())
|
||||||
};
|
};
|
||||||
})
|
});
|
||||||
})
|
|
||||||
}));
|
|
||||||
|
|
||||||
jest.mock('react-native-notifications', () => ({
|
jest.mock('react-native-notifications', () => ({
|
||||||
Notifications: {
|
Notifications: {
|
||||||
|
|
|
@ -165,9 +165,8 @@
|
||||||
"@storybook/addon-storyshots": "6.3",
|
"@storybook/addon-storyshots": "6.3",
|
||||||
"@storybook/react": "6.3",
|
"@storybook/react": "6.3",
|
||||||
"@storybook/react-native": "^6.0.1-beta.7",
|
"@storybook/react-native": "^6.0.1-beta.7",
|
||||||
"@testing-library/jest-native": "^5.4.2",
|
|
||||||
"@testing-library/react-hooks": "^8.0.1",
|
"@testing-library/react-hooks": "^8.0.1",
|
||||||
"@testing-library/react-native": "^12.4.1",
|
"@testing-library/react-native": "^12.4.3",
|
||||||
"@types/bytebuffer": "^5.0.44",
|
"@types/bytebuffer": "^5.0.44",
|
||||||
"@types/ejson": "^2.1.3",
|
"@types/ejson": "^2.1.3",
|
||||||
"@types/i18n-js": "^3.8.3",
|
"@types/i18n-js": "^3.8.3",
|
||||||
|
@ -192,7 +191,7 @@
|
||||||
"babel-loader": "8.3.0",
|
"babel-loader": "8.3.0",
|
||||||
"babel-plugin-transform-remove-console": "^6.9.4",
|
"babel-plugin-transform-remove-console": "^6.9.4",
|
||||||
"codecov": "^3.8.3",
|
"codecov": "^3.8.3",
|
||||||
"detox": "20.11.0",
|
"detox": "20.17.1",
|
||||||
"eslint": "^7.32.0",
|
"eslint": "^7.32.0",
|
||||||
"eslint-config-prettier": "^8.5.0",
|
"eslint-config-prettier": "^8.5.0",
|
||||||
"eslint-plugin-import": "2.26.0",
|
"eslint-plugin-import": "2.26.0",
|
||||||
|
@ -224,7 +223,7 @@
|
||||||
"node_modules"
|
"node_modules"
|
||||||
],
|
],
|
||||||
"transformIgnorePatterns": [
|
"transformIgnorePatterns": [
|
||||||
"node_modules/(?!(jest-)?@?react-native|@react-native-community|@react-navigation|expo)"
|
"node_modules/(?!((jest-)?react-native|@react-native(-community)?)|expo(nent)?|@expo(nent)?/.*|@expo-google-fonts/.*|react-navigation|@react-navigation/.*|@unimodules/.*|unimodules|sentry-expo|native-base|react-native-svg)"
|
||||||
],
|
],
|
||||||
"preset": "./jest.preset.js",
|
"preset": "./jest.preset.js",
|
||||||
"coverageDirectory": "./coverage/",
|
"coverageDirectory": "./coverage/",
|
||||||
|
|
118
yarn.lock
118
yarn.lock
|
@ -4335,6 +4335,11 @@
|
||||||
find-up "^5.0.0"
|
find-up "^5.0.0"
|
||||||
js-yaml "^4.1.0"
|
js-yaml "^4.1.0"
|
||||||
|
|
||||||
|
"@flatten-js/interval-tree@^1.1.2":
|
||||||
|
version "1.1.2"
|
||||||
|
resolved "https://registry.yarnpkg.com/@flatten-js/interval-tree/-/interval-tree-1.1.2.tgz#fcc891da48bc230392884be01c26fe8c625702e8"
|
||||||
|
integrity sha512-OwLoV9E/XM6b7bes2rSFnGNjyRy7vcoIHFTnmBR2WAaZTf0Fe4EX4GdA65vU1KgFAasti7iRSg2dZfYd1Zt00Q==
|
||||||
|
|
||||||
"@gar/promisify@^1.0.1":
|
"@gar/promisify@^1.0.1":
|
||||||
version "1.1.3"
|
version "1.1.3"
|
||||||
resolved "https://registry.yarnpkg.com/@gar/promisify/-/promisify-1.1.3.tgz#555193ab2e3bb3b6adc3d551c9c030d9e860daf6"
|
resolved "https://registry.yarnpkg.com/@gar/promisify/-/promisify-1.1.3.tgz#555193ab2e3bb3b6adc3d551c9c030d9e860daf6"
|
||||||
|
@ -6292,17 +6297,6 @@
|
||||||
resolve-from "^5.0.0"
|
resolve-from "^5.0.0"
|
||||||
store2 "^2.12.0"
|
store2 "^2.12.0"
|
||||||
|
|
||||||
"@testing-library/jest-native@^5.4.2":
|
|
||||||
version "5.4.3"
|
|
||||||
resolved "https://registry.yarnpkg.com/@testing-library/jest-native/-/jest-native-5.4.3.tgz#9334c68eaf45db9eb20d0876728cc5d7fc2c3ea2"
|
|
||||||
integrity sha512-/sSDGaOuE+PJ1Z9Kp4u7PQScSVVXGud59I/qsBFFJvIbcn4P6yYw6cBnBmbPF+X9aRIsTJRDl6gzw5ZkJNm66w==
|
|
||||||
dependencies:
|
|
||||||
chalk "^4.1.2"
|
|
||||||
jest-diff "^29.0.1"
|
|
||||||
jest-matcher-utils "^29.0.1"
|
|
||||||
pretty-format "^29.0.3"
|
|
||||||
redent "^3.0.0"
|
|
||||||
|
|
||||||
"@testing-library/react-hooks@^8.0.1":
|
"@testing-library/react-hooks@^8.0.1":
|
||||||
version "8.0.1"
|
version "8.0.1"
|
||||||
resolved "https://registry.yarnpkg.com/@testing-library/react-hooks/-/react-hooks-8.0.1.tgz#0924bbd5b55e0c0c0502d1754657ada66947ca12"
|
resolved "https://registry.yarnpkg.com/@testing-library/react-hooks/-/react-hooks-8.0.1.tgz#0924bbd5b55e0c0c0502d1754657ada66947ca12"
|
||||||
|
@ -6311,10 +6305,10 @@
|
||||||
"@babel/runtime" "^7.12.5"
|
"@babel/runtime" "^7.12.5"
|
||||||
react-error-boundary "^3.1.0"
|
react-error-boundary "^3.1.0"
|
||||||
|
|
||||||
"@testing-library/react-native@^12.4.1":
|
"@testing-library/react-native@^12.4.3":
|
||||||
version "12.4.1"
|
version "12.4.3"
|
||||||
resolved "https://registry.yarnpkg.com/@testing-library/react-native/-/react-native-12.4.1.tgz#f15d0b6727e5e1af8bc35049aa95ce24b4420fe7"
|
resolved "https://registry.yarnpkg.com/@testing-library/react-native/-/react-native-12.4.3.tgz#57cd6a88b289f19144558b5e97336b57101af3ec"
|
||||||
integrity sha512-HDHwGTJwBB9//Flv0HhApghFsUYZvaKTemXOs9PCMk6P8mUl4IJby8zAud8rq7bT/ZMnehgIak8QK+mJCH6+5Q==
|
integrity sha512-WLE7VbbR5jZJQl3vfNK7Wt+IHnzhOxyu95Mr56EHmzH3XhC8DkrPVAnUq9asq/QWj4aGnymbinFx6zZys/WZmA==
|
||||||
dependencies:
|
dependencies:
|
||||||
jest-matcher-utils "^29.7.0"
|
jest-matcher-utils "^29.7.0"
|
||||||
pretty-format "^29.7.0"
|
pretty-format "^29.7.0"
|
||||||
|
@ -8625,6 +8619,17 @@ builtins@^1.0.3:
|
||||||
resolved "https://registry.yarnpkg.com/builtins/-/builtins-1.0.3.tgz#cb94faeb61c8696451db36534e1422f94f0aee88"
|
resolved "https://registry.yarnpkg.com/builtins/-/builtins-1.0.3.tgz#cb94faeb61c8696451db36534e1422f94f0aee88"
|
||||||
integrity sha512-uYBjakWipfaO/bXI7E8rq6kpwHRZK5cNYrUv2OzZSI/FvmdMyXJ2tG9dKcjEC5YHmHpUAwsargWIZNWdxb/bnQ==
|
integrity sha512-uYBjakWipfaO/bXI7E8rq6kpwHRZK5cNYrUv2OzZSI/FvmdMyXJ2tG9dKcjEC5YHmHpUAwsargWIZNWdxb/bnQ==
|
||||||
|
|
||||||
|
|
||||||
|
bunyamin@^1.5.0:
|
||||||
|
version "1.5.2"
|
||||||
|
resolved "https://registry.yarnpkg.com/bunyamin/-/bunyamin-1.5.2.tgz#681db204c0b16531369d5c1f6c89dc8d760b7558"
|
||||||
|
integrity sha512-Xp2nfqk33zt3nX90OSTkLVOc5N+1zdR3MWvfLHoIrm3cGRkdxPTPYB9CCgrDV8oum5rbghJjAbmXFXOrRXvMtg==
|
||||||
|
dependencies:
|
||||||
|
"@flatten-js/interval-tree" "^1.1.2"
|
||||||
|
multi-sort-stream "^1.0.4"
|
||||||
|
stream-json "^1.7.5"
|
||||||
|
trace-event-lib "^1.3.1"
|
||||||
|
|
||||||
bunyan-debug-stream@^3.1.0:
|
bunyan-debug-stream@^3.1.0:
|
||||||
version "3.1.0"
|
version "3.1.0"
|
||||||
resolved "https://registry.yarnpkg.com/bunyan-debug-stream/-/bunyan-debug-stream-3.1.0.tgz#78309c67ad85cfb8f011155334152c49209dcda8"
|
resolved "https://registry.yarnpkg.com/bunyan-debug-stream/-/bunyan-debug-stream-3.1.0.tgz#78309c67ad85cfb8f011155334152c49209dcda8"
|
||||||
|
@ -8642,6 +8647,18 @@ bunyan@^1.8.12:
|
||||||
mv "~2"
|
mv "~2"
|
||||||
safe-json-stringify "~1"
|
safe-json-stringify "~1"
|
||||||
|
|
||||||
|
bunyan@^2.0.5:
|
||||||
|
version "2.0.5"
|
||||||
|
resolved "https://registry.yarnpkg.com/bunyan/-/bunyan-2.0.5.tgz#9dd056755220dddd8b5bb9cf76f3d0d766e96e71"
|
||||||
|
integrity sha512-Jvl74TdxCN6rSP9W1I6+UOUtwslTDqsSFkDqZlFb/ilaSvQ+bZAnXT/GT97IZ5L+Vph0joPZPhxUyn6FLNmFAA==
|
||||||
|
dependencies:
|
||||||
|
exeunt "1.1.0"
|
||||||
|
optionalDependencies:
|
||||||
|
dtrace-provider "~0.8"
|
||||||
|
moment "^2.19.3"
|
||||||
|
mv "~2"
|
||||||
|
safe-json-stringify "~1"
|
||||||
|
|
||||||
bytebuffer@^5.0.1:
|
bytebuffer@^5.0.1:
|
||||||
version "5.0.1"
|
version "5.0.1"
|
||||||
resolved "https://registry.yarnpkg.com/bytebuffer/-/bytebuffer-5.0.1.tgz#582eea4b1a873b6d020a48d58df85f0bba6cfddd"
|
resolved "https://registry.yarnpkg.com/bytebuffer/-/bytebuffer-5.0.1.tgz#582eea4b1a873b6d020a48d58df85f0bba6cfddd"
|
||||||
|
@ -10145,10 +10162,10 @@ detect-port@^1.3.0:
|
||||||
address "^1.0.1"
|
address "^1.0.1"
|
||||||
debug "^2.6.0"
|
debug "^2.6.0"
|
||||||
|
|
||||||
detox@20.11.0:
|
detox@20.17.1:
|
||||||
version "20.11.0"
|
version "20.17.1"
|
||||||
resolved "https://registry.yarnpkg.com/detox/-/detox-20.11.0.tgz#f240e01db12334e0706b7f3477e59b8a5e4358c8"
|
resolved "https://registry.yarnpkg.com/detox/-/detox-20.17.1.tgz#55b9615cf5937819e1257fbf03fb2d2d58cf2acc"
|
||||||
integrity sha512-01LpETlZwfo2V7Awo+5ccUbee7E1lvH3ldLlmXxsx3mQ0pEA65f9CaO+FWhtUGYh7vQRMOQ9SnzYdej/ydQ7iQ==
|
integrity sha512-10pey6CR9D5GSloRkH60ObBGZ8VS11H7iuBNY7qq6jO2swiqqckHhPLRXfH9+WGR7l3vDnfU+G/gQs7JxQkJwA==
|
||||||
dependencies:
|
dependencies:
|
||||||
ajv "^8.6.3"
|
ajv "^8.6.3"
|
||||||
bunyan "^1.8.12"
|
bunyan "^1.8.12"
|
||||||
|
@ -10162,6 +10179,7 @@ detox@20.11.0:
|
||||||
funpermaproxy "^1.1.0"
|
funpermaproxy "^1.1.0"
|
||||||
glob "^8.0.3"
|
glob "^8.0.3"
|
||||||
ini "^1.3.4"
|
ini "^1.3.4"
|
||||||
|
jest-environment-emit "^1.0.5"
|
||||||
json-cycle "^1.3.0"
|
json-cycle "^1.3.0"
|
||||||
lodash "^4.17.11"
|
lodash "^4.17.11"
|
||||||
multi-sort-stream "^1.0.3"
|
multi-sort-stream "^1.0.3"
|
||||||
|
@ -11138,6 +11156,11 @@ execa@^5.0.0, execa@^5.1.1:
|
||||||
signal-exit "^3.0.3"
|
signal-exit "^3.0.3"
|
||||||
strip-final-newline "^2.0.0"
|
strip-final-newline "^2.0.0"
|
||||||
|
|
||||||
|
exeunt@1.1.0:
|
||||||
|
version "1.1.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/exeunt/-/exeunt-1.1.0.tgz#af72db6f94b3cb75e921aee375d513049843d284"
|
||||||
|
integrity sha512-dd++Yn/0Fp+gtJ04YHov7MeAii+LFivJc6KqnJNfplzLVUkUDrfKoQDTLlCgzcW15vY5hKlHasWeIsQJ8agHsw==
|
||||||
|
|
||||||
exif-parser@^0.1.12:
|
exif-parser@^0.1.12:
|
||||||
version "0.1.12"
|
version "0.1.12"
|
||||||
resolved "https://registry.yarnpkg.com/exif-parser/-/exif-parser-0.1.12.tgz#58a9d2d72c02c1f6f02a0ef4a9166272b7760922"
|
resolved "https://registry.yarnpkg.com/exif-parser/-/exif-parser-0.1.12.tgz#58a9d2d72c02c1f6f02a0ef4a9166272b7760922"
|
||||||
|
@ -13731,16 +13754,6 @@ jest-diff@^28.1.3:
|
||||||
jest-get-type "^28.0.2"
|
jest-get-type "^28.0.2"
|
||||||
pretty-format "^28.1.3"
|
pretty-format "^28.1.3"
|
||||||
|
|
||||||
jest-diff@^29.0.1, jest-diff@^29.6.4:
|
|
||||||
version "29.6.4"
|
|
||||||
resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-29.6.4.tgz#85aaa6c92a79ae8cd9a54ebae8d5b6d9a513314a"
|
|
||||||
integrity sha512-9F48UxR9e4XOEZvoUXEHSWY4qC4zERJaOfrbBg9JpbJOO43R1vN76REt/aMGZoY6GD5g84nnJiBIVlscegefpw==
|
|
||||||
dependencies:
|
|
||||||
chalk "^4.0.0"
|
|
||||||
diff-sequences "^29.6.3"
|
|
||||||
jest-get-type "^29.6.3"
|
|
||||||
pretty-format "^29.6.3"
|
|
||||||
|
|
||||||
jest-diff@^29.7.0:
|
jest-diff@^29.7.0:
|
||||||
version "29.7.0"
|
version "29.7.0"
|
||||||
resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-29.7.0.tgz#017934a66ebb7ecf6f205e84699be10afd70458a"
|
resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-29.7.0.tgz#017934a66ebb7ecf6f205e84699be10afd70458a"
|
||||||
|
@ -13769,6 +13782,20 @@ jest-each@^28.1.3:
|
||||||
jest-util "^28.1.3"
|
jest-util "^28.1.3"
|
||||||
pretty-format "^28.1.3"
|
pretty-format "^28.1.3"
|
||||||
|
|
||||||
|
jest-environment-emit@^1.0.5:
|
||||||
|
version "1.0.5"
|
||||||
|
resolved "https://registry.yarnpkg.com/jest-environment-emit/-/jest-environment-emit-1.0.5.tgz#e6f33451f98b88ccd48e9e1188bb535880f03c1b"
|
||||||
|
integrity sha512-OsQ08AhYxkkyDBTIow+9ogNmJheQIGWQKp0Nku+1ToLWjAj2Pd6LmypN8HgUIqYHs4HFcqkQ25kaf1qExmoZpg==
|
||||||
|
dependencies:
|
||||||
|
bunyamin "^1.5.0"
|
||||||
|
bunyan "^2.0.5"
|
||||||
|
bunyan-debug-stream "^3.1.0"
|
||||||
|
funpermaproxy "^1.1.0"
|
||||||
|
lodash.merge "^4.6.2"
|
||||||
|
node-ipc "9.2.1"
|
||||||
|
strip-ansi "^6.0.0"
|
||||||
|
tslib "^2.5.3"
|
||||||
|
|
||||||
jest-environment-node@^28.1.3:
|
jest-environment-node@^28.1.3:
|
||||||
version "28.1.3"
|
version "28.1.3"
|
||||||
resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-28.1.3.tgz#7e74fe40eb645b9d56c0c4b70ca4357faa349be5"
|
resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-28.1.3.tgz#7e74fe40eb645b9d56c0c4b70ca4357faa349be5"
|
||||||
|
@ -13914,16 +13941,6 @@ jest-matcher-utils@^28.1.3:
|
||||||
jest-get-type "^28.0.2"
|
jest-get-type "^28.0.2"
|
||||||
pretty-format "^28.1.3"
|
pretty-format "^28.1.3"
|
||||||
|
|
||||||
jest-matcher-utils@^29.0.1:
|
|
||||||
version "29.6.4"
|
|
||||||
resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-29.6.4.tgz#327db7ababea49455df3b23e5d6109fe0c709d24"
|
|
||||||
integrity sha512-KSzwyzGvK4HcfnserYqJHYi7sZVqdREJ9DMPAKVbS98JsIAvumihaNUbjrWw0St7p9IY7A9UskCW5MYlGmBQFQ==
|
|
||||||
dependencies:
|
|
||||||
chalk "^4.0.0"
|
|
||||||
jest-diff "^29.6.4"
|
|
||||||
jest-get-type "^29.6.3"
|
|
||||||
pretty-format "^29.6.3"
|
|
||||||
|
|
||||||
jest-matcher-utils@^29.7.0:
|
jest-matcher-utils@^29.7.0:
|
||||||
version "29.7.0"
|
version "29.7.0"
|
||||||
resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz#ae8fec79ff249fd592ce80e3ee474e83a6c44f12"
|
resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz#ae8fec79ff249fd592ce80e3ee474e83a6c44f12"
|
||||||
|
@ -15787,7 +15804,7 @@ ms@2.1.3:
|
||||||
resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2"
|
resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2"
|
||||||
integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==
|
integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==
|
||||||
|
|
||||||
multi-sort-stream@^1.0.3:
|
multi-sort-stream@^1.0.3, multi-sort-stream@^1.0.4:
|
||||||
version "1.0.4"
|
version "1.0.4"
|
||||||
resolved "https://registry.yarnpkg.com/multi-sort-stream/-/multi-sort-stream-1.0.4.tgz#e4348edc9edc36e16333e531a90c0f166235cc99"
|
resolved "https://registry.yarnpkg.com/multi-sort-stream/-/multi-sort-stream-1.0.4.tgz#e4348edc9edc36e16333e531a90c0f166235cc99"
|
||||||
integrity sha512-hAZ8JOEQFbgdLe8HWZbb7gdZg0/yAIHF00Qfo3kd0rXFv96nXe+/bPTrKHZ2QMHugGX4FiAyET1Lt+jiB+7Qlg==
|
integrity sha512-hAZ8JOEQFbgdLe8HWZbb7gdZg0/yAIHF00Qfo3kd0rXFv96nXe+/bPTrKHZ2QMHugGX4FiAyET1Lt+jiB+7Qlg==
|
||||||
|
@ -17140,15 +17157,6 @@ pretty-format@^28.1.3:
|
||||||
ansi-styles "^5.0.0"
|
ansi-styles "^5.0.0"
|
||||||
react-is "^18.0.0"
|
react-is "^18.0.0"
|
||||||
|
|
||||||
pretty-format@^29.0.3, pretty-format@^29.6.3:
|
|
||||||
version "29.6.3"
|
|
||||||
resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-29.6.3.tgz#d432bb4f1ca6f9463410c3fb25a0ba88e594ace7"
|
|
||||||
integrity sha512-ZsBgjVhFAj5KeK+nHfF1305/By3lechHQSMWCTl8iHSbfOm2TN5nHEtFc/+W7fAyUeCs2n5iow72gld4gW0xDw==
|
|
||||||
dependencies:
|
|
||||||
"@jest/schemas" "^29.6.3"
|
|
||||||
ansi-styles "^5.0.0"
|
|
||||||
react-is "^18.0.0"
|
|
||||||
|
|
||||||
pretty-format@^29.7.0:
|
pretty-format@^29.7.0:
|
||||||
version "29.7.0"
|
version "29.7.0"
|
||||||
resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-29.7.0.tgz#ca42c758310f365bfa71a0bda0a807160b776812"
|
resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-29.7.0.tgz#ca42c758310f365bfa71a0bda0a807160b776812"
|
||||||
|
@ -19586,6 +19594,13 @@ stream-json@^1.7.4:
|
||||||
dependencies:
|
dependencies:
|
||||||
stream-chain "^2.2.5"
|
stream-chain "^2.2.5"
|
||||||
|
|
||||||
|
stream-json@^1.7.5:
|
||||||
|
version "1.8.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/stream-json/-/stream-json-1.8.0.tgz#53f486b2e3b4496c506131f8d7260ba42def151c"
|
||||||
|
integrity sha512-HZfXngYHUAr1exT4fxlbc1IOce1RYxp2ldeaf97LYCOPSoOqY/1Psp7iGvpb+6JIOgkra9zDYnPX01hGAHzEPw==
|
||||||
|
dependencies:
|
||||||
|
stream-chain "^2.2.5"
|
||||||
|
|
||||||
stream-shift@^1.0.0:
|
stream-shift@^1.0.0:
|
||||||
version "1.0.1"
|
version "1.0.1"
|
||||||
resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.1.tgz#d7088281559ab2778424279b0877da3c392d5a3d"
|
resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.1.tgz#d7088281559ab2778424279b0877da3c392d5a3d"
|
||||||
|
@ -20476,6 +20491,11 @@ tslib@^2.0.0, tslib@^2.0.1, tslib@^2.1.0, tslib@^2.3.0:
|
||||||
resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.4.0.tgz#7cecaa7f073ce680a05847aa77be941098f36dc3"
|
resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.4.0.tgz#7cecaa7f073ce680a05847aa77be941098f36dc3"
|
||||||
integrity sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==
|
integrity sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==
|
||||||
|
|
||||||
|
tslib@^2.5.3:
|
||||||
|
version "2.6.2"
|
||||||
|
resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.2.tgz#703ac29425e7b37cd6fd456e92404d46d1f3e4ae"
|
||||||
|
integrity sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==
|
||||||
|
|
||||||
tsutils@^3.21.0:
|
tsutils@^3.21.0:
|
||||||
version "3.21.0"
|
version "3.21.0"
|
||||||
resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.21.0.tgz#b48717d394cea6c1e096983eed58e9d61715b623"
|
resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.21.0.tgz#b48717d394cea6c1e096983eed58e9d61715b623"
|
||||||
|
|
Loading…
Reference in New Issue