diff --git a/packages/components/src/Checkbox/index.tsx b/packages/components/src/Checkbox/index.tsx index 56d32161..5aab02a6 100644 --- a/packages/components/src/Checkbox/index.tsx +++ b/packages/components/src/Checkbox/index.tsx @@ -1,9 +1,10 @@ import React, { useCallback, useEffect, useState } from 'react'; +import clsx from 'clsx'; + import { STATUS } from '@treejs/types/common'; import { IHTMLElement } from '@treejs/types/form'; -import Button from '../Button'; import CheckSquareIcon from '../Icons/CheckSquare'; import SquareIcon from '../Icons/Square'; @@ -24,7 +25,7 @@ const Checkbox: React.FC = (props) => { }, [props.checked]); const handleClick = useCallback( - (e: React.MouseEvent): void => { + (e: React.MouseEvent): void => { if (props.onChange) { props.onChange(!checked, e); } @@ -42,23 +43,24 @@ const Checkbox: React.FC = (props) => { [checked] ); + const boxClassName = clsx('text-xl field-checkbox', { + 'field-checkbox--info': status === STATUS.info, + 'field-checkbox--warning': status === STATUS.warning, + 'field-checkbox--error': status === STATUS.error, + }); + return ( -
-
- } - className="m-0 normal-case w-auto font-thin inline" - status={status} - pressed={checked} - /> +
+ + - +
+ {checked ? : } +
+
+ {title} +
); }; diff --git a/packages/components/src/Message/index.tsx b/packages/components/src/Message/index.tsx index b073e614..c0586497 100644 --- a/packages/components/src/Message/index.tsx +++ b/packages/components/src/Message/index.tsx @@ -12,17 +12,15 @@ import InfoCircleIcon from '../Icons/InfoCircle'; type IProps = { children?: React.ReactElement | string; - filled?: boolean; status: STATUS; title?: string; }; function Message(props: IProps) { - const { status = STATUS.none, title, children, filled = false } = props; + const { status = STATUS.none, title, children } = props; return (
-
+
{status === STATUS.info && } {status === STATUS.success && } {status === STATUS.warning && } {status === STATUS.error && } {status === STATUS.none && }
-
+
{title}
{children}
diff --git a/packages/components/src/Modal/context.tsx b/packages/components/src/Modal/context.tsx index 5aca4c4b..e3cc7fd4 100644 --- a/packages/components/src/Modal/context.tsx +++ b/packages/components/src/Modal/context.tsx @@ -1,6 +1,7 @@ import React, { createContext, FC, ReactNode, useMemo, useState } from 'react'; import { omit } from 'ramda'; +import { ToasterId } from '../Toaster/types'; import { Modal, ModalId } from './types'; type ModalContextType = { @@ -8,7 +9,7 @@ type ModalContextType = { open: (modalId: ModalId) => void; opened: ModalId[]; register: (modal: Modal) => void; - registered: Record; + registered: Record; unregister: (modalId: ModalId) => void; }; @@ -22,7 +23,7 @@ export const ModalContext = createContext({ }); export const ModalWrapper: FC<{ children: ReactNode }> = ({ children }) => { - const [modals, setModals] = useState>({}); + const [modals, setModals] = useState>({}); const [opened, setOpened] = useState([]); const register = (modal: Modal) => { diff --git a/packages/components/src/RadioButton/components/RadioButton.tsx b/packages/components/src/RadioButton/components/RadioButton.tsx index f564c8d8..722cab85 100644 --- a/packages/components/src/RadioButton/components/RadioButton.tsx +++ b/packages/components/src/RadioButton/components/RadioButton.tsx @@ -2,7 +2,6 @@ import React, { useCallback, useEffect, useMemo, useState } from 'react'; import clsx from 'clsx'; -import Button from '@treejs/components/Button'; import CircleIcon from '@treejs/components/Icons/Circle'; import CircleFillIcon from '@treejs/components/Icons/CircleFill'; import { STATUS } from '@treejs/types/common'; @@ -43,15 +42,21 @@ const RadioButton: React.FC = (props) => { [] ); - const optionElements = useMemo(() => { + const boxClassName = clsx('text-xl field-radio', { + 'field-radio--info': status === STATUS.info, + 'field-radio--warning': status === STATUS.warning, + 'field-radio--error': status === STATUS.error, + }); + + const elements = useMemo(() => { return options.map(({ code, name }): React.ReactElement => { return (
{!isNilOrEmpty(OptionRender) ? ( React.cloneElement(OptionRender, { @@ -59,28 +64,24 @@ const RadioButton: React.FC = (props) => { value, } as any) ) : ( -
- } - onClick={handleClick({ code, name })} - className="m-0 normal-case w-auto font-thin" - pressed={value === code} - status={status} - /> +
+ {value === code ? ( + + ) : ( + + )} +
{name}
+
)}
); }); - }, [value, options, props.name, status]); + }, [value, options, props.name, boxClassName]); return ( -
-
{title}
- {horizontal ?
{optionElements}
: optionElements} +
+
{title}
+ {elements}
); }; diff --git a/packages/components/src/Skeleton/components/Skeleton.tsx b/packages/components/src/Skeleton/components/Skeleton.tsx index fa4356aa..fa78242f 100644 --- a/packages/components/src/Skeleton/components/Skeleton.tsx +++ b/packages/components/src/Skeleton/components/Skeleton.tsx @@ -1,4 +1,4 @@ -import React, { useCallback, useEffect, useMemo, useState } from 'react'; +import React, { ReactChild, useCallback, useEffect, useMemo, useState } from 'react'; import { isNil } from 'ramda'; import clsx from 'clsx'; @@ -15,7 +15,7 @@ import { MenuItem } from '../types'; import { Item } from './Item'; type IProps = { - children: React.ReactChild; + children: ReactChild; components?: { footer?: React.ReactElement; }; diff --git a/packages/components/src/TextField/index.tsx b/packages/components/src/TextField/index.tsx index d84a722b..1d5fa0f6 100644 --- a/packages/components/src/TextField/index.tsx +++ b/packages/components/src/TextField/index.tsx @@ -93,9 +93,9 @@ const TextField: React.FC = (props) => { const handleClearValue = useCallback( (e: React.MouseEvent): void => { - setValue(null); + setValue(''); if (onChange) { - onChange(null, e); + onChange('', e); } }, [onChange] @@ -114,19 +114,23 @@ const TextField: React.FC = (props) => { [disabled, onChange] ); + const showClearIcon = !disabled && clearable && !isNilOrEmpty(value); + return ( -
- {title !== undefined && ( +
+ {title && ( )} = (props) => { onChange={handleChange} autoFocus={autoFocus} /> - {!disabled && clearable && !isNilOrEmpty(value) && ( + {showClearIcon && (
diff --git a/packages/components/src/Toaster/actions/index.ts b/packages/components/src/Toaster/actions/index.ts deleted file mode 100644 index 7e262417..00000000 --- a/packages/components/src/Toaster/actions/index.ts +++ /dev/null @@ -1,40 +0,0 @@ -import { Dispatch } from '@reduxjs/toolkit'; - -import { STATUS } from '@treejs/types/common'; -import { isNilOrEmpty } from '@treejs/utils'; - -import { TOASTER_TIMEOUT } from '../constants'; -import { ACTIONS, ToasterId, ToasterOption } from '../types'; - -const timeouts: { [key: string]: any } = []; - -export const closeToaster = (name: ToasterId) => (dispatch: Dispatch) => { - timeouts[name] = null; - dispatch({ - type: ACTIONS.REMOVE_TOASTER, - payload: { - name, - }, - }); -}; - -export const addToaster = - (options: ToasterOption): any => - (dispatch: Dispatch) => { - if (!isNilOrEmpty(timeouts[options.name])) { - clearTimeout(timeouts[options.name]); - } - - timeouts[options.name] = setTimeout(() => { - dispatch(closeToaster(options.name)); - }, options.timeout || TOASTER_TIMEOUT); - - dispatch({ - type: ACTIONS.ADD_TOASTER, - payload: { - status: STATUS.none, - timeout: TOASTER_TIMEOUT, - ...options, - }, - }); - }; diff --git a/packages/components/src/Toaster/components/AddToaster.tsx b/packages/components/src/Toaster/components/AddToaster.tsx index ac2120ee..47041695 100644 --- a/packages/components/src/Toaster/components/AddToaster.tsx +++ b/packages/components/src/Toaster/components/AddToaster.tsx @@ -1,29 +1,23 @@ -import React, { useCallback } from 'react'; - -import { useDispatch } from 'react-redux'; - -import { STATUS } from '@treejs/types/common'; +import React from 'react'; import Button from '../../Button'; -import { addToaster } from '../actions'; -import { ToasterState } from '../types'; +import { useToaster } from '../hooks'; +import { Toaster } from '../types'; type IProps = { - message: string; - status?: STATUS; - title: string; -} & ToasterState; + label: string; +} & Toaster; const AddToaster: React.FC = (props) => { - const { name, title, status, message } = props; + const { id, label, title, status, message } = props; - const dispatch = useDispatch(); + const { showToaster } = useToaster(); - const handleClick = useCallback((): void => { - dispatch(addToaster({ name, status, message })); - }, []); + const handleClick = (): void => { + showToaster({ id, status, message, title }); + }; - return