From 521e3225192f26c8435f290a173fc5ec09eff561 Mon Sep 17 00:00:00 2001 From: henriquecesp <henriquecesps4@gmail.com> Date: Sun, 24 Oct 2021 15:29:32 -0300 Subject: [PATCH] feat(templates): react components type templates --- .../components/__name__/component.tsx.txt | 22 ++++++ .../components/__name__/index.tsx.txt | 1 + .../contexts/__name__Context.tsx.txt | 71 +++++++++++++++++++ .../reactjsHook/hooks/use__name__.tsx.txt | 10 +++ .../components/__name__/component.tsx.txt | 35 +++++++++ .../components/__name__/index.tsx.txt | 1 + .../components/__name__/component.tsx.txt | 28 ++++++++ .../components/__name__/index.tsx.txt | 1 + 8 files changed, 169 insertions(+) create mode 100644 app/templates/reactjsComponent/components/__name__/component.tsx.txt create mode 100644 app/templates/reactjsComponent/components/__name__/index.tsx.txt create mode 100644 app/templates/reactjsContext/contexts/__name__Context.tsx.txt create mode 100644 app/templates/reactjsHook/hooks/use__name__.tsx.txt create mode 100644 app/templates/reactjsMui/components/__name__/component.tsx.txt create mode 100644 app/templates/reactjsMui/components/__name__/index.tsx.txt create mode 100644 app/templates/reactjsStyled/components/__name__/component.tsx.txt create mode 100644 app/templates/reactjsStyled/components/__name__/index.tsx.txt diff --git a/app/templates/reactjsComponent/components/__name__/component.tsx.txt b/app/templates/reactjsComponent/components/__name__/component.tsx.txt new file mode 100644 index 0000000..b51118c --- /dev/null +++ b/app/templates/reactjsComponent/components/__name__/component.tsx.txt @@ -0,0 +1,22 @@ +import React from 'react'; + +interface Props { + title: string; +} + +const <%= namePascal %> = ({title}: Props): JSX.Element => { + const [data, setData] = React.useState<boolean>(false) + + const handleClick = React.useCallback(() => { + setData(data => !data) + }, []); + + return ( + <div> + <h1>{title}</h1> + <button onClick={handleClick}>Click Me!</button> + </div> + ); +} + +export default <%= namePascal %> diff --git a/app/templates/reactjsComponent/components/__name__/index.tsx.txt b/app/templates/reactjsComponent/components/__name__/index.tsx.txt new file mode 100644 index 0000000..3bfb4f7 --- /dev/null +++ b/app/templates/reactjsComponent/components/__name__/index.tsx.txt @@ -0,0 +1 @@ +export { default } from './' diff --git a/app/templates/reactjsContext/contexts/__name__Context.tsx.txt b/app/templates/reactjsContext/contexts/__name__Context.tsx.txt new file mode 100644 index 0000000..be84888 --- /dev/null +++ b/app/templates/reactjsContext/contexts/__name__Context.tsx.txt @@ -0,0 +1,71 @@ +import { createContext, useContext, useReducer } from 'react'; + +interface <%= namePascal %> { + id: number; + title: string; +} + +interface <%= namePascal %>State { + <%= namePluralCamel %>: <%= namePascal %>[]; +} + +interface Action { + type: 'ADD' | 'DELETE'; + <%= nameCamel %>: <%= namePascal %>; + id: string; +} + +const <%= namePascal %>StateContext = createContext<<%= namePascal %>State>({ + <%= nameCamel %>: [], +}); + +const <%= namePascal %>DispatchContext = createContext<React.Dispatch<Action>>( + null as unknown as React.Dispatch<Action>, +); + +function <%= namePascal %>Reducer(state: <%= namePascal %>State, action: Action) { + switch (action.type) { + case 'ADD': { + return { + ...state, + <%= nameCamel %>: [...state.<%= namePluralCamel %>, action.<%= nameCamel %>], + }; + } + case 'DELETE': { + const updated<%= namePascal %> = state.<%= namePluralCamel %>.filter((item) => item.id != action.id); + return { + ...state, + <%= namePluralCamel %>: updated<%= namePascal %>, + }; + } + default: { + throw new Error('unhandled action type'); + } + } +} + +interface <%= namePascal %>Provider { + children: React.ReactNode; +} + +/* +Use the <%= namePascal %>ContextProvider to wrap your app and set up the <%= namePascal %>StateContext and <%= namePascal %>DispatchContext. +*/ + +export function <%= namePascal %>ContextProvider({ children }: <%= namePascal %>Provider): JSX.Element { + const [state, dispatch] = useReducer(<%= namePascal %>Reducer, { + <%= namePluralPascal %>: [], + }); + + return ( + <<%= namePascal %>StateContext.Provider value={state}> + <<%= namePascal %>DispatchContext.Provider value={dispatch}> + {children} + </<%= namePascal %>DispatchContext.Provider> + </<%= namePascal %>StateContext.Provider> + ); +} + +export const use<%= namePascal %>DispatchContext = (): React.Dispatch<Action> => + useContext(<%= namePascal %>DispatchContext); +export const use<%= namePascal %>StateContext = (): <%= namePascal %>State => useContext(<%= namePascal %>StateContext); diff --git a/app/templates/reactjsHook/hooks/use__name__.tsx.txt b/app/templates/reactjsHook/hooks/use__name__.tsx.txt new file mode 100644 index 0000000..c8a4eff --- /dev/null +++ b/app/templates/reactjsHook/hooks/use__name__.tsx.txt @@ -0,0 +1,10 @@ +import { Reducer, useReducer } from 'react'; + +const <%= namePascal %>Reducer = (state: boolean, nextValue?: any) => + typeof nextValue === 'boolean' ? nextValue : !state; + +const use<%= namePascal %> = (initialValue: boolean): [boolean, (nextValue?: any) => void] => { + return useReducer<Reducer<boolean, any>>(<%= namePascal %>Reducer, initialValue); +}; + +export default use<%= namePascal %>; diff --git a/app/templates/reactjsMui/components/__name__/component.tsx.txt b/app/templates/reactjsMui/components/__name__/component.tsx.txt new file mode 100644 index 0000000..77ac341 --- /dev/null +++ b/app/templates/reactjsMui/components/__name__/component.tsx.txt @@ -0,0 +1,35 @@ +import * as React from 'react'; +import { styled } from '@mui/material/styles'; +import Button from '@mui/material/Button'; +import Stack from '@mui/material/Stack'; +import { purple } from '@mui/material/colors'; + +const ColorButton = styled(Button)(({ theme }) => ({ + color: theme.palette.getContrastText(purple[500]), + backgroundColor: purple[500], + '&:hover': { + backgroundColor: purple[700], + }, +})); + +interface Props { + title: string; +} + +const <%= namePascal %> = ({title}: Props): JSX.Element => { + const [data, setData] = React.useState<boolean>(false) + + const handleClick = React.useCallback(() => { + setData(data => !data) + }, []); + + return ( + <Stack spacing={2} direction="row"> + <ColorButton variant="contained" onClick={handleClick}> + {title} + </ColorButton> + </Stack> + ); +} + +export default <%= namePascal %> diff --git a/app/templates/reactjsMui/components/__name__/index.tsx.txt b/app/templates/reactjsMui/components/__name__/index.tsx.txt new file mode 100644 index 0000000..3bfb4f7 --- /dev/null +++ b/app/templates/reactjsMui/components/__name__/index.tsx.txt @@ -0,0 +1 @@ +export { default } from './' diff --git a/app/templates/reactjsStyled/components/__name__/component.tsx.txt b/app/templates/reactjsStyled/components/__name__/component.tsx.txt new file mode 100644 index 0000000..95452f8 --- /dev/null +++ b/app/templates/reactjsStyled/components/__name__/component.tsx.txt @@ -0,0 +1,28 @@ +import React from 'react'; +import styled from 'styled-components' + +const Button = styled.button` + /* ... */ +` + +interface Props { + title: string; +} + +const <%= namePascal %> = ({title}: Props): JSX.Element => { + const [data, setData] = React.useState<boolean>(false) + + const handleClick = React.useCallback(() => { + setData(data => !data) + }, []); + + return ( + <div> + <Button onClick={handleClick}> + {title} + </Button> + </div> + ); +} + +export default <%= namePascal %> diff --git a/app/templates/reactjsStyled/components/__name__/index.tsx.txt b/app/templates/reactjsStyled/components/__name__/index.tsx.txt new file mode 100644 index 0000000..3bfb4f7 --- /dev/null +++ b/app/templates/reactjsStyled/components/__name__/index.tsx.txt @@ -0,0 +1 @@ +export { default } from './'