diff --git a/native/chat/chat-thread-list-see-more-sidebars.react.js b/native/chat/chat-thread-list-see-more-sidebars.react.js
index b21f682ac..72f0372a4 100644
--- a/native/chat/chat-thread-list-see-more-sidebars.react.js
+++ b/native/chat/chat-thread-list-see-more-sidebars.react.js
@@ -1,70 +1,70 @@
// @flow
import * as React from 'react';
import { Text } from 'react-native';
import Icon from 'react-native-vector-icons/Ionicons';
import type { ThreadInfo } from 'lib/types/thread-types';
import Button from '../components/button.react';
import { useColors, useStyles } from '../themes/colors';
type Props = {|
+threadInfo: ThreadInfo,
+unread: boolean,
+showingSidebarsInline: boolean,
+onPress: (threadInfo: ThreadInfo) => void,
|};
function ChatThreadListSeeMoreSidebars(props: Props) {
const { onPress, threadInfo, unread, showingSidebarsInline } = props;
const onPressButton = React.useCallback(() => onPress(threadInfo), [
onPress,
threadInfo,
]);
const colors = useColors();
const styles = useStyles(unboundStyles);
const unreadStyle = unread ? styles.unread : null;
const buttonText = showingSidebarsInline ? 'See more...' : 'See sidebars...';
return (
);
}
const unboundStyles = {
unread: {
color: 'listForegroundLabel',
fontWeight: 'bold',
},
button: {
height: 30,
flexDirection: 'row',
display: 'flex',
- marginLeft: 25,
- marginRight: 10,
+ paddingLeft: 25,
+ paddingRight: 10,
alignItems: 'center',
},
icon: {
paddingLeft: 5,
color: 'listForegroundSecondaryLabel',
width: 35,
},
text: {
color: 'listForegroundSecondaryLabel',
flex: 1,
fontSize: 16,
paddingLeft: 5,
paddingBottom: 2,
},
};
export default ChatThreadListSeeMoreSidebars;
diff --git a/native/chat/sidebar-item.react.js b/native/chat/sidebar-item.react.js
index ed9cfbafe..6d8ecb696 100644
--- a/native/chat/sidebar-item.react.js
+++ b/native/chat/sidebar-item.react.js
@@ -1,84 +1,84 @@
// @flow
import * as React from 'react';
import { Text } from 'react-native';
import Icon from 'react-native-vector-icons/Entypo';
import type { ThreadInfo, SidebarInfo } from 'lib/types/thread-types';
import { shortAbsoluteDate } from 'lib/utils/date-utils';
import Button from '../components/button.react';
import { SingleLine } from '../components/single-line.react';
import { useColors, useStyles } from '../themes/colors';
import type { ViewStyle } from '../types/styles';
type Props = {|
+sidebarInfo: SidebarInfo,
+onPressItem: (threadInfo: ThreadInfo) => void,
+style?: ?ViewStyle,
|};
function SidebarItem(props: Props) {
const { lastUpdatedTime } = props.sidebarInfo;
const lastActivity = shortAbsoluteDate(lastUpdatedTime);
const { threadInfo } = props.sidebarInfo;
const styles = useStyles(unboundStyles);
const unreadStyle = threadInfo.currentUser.unread ? styles.unread : null;
const { onPressItem } = props;
const onPress = React.useCallback(() => onPressItem(threadInfo), [
threadInfo,
onPressItem,
]);
const colors = useColors();
return (
);
}
const unboundStyles = {
unread: {
color: 'listForegroundLabel',
fontWeight: 'bold',
},
sidebar: {
height: 30,
flexDirection: 'row',
display: 'flex',
- marginLeft: 25,
- marginRight: 10,
+ paddingLeft: 25,
+ paddingRight: 10,
alignItems: 'center',
},
icon: {
paddingLeft: 5,
color: 'listForegroundSecondaryLabel',
width: 35,
},
name: {
color: 'listForegroundSecondaryLabel',
flex: 1,
fontSize: 16,
paddingLeft: 5,
paddingBottom: 2,
},
lastActivity: {
color: 'listForegroundTertiaryLabel',
fontSize: 14,
marginLeft: 10,
},
};
export default SidebarItem;
diff --git a/native/chat/sidebar-list-modal.react.js b/native/chat/sidebar-list-modal.react.js
index 45acf6f52..01886cc16 100644
--- a/native/chat/sidebar-list-modal.react.js
+++ b/native/chat/sidebar-list-modal.react.js
@@ -1,162 +1,162 @@
// @flow
import * as React from 'react';
import { TextInput, FlatList, StyleSheet } from 'react-native';
import { sidebarInfoSelector } from 'lib/selectors/thread-selectors';
import SearchIndex from 'lib/shared/search-index';
import { threadSearchText } from 'lib/shared/thread-utils';
import type { ThreadInfo, SidebarInfo } from 'lib/types/thread-types';
import Modal from '../components/modal.react';
import Search from '../components/search.react';
import type { RootNavigationProp } from '../navigation/root-navigator.react';
import type { NavigationRoute } from '../navigation/route-names';
import { MessageListRouteName } from '../navigation/route-names';
import { useSelector } from '../redux/redux-utils';
import { useIndicatorStyle } from '../themes/colors';
import { waitForModalInputFocus } from '../utils/timers';
import SidebarItem from './sidebar-item.react';
export type SidebarListModalParams = {|
+threadInfo: ThreadInfo,
|};
function keyExtractor(sidebarInfo: SidebarInfo) {
return sidebarInfo.threadInfo.id;
}
function getItemLayout(data: ?$ReadOnlyArray, index: number) {
return { length: 24, offset: 24 * index, index };
}
type Props = {|
+navigation: RootNavigationProp<'SidebarListModal'>,
+route: NavigationRoute<'SidebarListModal'>,
|};
function SidebarListModal(props: Props) {
const threadID = props.route.params.threadInfo.id;
const sidebarInfos = useSelector(
(state) => sidebarInfoSelector(state)[threadID] ?? [],
);
const [searchState, setSearchState] = React.useState({
text: '',
results: new Set(),
});
const listData = React.useMemo(() => {
if (!searchState.text) {
return sidebarInfos;
}
return sidebarInfos.filter(({ threadInfo }) =>
searchState.results.has(threadInfo.id),
);
}, [sidebarInfos, searchState]);
const userInfos = useSelector((state) => state.userStore.userInfos);
const searchIndex = React.useMemo(() => {
const index = new SearchIndex();
for (const sidebarInfo of sidebarInfos) {
const { threadInfo } = sidebarInfo;
index.addEntry(threadInfo.id, threadSearchText(threadInfo, userInfos));
}
return index;
}, [sidebarInfos, userInfos]);
React.useEffect(() => {
setSearchState((curState) => ({
...curState,
results: new Set(searchIndex.getSearchResults(curState.text)),
}));
}, [searchIndex]);
const onChangeSearchText = React.useCallback(
(searchText: string) =>
setSearchState({
text: searchText,
results: new Set(searchIndex.getSearchResults(searchText)),
}),
[searchIndex],
);
const searchTextInputRef = React.useRef();
const setSearchTextInputRef = React.useCallback(
async (textInput: ?React.ElementRef) => {
searchTextInputRef.current = textInput;
if (!textInput) {
return;
}
await waitForModalInputFocus();
if (searchTextInputRef.current) {
searchTextInputRef.current.focus();
}
},
[],
);
const { navigation } = props;
const { navigate } = navigation;
const onPressItem = React.useCallback(
(threadInfo: ThreadInfo) => {
setSearchState({
text: '',
results: new Set(),
});
if (searchTextInputRef.current) {
searchTextInputRef.current.blur();
}
navigate({
name: MessageListRouteName,
params: { threadInfo },
key: `${MessageListRouteName}${threadInfo.id}`,
});
},
[navigate],
);
const renderItem = React.useCallback(
(row: { item: SidebarInfo, ... }) => {
return (
);
},
[onPressItem],
);
const indicatorStyle = useIndicatorStyle();
return (
);
}
const styles = StyleSheet.create({
search: {
marginBottom: 8,
},
sidebar: {
- marginLeft: 0,
- marginRight: 5,
+ paddingLeft: 0,
+ paddingRight: 5,
},
});
export default SidebarListModal;