Get MVP of web app running

This commit is contained in:
Paul Frazee 2023-01-26 12:53:46 -06:00
parent 751dfb20fd
commit a3d2db9645
8 changed files with 158 additions and 46 deletions

View file

@ -1,35 +0,0 @@
import React from 'react'
import {observer} from 'mobx-react-lite'
import {View, StyleSheet} from 'react-native'
import {DesktopLeftColumn} from './left-column'
import {DesktopRightColumn} from './right-column'
import {useStores} from '../../../state'
export const DesktopWebShell: React.FC = observer(({children}) => {
const store = useStores()
return (
<View style={styles.outerContainer}>
{store.session.hasSession ? (
<>
<DesktopLeftColumn />
<View style={styles.innerContainer}>{children}</View>
<DesktopRightColumn />
</>
) : (
<View style={styles.innerContainer}>{children}</View>
)}
</View>
)
})
const styles = StyleSheet.create({
outerContainer: {
height: '100%',
},
innerContainer: {
marginLeft: 'auto',
marginRight: 'auto',
width: '600px',
height: '100%',
},
})

View file

@ -0,0 +1,140 @@
import React from 'react'
import {observer} from 'mobx-react-lite'
import {View, StyleSheet, Text} from 'react-native'
import {useStores} from '../../../state'
import {match, MatchResult} from '../../routes'
// import {DesktopLeftColumn} from './left-column'
// import {DesktopRightColumn} from './right-column'
import {Login} from '../../screens/Login'
import {ErrorBoundary} from '../../com/util/ErrorBoundary'
import {usePalette} from '../../lib/hooks/usePalette'
import {s} from '../../lib/styles'
export const WebShell: React.FC = observer(() => {
const pal = usePalette('default')
const store = useStores()
const screenRenderDesc = constructScreenRenderDesc(store.nav)
if (!store.session.hasSession) {
return (
<View style={styles.outerContainer}>
<View style={styles.innerContainer}>
<Login />
</View>
</View>
)
}
return (
<View style={[styles.outerContainer, pal.view]}>
<View style={styles.innerContainer}>
{screenRenderDesc.screens.map(({Com, navIdx, params, key, current}) => (
<View
key={key}
style={[s.h100pct, current ? styles.visible : styles.hidden]}>
<ErrorBoundary>
<Com params={params} navIdx={navIdx} visible={current} />
</ErrorBoundary>
</View>
))}
</View>
</View>
)
// TODO
// <Modal />
// <Lightbox />
// <Composer
// active={store.shell.isComposerActive}
// onClose={() => store.shell.closeComposer()}
// winHeight={winDim.height}
// replyTo={store.shell.composerOpts?.replyTo}
// imagesOpen={store.shell.composerOpts?.imagesOpen}
// onPost={store.shell.composerOpts?.onPost}
// />
// return (
// <View style={styles.outerContainer}>
// {store.session.hasSession ? (
// <>
// <DesktopLeftColumn />
// <View style={styles.innerContainer}>
// <Text>Hello, world! (Logged in)</Text>
// {children}
// </View>
// <DesktopRightColumn />
// </>
// ) : (
// <View style={styles.innerContainer}>
// <Text>Hello, world! (Logged out)</Text>
// {children}
// </View>
// )}
// </View>
// )
})
/**
* This method produces the information needed by the shell to
* render the current screens with screen-caching behaviors.
*/
type ScreenRenderDesc = MatchResult & {
key: string
navIdx: string
current: boolean
previous: boolean
isNewTab: boolean
}
function constructScreenRenderDesc(nav: NavigationModel): {
icon: IconProp
hasNewTab: boolean
screens: ScreenRenderDesc[]
} {
let hasNewTab = false
let icon: IconProp = 'magnifying-glass'
let screens: ScreenRenderDesc[] = []
for (const tab of nav.tabs) {
const tabScreens = [
...tab.getBackList(5),
Object.assign({}, tab.current, {index: tab.index}),
]
const parsedTabScreens = tabScreens.map(screen => {
const isCurrent = nav.isCurrentScreen(tab.id, screen.index)
const isPrevious = nav.isCurrentScreen(tab.id, screen.index + 1)
const matchRes = match(screen.url)
if (isCurrent) {
icon = matchRes.icon
}
hasNewTab = hasNewTab || tab.isNewTab
return Object.assign(matchRes, {
key: `t${tab.id}-s${screen.index}`,
navIdx: `${tab.id}-${screen.id}`,
current: isCurrent,
previous: isPrevious,
isNewTab: tab.isNewTab,
}) as ScreenRenderDesc
})
screens = screens.concat(parsedTabScreens)
}
return {
icon,
hasNewTab,
screens,
}
}
const styles = StyleSheet.create({
outerContainer: {
height: '100%',
},
innerContainer: {
marginLeft: 'auto',
marginRight: 'auto',
width: '600px',
height: '100%',
},
visible: {
display: 'flex',
},
hidden: {
display: 'none',
},
})