44 * SPDX-License-Identifier: BSD-3-Clause
55 * For full license text, see the LICENSE file in the repo root or https://opensource.org/licenses/BSD-3-Clause
66 */
7- import React , { useState } from 'react'
7+ import React from 'react'
88import PropTypes from 'prop-types'
99import ccValidator from 'card-validator'
1010import { useIntl } from 'react-intl'
11- import { Box , Flex , FormLabel , InputRightElement , SimpleGrid , Stack , Tooltip } from '@chakra-ui/react'
11+ import { Box , Flex , SimpleGrid , Stack , Field as ChakraField } from '@chakra-ui/react'
12+ import Tooltip from '../../components/tooltip'
1213import { formatCreditCardNumber , getCreditCardIcon } from '../../utils/cc-utils'
1314import useCreditCardFields from '../../components/forms/useCreditCardFields'
1415import Field from '../../components/field'
1516import { AmexIcon , DiscoverIcon , MastercardIcon , VisaIcon , InfoIcon } from '../../components/icons'
1617
1718const CreditCardFields = ( { form, prefix = '' } ) => {
1819 const { formatMessage} = useIntl ( )
19- const [ isTooltipOpen , setIsTooltipOpen ] = useState ( false )
2020 const fields = useCreditCardFields ( { form, prefix} )
2121
2222 // Rerender the fields when we `cardType` changes so the detected
@@ -42,31 +42,15 @@ const CreditCardFields = ({form, prefix = ''}) => {
4242 description : 'Generic credit card security code help text'
4343 } )
4444
45- const handleTooltipClose = ( ) => {
46- setIsTooltipOpen ( false )
47- if ( document ) {
48- document . removeEventListener ( 'click' , handleTooltipClose )
49- document . removeEventListener ( 'keydown' , handleTooltipClose )
50- }
51- }
52-
53- const handleTooltipOpen = ( ) => {
54- setIsTooltipOpen ( true )
55- if ( document ) {
56- document . addEventListener ( 'click' , handleTooltipClose )
57- document . addEventListener ( 'keydown' , handleTooltipClose )
58- }
59- }
60-
6145 return (
6246 < Box >
63- < Stack spacing = { 5 } >
47+ < Stack gap = { 5 } >
6448 < Field
6549 { ...fields . number }
6650 formLabel = {
67- < Flex justify = "space-between" >
68- < FormLabel > { fields . number . label } </ FormLabel >
69- < Stack direction = "row" spacing = { 1 } >
51+ < Flex justify = "space-between" align = "center" w = "full" >
52+ < Box > { fields . number . label } </ Box >
53+ < Stack direction = "row" gap = { 1 } >
7054 < VisaIcon layerStyle = "ccIcon" />
7155 < MastercardIcon layerStyle = "ccIcon" />
7256 < AmexIcon layerStyle = "ccIcon" />
@@ -84,19 +68,17 @@ const CreditCardFields = ({form, prefix = ''}) => {
8468 : number
8569 form . setValue ( 'cardType' , card ?. type || '' )
8670 return onChange ( formattedNumber )
87- }
71+ } ,
72+ endElement :
73+ CardIcon && form . getValues ( ) . number ?. length > 2 ? (
74+ < CardIcon layerStyle = "ccIcon" />
75+ ) : undefined
8876 } ) }
89- >
90- { CardIcon && form . getValues ( ) . number ?. length > 2 && (
91- < InputRightElement width = "60px" >
92- < CardIcon layerStyle = "ccIcon" />
93- </ InputRightElement >
94- ) }
95- </ Field >
77+ />
9678
9779 < Field { ...fields . holder } />
9880
99- < SimpleGrid columns = { [ 2 , 2 , 3 ] } spacing = { 5 } >
81+ < SimpleGrid columns = { [ 2 , 2 , 3 ] } gap = { 5 } >
10082 < Field
10183 { ...fields . expiry }
10284 inputProps = { ( { onChange} ) => ( {
@@ -131,33 +113,31 @@ const CreditCardFields = ({form, prefix = ''}) => {
131113 < Field
132114 { ...fields . securityCode }
133115 formLabel = {
134- < >
135- < FormLabel display = "inline" mr = { 1 } >
136- { fields . securityCode . label }
137- </ FormLabel >
138- < Box
139- onMouseEnter = { handleTooltipOpen }
140- onFocus = { handleTooltipOpen }
141- as = "span"
142- >
116+ < ChakraField . Label >
117+ < Flex align = "center" justify = "space-between" >
118+ < Box > { fields . securityCode . label } </ Box >
143119 < Tooltip
144- hasArrow
145- placement = "top"
146- label = { securityCodeTooltipLabel }
147- shouldWrapChildren = { true }
148- isOpen = { isTooltipOpen }
120+ content = { securityCodeTooltipLabel }
121+ contentProps = { {
122+ css : { '--tooltip-bg' : 'colors.blue.800' }
123+ } }
149124 >
150- < InfoIcon
151- boxSize = { 5 }
152- color = "gray.700"
125+ < Box
126+ as = "button"
153127 aria-label = { formatMessage ( {
154128 id : 'credit_card_fields.tool_tip.security_code_aria_label' ,
155129 defaultMessage : 'Security code info'
156130 } ) }
157- />
131+ >
132+ < InfoIcon
133+ boxSize = { 4 }
134+ color = "gray.700"
135+ cursor = "pointer"
136+ />
137+ </ Box >
158138 </ Tooltip >
159- </ Box >
160- </ >
139+ </ Flex >
140+ </ ChakraField . Label >
161141 }
162142 />
163143 </ SimpleGrid >
0 commit comments