Skip to content

Commit

Permalink
Merge pull request #482 from oasisprotocol/ml/mobile-paratime-picker
Browse files Browse the repository at this point in the history
Mobile ParaTime picker
  • Loading branch information
lubej committed Jun 19, 2023
2 parents 1ce36a0 + 73a0ca6 commit 5525118
Show file tree
Hide file tree
Showing 10 changed files with 236 additions and 58 deletions.
1 change: 1 addition & 0 deletions .changelog/482.feature.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Mobile ParaTime picker
21 changes: 19 additions & 2 deletions src/app/components/PageLayout/Header.tsx
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { FC } from 'react'
import { FC, useEffect, useRef } from 'react'
import AppBar from '@mui/material/AppBar'
import Grid from '@mui/material/Unstable_Grid2'
import useScrollTrigger from '@mui/material/useScrollTrigger'
Expand All @@ -8,18 +8,35 @@ import { NetworkSelector } from './NetworkSelector'
import Box from '@mui/material/Box'
import { useScopeParam } from '../../hooks/useScopeParam'
import { useScreenSize } from '../../hooks/useScreensize'
import useResizeObserver from 'use-resize-observer'

export const Header: FC = () => {
const theme = useTheme()
const { isMobile } = useScreenSize()
const { isMobile, isTablet } = useScreenSize()
const scope = useScopeParam()
const scrollTrigger = useScrollTrigger({
disableHysteresis: true,
threshold: 0,
})
const headerRef = useRef<HTMLDivElement | null>(null)

const { height: headerHeight } = useResizeObserver<Element>({
ref: headerRef,
})

useEffect(() => {
if (!isTablet) {
return
}

if (headerRef.current !== null) {
document.body.style.setProperty('--app-header-height', `${headerHeight?.toFixed(2) || 0}px`)
}
}, [isTablet, headerHeight])

return (
<AppBar
ref={headerRef}
position="sticky"
sx={{
transitionProperty: 'background-color',
Expand Down
26 changes: 22 additions & 4 deletions src/app/components/PageLayout/index.tsx
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { FC, PropsWithChildren, ReactNode } from 'react'
import { FC, PropsWithChildren, ReactNode, useEffect, useRef } from 'react'
import { Header } from './Header'
import { Footer } from './Footer'
import Box from '@mui/material/Box'
Expand All @@ -10,6 +10,7 @@ import { NetworkOfflineBanner, RuntimeOfflineBanner } from '../OfflineBanner'
import { Search } from '../Search'
import { useIsApiOffline } from '../OfflineBanner/hook'
import { Network } from '../../../types/network'
import useResizeObserver from 'use-resize-observer'

interface PageLayoutProps {
mobileFooterAction?: ReactNode
Expand All @@ -24,12 +25,29 @@ export const PageLayout: FC<PropsWithChildren<PageLayoutProps>> = ({ children, m
const { isMobile, isTablet } = useScreenSize()
const scope = useScopeParam()
const isApiOffline = useIsApiOffline(scope?.network || Network.mainnet)
const bannersRef = useRef<HTMLDivElement | null>(null)

const { height: bannersHeight } = useResizeObserver<Element>({
ref: bannersRef,
})

useEffect(() => {
if (!isTablet) {
return
}

if (bannersRef.current !== null) {
document.body.style.setProperty('--app-banners-height', `${bannersHeight?.toFixed(2) || 0}px`)
}
}, [isTablet, bannersHeight])

return (
<>
<BuildBanner />
<NetworkOfflineBanner />
{scope && <RuntimeOfflineBanner />}
<Box ref={bannersRef}>
<BuildBanner />
<NetworkOfflineBanner />
{scope && <RuntimeOfflineBanner />}
</Box>
<Box
sx={{
minHeight: '100vh',
Expand Down
4 changes: 3 additions & 1 deletion src/app/components/ParaTimePicker/LayerDetails.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ import { getLayerLabels, getNetworkIcons } from '../../utils/content'
import { getNameForScope } from '../../../types/searchScope'
import { useRuntimeFreshness } from '../OfflineBanner/hook'
import { LayerStatus } from '../LayerStatus'
import { useScreenSize } from '../../hooks/useScreensize'

type LayerDetailsContent = {
description: string
Expand Down Expand Up @@ -80,6 +81,7 @@ const contentMinHeight = '270px'
export const LayerDetails: FC<LayerDetailsProps> = ({ network, selectedLayer }) => {
const { t } = useTranslation()
const theme = useTheme()
const { isTablet } = useScreenSize()
const labels = getNetworkNames(t)
const layerLabels = getLayerLabels(t)
const icons = getNetworkIcons()
Expand All @@ -92,7 +94,7 @@ export const LayerDetails: FC<LayerDetailsProps> = ({ network, selectedLayer })
}

return (
<Box sx={{ px: 5, py: 4, display: 'flex', minHeight: contentMinHeight }}>
<Box sx={{ px: isTablet ? 2 : 5, py: 4, display: 'flex', minHeight: contentMinHeight }}>
<Box sx={{ pt: 1, pr: 4, color: COLORS.brandDark }}>
<Circle
color={COLORS.white}
Expand Down
29 changes: 20 additions & 9 deletions src/app/components/ParaTimePicker/LayerMenu.tsx
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { FC, useState } from 'react'
import { FC, PropsWithChildren, useState } from 'react'
import { useTranslation } from 'react-i18next'
import Typography from '@mui/material/Typography'
import KeyboardArrowRightIcon from '@mui/icons-material/KeyboardArrowRight'
Expand All @@ -12,13 +12,24 @@ import { getLayerLabels } from '../../utils/content'
import { RouteUtils } from '../../utils/route-utils'
import { Network } from '../../../types/network'
import { orderByLayer } from '../../../types/layers'
import { useScreenSize } from '../../hooks/useScreensize'

type BaseLayerMenuItemProps = {
divider: boolean
layer: Layer
}

const LayerMenuItemCaption: FC<PropsWithChildren> = ({ children }) => (
<Typography
component="span"
sx={{ fontSize: '10px', fontStyle: 'italic', color: COLORS.grayMedium, ml: 2 }}
>
{children}
</Typography>
)

export const DisabledLayerMenuItem: FC<BaseLayerMenuItemProps> = ({ divider, layer }) => {
const { isTablet } = useScreenSize()
const { t } = useTranslation()
const labels = getLayerLabels(t)

Expand All @@ -27,7 +38,10 @@ export const DisabledLayerMenuItem: FC<BaseLayerMenuItemProps> = ({ divider, lay
{/* Div is needed because we need an element with enabled pointer-events to make Tooltip work */}
<div>
<MenuItem disabled divider={divider}>
<ListItemText>{labels[layer]}</ListItemText>
<ListItemText>
{labels[layer]}
{isTablet && <LayerMenuItemCaption>{t('paraTimePicker.comingSoon')}</LayerMenuItemCaption>}
</ListItemText>
</MenuItem>
</div>
</Tooltip>
Expand Down Expand Up @@ -70,12 +84,9 @@ export const LayerMenuItem: FC<LayerMenuItemProps> = ({
>
<ListItemText>
{labels[layer]}
<Typography
component="span"
sx={{ fontSize: '10px', fontStyle: 'italic', color: COLORS.grayMedium, ml: 2 }}
>
{selectedNetwork === network && activeLayer === layer && t('paraTimePicker.selected')}
</Typography>
{selectedNetwork === network && activeLayer === layer && (
<LayerMenuItemCaption>{t('paraTimePicker.selected')}</LayerMenuItemCaption>
)}
</ListItemText>
{layer === selectedLayer && <KeyboardArrowRightIcon />}
</MenuItem>
Expand Down Expand Up @@ -105,7 +116,7 @@ export const LayerMenu: FC<LayerMenuProps> = ({
.sort(orderByLayer)

return (
<MenuList>
<MenuList sx={{ pt: 0 }}>
{options.map((option, index) => {
if (!option.enabled) {
return (
Expand Down
2 changes: 1 addition & 1 deletion src/app/components/ParaTimePicker/NetworkMenu.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -85,7 +85,7 @@ export const NetworkMenu: FC<NetworkMenuProps> = ({ activeNetwork, selectedNetwo

return (
<>
<MenuList>
<MenuList sx={{ pt: 0 }}>
{stableOptions.map((network, index) => (
<NetworkMenuItem
activeNetwork={activeNetwork}
Expand Down

0 comments on commit 5525118

Please sign in to comment.