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

Feature/custom theme #134

Merged
merged 25 commits into from
Nov 29, 2023
Merged
Show file tree
Hide file tree
Changes from 4 commits
Commits
Show all changes
25 commits
Select commit Hold shift + click to select a range
be63fa6
feat(theme): add property customTheme, Theme interface
absolemDev Nov 15, 2023
9374544
feat(form): add disabled property
absolemDev Nov 15, 2023
6921103
feat(input, button): customization components, add interfaces
absolemDev Nov 16, 2023
96cd845
fix(theme-provider): add conditional render
absolemDev Nov 16, 2023
e005061
feat: test
Nelfimov Nov 17, 2023
2ec40ad
chore: deps
Nelfimov Nov 17, 2023
5398e3a
feat: add customElement property, interfaces, conditional render cust…
absolemDev Nov 20, 2023
9f9f1d8
fix: install dependencies
absolemDev Nov 20, 2023
c3e7e80
fix: imports, interfaces
absolemDev Nov 20, 2023
c9b1626
feat: add wrappers for custom elemrnts
absolemDev Nov 22, 2023
bf5c3ac
fix: interfaces
absolemDev Nov 22, 2023
2b0cd55
feat: add form provider, form context, hook useForm
absolemDev Nov 23, 2023
611572e
fix: interfaces
absolemDev Nov 23, 2023
2762700
fix(input-wrapper): transform children arguments to object
absolemDev Nov 23, 2023
e122833
feat: add disabled prop, arguments for cildren button wrapper, edit i…
absolemDev Nov 24, 2023
9ac4775
fix(form-provider): export const
absolemDev Nov 24, 2023
84addff
feat(enums): add ButtonType enum
absolemDev Nov 24, 2023
f8d6d3c
feat: add use-custom-element hook, extend form context, edit interfaces
absolemDev Nov 27, 2023
bf5b803
fix: useMemo props for custom-elements hook, use Condition in wrapper…
absolemDev Nov 28, 2023
78bbb3d
fix: add fields hook, button hook, utils
absolemDev Nov 28, 2023
4272da8
docs: add README.md
absolemDev Nov 28, 2023
cfc8b6b
docs: edit README.md
absolemDev Nov 29, 2023
759c5c0
fix: get-name-fields util
absolemDev Nov 29, 2023
6b3cc3d
docs: edit package name
absolemDev Nov 29, 2023
2da55e8
fix: yarn check
absolemDev Nov 29, 2023
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
5 changes: 4 additions & 1 deletion packages/payment-widget/src/hooks/use-fields-render.hook.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import React from 'react'
import { useIntl } from 'react-intl'

import { Field } from '../interfaces'
import { InputStyles } from '../interfaces'
import { HandleBlurField } from '../interfaces'
import { FieldState } from '../interfaces'
import { HandleChangeField } from '../interfaces'
Expand All @@ -18,7 +19,8 @@ export const useFieldsRenderer = (
fieldsState: FieldState,
handleChange: HandleChangeField,
handleBlur: HandleBlurField,
inputGaps: number
inputGaps: number,
styles: InputStyles
) => {
const intl = useIntl()

Expand All @@ -38,6 +40,7 @@ export const useFieldsRenderer = (
errorText={translateError}
onChangeNative={handleChange}
onBlur={handleBlur}
styles={styles}
/>
<Condition match={isNotLastField}>
<Layout flexBasis={inputGaps} flexShrink={0} />
Expand Down
2 changes: 2 additions & 0 deletions packages/payment-widget/src/interfaces/fields.interfaces.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import { HTMLInputTypeAttribute } from 'react'
import { AdditionalFieldsType } from '../enums'
import { RequiredFieldsType } from '../enums'
import { DirectionFields } from './styles.interfaces'
import { InputStyles } from './styles.interfaces'

export type FieldsNames = RequiredFieldsType | AdditionalFieldsType
export type FieldState = Record<FieldsNames, string>
Expand Down Expand Up @@ -38,4 +39,5 @@ export interface FieldsProps {
inputGaps?: number
isGenerateReceipt?: boolean
additionalFields?: AdditionalField[]
styles?: InputStyles
}
19 changes: 18 additions & 1 deletion packages/payment-widget/src/interfaces/styles.interfaces.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,25 @@ export enum DirectionFields {
Column = 'column',
}

export interface InputStyles {
styledArray?: any[]
Nelfimov marked this conversation as resolved.
Show resolved Hide resolved
size?: string
rounding?: {
default: number
active: number
}
}

export interface ButtonStyles extends ButtonProps {
styledArray?: any[]
size?: string
variant?: string
fill?: boolean
}

export interface Styles {
direction?: DirectionFields
inputGaps?: number
button?: ButtonProps
button?: ButtonStyles
input?: InputStyles
}
2 changes: 2 additions & 0 deletions packages/payment-widget/src/interfaces/widget.interfaces.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,4 +9,6 @@ export interface WidgetProps {
receipt?: ReceiptSettings
styles?: Styles
additionalFields?: AdditionalField[]
customTheme?: boolean
disabled?: boolean
}
18 changes: 9 additions & 9 deletions packages/payment-widget/src/ui/button/button.component.tsx
Original file line number Diff line number Diff line change
@@ -1,26 +1,26 @@
import styled from '@emotion/styled'
import { ButtonProps } from '@atls-ui-parts/button'

import React from 'react'
import { FC } from 'react'
import { useHover } from 'react-laag'

import { ButtonStyles } from '../../interfaces'
import { appearanceStyles } from './button.styles'
import { contentStyles } from './button.styles'
import { baseStyles } from './button.styles'
import { shapeStyles } from './button.styles'

const ButtonElement = styled('button')<any>(
baseStyles,
contentStyles,
appearanceStyles,
shapeStyles
)
const ButtonElement = ({ styledArray, ...props }) => {
const StyledButton = styledArray.length
? styled('button')<any>(...styledArray)
: styled('button')<any>(baseStyles, contentStyles, appearanceStyles, shapeStyles)
return <StyledButton {...props} />
}

export const Button: FC<ButtonProps> = ({ children, ...props }) => {
export const Button: FC<ButtonStyles> = ({ children, styledArray, ...props }) => {
const [hover, hoverProps] = useHover()
return (
<ButtonElement hover={hover} {...hoverProps} {...props}>
<ButtonElement hover={hover} {...hoverProps} styledArray={styledArray || []} {...props}>
{children}
</ButtonElement>
)
Expand Down
4 changes: 3 additions & 1 deletion packages/payment-widget/src/ui/fields.component.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ export const Fields = ({
isGenerateReceipt = false,
direction = DirectionFields.Column,
inputGaps = 16,
styles = {},
}: FieldsProps) => {
const processedFields = isGenerateReceipt
? addReceiptFieldsUtil(additionalFields)
Expand All @@ -35,7 +36,8 @@ export const Fields = ({
fieldsState,
handleChange,
handleBlur,
inputGaps
inputGaps,
styles
)
const Direction = direction === DirectionFields.Column ? Column : Row

Expand Down
12 changes: 10 additions & 2 deletions packages/payment-widget/src/ui/form.component.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,14 @@ import { useValidate } from '../hooks'
import { makePayment } from '../utils'
import { makePaymentWithCheck } from '../utils'

export const Form = ({ settings, amount, receipt, styles, additionalFields }: WidgetProps) => {
export const Form = ({
settings,
amount,
receipt,
styles,
additionalFields,
disabled,
}: WidgetProps) => {
const isLoaded = useInit()
const { errors, validateField, isValidate } = useValidate()
const payHandler: FormEventHandler<HTMLFormElement> = (event) => {
Expand All @@ -36,8 +43,9 @@ export const Form = ({ settings, amount, receipt, styles, additionalFields }: Wi
additionalFields={additionalFields}
direction={styles?.direction}
inputGaps={styles?.inputGaps}
styles={styles?.input}
/>
<Button type='submit' disabled={!isLoaded} {...styles?.button}>
<Button type='submit' disabled={!isLoaded || disabled} {...styles?.button}>
<FormattedMessage id='payment_widget.pay' defaultMessage='Оплатить' />
</Button>
</form>
Expand Down
30 changes: 19 additions & 11 deletions packages/payment-widget/src/ui/input/input.component.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -14,19 +14,19 @@ import { forwardRef } from 'react'
import { useHover } from 'react-laag'
import { layout } from 'styled-system'

import { InputStyles } from '../../interfaces'
import { theme } from '../theme/src/index'
import { appearanceStyles } from './input.styles'
import { baseStyles } from './input.styles'
import { shapeStyles } from './input.styles'
import { transitionStyles } from './input.styles'

export const InputElement = styled.div<any>(
baseStyles,
shapeStyles,
appearanceStyles,
transitionStyles,
layout
)
export const InputElement = ({ styledArray, ...props }) => {
const StyledInput = styledArray.length
? styled.div<any>(baseStyles, ...styledArray, layout)
: styled.div<any>(baseStyles, shapeStyles, appearanceStyles, transitionStyles, layout)
return <StyledInput {...props} />
}

const Container = styled.div(({ type }: any) => ({
display: type === 'hidden' ? 'none' : 'flex',
Expand All @@ -36,6 +36,7 @@ const Container = styled.div(({ type }: any) => ({

interface InputProps extends BaseInputProps {
errorText?: string
styles?: InputStyles
}

export const InputWithoutRef: ForwardRefRenderFunction<HTMLInputElement, InputProps> = (
Expand All @@ -48,13 +49,14 @@ export const InputWithoutRef: ForwardRefRenderFunction<HTMLInputElement, InputPr
onChange,
onChangeNative,
placeholder,
styles,
...props
},
ref
) => {
const changeValue = useChangeValue(disabled, onChange, onChangeNative)
const [, hoverProps] = useHover()
const [, setFocus] = useState<boolean>(false)
const [hover, hoverProps] = useHover()
const [focus, setFocus] = useState<boolean>(false)

if (!ref) {
ref = useRef(null) // eslint-disable-line
Expand All @@ -76,15 +78,21 @@ export const InputWithoutRef: ForwardRefRenderFunction<HTMLInputElement, InputPr
}}
{...hoverProps}
>
<InputElement {...props} error={errorText !== ''}>
<InputElement
{...props}
error={errorText !== ''}
size={styles?.size}
styledArray={styles?.styledArray || []}
rounding={focus || hover ? styles?.rounding?.active : styles?.rounding?.default}
>
<RawInput
ref={ref}
type={type}
required={required}
disabled={disabled}
value={value}
onChange={changeValue}
placeholder={required ? `${placeholder}*` : placeholder}
placeholder={placeholder}
{...props}
/>
</InputElement>
Expand Down
9 changes: 6 additions & 3 deletions packages/payment-widget/src/ui/theme/src/theme.provider.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,9 @@ import { ThemeProvider as EmotionThemeProvider } from '@emotion/react'

import React from 'react'

export const ThemeProvider = ({ children }) => (
<EmotionThemeProvider theme={theme}>{children}</EmotionThemeProvider>
)
export const ThemeProvider = ({ customTheme, children }) =>
Nelfimov marked this conversation as resolved.
Show resolved Hide resolved
customTheme ? (
<>{children}</> // eslint-disable-line
) : (
<EmotionThemeProvider theme={theme}>{children}</EmotionThemeProvider>
)
13 changes: 11 additions & 2 deletions packages/payment-widget/src/ui/widget.component.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -14,11 +14,19 @@ const messages = {
[LanguagesType.ENGLISH]: messagesEn,
}

export const Widget = ({ amount, settings, receipt, additionalFields, styles }: WidgetProps) => {
export const Widget = ({
amount,
settings,
receipt,
additionalFields,
styles,
customTheme,
disabled,
}: WidgetProps) => {
const locale = settings.language ?? LanguagesType.RUSSIAN

return (
<ThemeProvider>
<ThemeProvider customTheme={customTheme}>
<IntlProvider
locale={locale}
messages={messages[locale]}
Expand All @@ -30,6 +38,7 @@ export const Widget = ({ amount, settings, receipt, additionalFields, styles }:
receipt={receipt}
styles={styles}
additionalFields={additionalFields}
disabled={disabled}
/>
</IntlProvider>
</ThemeProvider>
Expand Down
Loading