diff --git a/app/containers/BackgroundContainer/index.tsx b/app/containers/BackgroundContainer/index.tsx
index fbe5d307..1c4ed396 100644
--- a/app/containers/BackgroundContainer/index.tsx
+++ b/app/containers/BackgroundContainer/index.tsx
@@ -35,7 +35,7 @@ const styles = StyleSheet.create({
const BackgroundContainer = ({ theme, text, loading }: IBackgroundContainer) => (
- {text ? {text} : null}
+ {text && !loading ? {text} : null}
{loading ? : null}
);
diff --git a/app/containers/ThreadDetails.tsx b/app/containers/ThreadDetails.tsx
index 9275019d..ada6d12d 100644
--- a/app/containers/ThreadDetails.tsx
+++ b/app/containers/ThreadDetails.tsx
@@ -1,11 +1,11 @@
import React from 'react';
-import { StyleSheet, Text, View } from 'react-native';
+import { StyleSheet, Text, View, ViewStyle } from 'react-native';
import Touchable from 'react-native-platform-touchable';
import { CustomIcon } from '../lib/Icons';
import { themes } from '../constants/colors';
import sharedStyles from '../views/Styles';
-import { withTheme } from '../theme';
+import { useTheme } from '../theme';
const styles = StyleSheet.create({
container: {
@@ -41,8 +41,7 @@ const styles = StyleSheet.create({
interface IThreadDetails {
item: {
- tcount?: number | string;
- dcount?: number | string;
+ tcount: number | string;
replies?: any;
id: string;
};
@@ -53,25 +52,20 @@ interface IThreadDetails {
toggleFollowThread: Function;
thread: boolean;
time: string;
- style: object;
- theme: string;
+ style: ViewStyle;
}
-const ThreadDetails = ({ item, user, badgeColor, toggleFollowThread, thread, time, style, theme }: IThreadDetails) => {
- const { tcount, dcount } = item;
- let count = tcount || dcount;
+const ThreadDetails = ({ item, user, badgeColor, toggleFollowThread, style }: IThreadDetails) => {
+ const { theme } = useTheme();
+ let { tcount } = item;
- if (count! >= 1000) {
- count = '+999';
- } else if (count! >= 100) {
- count = '+99';
+ if (tcount >= 1000) {
+ tcount = '+999';
}
let replies = item?.replies?.length ?? 0;
if (replies >= 1000) {
replies = '+999';
- } else if (replies >= 100) {
- replies = '+99';
}
const isFollowing = item.replies?.find((u: any) => u === user?.id);
@@ -80,34 +74,31 @@ const ThreadDetails = ({ item, user, badgeColor, toggleFollowThread, thread, tim
-
-
- {count}
+
+
+ {tcount}
-
-
- {thread ? replies : time}
+
+
+ {replies}
-
- {thread ? (
-
- {badgeColor ? : null}
- toggleFollowThread?.(isFollowing, item.id)}>
-
-
-
- ) : null}
+
+ {badgeColor ? : null}
+ toggleFollowThread?.(isFollowing, item.id)}>
+
+
+
);
};
-export default withTheme(ThreadDetails);
+export default ThreadDetails;
diff --git a/app/views/DiscussionsView/DiscussionDetails.tsx b/app/views/DiscussionsView/DiscussionDetails.tsx
new file mode 100644
index 00000000..6e36f6b6
--- /dev/null
+++ b/app/views/DiscussionsView/DiscussionDetails.tsx
@@ -0,0 +1,73 @@
+import React from 'react';
+import { StyleSheet, Text, View, ViewStyle } from 'react-native';
+
+import { CustomIcon } from '../../lib/Icons';
+import { themes } from '../../constants/colors';
+import sharedStyles from '../Styles';
+import { useTheme } from '../../theme';
+
+const styles = StyleSheet.create({
+ container: {
+ flex: 1,
+ flexDirection: 'row',
+ alignItems: 'center'
+ },
+ detailsContainer: {
+ flex: 1,
+ flexDirection: 'row'
+ },
+ detailContainer: {
+ flexDirection: 'row',
+ alignItems: 'center',
+ marginRight: 8
+ },
+ detailText: {
+ fontSize: 10,
+ marginLeft: 2,
+ ...sharedStyles.textSemibold
+ }
+});
+
+interface IDiscussionDetails {
+ item: {
+ dcount: number | string;
+ replies?: any;
+ id: string;
+ };
+ user: {
+ id: string;
+ };
+ time: string;
+ style: ViewStyle;
+}
+
+const DiscussionDetails = ({ item, time, style }: IDiscussionDetails) => {
+ const { theme } = useTheme();
+ let { dcount } = item;
+
+ if (dcount >= 1000) {
+ dcount = '+999';
+ }
+
+ return (
+
+
+
+
+
+ {dcount}
+
+
+
+
+
+
+ {time}
+
+
+
+
+ );
+};
+
+export default DiscussionDetails;
diff --git a/app/views/DiscussionsView/Item.tsx b/app/views/DiscussionsView/Item.tsx
new file mode 100644
index 00000000..a92b4c6c
--- /dev/null
+++ b/app/views/DiscussionsView/Item.tsx
@@ -0,0 +1,111 @@
+import React from 'react';
+import { StyleSheet, Text, View } from 'react-native';
+import Touchable from 'react-native-platform-touchable';
+
+import { useTheme } from '../../theme';
+import Avatar from '../../containers/Avatar';
+import sharedStyles from '../Styles';
+import { themes } from '../../constants/colors';
+import Markdown from '../../containers/markdown';
+import { formatDateThreads, makeThreadName } from '../../utils/room';
+import DiscussionDetails from './DiscussionDetails';
+
+const styles = StyleSheet.create({
+ container: {
+ flexDirection: 'row',
+ padding: 16
+ },
+ contentContainer: {
+ flexDirection: 'column',
+ flex: 1
+ },
+ titleContainer: {
+ flexDirection: 'row',
+ marginBottom: 2,
+ justifyContent: 'space-between'
+ },
+ title: {
+ flexShrink: 1,
+ fontSize: 18,
+ ...sharedStyles.textMedium
+ },
+ time: {
+ fontSize: 14,
+ marginLeft: 4,
+ ...sharedStyles.textRegular
+ },
+ avatar: {
+ marginRight: 8
+ },
+ discussionDetails: {
+ marginTop: 8
+ },
+ messageContainer: {
+ flexDirection: 'row'
+ },
+ markdown: {
+ flex: 1
+ }
+});
+
+interface IItem {
+ item: {
+ id: string;
+ u: {
+ username: string;
+ };
+ dcount: string | number;
+ replies?: any;
+ msg: string;
+ ts: string;
+ };
+ baseUrl: string;
+ user: {
+ id: string;
+ token: string;
+ };
+ onPress: {
+ (...args: any[]): void;
+ stop(): void;
+ };
+}
+
+const Item = ({ item, baseUrl, user, onPress }: IItem): JSX.Element => {
+ const { theme } = useTheme();
+ const username = item?.u?.username;
+ const date = formatDateThreads(item.ts);
+
+ return (
+ onPress(item)}
+ testID={`discussions-view-${item.msg}`}
+ style={{ backgroundColor: themes[theme!].backgroundColor }}>
+
+
+
+
+
+ {username}
+
+ {date}
+
+
+ {/* @ts-ignore */}
+
+
+
+
+
+
+ );
+};
+
+export default Item;
diff --git a/app/views/DiscussionsView/index.tsx b/app/views/DiscussionsView/index.tsx
index efee9b0a..a1aa1a51 100644
--- a/app/views/DiscussionsView/index.tsx
+++ b/app/views/DiscussionsView/index.tsx
@@ -20,22 +20,37 @@ import { getHeaderTitlePosition } from '../../containers/Header';
import { useTheme } from '../../theme';
import RocketChat from '../../lib/rocketchat';
import SearchHeader from '../../containers/SearchHeader';
-import Item from '../ThreadMessagesView/Item';
+import Item from './Item';
import styles from './styles';
const API_FETCH_COUNT = 50;
+interface IItem {
+ rid: string;
+ drid: string;
+ prid: string;
+ id: string;
+ u: {
+ username: string;
+ };
+ dcount: string | number;
+ replies?: any;
+ msg: string;
+ ts: string;
+}
+
interface IDiscussionsViewProps {
navigation: StackNavigationProp;
route: RouteProp;
- item: {
- msg: string;
- };
+ item: IItem;
}
interface IDiscussionsViewState {
- login?: {
- user: object;
+ login: {
+ user: {
+ id: string;
+ token: string;
+ };
};
server: {
server: string;
@@ -54,8 +69,6 @@ const DiscussionsView = ({ navigation, route }: IDiscussionsViewProps): JSX.Elem
const user = useSelector((state: IDiscussionsViewState) => state.login?.user);
const baseUrl = useSelector((state: IDiscussionsViewState) => state.server?.server);
- const useRealName = useSelector((state: IDiscussionsViewState) => state.settings?.UI_Use_Real_Name);
- const timeFormat = useSelector((state: IDiscussionsViewState) => state.settings?.Message_TimeFormat);
const isMasterDetail = useSelector((state: IDiscussionsViewState) => state.app?.isMasterDetail);
const [loading, setLoading] = useState(false);
@@ -174,7 +187,7 @@ const DiscussionsView = ({ navigation, route }: IDiscussionsViewProps): JSX.Elem
}, [navigation, isSearching]);
const onDiscussionPress = debounce(
- (item: any) => {
+ (item: IItem) => {
navigation.push('RoomView', {
rid: item.drid,
prid: item.rid,
@@ -186,16 +199,14 @@ const DiscussionsView = ({ navigation, route }: IDiscussionsViewProps): JSX.Elem
true
);
- const renderItem = ({ item }: any) => (
+ const renderItem = ({ item }: { item: IItem }) => (
);
@@ -218,7 +229,7 @@ const DiscussionsView = ({ navigation, route }: IDiscussionsViewProps): JSX.Elem
windowSize={10}
initialNumToRender={7}
removeClippedSubviews={isIOS}
- onEndReached={() => (isSearching ? searchTotal > API_FETCH_COUNT ?? load() : total > API_FETCH_COUNT ?? load())}
+ onEndReached={() => (searchTotal || total) > API_FETCH_COUNT ?? load()}
ItemSeparatorComponent={List.Separator}
ListFooterComponent={loading ? : null}
scrollIndicatorInsets={{ right: 1 }}
diff --git a/ios/RocketChatRN.xcodeproj/project.pbxproj b/ios/RocketChatRN.xcodeproj/project.pbxproj
index d9ff1460..65ed76c1 100644
--- a/ios/RocketChatRN.xcodeproj/project.pbxproj
+++ b/ios/RocketChatRN.xcodeproj/project.pbxproj
@@ -1869,7 +1869,7 @@
COPY_PHASE_STRIP = NO;
ENABLE_STRICT_OBJC_MSGSEND = YES;
ENABLE_TESTABILITY = YES;
- "EXCLUDED_ARCHS[sdk=iphonesimulator*]" = "arm64 i386";
+ "EXCLUDED_ARCHS[sdk=iphonesimulator*]" = i386;
GCC_C_LANGUAGE_STANDARD = gnu99;
GCC_DYNAMIC_NO_PIC = NO;
GCC_NO_COMMON_BLOCKS = YES;
@@ -1924,7 +1924,7 @@
COPY_PHASE_STRIP = YES;
ENABLE_NS_ASSERTIONS = NO;
ENABLE_STRICT_OBJC_MSGSEND = YES;
- "EXCLUDED_ARCHS[sdk=iphonesimulator*]" = "arm64 i386";
+ "EXCLUDED_ARCHS[sdk=iphonesimulator*]" = i386;
GCC_C_LANGUAGE_STANDARD = gnu99;
GCC_NO_COMMON_BLOCKS = YES;
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;