Skip to content

Commit

Permalink
Merge branch 'main' of github.com:threshold-network/token-dashboard i…
Browse files Browse the repository at this point in the history
…nto e2e-environment-setup
  • Loading branch information
georgeweiler committed Oct 8, 2021
2 parents e28a527 + d364e88 commit 8f7c5dc
Show file tree
Hide file tree
Showing 19 changed files with 254 additions and 103 deletions.
1 change: 1 addition & 0 deletions .eslintrc.js
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ module.exports = {
"spaced-comment": 0,
"react/jsx-uses-react": "off",
"react/react-in-jsx-scope": "off",
"no-unused-vars": 0,
},
settings: {
react: {
Expand Down
2 changes: 2 additions & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
"@chakra-ui/react": "^1.6.7",
"@emotion/react": "^11",
"@emotion/styled": "^11",
"@reduxjs/toolkit": "^1.6.1",
"@testing-library/jest-dom": "^5.11.4",
"@testing-library/react": "^11.1.0",
"@testing-library/user-event": "^12.1.10",
Expand All @@ -18,6 +19,7 @@
"react": "^17.0.2",
"react-dom": "^17.0.2",
"react-icons": "^4.2.0",
"react-redux": "^7.2.5",
"react-scripts": "4.0.3",
"typescript": "^4.4.3",
"web-vitals": "^1.0.1"
Expand Down
103 changes: 12 additions & 91 deletions src/App.tsx
Original file line number Diff line number Diff line change
@@ -1,99 +1,20 @@
import { FC } from "react"
import {
Badge,
HStack,
ChakraProvider,
Container,
Heading,
VStack,
} from "@chakra-ui/react"
import { ChakraProvider, Container, Heading } from "@chakra-ui/react"
import { Provider as ReduxProvider } from "react-redux"
import theme from "./theme"
import reduxStore from "./store"
import ModalRoot from "./components/Modal"

const App: FC = () => {
return (
<ChakraProvider theme={theme}>
<Container data-cy="app-container">
<Heading>Threshold Token Dashboard?</Heading>
<VStack spacing={12} mt={6}>
<VStack>
<HStack spacing={4}>
<Badge size="sm">Badge</Badge>
<Badge size="sm" colorScheme="green">
Badge
</Badge>
<Badge size="sm" colorScheme="yellow">
Badge
</Badge>
<Badge size="sm" colorScheme="red">
Badge
</Badge>
</HStack>
<HStack spacing={4}>
<Badge>Badge</Badge>
<Badge colorScheme="green">Badge</Badge>
<Badge colorScheme="yellow">Badge</Badge>
<Badge colorScheme="red">Badge</Badge>
</HStack>
</VStack>
<VStack>
<HStack spacing={4}>
<Badge size="sm" variant="outline">
Badge
</Badge>
<Badge size="sm" variant="outline" colorScheme="green">
Badge
</Badge>
<Badge size="sm" variant="outline" colorScheme="yellow">
Badge
</Badge>
<Badge size="sm" variant="outline" colorScheme="red">
Badge
</Badge>
</HStack>
<HStack spacing={4}>
<Badge variant="outline">Badge</Badge>
<Badge variant="outline" colorScheme="green">
Badge
</Badge>
<Badge variant="outline" colorScheme="yellow">
Badge
</Badge>
<Badge variant="outline" colorScheme="red">
Badge
</Badge>
</HStack>
</VStack>
<VStack>
<HStack spacing={4}>
<Badge size="sm" variant="subtle">
Badge
</Badge>
<Badge size="sm" variant="subtle" colorScheme="green">
Badge
</Badge>
<Badge size="sm" variant="subtle" colorScheme="yellow">
Badge
</Badge>
<Badge size="sm" variant="subtle" colorScheme="red">
Badge
</Badge>
</HStack>
<HStack spacing={4}>
<Badge variant="subtle">Badge</Badge>
<Badge variant="subtle" colorScheme="green">
Badge
</Badge>
<Badge variant="subtle" colorScheme="yellow">
Badge
</Badge>
<Badge variant="subtle" colorScheme="red">
Badge
</Badge>
</HStack>
</VStack>
</VStack>
</Container>
</ChakraProvider>
<ReduxProvider store={reduxStore}>
<ChakraProvider theme={theme}>
<ModalRoot />
<Container data-cy="app-container">
<Heading>Threshold Token Dashboard?</Heading>
</Container>
</ChakraProvider>
</ReduxProvider>
)
}

Expand Down
30 changes: 30 additions & 0 deletions src/components/Modal/ExampleModal.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
import {
Button,
ModalBody,
ModalCloseButton,
ModalFooter,
ModalHeader,
} from "@chakra-ui/react"
import { FC } from "react"
import withBaseModal from "./withBaseModal"
import { BaseModalProps } from "../../types"

const ExampleModal: FC<{ name: string } & BaseModalProps> = ({
name,
closeModal,
}) => {
return (
<>
<ModalHeader>Modal Title</ModalHeader>
<ModalCloseButton />
<ModalBody>Hello {name}!</ModalBody>
<ModalFooter>
<Button colorScheme="blue" mr={3} onClick={closeModal}>
Close
</Button>
<Button variant="ghost">Secondary Action</Button>
</ModalFooter>
</>
)
}
export default withBaseModal(ExampleModal)
15 changes: 15 additions & 0 deletions src/components/Modal/ModalRoot.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
import { useModal } from "../../hooks/useModal"
import { MODAL_TYPES } from "../../types"

const ModalRoot = () => {
const { modalType, modalProps, closeModal } = useModal()

if (!modalType) {
return <></>
}

const SpecificModal = MODAL_TYPES[modalType]
return <SpecificModal closeModal={closeModal} {...modalProps} />
}

export default ModalRoot
3 changes: 3 additions & 0 deletions src/components/Modal/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
import ModalRoot from "./ModalRoot"

export default ModalRoot
20 changes: 20 additions & 0 deletions src/components/Modal/withBaseModal.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
import { ComponentType } from "react"
import { Modal, ModalContent, ModalOverlay } from "@chakra-ui/react"
import { BaseModalProps } from "../../types"

function withBaseModal<T extends BaseModalProps>(
WrappedModalContent: ComponentType<T>
) {
return (props: T) => {
return (
<Modal isOpen onClose={props.closeModal}>
<ModalOverlay />
<ModalContent>
<WrappedModalContent {...props} />
</ModalContent>
</Modal>
)
}
}

export default withBaseModal
1 change: 1 addition & 0 deletions src/enums/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export * from "./modal"
3 changes: 3 additions & 0 deletions src/enums/modal.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
export enum ModalType {
Example = "EXAMPLE",
}
26 changes: 26 additions & 0 deletions src/hooks/useModal.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
import { useSelector, useDispatch } from "react-redux"
import { UseModal } from "../types"
import {
openModal as openModalAction,
closeModal as closeModalAction,
} from "../store/modal"
import { RootState } from "../store"
import { ModalType } from "../enums"

export const useModal: UseModal = () => {
const modalType = useSelector((state: RootState) => state.modal.modalType)
const modalProps = useSelector((state: RootState) => state.modal.props)
const dispatch = useDispatch()

const openModal = (modalType: ModalType, props: any) =>
dispatch(openModalAction({ modalType, props }))

const closeModal = () => dispatch(closeModalAction())

return {
modalType,
modalProps,
openModal,
closeModal,
}
}
12 changes: 12 additions & 0 deletions src/store/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
import { configureStore } from "@reduxjs/toolkit"
import { modalSlice } from "./modal"

const store = configureStore({
reducer: {
modal: modalSlice.reducer,
},
})

export type RootState = ReturnType<typeof store.getState>

export default store
1 change: 1 addition & 0 deletions src/store/modal/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export * from "./modalSlice"
21 changes: 21 additions & 0 deletions src/store/modal/modalSlice.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
import { createSlice } from "@reduxjs/toolkit"

export const modalSlice = createSlice({
name: "modal",
initialState: {
modalType: null,
props: {},
},
reducers: {
openModal: (state, action) => {
state.modalType = action.payload.modalType
state.props = action.payload.props
},
closeModal: (state) => {
state.modalType = null
state.props = {}
},
},
})

export const { openModal, closeModal } = modalSlice.actions
4 changes: 2 additions & 2 deletions src/stories/button.stories.tsx
Original file line number Diff line number Diff line change
@@ -1,14 +1,14 @@
import { Button as ChakraButton, ButtonProps } from "@chakra-ui/react"
import { MdBuild, MdAccessAlarm, MdAttachFile } from "react-icons/md"
import { Story, Meta } from "@storybook/react"
import { IIconMap } from "../types"
import { IconMap } from "../types"

interface ButtonStoryProps extends Omit<ButtonProps, "leftIcon" | "rightIcon"> {
leftIcon: string | undefined
rightIcon: string | undefined
}

const iconMap: IIconMap = {
const iconMap: IconMap = {
Wrench: <MdBuild />,
Alarm: <MdAccessAlarm />,
File: <MdAttachFile />,
Expand Down
4 changes: 2 additions & 2 deletions src/stories/divider.stories.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -7,13 +7,13 @@ import {
FaArrowCircleUp,
FiAlertCircle,
} from "react-icons/all"
import { IIconMap } from "../types"
import { IconMap } from "../types"

interface DividerStoryProps extends Omit<DividerProps, "orientation"> {
children: string | undefined
}

const iconMap: IIconMap = {
const iconMap: IconMap = {
ArrowDown: <DividerIcon as={FaArrowCircleDown} />,
ArrowUp: <DividerIcon as={FaArrowCircleUp} />,
Alert: <DividerIcon as={FiAlertCircle} />,
Expand Down
7 changes: 2 additions & 5 deletions src/types/index.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,2 @@
import { ReactElement } from "react"

export interface IIconMap {
[key: string]: ReactElement
}
export * from "./modal"
export * from "./utils"
31 changes: 31 additions & 0 deletions src/types/modal.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
import { ModalType } from "../enums"
import { ElementType } from "react"
import ExampleModal from "../components/Modal/ExampleModal"

export const MODAL_TYPES: Record<ModalType, ElementType> = {
[ModalType.Example]: ExampleModal,
}

export interface BaseModalProps {
closeModal: () => void
}

export interface OpenModal {
payload: {
modalType: ModalType
props: any
}
}

export interface CloseModal {}

export type ModalActionTypes = OpenModal | CloseModal

export interface UseModal {
(): {
modalType: ModalType | null
modalProps: any
openModal: (type: ModalType, props?: any) => ModalActionTypes
closeModal: () => ModalActionTypes
}
}
5 changes: 5 additions & 0 deletions src/types/utils.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
import { ReactElement } from "react"

export interface IconMap {
[key: string]: ReactElement
}
Loading

0 comments on commit 8f7c5dc

Please sign in to comment.