Copy over HomeView
This commit is contained in:
parent
1456c53195
commit
6b6bf83aa9
|
@ -0,0 +1,71 @@
|
|||
import {SizeTypes} from './interfaces'
|
||||
|
||||
export const largeTiles = [
|
||||
{
|
||||
title: 'Peer Supporter Library',
|
||||
screen: 'ProfileLibraryNavigator',
|
||||
size: SizeTypes.LARGE,
|
||||
color: 'mossGreen',
|
||||
icon: require('../../static/images/peer-supporter-solid.png'),
|
||||
disabled: false
|
||||
},
|
||||
{
|
||||
title: '24/7 Chat Room',
|
||||
screen: '24Chat',
|
||||
size: SizeTypes.LARGE,
|
||||
color: 'magenta',
|
||||
icon: require('../../static/images/24-7-solid.png'),
|
||||
disabled: false
|
||||
}
|
||||
];
|
||||
|
||||
export const smallTiles = [
|
||||
{
|
||||
title: 'Discussion Boards',
|
||||
screen: 'DiscussionStackNavigator',
|
||||
size: SizeTypes.SMALL,
|
||||
color: 'dreamBlue',
|
||||
icon: require('../../static/images/discussion-solid.png'),
|
||||
disabled: false
|
||||
},
|
||||
{
|
||||
title: 'Virtual Happy Hour',
|
||||
screen: 'VirtualHappyHour',
|
||||
size: SizeTypes.SMALL,
|
||||
color: 'creamsicleYellow',
|
||||
icon: require('../../static/images/happy-hour-solid.png'),
|
||||
disabled: true
|
||||
},
|
||||
{
|
||||
title: 'Calendar',
|
||||
screen: 'Calendar',
|
||||
size: SizeTypes.SMALL,
|
||||
color: 'pink',
|
||||
icon: require('../../static/images/calendar-solid.png'),
|
||||
disabled: true
|
||||
},
|
||||
{
|
||||
title: 'Direct Messaging',
|
||||
screen: 'ChatsStackNavigator',
|
||||
size: SizeTypes.SMALL,
|
||||
color: 'pink',
|
||||
icon: require('../../static/images/messaging-solid.png'),
|
||||
disabled: false
|
||||
},
|
||||
{
|
||||
title: 'Tech Support',
|
||||
screen: 'TechSupport',
|
||||
size: SizeTypes.SMALL,
|
||||
color: 'magenta',
|
||||
icon: require('../../static/images/support-solid.png'),
|
||||
disabled: true
|
||||
},
|
||||
{
|
||||
title: 'Settings',
|
||||
screen: 'SettingsStackNavigator',
|
||||
size: SizeTypes.SMALL,
|
||||
color: 'creamsicleYellow',
|
||||
icon: require('../../static/images/settings-solid.png'),
|
||||
disabled: false
|
||||
}
|
||||
];
|
|
@ -0,0 +1,61 @@
|
|||
import { Q } from '@nozbe/watermelondb';
|
||||
import { Subscription } from 'rxjs';
|
||||
|
||||
import database from '../../lib/database';
|
||||
import { TSubscriptionModel } from '../../definitions';
|
||||
import { goRoom } from '../../lib/methods/helpers/goRoom';
|
||||
|
||||
const CHAT247ROOMID = '24-7-chatroom';
|
||||
|
||||
let querySubscription: Subscription;
|
||||
|
||||
const unsubscribeQuery = () => {
|
||||
if (querySubscription && querySubscription.unsubscribe) {
|
||||
querySubscription.unsubscribe();
|
||||
}
|
||||
};
|
||||
|
||||
export const get247Chat = async (): Promise<TSubscriptionModel | undefined> => {
|
||||
let chatRoom: TSubscriptionModel | undefined;
|
||||
|
||||
unsubscribeQuery();
|
||||
|
||||
const db = database.active;
|
||||
|
||||
const defaultWhereClause = [Q.where('archived', false), Q.where('open', true)] as (Q.WhereDescription | Q.SortBy)[];
|
||||
defaultWhereClause.push(Q.experimentalSortBy('room_updated_at', Q.desc));
|
||||
|
||||
const observable = await db
|
||||
.get('subscriptions')
|
||||
.query(...defaultWhereClause)
|
||||
.observeWithColumns(['on_hold']);
|
||||
|
||||
const subscriptionPromise = new Promise<void>((resolve, reject) => {
|
||||
querySubscription = observable.subscribe(
|
||||
data => {
|
||||
chatRoom = data.find(chat => chat.name === CHAT247ROOMID);
|
||||
resolve();
|
||||
},
|
||||
error => {
|
||||
reject(error);
|
||||
}
|
||||
);
|
||||
});
|
||||
|
||||
await subscriptionPromise;
|
||||
return chatRoom;
|
||||
};
|
||||
|
||||
export const navigateTo247Chat = async (Navigation: any, isMasterDetail: boolean) => {
|
||||
if (Navigation) {
|
||||
try {
|
||||
const chatRoom = await get247Chat();
|
||||
await Navigation.navigate('ChatsStackNavigator', {
|
||||
screen: 'RoomListView'
|
||||
});
|
||||
goRoom({ item: chatRoom, isMasterDetail });
|
||||
} catch (error) {
|
||||
console.error('error', error);
|
||||
}
|
||||
}
|
||||
};
|
|
@ -0,0 +1,109 @@
|
|||
import React, { useEffect } from 'react';
|
||||
import { ScrollView, Text, View, Image } from 'react-native';
|
||||
import { useSelector } from 'react-redux';
|
||||
import Touchable from 'react-native-platform-touchable';
|
||||
import { useNavigation } from '@react-navigation/native';
|
||||
import { StackNavigationProp } from '@react-navigation/stack';
|
||||
|
||||
import { getUserSelector } from '../../selectors/login';
|
||||
import { LISTENER } from '../../containers/Toast';
|
||||
import StatusBar from '../../containers/StatusBar';
|
||||
import * as HeaderButton from '../../containers/HeaderButton';
|
||||
import EventEmitter from '../../lib/methods/helpers/events';
|
||||
import { themes } from '../../lib/constants';
|
||||
import {
|
||||
// useTheme,
|
||||
withTheme
|
||||
} from '../../theme';
|
||||
import { IApplicationState } from '../../definitions';
|
||||
import * as tileData from './data';
|
||||
import * as allStyles from './styles';
|
||||
import { Tileprops } from './interfaces';
|
||||
import { navigateTo247Chat } from './helpers';
|
||||
import Avatar from '../../containers/Avatar/Avatar';
|
||||
import Navigation from '../../lib/navigation/appNavigation';
|
||||
|
||||
const HomeView: React.FC = () => {
|
||||
const navigation = useNavigation<StackNavigationProp<any>>();
|
||||
const user = useSelector((state: IApplicationState) => getUserSelector(state));
|
||||
const isMasterDetail = useSelector((state: IApplicationState) => state.app.isMasterDetail);
|
||||
const server = useSelector((state: IApplicationState) => state.server.server);
|
||||
const userName = user?.name || '';
|
||||
// const { theme } = useTheme();
|
||||
const theme = 'light';
|
||||
|
||||
const { largeTiles, smallTiles } = tileData;
|
||||
const { styles, createTileStyles } = allStyles;
|
||||
|
||||
useEffect(() => {
|
||||
navigation.setOptions({ title: '', headerStyle: { shadowColor: 'transparent' } });
|
||||
if (!isMasterDetail) {
|
||||
navigation.setOptions({
|
||||
headerLeft: () => <HeaderButton.Drawer navigation={navigation} testID='display-view-drawer' />,
|
||||
headerRight: () => (
|
||||
<HeaderButton.Container>
|
||||
<HeaderButton.Item
|
||||
iconName='search'
|
||||
onPress={() => {
|
||||
EventEmitter.emit(LISTENER, { message: `Open search` });
|
||||
}}
|
||||
/>
|
||||
<Touchable style={styles.profileImageContainer} onPress={() => navigation.navigate('ProfileStackNavigator')}>
|
||||
{userName ? (
|
||||
<Avatar text={userName} style={styles.profileImage} size={24} server={server} borderRadius={12} />
|
||||
) : (
|
||||
<></>
|
||||
)}
|
||||
</Touchable>
|
||||
</HeaderButton.Container>
|
||||
)
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
const homeViewTile = ({ icon, title, size, screen, color, disabled = false }: Tileprops, index: number) => {
|
||||
const tileStyles = createTileStyles({
|
||||
size,
|
||||
color: themes[theme][color]
|
||||
});
|
||||
const imageStyle = size === 'large' ? tileStyles.largeImage : tileStyles.smallImage;
|
||||
|
||||
return (
|
||||
<Touchable
|
||||
onPress={() => {
|
||||
if (screen) {
|
||||
if (screen === '24Chat') {
|
||||
navigateTo247Chat(Navigation, isMasterDetail);
|
||||
return;
|
||||
}
|
||||
navigation.navigate(screen);
|
||||
}
|
||||
}}
|
||||
style={{ opacity: disabled ? 0.4 : 1, ...tileStyles.tile }}
|
||||
key={index}
|
||||
disabled={disabled}
|
||||
activeOpacity={0.6}
|
||||
>
|
||||
<View style={tileStyles.tileContent}>
|
||||
<View style={tileStyles.imageContainer}>
|
||||
<Image source={icon} style={imageStyle} resizeMode='contain' />
|
||||
</View>
|
||||
<Text style={tileStyles.text}>{title}</Text>
|
||||
</View>
|
||||
</Touchable>
|
||||
);
|
||||
};
|
||||
|
||||
return (
|
||||
<View style={styles.mainContainer} testID='home-view'>
|
||||
<StatusBar />
|
||||
<ScrollView>
|
||||
<Text style={styles.title}>{`Welcome ${userName},`}</Text>
|
||||
<View style={styles.tileContainer}>{largeTiles.map((item, index) => homeViewTile(item, index))}</View>
|
||||
<View style={styles.tileContainer}>{smallTiles.map((item, index) => homeViewTile(item, index))}</View>
|
||||
</ScrollView>
|
||||
</View>
|
||||
);
|
||||
};
|
||||
|
||||
export default withTheme(HomeView);
|
|
@ -0,0 +1,15 @@
|
|||
import { TColors } from '../../theme';
|
||||
|
||||
export enum SizeTypes {
|
||||
SMALL = 'small',
|
||||
LARGE = 'large'
|
||||
}
|
||||
|
||||
export interface Tileprops {
|
||||
icon: any;
|
||||
title: string;
|
||||
size: SizeTypes;
|
||||
screen: string;
|
||||
color: TColors;
|
||||
disabled?: boolean;
|
||||
}
|
|
@ -0,0 +1,65 @@
|
|||
import { StyleSheet } from 'react-native';
|
||||
|
||||
import { colors } from '../../lib/constants';
|
||||
|
||||
export const styles = StyleSheet.create({
|
||||
mainContainer: {
|
||||
backgroundColor: colors.light.backgroundColor,
|
||||
flex: 1,
|
||||
padding: 20
|
||||
},
|
||||
title: {
|
||||
fontSize: 24,
|
||||
lineHeight: 29,
|
||||
fontWeight: '600'
|
||||
},
|
||||
tileContainer: {
|
||||
flexDirection: 'row',
|
||||
justifyContent: 'space-around',
|
||||
flexWrap: 'wrap'
|
||||
},
|
||||
profileImageContainer: {
|
||||
marginRight: 20
|
||||
},
|
||||
profileImage: {
|
||||
// width: 24,
|
||||
// height: 24,
|
||||
borderRadius: 12,
|
||||
// backgroundColor: 'red'
|
||||
}
|
||||
});
|
||||
|
||||
export const createTileStyles = ({ size, color }: { size?: 'small' | 'large'; color: string }) =>
|
||||
StyleSheet.create({
|
||||
tile: {
|
||||
width: size === 'small' ? 96 : 130,
|
||||
marginVertical: 16,
|
||||
alignItems: 'center'
|
||||
},
|
||||
tileContent: {
|
||||
alignItems: 'center'
|
||||
},
|
||||
imageContainer: {
|
||||
justifyContent: 'center',
|
||||
alignItems: 'center',
|
||||
width: size === 'small' ? 80 : 130,
|
||||
height: size === 'small' ? 80 : 130,
|
||||
borderRadius: size === 'small' ? 10 : 65,
|
||||
backgroundColor: color
|
||||
},
|
||||
text: {
|
||||
fontSize: 16,
|
||||
lineHeight: 19,
|
||||
textAlign: 'center',
|
||||
fontWeight: '500',
|
||||
marginTop: size === 'small' ? 14 : 16
|
||||
},
|
||||
smallImage: {
|
||||
width: 45,
|
||||
height: 45
|
||||
},
|
||||
largeImage: {
|
||||
width: 75,
|
||||
height: 75
|
||||
}
|
||||
});
|
Loading…
Reference in New Issue