@chakra-ui/react#Badge TypeScript Examples
The following examples show how to use
@chakra-ui/react#Badge.
You can vote up the ones you like or vote down the ones you don't like,
and go to the original project or source file by following the links above each example. You may check out the related API usage on the sidebar.
Example #1
Source File: index.tsx From bluebubbles-server with Apache License 2.0 | 6 votes |
StatBox = (
{ title, text, color }:
{ title: string, text: string | number | null, color: string }
): JSX.Element => {
return (
<Box maxW='sm' borderWidth='1px' borderRadius='lg' overflow='hidden' p={5} m={1}>
<Badge borderRadius='full' px='2' colorScheme={color} mb={2}>
{title}
</Badge>
<Spacer />
<Box
color='gray.500'
fontWeight='semibold'
letterSpacing='wide'
>
{(text === null) ? (
<SkeletonText height={20} mt={2} noOfLines={3} />
) : (
(typeof(text) === 'number') ? (
<Text fontSize='2vw'>{formatNumber(text)}</Text>
) : (
<Text fontSize='2vw'>{text}</Text>
)
)}
</Box>
</Box>
);
}
Example #2
Source File: Home.tsx From wiregui with MIT License | 6 votes |
export default function Home() {
return (
<Content>
<Flex direction="column" justify="center" marginLeft="30%">
<Center>
<Image
src="../icons/dragon.png"
width="50%"
opacity="50%"
filter="grayscale(100%)"
draggable="false"
/>
</Center>
<Center mt="10" opacity="75%">
Click{" "}
<Badge mx="1" variant="outline" colorScheme="orange">
New Tunnel
</Badge>{" "}
to add a new tunnel
</Center>
<Center mt="4" opacity="75%">
Click an existing tunnel to toggle
</Center>
</Flex>
</Content>
);
}
Example #3
Source File: CourseCard.tsx From fresh-coupons with GNU General Public License v3.0 | 6 votes |
function DiscountBadge({isAlreadyAFreeCourse, discountPercentage, ...props}: DiscountBadgeProps) {
return (
<Badge
position="absolute"
top="0"
left="0"
fontSize="md"
variant="solid"
colorScheme="orange"
{...props}>{isAlreadyAFreeCourse ? "FREE" : `${discountPercentage}% OFF`}</Badge>
)
}
Example #4
Source File: CourseRating.tsx From fresh-coupons with GNU General Public License v3.0 | 6 votes |
CourseRating = (props: CustomerReviewsProps) => {
const { rating, reviewCount, ...stackProps } = props
if(!reviewCount || !rating) return (
<Text fontSize="sm" fontWeight="medium" color={useColorModeValue('gray.600', 'gray.300')}>
Not enough rating
</Text>
)
return (
<HStack spacing="1" {...stackProps}>
<Badge colorScheme="orange" variant="solid" px="2" rounded="full">
{rating}
</Badge>
{length && reviewCount && (
<>
<Flex align="center">
{Array.from({length: +rating!}).map((_, index) => (
<Icon key={index} as={HiStar} color="orange.500"/>
))}
</Flex>
<Text fontSize="sm" fontWeight="medium" color={useColorModeValue('gray.600', 'gray.300')}>
({reviewCount})
</Text>
</>
)}
</HStack>
)
}
Example #5
Source File: ElementsSummary.tsx From engine with MIT License | 6 votes |
ElementsSummary: view = ({
elements,
isDepsVisible = observe.views[prop.parentId].data.isDepsVisible,
updateIsDepsVisible = update.views[prop.parentId].data.isDepsVisible,
}) => {
if (!elements) {
return;
}
let deps = (elements.view || []).concat(elements.producer || []);
deps = uniq(deps);
const depsNo = deps.length;
return (
<Stack direction="row" ml="2">
{depsNo > 0 && (
<>
<Badge
variant={isDepsVisible ? "solid" : "outline"}
colorScheme="purple"
cursor="pointer"
onClick={() => updateIsDepsVisible.set(!isDepsVisible)}
>
{depsNo} deps
</Badge>
</>
)}
</Stack>
);
}
Example #6
Source File: CouponAvailableBanner.tsx From fresh-coupons with GNU General Public License v3.0 | 5 votes |
function BannerContent(props: BannerContentProps) {
const {couponCode, discountPercentage} = props
return (
<Text fontWeight="bold" as="span" fontSize="3xl">Use <Badge fontSize="xl">{couponCode}</Badge> coupon code to get <Badge
fontSize="xl">{discountPercentage}</Badge> ?</Text>
)
}
Example #7
Source File: FusePoolEditPage.tsx From rari-dApp with GNU Affero General Public License v3.0 | 5 votes |
RewardsDistributorRow = ({
rewardsDistributor,
handleRowClick,
hideModalDivider,
activeCTokens,
}: {
rewardsDistributor: RewardsDistributor;
handleRowClick: (rD: RewardsDistributor) => void;
hideModalDivider: boolean;
activeCTokens: string[];
}) => {
const { address, fuse } = useRari();
const isAdmin = address === rewardsDistributor.admin;
const tokenData = useTokenData(rewardsDistributor.rewardToken);
// Balances
const { data: rDBalance } = useTokenBalance(
rewardsDistributor.rewardToken,
rewardsDistributor.address
);
const underlyingsMap = useCTokensUnderlying(activeCTokens);
const underlyings = Object.values(underlyingsMap);
return (
<>
<Tr
_hover={{ background: "grey", cursor: "pointer" }}
h="30px"
p={5}
flexDir="row"
onClick={() => handleRowClick(rewardsDistributor)}
>
<Td>
<HStack>
{tokenData?.logoURL ? (
<Image
src={tokenData.logoURL}
boxSize="30px"
borderRadius="50%"
/>
) : null}
<Heading fontSize="22px" color={tokenData?.color ?? "#FFF"} ml={2}>
{tokenData
? tokenData.symbol ?? "Invalid Address!"
: "Loading..."}
</Heading>
</HStack>
</Td>
<Td>
{!!underlyings.length ? (
<CTokenAvatarGroup tokenAddresses={underlyings} popOnHover={true} />
) : (
<Badge colorScheme="red">Inactive</Badge>
)}
</Td>
<Td>
{(
parseFloat(rDBalance?.toString() ?? "0") /
10 ** (tokenData?.decimals ?? 18)
).toFixed(3)}{" "}
{tokenData?.symbol}
</Td>
<Td>
<Badge colorScheme={isAdmin ? "green" : "red"}>
{isAdmin ? "Is Admin" : "Not Admin"}
</Badge>
</Td>
</Tr>
{/* {!hideModalDivider && <ModalDivider />} */}
</>
);
}
Example #8
Source File: ElementDescription.tsx From engine with MIT License | 5 votes |
ElementDescription: view = ({
selectedId = observe.selectedElement.id,
path = observe.selectedElement.path,
element = observe.structure.elements[arg.selectedId],
code = observe.structure.code[arg.selectedId],
showV2 = update.showV2,
getShowV2 = get.showV2,
}) => {
if (!element) {
return;
}
try {
code = (prettier as any).format(code, {
parser: "typescript",
plugins: prettierPlugins,
});
} catch (e) {
code = code || "loading code..";
}
return (
<Box p="4" overflowY="scroll" h="100vh">
<Box mb="4">
<VStack align="stretch" spacing={1} bg="gray.400" p="4">
<Text>
<Badge color={element.type === "view" ? "green" : "purple"}>
{element.type}
</Badge>
</Text>
<Text fontSize="xl" fontWeight="bold">
{" "}
{element.meta.name}
</Text>
<Text>{element.meta.relativeFilePath}</Text>
<Badge
onClick={() => showV2.set(!!!getShowV2.value())}
position="absolute"
colorScheme="green"
right="3"
top="3"
cursor="pointer"
>
Toggle V2
</Badge>
</VStack>
</Box>
<Box mb="4">
<Heading size="sm" mb="2">
Header
</Heading>
{element.params.type === OperationTypes.STRUCT && (
<Operations
value={element.params.value}
path={path}
id={selectedId}
/>
)}
</Box>
<Box mb="2">
<Heading size="sm" mb="2">
Body
</Heading>
<CodeEditor
value={code}
language="typescript"
placeholder="loading code.."
onChange={(evn) => {}}
padding={15}
style={{
fontSize: 12,
backgroundColor: "#f5f5f5",
fontFamily:
"ui-monospace,SFMono-Regular,SF Mono,Consolas,Liberation Mono,Menlo,monospace",
}}
/>
</Box>
</Box>
);
}
Example #9
Source File: Element.tsx From engine with MIT License | 5 votes |
Element: view = ({
id,
path,
filePath = observe.structure.elements[prop.id].meta.relativeFilePath,
type = observe.structure.elements[prop.id].type,
name = observe.structure.elements[prop.id].meta.name,
params = observe.structure.elements[prop.id].params,
updateSelectedElement = update.selectedElement,
selected = observe.selectedElement,
}) => {
if (!name) {
return;
}
const flags = getFlags(path, params);
const isElementSelected = selected?.id === id;
const isElementAndPathSelected = isElementSelected && selected.path === path;
return (
<Box
bg={
isElementAndPathSelected
? "purple.200"
: isElementSelected
? "purple.100"
: "gray.200"
}
borderBottom="solid 1px"
borderColor="gray.400"
cursor="pointer"
_hover={{
background: !isElementSelected && "gray.300",
}}
minW="md"
py="2"
onClick={() =>
updateSelectedElement.set({
id,
path,
})
}
>
<HStack px="2">
<HStack>
{flags.read && <Badge variant="solid">Read</Badge>}
{flags.write && <Badge variant="solid">Write</Badge>}
</HStack>
<Badge
variant="solid"
colorScheme={type === "producer" ? "purple" : "green"}
mr="2"
>
{type}
</Badge>
<Text isTruncated maxW="60">
{name}
</Text>
</HStack>
<Text px="2" fontSize="xs">
{filePath}
</Text>
</Box>
);
}
Example #10
Source File: ContactsTable.tsx From bluebubbles-server with Apache License 2.0 | 4 votes |
ContactsTable = ({
contacts,
onCreate,
onDelete,
onUpdate,
onAddressAdd,
onAddressDelete
}: {
contacts: Array<ContactItem>,
onCreate?: (contact: ContactItem) => void,
onDelete?: (contactId: number | string) => void,
onUpdate?: (contact: Partial<ContactItem>) => void,
onAddressAdd?: (contactId: number | string, address: string) => void;
onAddressDelete?: (contactAddressId: number) => void;
}): JSX.Element => {
const dialogRef = useRef(null);
const [dialogOpen, setDialogOpen] = useBoolean();
const [selectedContact, setSelectedContact] = useState(null as any | null);
return (
<Box>
<Table variant="striped" colorScheme="blue" size='sm'>
<Thead>
<Tr>
<Th>Edit</Th>
<Th>Display Name</Th>
<Th isNumeric>Addresses</Th>
</Tr>
</Thead>
<Tbody>
{contacts.map(item => {
const name = (item.displayName && item.displayName.length > 0)
? item.displayName
: [item?.firstName, item?.lastName].filter((e) => e && e.length > 0).join(' ');
const addresses = [
...(item.phoneNumbers ?? []).map(e => e.address),
...(item.emails ?? []).map(e => e.address)
];
return (
<Tr key={`${item.sourceType}-${item.id}-${name}-${addresses.join('_')}`}>
<Td _hover={{ cursor: (item?.sourceType === 'api') ? 'auto' : 'pointer' }} onClick={() => {
if (item?.sourceType === 'api') return;
setSelectedContact(item);
setDialogOpen.on();
}}>
{(item?.sourceType === 'api') ? (
<Tooltip label="Not Editable" hasArrow aria-label='not editable tooltip'>
<span>
<Icon as={MdOutlineEditOff} />
</span>
</Tooltip>
): (
<Tooltip label="Click to Edit" hasArrow aria-label='editable tooltip'>
<span>
<Icon as={AiOutlineEdit} />
</span>
</Tooltip>
)}
</Td>
<Td>{name}</Td>
<Td isNumeric>{addresses.map((addr) => (
<Badge ml={2} key={`${name}-${addr}-${addresses.length}`}>{addr}</Badge>
))}</Td>
</Tr>
);
})}
</Tbody>
</Table>
<ContactDialog
modalRef={dialogRef}
isOpen={dialogOpen}
existingContact={selectedContact}
onDelete={onDelete}
onCreate={onCreate}
onUpdate={onUpdate}
onAddressAdd={onAddressAdd}
onAddressDelete={onAddressDelete}
onClose={() => {
setSelectedContact(null);
setDialogOpen.off();
}}
/>
</Box>
);
}
Example #11
Source File: Navigation.tsx From bluebubbles-server with Apache License 2.0 | 4 votes |
MobileNav = ({ onOpen, onNotificationOpen, unreadCount, ...rest }: MobileProps) => {
const { colorMode, toggleColorMode } = useColorMode();
return (
<Flex
ml={{ base: 0, md: 60 }}
px={{ base: 4, md: 4 }}
height="20"
alignItems="center"
borderBottomWidth="1px"
borderBottomColor={useColorModeValue('gray.200', 'gray.700')}
justifyContent={{ base: 'space-between', md: 'flex-end' }}
{...rest}
>
<IconButton
display={{ base: 'flex', md: 'none' }}
onClick={onOpen}
variant="outline"
aria-label="open menu"
icon={<FiMenu />}
/>
<Text display={{ base: 'flex', md: 'none' }} fontSize="2xl" fontFamily="monospace" fontWeight="bold">
<img src={logo} className="logo-small" alt="logo" />
</Text>
<HStack spacing={{ base: '0', md: '1' }}>
<Tooltip label="Website Home" aria-label="website-tip">
<Link href="https://bluebubbles.app" style={{ textDecoration: 'none' }} target="_blank">
<IconButton size="lg" variant="ghost" aria-label="website" icon={<AiOutlineHome />} />
</Link>
</Tooltip>
<Tooltip label="BlueBubbles Web" aria-label="website-tip">
<Link href="https://bluebubbles.app/web" style={{ textDecoration: 'none' }} target="_blank">
<IconButton size="lg" variant="ghost" aria-label="bluebubbles web" icon={<FiMessageCircle />} />
</Link>
</Tooltip>
<Tooltip label="Sponsor Us" aria-label="sponsor-tip">
<Link href="https://github.com/sponsors/BlueBubblesApp" style={{ textDecoration: 'none' }} target="_blank">
<IconButton size="lg" variant="ghost" aria-label="donate" icon={<AiOutlineHeart />} />
</Link>
</Tooltip>
<Tooltip label="Support Us" aria-label="donate-tip">
<Link href="https://bluebubbles.app/donate" style={{ textDecoration: 'none' }} target="_blank">
<IconButton size="lg" variant="ghost" aria-label="donate" icon={<MdOutlineAttachMoney />} />
</Link>
</Tooltip>
<Tooltip label="Join our Discord" aria-label="discord-tip">
<Link href="https://discord.gg/yC4wr38" style={{ textDecoration: 'none' }} target="_blank">
<IconButton size="lg" variant="ghost" aria-label="discord" icon={<FaDiscord />} />
</Link>
</Tooltip>
<Tooltip label="Read our Source Code" aria-label="github-tip">
<Link href="https://github.com/BlueBubblesApp" style={{ textDecoration: 'none' }} target="_blank">
<IconButton size="lg" variant="ghost" aria-label="github" icon={<FiGithub />} />
</Link>
</Tooltip>
<Box position='relative' float='left'>
<IconButton
size="lg"
verticalAlign='middle'
zIndex={1}
variant="ghost"
aria-label="notifications"
icon={<FiBell />}
onClick={() => onNotificationOpen()}
/>
{(unreadCount > 0) ? (
<Badge
borderRadius='lg'
variant='solid'
colorScheme='red'
position='absolute'
margin={0}
top={1}
right={1}
zIndex={2}
>{unreadCount}</Badge>
) : null}
</Box>
<Spacer />
<Divider orientation="vertical" width={1} height={15} borderColor='gray' />
<Spacer />
<Spacer />
<Spacer />
<FormControl display='flex' alignItems='center'>
<Box mr={2}><MdOutlineDarkMode size={20} /></Box>
<Switch id='theme-mode-toggle' onChange={toggleColorMode} isChecked={colorMode === 'light'} />
<Box ml={2}><MdOutlineLightMode size={20} /></Box>
</FormControl>
</HStack>
</Flex>
);
}
Example #12
Source File: repositories-list-item.tsx From notebook with MIT License | 4 votes |
RepositoriesListItem: React.SFC<RepositoriesListItemProps> = ({
repo
}) => {
const [repoId, setRepoId] = React.useState<number>(0);
const bg = useColorModeValue("white", "#2f3244");
const textColor = useColorModeValue("gray.600", "#b5b1b1");
const { isOpen, onOpen, onClose } = useDisclosure();
const handleClick = (id: number) => {
setRepoId(id);
onOpen();
};
return (
<>
<Center>
<Box
maxW="sm"
height="fit-content"
borderWidth="1px"
borderRadius="lg"
overflow="hidden"
boxShadow="md"
mx="5px"
mb="10px"
mt="10px"
_hover={{ boxShadow: "lg" }}
>
{/* <Image
height={{ base: "28vh", lg: "32vh" }}
cursor={repo.coverImage ? "pointer" : "auto"}
width={"100%"}
src={repo.coverImage}
objectFit="cover"
alt="cover image"
fallbackSrc="https://via.placeholder.com/320x216/DCDFDF/ffffff/?text=CoverImage"
fallbackSrc={placeholder}
onClick={() => handleClick(repo.coverImage)}
/> */}
<LazyImage
id={repo.id}
src={repo.coverImage}
blurHash={repo.blurHash}
handleClick={handleClick}
/>
<Box p="5" bg={bg}>
<Flex justifyContent="space-between" alignItems="center">
<Box
mt="1"
fontWeight="semibold"
as="h6"
fontSize="md"
lineHeight="tight"
textAlign="left"
isTruncated
>
<Link
href={repo.liveLink || repo.githubLink}
textDecoration={"none !important"}
isExternal
>
{repo.title}
<ExternalLinkIcon mx="3px" />
</Link>
</Box>
<Box mt="1">
{repo.stars ? (
<Link
href={repo.githubLink}
textDecoration={"none !important"}
isExternal
>
<Tooltip hasArrow label="Github stars" placement="top-end">
<Box>
<StarIcon color="teal.300" fontSize="sm" />
<Box as="span" ml="2" color={textColor} fontSize="sm">
{repo.stars}
</Box>
</Box>
</Tooltip>
</Link>
) : (
""
)}
</Box>
</Flex>
<Box textAlign="left">
<HStack spacing="1" mt="2" mb="2">
{repo.technologies.map((tech, index) => (
<Badge
borderRadius="full"
px="1"
colorScheme={tech.color}
textTransform="lowercase"
key={index}
>
{tech.name}
</Badge>
))}
</HStack>
</Box>
<Box color={textColor} fontSize="md" textAlign="left">
{repo.desc}
</Box>
</Box>
</Box>
</Center>
<Carousel
repoId={repoId}
onOpen={onOpen}
onClose={onClose}
isOpen={isOpen}
/>
</>
);
}
Example #13
Source File: post-card.tsx From portfolio with MIT License | 4 votes |
PostCard: React.SFC<PostCardProps> = ({ article }) => {
const textColor = useColorModeValue("gray.500", "gray.200");
const devIcon = useColorModeValue(dev, dev2);
return (
<CardTransition>
<VStack
spacing={1}
p={4}
isExternal
_hover={{ shadow: "md", textDecoration: "none" }}
borderWidth="1px"
position="relative"
rounded="md"
bg={useColorModeValue("white", "gray.800")}
align="left"
>
{article.external ? (
<Tooltip hasArrow label="Dev.to" placement="top">
<Image
src={devIcon}
width="2rem"
height="2rem"
position="absolute"
color="#cbd5e0"
right="0.5rem"
top="-14px"
/>
</Tooltip>
) : (
<Tooltip hasArrow label="mahmad.me" placement="top">
<Box position="absolute" color="#cbd5e0" right="0.5rem" top="-14px">
<Badge ml="1" variant="solid" colorScheme="blackAlpha">
Website
</Badge>
</Box>
</Tooltip>
)}
<Heading fontSize="lg" align="left" mt={0}>
{article.external ? (
<Text as={Link} href={article.link} target="_blank">
{article.title}
</Text>
) : (
<Link as={NavLink} to={article.link}>
{article.title}
</Link>
)}
{article.isNew && (
<Badge
ml="1"
mb="1"
colorScheme="green"
fontSize="0.7em"
lineHeight={1.5}
>
New
</Badge>
)}
</Heading>
<HStack spacing={2} isInline>
<Tooltip hasArrow label="Published" placement="top">
<Text fontSize="sm" fontWeight="400" color={textColor}>
{article.published}
</Text>
</Tooltip>
<Text fontSize="sm" fontWeight="400" color={textColor}>
•
</Text>
<Tooltip hasArrow label="Views" placement="top">
<Flex alignItems="center">
<Text
fontSize="sm"
noOfLines={1}
fontWeight="400"
align="left"
color={textColor}
>
{article.views}
</Text>
<Icon as={FaEye} ml={1} color={textColor} />
</Flex>
</Tooltip>
<Text fontSize="sm" fontWeight="600" color={textColor}>
•
</Text>
<Tooltip hasArrow label="Read time" placement="top">
<Text
fontSize="sm"
noOfLines={1}
fontWeight="400"
align="left"
color={textColor}
>
{article.readTime}
</Text>
</Tooltip>
<HStack spacing={1} alignItems="center" d={["none", "none", "flex"]}>
{article.tags.map(tag => (
<Tag
size="sm"
padding="0 3px"
key={tag}
colorScheme={getTagColor(tag)}
>
{tag}
</Tag>
))}
</HStack>
</HStack>
<HStack spacing={1} alignItems="center" d={["flex", "flex", "none"]}>
{article.tags.map(tag => (
<Tag
size="sm"
padding="0 3px"
key={tag}
colorScheme={getTagColor(tag)}
>
{tag}
</Tag>
))}
</HStack>
<Text align="left" fontSize="md" noOfLines={4} color={textColor}>
{article.desc}
</Text>
</VStack>
</CardTransition>
);
}
Example #14
Source File: home.tsx From portfolio with MIT License | 4 votes |
Home = () => {
return (
<Flex direction="column" align="center">
<Flex direction={["column", "column", "row"]}>
<MotionBox
opacity="0"
initial={{
translateX: -150,
opacity: 0
}}
animate={{
translateX: 0,
opacity: 1,
transition: {
duration: ANIMATION_DURATION
}
}}
m="auto"
mb={[16, 16, "auto"]}
>
<Avatar
size={"2xl"}
src={UserIcon}
// src={"https://avatars2.githubusercontent.com/u/37842853?v=4"}
/>
</MotionBox>
<MotionFlex
ml={["auto", "auto", 16]}
m={["auto", "initial"]}
w={["90%", "85%", "80%"]}
maxW="800px"
opacity="0"
justify="center"
direction="column"
initial={{
opacity: 0,
translateX: 150
}}
animate={{
opacity: 1,
translateX: 0,
transition: {
duration: ANIMATION_DURATION
}
}}
>
<Header underlineColor={ORANGE} emoji="?" mt={0} className="face">
Hey!
</Header>
<Box as="h2" fontSize="2xl" fontWeight="400" textAlign="left">
My name is{" "}
<Box as="strong" fontWeight="600">
Ahmad
</Box>{" "}
and I'm a{" "}
<Box as="span" whiteSpace="nowrap">
Full Stack Developer and
</Box>{" "}
<Box as="span" whiteSpace="nowrap">
an open source lover
</Box>
from{" "}
<Box as="span" whiteSpace="nowrap">
Pakistan ??
</Box>
</Box>
<Box as="h2" fontSize="2xl" fontWeight="400" mt={5} textAlign="left">
This is my digital garden, where I write about the things I'm
working on and share what I've learned. ?
</Box>
</MotionFlex>
</Flex>
<MotionBox
w="100%"
opacity="0"
initial={{
translateY: 80
}}
animate={{
translateY: 0,
opacity: 1,
transition: {
delay: ANIMATION_DURATION - 0.1,
duration: ANIMATION_DURATION
}
}}
>
<Box mt={10}>
<Stack
mb={10}
mx={[0, 0, 10]}
padding={4}
align="start"
borderLeft="4px solid"
borderColor={"#53c8c4"}
color={"whatsapp"}
_hover={{ shadow: "lg" }}
backgroundColor={useColorModeValue("gray.100", "#1e2533")}
rounded="sm"
fontSize="md"
>
<Text textAlign="center" color="#53c8c4" fontWeight="bold">
Highlights
</Text>
<UnorderedList textAlign="left" paddingLeft={5} m={0}>
<ListItem>
<Link as={NavLink} to="/open-source">
Live/Local Github Repos
<Badge ml="1" colorScheme="green">
New
</Badge>
</Link>
</ListItem>
<ListItem>
<Link as={NavLink} to="/story-timeline">
Story page
</Link>
</ListItem>
<ListItem>
<Link as={NavLink} to="/tech-stack">
Tech Stack
</Link>
</ListItem>
<ListItem>
<Link as={NavLink} to="/achievements">
Achievements
</Link>
</ListItem>
</UnorderedList>
</Stack>
<Projects projects={projectsList} />
</Box>
</MotionBox>
</Flex>
);
}
Example #15
Source File: create-app.tsx From ledokku with MIT License | 4 votes |
CreateApp = () => {
const history = useHistory();
const toast = useToast();
const createAppSchema = yup.object({
type: yup
.string()
.oneOf(['GITHUB', 'GITLAB', 'DOCKER', 'DOKKU'])
.required(),
});
const formik = useFormik<{ type: AppTypes }>({
initialValues: {
type: AppTypes.GITHUB,
},
validateOnChange: true,
validationSchema: createAppSchema,
onSubmit: async (values) => {
try {
values.type === AppTypes.GITHUB
? history.push('/create-app-github')
: history.push('/create-app-dokku');
} catch (error) {
toast.error(error.message);
}
},
});
return (
<>
<HeaderContainer>
<Header />
</HeaderContainer>
<Container maxW="5xl" my="4">
<Heading py="2" as="h2" size="md">
App source
</Heading>
<Box mt="24">
<Box mt="4">
<form onSubmit={formik.handleSubmit}>
<Box mt="20">
<Text mb="5" color="gray.500">
Choose between creating app from a Github repository or
creating a standalone Dokku app.
</Text>
<Grid
templateColumns={{
base: 'repeat(2, minmax(0, 1fr))',
md: 'repeat(4, minmax(0, 1fr))',
}}
gap="4"
>
<SourceBox
selected={formik.values.type === AppTypes.GITHUB}
label="GitHub"
icon={<GithubIcon size={40} />}
onClick={() => formik.setFieldValue('type', 'GITHUB')}
/>
<SourceBox
selected={formik.values.type === AppTypes.DOKKU}
label="Dokku"
icon={
<Image
boxSize="48px"
objectFit="cover"
src="/dokku.png"
alt="dokkuLogo"
/>
}
onClick={() => formik.setFieldValue('type', 'DOKKU')}
/>
<SourceBox
selected={formik.values.type === AppTypes.GITLAB}
label="Gitlab"
icon={<GitlabIcon size={40} />}
badge={
<Badge ml="1" colorScheme="red">
Coming soon
</Badge>
}
// Uncomment this when we can handle docker deployments
// onClick={() => formik.setFieldValue('type', 'GITLAB')}
/>
<SourceBox
selected={formik.values.type === AppTypes.DOCKER}
label="Docker"
icon={<DockerIcon size={40} />}
badge={
<Badge ml="1" colorScheme="red">
Coming soon
</Badge>
}
// Uncomment this when we can handle docker deployments
// onClick={() => formik.setFieldValue('type', 'DOCKER')}
/>
</Grid>
</Box>
<Box mt="36" display="flex" justifyContent="flex-end">
<Button
isLoading={formik.isSubmitting}
disabled={!formik.values.type || !!formik.errors.type}
rightIcon={<FiArrowRight size={20} />}
type="submit"
>
Next
</Button>
</Box>
</form>
</Box>
</Box>
</Container>
</>
);
}