Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Right-hand sidebar for staking flow #132

Merged
merged 20 commits into from
Jan 17, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Binary file added dapp/src/assets/images/right-sidebar-bg.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
71 changes: 66 additions & 5 deletions dapp/src/components/Sidebar/index.tsx
Original file line number Diff line number Diff line change
@@ -1,6 +1,29 @@
import React from "react"
import { Box, Button, useMultiStyleConfig } from "@chakra-ui/react"
import { useDocsDrawer, useSidebar } from "#/hooks"
import {
Box,
Icon,
useMultiStyleConfig,
Image,
Card,
CardBody,
CardHeader,
CardFooter,
HStack,
Link,
} from "@chakra-ui/react"
import RightSidebar from "#/assets/images/right-sidebar-bg.png"
import { useSidebar, useDocsDrawer } from "#/hooks"
import { ShieldPlusIcon } from "#/static/icons"
import { TextMd, TextSm } from "../shared/Typography"
import ButtonLink from "../shared/ButtonLink"
kkosiorowska marked this conversation as resolved.
Show resolved Hide resolved

const readMoreEarnings = "https://#"

const BUTTONS = [
{ label: "FAQ" },
{ label: "Token Contract" },
{ label: "Bridge Contract" },
]

export default function Sidebar() {
const { isOpen } = useSidebar()
Expand All @@ -11,12 +34,50 @@ export default function Sidebar() {
<Box
as="aside"
mt="header_height"
w={isOpen ? 80 : 0}
w={isOpen ? "sidebar_width" : "0"}
__css={styles.sidebarContainer}
>
<Box __css={styles.sidebar}>
{/* TODO: Add a correct content for the sidebar */}
<Button onClick={openDocsDrawer}>Open a documentation</Button>
<ButtonLink onClick={openDocsDrawer} variant="solid">
Docs
</ButtonLink>
<Card variant="elevated" colorScheme="gold" size="md">
<CardHeader padding="0">
<Image src={RightSidebar} alt="" width="70.5" height="40" />
</CardHeader>

<CardBody>
<TextMd alignSelf="stretch" fontWeight="bold">
Maximize your earnings by using tBTC to deposit and redeem BTC in
DeFi!
</TextMd>
</CardBody>

<CardFooter paddingTop="0">
<Link href={readMoreEarnings} isExternal>
<TextSm>Read more</TextSm>
</Link>
</CardFooter>
</Card>

<Card variant="elevated" colorScheme="gold" size="md">
<CardHeader>
<TextMd fontWeight="bold">How we calculate fees</TextMd>
</CardHeader>

<CardBody paddingTop="0">
<HStack gap="1">
<Icon as={ShieldPlusIcon} w={5} h={5} alignSelf="baseline" />
<TextSm>Fees is software empowered by the Threshold DAO.</TextSm>
</HStack>
</CardBody>
</Card>

{BUTTONS.map(({ label }) => (
<ButtonLink key={label} onClick={openDocsDrawer} colorScheme="gold">
{label}
</ButtonLink>
))}
</Box>
</Box>
)
Expand Down
34 changes: 34 additions & 0 deletions dapp/src/components/shared/ButtonLink/index.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
import React from "react"
import { Button, ButtonProps, Icon } from "@chakra-ui/react"
import { ArrowUpRight } from "#/static/icons"

type ButtonLinkProps = ButtonProps & {
icon?: typeof Icon
iconColor?: string
}

export default function ButtonLink({
Copy link
Contributor

@kkosiorowska kkosiorowska Jan 16, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I wonder if it is better to remove some of the props and make this component more flexible. And do something very similar to what was done in the threshold dashboard. I'm thinking of something like this:

import React from "react"
import { Button, ButtonProps, Icon, Link, LinkProps } from "@chakra-ui/react"
import { ArrowUpRight } from "#/static/icons"

type ButtonLinkProps = ButtonProps &
  LinkProps & {
    icon?: typeof Icon
    iconColor?: string
  }

export default function ButtonLink({
  icon = ArrowUpRight,
  iconColor = "brand.400",
  ...props
}: ButtonLinkProps) {
  return (
    <Button
      as={Link}
      w="100%"
      justifyContent="start"
      leftIcon={<Icon as={icon} boxSize={4} color={iconColor} />}
      {...props}
    />
  )
}

<ButtonLink variant="solid" onClick={openDocsDrawer} iconColor="white">
  Docs
</ButtonLink>

In that case, we would also need to update the theme for the Link component. This is just a suggestion to improve this component. Let me know what you think, we could discuss it together.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What kind of flexibility? Prop link was removed. This component will be changed so on, because of the approach to creating chakra icons (instead chakra icons will use a common Image component).

It will be changed if needed also here:
#141
#177

Copy link
Contributor

@kkosiorowska kkosiorowska Jan 16, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What kind of flexibility

Some of my thoughts:

  • Currently, for the variant solid icon can only be white.
  • I don't see the point of declaring in props: justifyContent and variant. These props are already declared in the ButtonProps. You can easily change them using {...props} in the component or set default values as I show above. But do we want to set a default value for the variant? It makes me wonder.
  • In my opinion isFullWidth or label is also unnecessary. Instead of a label, we can pass children.
  • Also, Using this button as a Link, we can add more props. For example href. It will also clearly show that we are using this button as a link.

Copy link
Contributor Author

@ioay ioay Jan 16, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

  1. As I mentioned above - chakra icon will be changed to svg, so it's going to change. On Friday we agreed that the icon will be in orange/white color depending on the solid/outline variant. Let's leave it as it is.
  2. justifyContent is a prop, so it can be overridden if needed, but by default, all buttons need to be aligned to the left.
  3. ok, I'll change
  4. Let's not mix it up with link functionality now, if it will be needed we can extend this file or create a Link component to handle external href or handle it in the passed method onClick. We talked about this on Friday and we agreed as it is, so as not to go through the comments one more week.

If needs arise, this component and others can be developed further.

children,
icon = ArrowUpRight,
iconColor = "brand.400",
variant = "outline",
...props
}: ButtonLinkProps) {
return (
<Button
variant={variant}
justifyContent="flex-start"
borderRadius="md"
leftIcon={
<Icon
as={icon}
boxSize={4}
color={variant === "solid" ? "white" : iconColor}
/>
}
{...props}
>
{children}
</Button>
)
}
17 changes: 17 additions & 0 deletions dapp/src/static/icons/ShieldPlus.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
import React from "react"
import { createIcon } from "@chakra-ui/react"

export const ShieldPlusIcon = createIcon({
displayName: "ShieldPlusIcon",
viewBox: "0 0 20 20",
path: (
<path
d="M8.0013 10.1669V6.16691M6.0013 8.16691H10.0013M13.3346 8.50024C13.3346 11.7725 9.76533 14.1525 8.46663 14.9102C8.31903 14.9963 8.24524 15.0393 8.14109 15.0617C8.06026 15.079 7.94234 15.079 7.86152 15.0617C7.75737 15.0393 7.68357 14.9963 7.53598 14.9102C6.23728 14.1525 2.66797 11.7725 2.66797 8.50024V5.31197C2.66797 4.77897 2.66797 4.51246 2.75514 4.28338C2.83215 4.081 2.95729 3.90042 3.11974 3.75726C3.30363 3.5952 3.55317 3.50162 4.05224 3.31447L7.62677 1.97402C7.76537 1.92205 7.83467 1.89606 7.90596 1.88576C7.96919 1.87662 8.03341 1.87662 8.09665 1.88576C8.16794 1.89606 8.23724 1.92205 8.37583 1.97402L11.9504 3.31447C12.4494 3.50162 12.699 3.5952 12.8829 3.75726C13.0453 3.90042 13.1705 4.081 13.2475 4.28338C13.3346 4.51246 13.3346 4.77897 13.3346 5.31197V8.50024Z"
fill="none"
stroke="currentColor"
strokeWidth="1.5"
strokeLinecap="round"
strokeLinejoin="round"
/>
),
})
1 change: 1 addition & 0 deletions dapp/src/static/icons/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,3 +6,4 @@ export * from "./AcreLogo"
export * from "./ConnectBTCAccount"
export * from "./ConnectETHAccount"
export * from "./AlertInfo"
export * from "./ShieldPlus"
34 changes: 23 additions & 11 deletions dapp/src/theme/Button.ts
Original file line number Diff line number Diff line change
Expand Up @@ -30,17 +30,29 @@ const Button: ComponentSingleStyleConfig = {
bg: "brand.400",
},
},
outline: {
color: "grey.700",
borderColor: "grey.700",
_hover: {
bg: "opacity.grey.700.05",
},
_active: {
bg: "transparent",
},
outline: ({ colorScheme }: StyleFunctionProps) => {
const defaultStyles = {
color: "grey.700",
borderColor: "grey.700",
_hover: {
bg: "opacity.grey.700.05",
},
_active: {
bg: "transparent",
},
}
if (colorScheme === "gold") {
return {
...defaultStyles,
bg: "gold.100",
borderColor: "white",
borderStyle: "solid",
}
}
return defaultStyles
},
card: (props: StyleFunctionProps) => {
// FIXME: It should be removed and replaced by solid/outline variants
card: ({ colorScheme }: StyleFunctionProps) => {
const defaultStyles = {
borderWidth: "2px",
borderColor: "gold.100",
Expand All @@ -54,7 +66,7 @@ const Button: ComponentSingleStyleConfig = {
},
}

if (props.colorScheme === "error") {
if (colorScheme === "error") {
return {
...defaultStyles,
color: "red.400",
Expand Down
34 changes: 31 additions & 3 deletions dapp/src/theme/Card.ts
Original file line number Diff line number Diff line change
@@ -1,15 +1,43 @@
import { ComponentSingleStyleConfig } from "@chakra-ui/react"
import {
ComponentSingleStyleConfig,
StyleFunctionProps,
} from "@chakra-ui/react"

const Card: ComponentSingleStyleConfig = {
baseStyle: {
container: {
boxShadow: "none",
borderWidth: "2px",
borderColor: "gold.100",
borderRadius: "xl",
bg: "gold.200",
},
},
variants: {
elevated: ({ colorScheme }: StyleFunctionProps) => {
if (!colorScheme) return {}

return {
container: {
bg: "gold.100",
borderColor: "white",
},
}
},
},
sizes: {
md: {
container: {
borderWidth: "1px",
},
},
lg: {
container: {
borderWidth: "2px",
},
},
},
defaultProps: {
size: "lg",
},
}

export default Card
4 changes: 4 additions & 0 deletions dapp/src/theme/Sidebar.ts
Original file line number Diff line number Diff line change
Expand Up @@ -18,11 +18,15 @@ const baseStyleSidebarContainer = defineStyle({
const baseStyleSidebar = defineStyle({
p: 4,
height: "100%",
w: "sidebar_width",
bg: "gold.200",
borderTop: "2px",
borderLeft: "2px",
borderColor: "gold.100",
borderTopLeftRadius: "xl",
display: "flex",
flexDirection: "column",
gap: 3,
})

const baseStyle = definePartsStyle({
Expand Down
3 changes: 3 additions & 0 deletions dapp/src/theme/utils/semanticTokens.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,4 +3,7 @@ export const semanticTokens = {
header_height: 24,
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Non-blocking comment

We would probably want to change the name for the header_height. Of course, this isn't the scope of this PR but it can be a bit confusing at the moment. What I mean is that looking at header_height you start to wonder why it isn't in the sizes category. We'll have to improve this in the future.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Let's create a task for this, we agreed that we do not want to mix different changes in one PR, so let's stick to this rule.

modal_shift: 36,
},
sizes: {
sidebar_width: 80,
},
}