Merge branch 'develop' into fix.jump-from-thread-to-same-room
This commit is contained in:
commit
360d104375
|
@ -144,7 +144,7 @@ android {
|
|||
minSdkVersion rootProject.ext.minSdkVersion
|
||||
targetSdkVersion rootProject.ext.targetSdkVersion
|
||||
versionCode VERSIONCODE as Integer
|
||||
versionName "4.17.0"
|
||||
versionName "4.18.0"
|
||||
vectorDrawables.useSupportLibrary = true
|
||||
if (!isFoss) {
|
||||
manifestPlaceholders = [BugsnagAPIKey: BugsnagAPIKey as String]
|
||||
|
|
|
@ -756,7 +756,7 @@
|
|||
"member-does-not-exist": "Member does not exist",
|
||||
"Convert": "Convert",
|
||||
"Convert_to_Team": "Convert to Team",
|
||||
"Convert_to_Team_Warning": "This can't be undone. Once you convert a channel to a team, you can not turn it back to a channel.",
|
||||
"Convert_to_Team_Warning": "You are converting this Channel to a Team. All Members will be kept.",
|
||||
"Move_to_Team": "Move to Team",
|
||||
"Move_Channel_Paragraph": "Moving a channel inside a team means that this channel will be added in the team’s context, however, all channel’s members, which are not members of the respective team, will still have access to this channel, but will not be added as team’s members. \n\nAll channel’s management will still be made by the owners of this channel.\n\nTeam’s members and even team’s owners, if not a member of this channel, can not have access to the channel’s content. \n\nPlease notice that the Team’s owner will be able remove members from the Channel.",
|
||||
"Move_to_Team_Warning": "After reading the previous intructions about this behavior, do you still want to move this channel to the selected team?",
|
||||
|
@ -765,5 +765,9 @@
|
|||
"Load_Older": "Load Older",
|
||||
"Left_The_Room_Successfully": "Left the room successfully",
|
||||
"Deleted_The_Team_Successfully": "Team deleted successfully",
|
||||
"Deleted_The_Room_Successfully": "Room deleted successfully"
|
||||
"Deleted_The_Room_Successfully": "Room deleted successfully",
|
||||
"Convert_to_Channel": "Convert to Channel",
|
||||
"Converting_Team_To_Channel": "Converting Team to Channel",
|
||||
"Select_Team_Channels_To_Delete": "Select the Team’s Channels you would like to delete, the ones you do not select will be moved to the Workspace. \n\nNotice that public Channels will be public and visible to everyone.",
|
||||
"You_are_converting_the_team": "You are converting this Team to a Channel"
|
||||
}
|
|
@ -669,5 +669,6 @@
|
|||
"invalid-room": "Sala inválida",
|
||||
"Left_The_Room_Successfully": "Saiu da sala com sucesso",
|
||||
"Deleted_The_Team_Successfully": "Time deletado com sucesso",
|
||||
"Deleted_The_Room_Successfully": "Sala deletada com sucesso"
|
||||
"Deleted_The_Room_Successfully": "Sala deletada com sucesso",
|
||||
"Convert_to_Channel": "Converter para um Canal"
|
||||
}
|
|
@ -75,7 +75,7 @@ export default class Root extends React.Component {
|
|||
theme: defaultTheme(),
|
||||
themePreferences: {
|
||||
currentTheme: supportSystemTheme() ? 'automatic' : 'light',
|
||||
darkLevel: 'dark'
|
||||
darkLevel: 'black'
|
||||
},
|
||||
width,
|
||||
height,
|
||||
|
|
|
@ -47,7 +47,8 @@ const PERMISSIONS = [
|
|||
'view-statistics',
|
||||
'view-user-administration',
|
||||
'view-all-teams',
|
||||
'view-all-team-channels'
|
||||
'view-all-team-channels',
|
||||
'convert-team'
|
||||
];
|
||||
|
||||
export async function setPermissions() {
|
||||
|
|
|
@ -131,6 +131,10 @@ export async function setSettings() {
|
|||
reduxStore.dispatch(addSettings(RocketChat.parseSettings(parsed.slice(0, parsed.length))));
|
||||
}
|
||||
|
||||
export function subscribeSettings() {
|
||||
return RocketChat.subscribe('stream-notify-all', 'public-settings-changed');
|
||||
}
|
||||
|
||||
export default async function() {
|
||||
try {
|
||||
const db = database.active;
|
||||
|
@ -146,7 +150,6 @@ export default async function() {
|
|||
const filteredSettingsIds = filteredSettings.map(s => s._id);
|
||||
|
||||
reduxStore.dispatch(addSettings(this.parseSettings(filteredSettings)));
|
||||
RocketChat.subscribe('stream-notify-all', 'public-settings-changed');
|
||||
|
||||
// filter server info
|
||||
const serverInfo = filteredSettings.filter(i1 => serverInfoKeys.includes(i1._id));
|
||||
|
|
|
@ -28,7 +28,7 @@ import getUsersPresence, { getUserPresence, subscribeUsersPresence } from './met
|
|||
|
||||
import protectedFunction from './methods/helpers/protectedFunction';
|
||||
import readMessages from './methods/readMessages';
|
||||
import getSettings, { getLoginSettings, setSettings } from './methods/getSettings';
|
||||
import getSettings, { getLoginSettings, setSettings, subscribeSettings } from './methods/getSettings';
|
||||
|
||||
import getRooms from './methods/getRooms';
|
||||
import { setPermissions, getPermissions } from './methods/getPermissions';
|
||||
|
@ -866,6 +866,13 @@ const RocketChat = {
|
|||
};
|
||||
return this.sdk.post(type === 'c' ? 'channels.convertToTeam' : 'groups.convertToTeam', params);
|
||||
},
|
||||
convertTeamToChannel({ teamId, selected }) {
|
||||
const params = {
|
||||
teamId,
|
||||
...(selected.length && { roomsToRemove: selected })
|
||||
};
|
||||
return this.sdk.post('teams.convertToChannel', params);
|
||||
},
|
||||
joinRoom(roomId, joinCode, type) {
|
||||
// TODO: join code
|
||||
// RC 0.48.0
|
||||
|
@ -883,6 +890,7 @@ const RocketChat = {
|
|||
getSettings,
|
||||
getLoginSettings,
|
||||
setSettings,
|
||||
subscribeSettings,
|
||||
getPermissions,
|
||||
setPermissions,
|
||||
getCustomEmojis,
|
||||
|
|
|
@ -41,10 +41,10 @@ const handleRequest = function* handleRequest({ data }) {
|
|||
encrypted
|
||||
} = data;
|
||||
logEvent(events.CT_CREATE, {
|
||||
type,
|
||||
readOnly,
|
||||
broadcast,
|
||||
encrypted
|
||||
type: `${ type }`,
|
||||
readOnly: `${ readOnly }`,
|
||||
broadcast: `${ broadcast }`,
|
||||
encrypted: `${ encrypted }`
|
||||
});
|
||||
const result = yield call(createTeam, data);
|
||||
sub = {
|
||||
|
|
|
@ -80,6 +80,10 @@ const handleLoginRequest = function* handleLoginRequest({ credentials, logoutOnE
|
|||
}
|
||||
};
|
||||
|
||||
const subscribeSettings = function* subscribeSettings() {
|
||||
yield RocketChat.subscribeSettings();
|
||||
};
|
||||
|
||||
const fetchPermissions = function* fetchPermissions() {
|
||||
yield RocketChat.getPermissions();
|
||||
};
|
||||
|
@ -133,6 +137,7 @@ const handleLoginSuccess = function* handleLoginSuccess({ user }) {
|
|||
yield fork(registerPushToken);
|
||||
yield fork(fetchUsersPresence);
|
||||
yield fork(fetchEnterpriseModules, { user });
|
||||
yield fork(subscribeSettings);
|
||||
yield put(encryptionInit());
|
||||
|
||||
setLanguage(user?.language);
|
||||
|
|
|
@ -124,7 +124,7 @@ class Root extends React.Component {
|
|||
theme: defaultTheme(),
|
||||
themePreferences: {
|
||||
currentTheme: supportSystemTheme() ? 'automatic' : 'light',
|
||||
darkLevel: 'dark'
|
||||
darkLevel: 'black'
|
||||
},
|
||||
root: '',
|
||||
width,
|
||||
|
|
|
@ -259,6 +259,8 @@ export default {
|
|||
RA_LEAVE_TEAM_F: 'ra_leave_team_f',
|
||||
RA_CONVERT_TO_TEAM: 'ra_convert_to_team',
|
||||
RA_CONVERT_TO_TEAM_F: 'ra_convert_to_team_f',
|
||||
RA_CONVERT_TEAM_TO_CHANNEL: 'ra_convert_team_to_channel',
|
||||
RA_CONVERT_TEAM_TO_CHANNEL_F: 'ra_convert_team_to_channel_f',
|
||||
RA_MOVE_TO_TEAM: 'ra_move_to_team',
|
||||
RA_MOVE_TO_TEAM_F: 'ra_move_to_team_f',
|
||||
RA_SEARCH_TEAM: 'ra_search_team',
|
||||
|
|
|
@ -39,16 +39,16 @@ const openLink = async(url, theme = 'light') => {
|
|||
try {
|
||||
const browser = await UserPreferences.getStringAsync(DEFAULT_BROWSER_KEY);
|
||||
|
||||
if (browser) {
|
||||
const schemeUrl = appSchemeURL(url, browser.replace(':', ''));
|
||||
await Linking.openURL(schemeUrl);
|
||||
} else {
|
||||
if (browser === 'inApp') {
|
||||
await WebBrowser.openBrowserAsync(url, {
|
||||
toolbarColor: themes[theme].headerBackground,
|
||||
controlsColor: themes[theme].headerTintColor,
|
||||
collapseToolbar: true,
|
||||
showTitle: true
|
||||
});
|
||||
} else {
|
||||
const schemeUrl = appSchemeURL(url, browser.replace(':', ''));
|
||||
await Linking.openURL(schemeUrl);
|
||||
}
|
||||
} catch {
|
||||
try {
|
||||
|
|
|
@ -83,7 +83,7 @@ class DefaultBrowserView extends React.Component {
|
|||
|
||||
isSelected = (value) => {
|
||||
const { browser } = this.state;
|
||||
if (!browser && value === 'inApp') {
|
||||
if (!browser && value === 'systemDefault:') {
|
||||
return true;
|
||||
}
|
||||
return browser === value;
|
||||
|
@ -92,7 +92,7 @@ class DefaultBrowserView extends React.Component {
|
|||
changeDefaultBrowser = async(newBrowser) => {
|
||||
logEvent(events.DB_CHANGE_DEFAULT_BROWSER, { browser: newBrowser });
|
||||
try {
|
||||
const browser = newBrowser !== 'inApp' ? newBrowser : null;
|
||||
const browser = newBrowser !== 'systemDefault:' ? newBrowser : null;
|
||||
await UserPreferences.setStringAsync(DEFAULT_BROWSER_KEY, browser);
|
||||
this.setState({ browser });
|
||||
} catch {
|
||||
|
|
|
@ -67,7 +67,8 @@ class RoomActionsView extends React.Component {
|
|||
viewBroadcastMemberListPermission: PropTypes.array,
|
||||
transferLivechatGuestPermission: PropTypes.array,
|
||||
createTeamPermission: PropTypes.array,
|
||||
addTeamChannelPermission: PropTypes.array
|
||||
addTeamChannelPermission: PropTypes.array,
|
||||
convertTeamPermission: PropTypes.array
|
||||
}
|
||||
|
||||
constructor(props) {
|
||||
|
@ -91,7 +92,8 @@ class RoomActionsView extends React.Component {
|
|||
canEdit: false,
|
||||
canToggleEncryption: false,
|
||||
canCreateTeam: false,
|
||||
canAddChannelToTeam: false
|
||||
canAddChannelToTeam: false,
|
||||
canConvertTeam: false
|
||||
};
|
||||
if (room && room.observe && room.rid) {
|
||||
this.roomObservable = room.observe();
|
||||
|
@ -142,9 +144,10 @@ class RoomActionsView extends React.Component {
|
|||
const canViewMembers = await this.canViewMembers();
|
||||
const canCreateTeam = await this.canCreateTeam();
|
||||
const canAddChannelToTeam = await this.canAddChannelToTeam();
|
||||
const canConvertTeam = await this.canConvertTeam();
|
||||
|
||||
this.setState({
|
||||
canAutoTranslate, canAddUser, canInviteUser, canEdit, canToggleEncryption, canViewMembers, canCreateTeam, canAddChannelToTeam
|
||||
canAutoTranslate, canAddUser, canInviteUser, canEdit, canToggleEncryption, canViewMembers, canCreateTeam, canAddChannelToTeam, canConvertTeam
|
||||
});
|
||||
|
||||
// livechat permissions
|
||||
|
@ -240,6 +243,16 @@ class RoomActionsView extends React.Component {
|
|||
return canAddChannelToTeam;
|
||||
}
|
||||
|
||||
canConvertTeam = async() => {
|
||||
const { room } = this.state;
|
||||
const { convertTeamPermission } = this.props;
|
||||
const { rid } = room;
|
||||
const permissions = await RocketChat.hasPermission([convertTeamPermission], rid);
|
||||
|
||||
const canConvertTeam = permissions[0];
|
||||
return canConvertTeam;
|
||||
}
|
||||
|
||||
canToggleEncryption = async() => {
|
||||
const { room } = this.state;
|
||||
const { toggleRoomE2EEncryptionPermission } = this.props;
|
||||
|
@ -433,6 +446,59 @@ class RoomActionsView extends React.Component {
|
|||
});
|
||||
}
|
||||
|
||||
convertTeamToChannel = async() => {
|
||||
const { room } = this.state;
|
||||
const { navigation } = this.props;
|
||||
|
||||
try {
|
||||
const result = await RocketChat.teamListRoomsOfUser({ teamId: room.teamId, userId: room.u._id });
|
||||
|
||||
if (result.rooms?.length) {
|
||||
const teamChannels = result.rooms.map(r => ({
|
||||
rid: r._id,
|
||||
name: r.name,
|
||||
teamId: r.teamId
|
||||
}));
|
||||
navigation.navigate('SelectListView', {
|
||||
title: 'Converting_Team_To_Channel',
|
||||
data: teamChannels,
|
||||
infoText: 'Select_Team_Channels_To_Delete',
|
||||
nextAction: data => this.convertTeamToChannelConfirmation(data)
|
||||
});
|
||||
} else {
|
||||
this.convertTeamToChannelConfirmation();
|
||||
}
|
||||
} catch (e) {
|
||||
this.convertTeamToChannelConfirmation();
|
||||
}
|
||||
}
|
||||
|
||||
handleConvertTeamToChannel = async(selected) => {
|
||||
logEvent(events.RA_CONVERT_TEAM_TO_CHANNEL);
|
||||
try {
|
||||
const { room } = this.state;
|
||||
const { navigation } = this.props;
|
||||
|
||||
const result = await RocketChat.convertTeamToChannel({ teamId: room.teamId, selected });
|
||||
|
||||
if (result.success) {
|
||||
navigation.navigate('RoomView');
|
||||
}
|
||||
} catch (e) {
|
||||
logEvent(events.RA_CONVERT_TEAM_TO_CHANNEL_F);
|
||||
log(e);
|
||||
}
|
||||
}
|
||||
|
||||
convertTeamToChannelConfirmation = (selected = []) => {
|
||||
showConfirmationAlert({
|
||||
title: I18n.t('Confirmation'),
|
||||
message: I18n.t('You_are_converting_the_team'),
|
||||
confirmationText: I18n.t('Convert'),
|
||||
onPress: () => this.handleConvertTeamToChannel(selected)
|
||||
});
|
||||
}
|
||||
|
||||
leaveTeam = async() => {
|
||||
const { room } = this.state;
|
||||
const { navigation, leaveRoom } = this.props;
|
||||
|
@ -806,6 +872,32 @@ class RoomActionsView extends React.Component {
|
|||
);
|
||||
}
|
||||
|
||||
teamToChannelActions = (t, room) => {
|
||||
const { canEdit, canConvertTeam } = this.state;
|
||||
const canConvertTeamToChannel = canEdit && canConvertTeam && !!room?.teamMain;
|
||||
|
||||
return (
|
||||
<>
|
||||
{['c', 'p'].includes(t) && canConvertTeamToChannel
|
||||
? (
|
||||
<>
|
||||
<List.Item
|
||||
title='Convert_to_Channel'
|
||||
onPress={() => this.onPressTouchable({
|
||||
event: this.convertTeamToChannel
|
||||
})}
|
||||
testID='room-actions-convert-channel-to-team'
|
||||
left={() => <List.Icon name='channel-public' />}
|
||||
showActionIndicator
|
||||
/>
|
||||
<List.Separator />
|
||||
</>
|
||||
)
|
||||
: null}
|
||||
</>
|
||||
);
|
||||
}
|
||||
|
||||
render() {
|
||||
const {
|
||||
room, membersCount, canViewMembers, canAddUser, canInviteUser, joined, canAutoTranslate, canForwardGuest, canReturnQueue
|
||||
|
@ -1007,7 +1099,9 @@ class RoomActionsView extends React.Component {
|
|||
)
|
||||
: null}
|
||||
|
||||
|
||||
{ this.teamChannelActions(t, room) }
|
||||
{this.teamToChannelActions(t, room)}
|
||||
|
||||
{['l'].includes(t) && !this.isOmnichannelPreview
|
||||
? (
|
||||
|
@ -1099,7 +1193,8 @@ const mapStateToProps = state => ({
|
|||
viewBroadcastMemberListPermission: state.permissions['view-broadcast-member-list'],
|
||||
transferLivechatGuestPermission: state.permissions['transfer-livechat-guest'],
|
||||
createTeamPermission: state.permissions['create-team'],
|
||||
addTeamChannelPermission: state.permissions['add-team-channel']
|
||||
addTeamChannelPermission: state.permissions['add-team-channel'],
|
||||
convertTeamPermission: state.permissions['convert-team']
|
||||
});
|
||||
|
||||
const mapDispatchToProps = dispatch => ({
|
||||
|
|
|
@ -30,14 +30,14 @@ const THEMES = [
|
|||
label: 'Dark',
|
||||
value: 'dark',
|
||||
group: THEME_GROUP
|
||||
}, {
|
||||
label: 'Dark',
|
||||
value: 'dark',
|
||||
group: DARK_GROUP
|
||||
}, {
|
||||
label: 'Black',
|
||||
value: 'black',
|
||||
group: DARK_GROUP
|
||||
}, {
|
||||
label: 'Dark',
|
||||
value: 'dark',
|
||||
group: DARK_GROUP
|
||||
}
|
||||
];
|
||||
|
||||
|
|
|
@ -51,7 +51,7 @@ describe('Move/Convert Team', () => {
|
|||
await element(by.id('room-actions-scrollview')).scrollTo('bottom');
|
||||
await waitFor(element(by.id('room-actions-convert-to-team'))).toExist().withTimeout(2000);
|
||||
await element(by.id('room-actions-convert-to-team')).tap();
|
||||
await waitFor(element(by.label('This can\'t be undone. Once you convert a channel to a team, you can not turn it back to a channel.'))).toExist().withTimeout(2000);
|
||||
await waitFor(element(by.label('You are converting this Channel to a Team. All Members will be kept.'))).toExist().withTimeout(2000);
|
||||
await element(by.text('Convert')).tap();
|
||||
await waitFor(element(by.id('room-view'))).toExist().withTimeout(20000);
|
||||
await waitFor(element(by.id(`room-view-title-${ toBeConverted }`))).toExist().withTimeout(6000);
|
||||
|
@ -84,5 +84,32 @@ describe('Move/Convert Team', () => {
|
|||
await element(by.text('Yes, move it!')).tap();
|
||||
await waitFor(element(by.id('room-view-header-team-channels'))).toExist().withTimeout(10000);
|
||||
});
|
||||
|
||||
after(async() => {
|
||||
await tapBack();
|
||||
await waitFor(element(by.id('rooms-list-view'))).toExist().withTimeout(2000);
|
||||
});
|
||||
});
|
||||
|
||||
describe('Convert Team to Channel and Delete toBeMoved channel within the Converted', () => {
|
||||
it('should convert a team to a channel', async() => {
|
||||
await navigateToRoomActions(toBeConverted);
|
||||
await element(by.id('room-actions-scrollview')).scrollTo('bottom');
|
||||
await waitFor(element(by.id('room-actions-convert-channel-to-team'))).toExist().withTimeout(2000);
|
||||
await element(by.id('room-actions-convert-channel-to-team')).tap();
|
||||
await sleep(2000);
|
||||
await waitFor(element(by.id('select-list-view'))).toExist().withTimeout(2000);
|
||||
await waitFor(element(by.id(`select-list-view-item-${ toBeMoved }`))).toExist().withTimeout(2000);
|
||||
await element(by.id(`select-list-view-item-${ toBeMoved }`)).tap();
|
||||
await waitFor(element(by.id('select-list-view-submit'))).toExist().withTimeout(2000);
|
||||
await element(by.id('select-list-view-submit')).tap();
|
||||
await waitFor(element(by.label('You are converting this Team to a Channel'))).toExist().withTimeout(2000);
|
||||
await element(by.text('Convert')).tap();
|
||||
await waitFor(element(by.id('room-view'))).toExist().withTimeout(20000);
|
||||
await waitFor(element(by.id(`room-view-title-${ toBeConverted }`))).toExist().withTimeout(6000);
|
||||
await tapBack();
|
||||
await waitFor(element(by.id('rooms-list-view'))).toExist().withTimeout(2000);
|
||||
await waitFor(element(by.id(`rooms-list-view-item-${ toBeMoved }`))).toBeNotVisible().withTimeout(60000);
|
||||
});
|
||||
});
|
||||
});
|
||||
|
|
|
@ -1694,7 +1694,7 @@
|
|||
INFOPLIST_FILE = NotificationService/Info.plist;
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 11.0;
|
||||
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @executable_path/../../Frameworks";
|
||||
MARKETING_VERSION = 4.17.0;
|
||||
MARKETING_VERSION = 4.18.0;
|
||||
MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
|
||||
MTL_FAST_MATH = YES;
|
||||
PRODUCT_BUNDLE_IDENTIFIER = chat.rocket.reactnative.NotificationService;
|
||||
|
@ -1731,7 +1731,7 @@
|
|||
INFOPLIST_FILE = NotificationService/Info.plist;
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 11.0;
|
||||
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @executable_path/../../Frameworks";
|
||||
MARKETING_VERSION = 4.17.0;
|
||||
MARKETING_VERSION = 4.18.0;
|
||||
MTL_FAST_MATH = YES;
|
||||
PRODUCT_BUNDLE_IDENTIFIER = chat.rocket.reactnative.NotificationService;
|
||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||
|
|
|
@ -23,7 +23,7 @@
|
|||
<key>CFBundlePackageType</key>
|
||||
<string>APPL</string>
|
||||
<key>CFBundleShortVersionString</key>
|
||||
<string>4.17.0</string>
|
||||
<string>4.18.0</string>
|
||||
<key>CFBundleSignature</key>
|
||||
<string>????</string>
|
||||
<key>CFBundleURLTypes</key>
|
||||
|
|
|
@ -21,7 +21,7 @@
|
|||
<key>CFBundlePackageType</key>
|
||||
<string>XPC!</string>
|
||||
<key>CFBundleShortVersionString</key>
|
||||
<string>4.17.0</string>
|
||||
<string>4.18.0</string>
|
||||
<key>CFBundleVersion</key>
|
||||
<string>1</string>
|
||||
<key>KeychainGroup</key>
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
{
|
||||
"name": "rocket-chat-reactnative",
|
||||
"version": "4.17.0",
|
||||
"version": "4.18.0",
|
||||
"private": true,
|
||||
"scripts": {
|
||||
"start": "react-native start",
|
||||
|
|
|
@ -0,0 +1,55 @@
|
|||
diff --git a/node_modules/react-native/Libraries/Components/ScrollView/ScrollView.js b/node_modules/react-native/Libraries/Components/ScrollView/ScrollView.js
|
||||
index c344ac4..479c8c0 100644
|
||||
--- a/node_modules/react-native/Libraries/Components/ScrollView/ScrollView.js
|
||||
+++ b/node_modules/react-native/Libraries/Components/ScrollView/ScrollView.js
|
||||
@@ -1244,9 +1244,17 @@ class ScrollView extends React.Component<Props, State> {
|
||||
// Note: we should split props.style on the inner and outer props
|
||||
// however, the ScrollView still needs the baseStyle to be scrollable
|
||||
const {outer, inner} = splitLayoutProps(flattenStyle(props.style));
|
||||
+
|
||||
+ // Workaround for RefreshControl inverted: https://github.com/facebook/react-native/issues/30034
|
||||
+ let inverted;
|
||||
+ if (inner.scaleY) {
|
||||
+ inverted = { scaleY: -1 };
|
||||
+ delete inner.scaleY;
|
||||
+ }
|
||||
+
|
||||
return React.cloneElement(
|
||||
refreshControl,
|
||||
- {style: [baseStyle, outer]},
|
||||
+ {style: [baseStyle, outer, inverted]},
|
||||
<ScrollViewClass
|
||||
{...props}
|
||||
style={[baseStyle, inner]}
|
||||
diff --git a/node_modules/react-native/Libraries/Lists/VirtualizedList.js b/node_modules/react-native/Libraries/Lists/VirtualizedList.js
|
||||
index 9ec105f..6bb6989 100644
|
||||
--- a/node_modules/react-native/Libraries/Lists/VirtualizedList.js
|
||||
+++ b/node_modules/react-native/Libraries/Lists/VirtualizedList.js
|
||||
@@ -11,6 +11,7 @@
|
||||
'use strict';
|
||||
|
||||
const Batchinator = require('../Interaction/Batchinator');
|
||||
+const Platform = require('../Utilities/Platform');
|
||||
const FillRateHelper = require('./FillRateHelper');
|
||||
const PropTypes = require('prop-types');
|
||||
const React = require('react');
|
||||
@@ -2185,9 +2186,16 @@ function describeNestedLists(childList: {
|
||||
}
|
||||
|
||||
const styles = StyleSheet.create({
|
||||
- verticallyInverted: {
|
||||
- transform: [{scaleY: -1}],
|
||||
- },
|
||||
+ // Workaround found on https://github.com/facebook/react-native/issues/30034#issuecomment-806396274
|
||||
+ // Note: Check ScrollView for a workaround on RefreshControl
|
||||
+ verticallyInverted:
|
||||
+ Platform.OS === 'android'
|
||||
+ ? {
|
||||
+ scaleY: -1,
|
||||
+ }
|
||||
+ : {
|
||||
+ transform: [{scaleY: -1}]
|
||||
+ },
|
||||
horizontallyInverted: {
|
||||
transform: [{scaleX: -1}],
|
||||
},
|
Loading…
Reference in New Issue