-
Notifications
You must be signed in to change notification settings - Fork 219
Product Title block: add support global style #5515
Changes from 3 commits
e9d7c30
517f80a
48709c7
6d79824
4bcdc58
a17ca36
516f570
2f7bc2f
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,21 @@ | ||
/** | ||
* External dependencies | ||
*/ | ||
import { useBlockProps } from '@wordpress/block-editor'; | ||
import classnames from 'classnames'; | ||
|
||
type Props = { | ||
attributes: Record< string, unknown > & { | ||
className?: string; | ||
}; | ||
}; | ||
|
||
export const Save = ( { attributes }: Props ): JSX.Element => { | ||
return ( | ||
<div | ||
{ ...useBlockProps.save( { | ||
className: classnames( 'is-loading', attributes.className ), | ||
} ) } | ||
/> | ||
); | ||
}; |
Original file line number | Diff line number | Diff line change | ||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
@@ -0,0 +1,123 @@ | ||||||||||||||||
/* eslint-disable @wordpress/no-unsafe-wp-apis */ | ||||||||||||||||
/** | ||||||||||||||||
* External dependencies | ||||||||||||||||
*/ | ||||||||||||||||
import { __experimentalUseColorProps } from '@wordpress/block-editor'; | ||||||||||||||||
|
||||||||||||||||
/** | ||||||||||||||||
* Internal dependencies | ||||||||||||||||
*/ | ||||||||||||||||
import { isFeaturePluginBuild } from '../settings/blocks/feature-flags'; | ||||||||||||||||
import { isString, isObject } from '../types/type-guards'; | ||||||||||||||||
|
||||||||||||||||
type WithClass = { | ||||||||||||||||
className: string; | ||||||||||||||||
}; | ||||||||||||||||
|
||||||||||||||||
type WithStyle = { | ||||||||||||||||
style: Record< string, unknown >; | ||||||||||||||||
}; | ||||||||||||||||
|
||||||||||||||||
const parseStyle = ( style: unknown ): Record< string, unknown > => { | ||||||||||||||||
if ( isString( style ) ) { | ||||||||||||||||
return JSON.parse( style ) || {}; | ||||||||||||||||
} | ||||||||||||||||
|
||||||||||||||||
if ( isObject( style ) ) { | ||||||||||||||||
return style; | ||||||||||||||||
} | ||||||||||||||||
|
||||||||||||||||
return {}; | ||||||||||||||||
}; | ||||||||||||||||
|
||||||||||||||||
const getSpacingStyleInline = ( | ||||||||||||||||
key: string, | ||||||||||||||||
values: { | ||||||||||||||||
top: string | null; | ||||||||||||||||
right: string | null; | ||||||||||||||||
bottom: string | null; | ||||||||||||||||
left: string | null; | ||||||||||||||||
} | ||||||||||||||||
) => { | ||||||||||||||||
return { | ||||||||||||||||
...( isString( values.top ) && { [ `${ key }Top` ]: values.top } ), | ||||||||||||||||
...( isString( values.right ) && { | ||||||||||||||||
[ `${ key }Right` ]: values.right, | ||||||||||||||||
} ), | ||||||||||||||||
...( isString( values.bottom ) && { | ||||||||||||||||
[ `${ key }Bottom` ]: values.bottom, | ||||||||||||||||
} ), | ||||||||||||||||
...( isString( values.left ) && { [ `${ key }Left` ]: values.left } ), | ||||||||||||||||
}; | ||||||||||||||||
}; | ||||||||||||||||
|
||||||||||||||||
const parseSpacingStyle = ( | ||||||||||||||||
spacing: Record< string, unknown > | ||||||||||||||||
): Record< string, unknown > => { | ||||||||||||||||
const keys = [ 'margin' ]; | ||||||||||||||||
|
||||||||||||||||
const getValueOrDefault = ( value: unknown ) => { | ||||||||||||||||
return isString( value ) && value.length > 0 ? value : null; | ||||||||||||||||
}; | ||||||||||||||||
|
||||||||||||||||
return Object.keys( spacing ).reduce( ( acc, key ) => { | ||||||||||||||||
const spacingProperty = isObject( spacing[ key ] ) | ||||||||||||||||
? ( spacing[ key ] as Record< string, unknown > ) | ||||||||||||||||
: {}; | ||||||||||||||||
|
||||||||||||||||
if ( keys.includes( key ) ) { | ||||||||||||||||
return { | ||||||||||||||||
...acc, | ||||||||||||||||
...getSpacingStyleInline( key, { | ||||||||||||||||
top: getValueOrDefault( spacingProperty.top ), | ||||||||||||||||
right: getValueOrDefault( spacingProperty.right ), | ||||||||||||||||
bottom: getValueOrDefault( spacingProperty.bottom ), | ||||||||||||||||
left: getValueOrDefault( spacingProperty.left ), | ||||||||||||||||
} ), | ||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Suggested change
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I think we can pass spacingProperty as the second argument then handle sides there instead. It makes the callback look cleaner. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
It can be an idea, but to be honest I prefer to create a more strict typed code. With this code (so without type), we lose some information about how the function But this is just my opinion, if you think that it is better to change it, I will do it :D There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. @gigitux With your example, I don't see the need for
|
||||||||||||||||
}; | ||||||||||||||||
} | ||||||||||||||||
|
||||||||||||||||
return acc; | ||||||||||||||||
}, {} ); | ||||||||||||||||
}; | ||||||||||||||||
|
||||||||||||||||
export const useSpacingProps = ( attributes: unknown ): WithStyle => { | ||||||||||||||||
const style = isObject( attributes ) ? parseStyle( attributes.style ) : {}; | ||||||||||||||||
const spacingStyles = isObject( style.spacing ) ? style.spacing : {}; | ||||||||||||||||
|
||||||||||||||||
return { | ||||||||||||||||
style: parseSpacingStyle( spacingStyles ), | ||||||||||||||||
}; | ||||||||||||||||
}; | ||||||||||||||||
|
||||||||||||||||
export const useTypographyProps = ( attributes: unknown ): WithStyle => { | ||||||||||||||||
const attributesObject = isObject( attributes ) ? attributes : {}; | ||||||||||||||||
const style = parseStyle( attributesObject.style ); | ||||||||||||||||
const typography = isObject( style.typography ) | ||||||||||||||||
? ( style.typography as Record< string, unknown > ) | ||||||||||||||||
: {}; | ||||||||||||||||
|
||||||||||||||||
return { | ||||||||||||||||
style: { | ||||||||||||||||
fontSize: attributesObject.fontSize || typography.fontSize, | ||||||||||||||||
lineHeight: typography.lineHeight, | ||||||||||||||||
fontWeight: typography.fontWeight, | ||||||||||||||||
textTransform: typography.textTransform, | ||||||||||||||||
fontFamily: attributesObject.fontFamily, | ||||||||||||||||
}, | ||||||||||||||||
}; | ||||||||||||||||
}; | ||||||||||||||||
|
||||||||||||||||
export const useColorProps = ( attributes: unknown ): WithStyle & WithClass => { | ||||||||||||||||
dinhtungdu marked this conversation as resolved.
Show resolved
Hide resolved
|
||||||||||||||||
if ( ! isFeaturePluginBuild() ) { | ||||||||||||||||
return { | ||||||||||||||||
className: '', | ||||||||||||||||
style: {}, | ||||||||||||||||
}; | ||||||||||||||||
} | ||||||||||||||||
|
||||||||||||||||
const attributesObject = isObject( attributes ) ? attributes : {}; | ||||||||||||||||
const style = parseStyle( attributesObject.style ); | ||||||||||||||||
|
||||||||||||||||
return __experimentalUseColorProps( { ...attributesObject, style } ); | ||||||||||||||||
}; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Can we use key: value here then remove the null properties? We can even return style object with null properties because they will be omitted during render. Using spread here is quite hard to read IMO.