Add progress guide list and task components
This commit is contained in:
@@ -0,0 +1,58 @@
|
|||||||
|
import React from 'react'
|
||||||
|
import {View} from 'react-native'
|
||||||
|
import {msg, Trans} from '@lingui/macro'
|
||||||
|
import {useLingui} from '@lingui/react'
|
||||||
|
|
||||||
|
import {atoms as a, useTheme} from '#/alf'
|
||||||
|
import {Button, ButtonIcon} from '../Button'
|
||||||
|
import {TimesLarge_Stroke2_Corner0_Rounded as Times} from '../icons/Times'
|
||||||
|
import {Text} from '../Typography'
|
||||||
|
import {ProgressGuideTask} from './Task'
|
||||||
|
|
||||||
|
export function ProgressGuideList() {
|
||||||
|
const t = useTheme()
|
||||||
|
const {_} = useLingui()
|
||||||
|
|
||||||
|
const [numLikes, setNumLikes] = React.useState<number>(0)
|
||||||
|
const [numFollows, setNumFollows] = React.useState<number>(0)
|
||||||
|
|
||||||
|
// DEBUG
|
||||||
|
React.useEffect(() => {
|
||||||
|
const i = setInterval(() => {
|
||||||
|
setNumLikes(v => (v >= 10 ? 0 : v + 1))
|
||||||
|
setNumFollows(v => (v >= 7 ? 0 : v + 1))
|
||||||
|
}, 1000)
|
||||||
|
return () => {
|
||||||
|
clearInterval(i)
|
||||||
|
}
|
||||||
|
}, [setNumLikes])
|
||||||
|
|
||||||
|
return (
|
||||||
|
<View style={[a.flex_col, a.gap_md]}>
|
||||||
|
<View style={[a.flex_row, a.align_center]}>
|
||||||
|
<Text
|
||||||
|
style={[t.atoms.text_contrast_medium, a.font_semibold, a.text_xs]}>
|
||||||
|
<Trans>GET STARTED</Trans>
|
||||||
|
</Text>
|
||||||
|
<Button
|
||||||
|
variant="ghost"
|
||||||
|
size="tiny"
|
||||||
|
color="secondary"
|
||||||
|
label={_(msg`Dismiss get started`)}>
|
||||||
|
<ButtonIcon icon={Times} />
|
||||||
|
</Button>
|
||||||
|
</View>
|
||||||
|
<ProgressGuideTask
|
||||||
|
current={numLikes}
|
||||||
|
total={10}
|
||||||
|
title={_(msg`Like 10 posts`)}
|
||||||
|
subtitle={_(msg`Teach Discover what you like.`)}
|
||||||
|
/>
|
||||||
|
<ProgressGuideTask
|
||||||
|
current={numFollows}
|
||||||
|
total={7}
|
||||||
|
title={_(msg`Follow 7 people`)}
|
||||||
|
/>
|
||||||
|
</View>
|
||||||
|
)
|
||||||
|
}
|
||||||
@@ -0,0 +1,50 @@
|
|||||||
|
import React from 'react'
|
||||||
|
import {View} from 'react-native'
|
||||||
|
import * as Progress from 'react-native-progress'
|
||||||
|
|
||||||
|
import {atoms as a, useTheme} from '#/alf'
|
||||||
|
import {AnimatedCheck} from '../anim/AnimatedCheck'
|
||||||
|
import {Text} from '../Typography'
|
||||||
|
|
||||||
|
export interface ProgressGuideTaskProps {
|
||||||
|
current: number
|
||||||
|
total: number
|
||||||
|
title: string
|
||||||
|
subtitle?: string
|
||||||
|
}
|
||||||
|
|
||||||
|
export function ProgressGuideTask({
|
||||||
|
current,
|
||||||
|
total,
|
||||||
|
title,
|
||||||
|
subtitle,
|
||||||
|
}: ProgressGuideTaskProps) {
|
||||||
|
const t = useTheme()
|
||||||
|
|
||||||
|
return (
|
||||||
|
<View style={[a.flex_row, a.gap_sm, !subtitle && a.align_center]}>
|
||||||
|
{current === total ? (
|
||||||
|
<AnimatedCheck playOnMount fill={t.palette.primary_500} width={16} />
|
||||||
|
) : (
|
||||||
|
<Progress.Circle
|
||||||
|
progress={current / total}
|
||||||
|
color={t.palette.primary_400}
|
||||||
|
size={16}
|
||||||
|
thickness={2}
|
||||||
|
borderWidth={0}
|
||||||
|
unfilledColor={t.palette.contrast_50}
|
||||||
|
/>
|
||||||
|
)}
|
||||||
|
<View style={[a.flex_col, a.gap_md]}>
|
||||||
|
<View style={[a.flex_col, a.gap_xs]}>
|
||||||
|
<Text style={[a.text_sm, a.font_semibold]}>{title}</Text>
|
||||||
|
{subtitle && (
|
||||||
|
<Text style={[a.text_xs, t.atoms.text_contrast_medium]}>
|
||||||
|
{subtitle}
|
||||||
|
</Text>
|
||||||
|
)}
|
||||||
|
</View>
|
||||||
|
</View>
|
||||||
|
</View>
|
||||||
|
)
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user