Implement scenes listing in main menu

This commit is contained in:
Paul Frazee 2022-11-08 15:56:22 -06:00
parent 1fbc4cf1f2
commit e6429182a1
12 changed files with 498 additions and 43 deletions

View file

@ -16,6 +16,7 @@ import Animated, {
} from 'react-native-reanimated'
import {IconProp} from '@fortawesome/fontawesome-svg-core'
import {FontAwesomeIcon} from '@fortawesome/react-native-fontawesome'
import _chunk from 'lodash.chunk'
import {HomeIcon, UserGroupIcon, BellIcon} from '../../lib/icons'
import {UserAvatar} from '../../com/util/UserAvatar'
import {useStores} from '../../../state'
@ -26,6 +27,12 @@ export const MainMenu = observer(
const store = useStores()
const initInterp = useSharedValue<number>(0)
useEffect(() => {
if (active) {
// trigger a refresh in case memberships have changed recently
store.me.refreshMemberships()
}
}, [active])
useEffect(() => {
if (active) {
initInterp.value = withTiming(1, {duration: 150})
@ -124,6 +131,29 @@ export const MainMenu = observer(
return <View />
}
const MenuItems = ({
children,
}: {
children: (JSX.Element | JSX.Element[])[]
}) => {
const groups = _chunk(children.flat(), 4)
const lastGroup = groups.at(-1)
while (lastGroup && lastGroup.length < 4) {
lastGroup.push(<MenuItemBlank />)
}
return (
<>
{groups.map((group, i) => (
<View key={i} style={[styles.menuItems]}>
{group.map((el, j) => (
<React.Fragment key={j}>{el}</React.Fragment>
))}
</View>
))}
</>
)
}
return (
<>
<TouchableWithoutFeedback onPress={onClose}>
@ -163,7 +193,7 @@ export const MainMenu = observer(
styles.menuItemsAnimContainer,
menuItemsAnimStyle,
]}>
<View style={[styles.menuItems]}>
<MenuItems>
<MenuItem icon="home" label="Home" url="/" />
<MenuItem
icon="bell"
@ -171,27 +201,28 @@ export const MainMenu = observer(
url="/notifications"
count={store.me.notificationCount}
/>
<MenuItemBlank />
<MenuItemBlank />
</View>
</MenuItems>
<Text style={styles.heading}>Scenes</Text>
<View style={[styles.menuItems]}>
<MenuItems>
<MenuItem icon={['far', 'compass']} label="Discover" url="/" />
<MenuItem
icon={'user-group'}
label="Create Scene"
url="/contacts"
/>
<MenuItemActor label="Galaxy Brain" url="/" />
<MenuItemActor label="Paul's Friends" url="/" />
</View>
<View style={[styles.menuItems]}>
<MenuItemActor label="Cool People Only" url="/" />
<MenuItemActor label="Techsky" url="/" />
<MenuItemBlank />
<MenuItemBlank />
</View>
{store.me.memberships ? (
store.me.memberships.memberships.map((membership, i) => (
<MenuItemActor
key={i}
label={membership.displayName || membership.handle}
url={`/profile/${membership.handle}`}
/>
))
) : (
<MenuItemBlank />
)}
</MenuItems>
</Animated.View>
</SafeAreaView>
</Animated.View>