Add support for passing scalars to vector props (#228)

Co-authored-by: Andrew Prifer <AndrewPrifer@users.noreply.github.com>
This commit is contained in:
Elliot 2022-06-26 11:47:20 -04:00 committed by GitHub
parent 7b337a9731
commit 2854881e17
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -31,6 +31,14 @@ type Vector3 = {
z: number
}
function isNumber(value: any) {
return typeof value === 'number' && isFinite(value)
}
function isVectorObject(value: any) {
return (['x', 'y', 'z'] as const).every((axis) => isNumber(value[axis]))
}
export const createVector = (components?: [number, number, number]) => {
return components
? {x: components[0], y: components[1], z: components[2]}
@ -47,16 +55,37 @@ export const createVectorPropConfig = (
{nudgeMultiplier = 0.01} = {},
): PropConfig<Vector3> => ({
parse: (props) => {
const vector = props[key]
? Array.isArray(props[key])
? createVector(props[key] as any)
: {
x: props[key].x,
y: props[key].y,
z: props[key].z,
}
: defaultValue
const propValue = props[key]
// if prop exists
const vector = !propValue
? defaultValue
: // if prop is an array
Array.isArray(propValue)
? createVector(propValue as any)
: // if prop is a scalar
isNumber(propValue)
? {
x: propValue,
y: propValue,
z: propValue,
}
: // if prop is a threejs Vector3
isVectorObject(propValue)
? {
x: propValue.x,
y: propValue.y,
z: propValue.z,
}
: // show a warning and return defaultValue
(console.warn(
`Couldn't parse prop %c${key}={${JSON.stringify(
propValue,
)}}%c, falling back to default value.`,
'background: black; color: white',
),
defaultValue)
;(['x', 'y', 'z'] as const).forEach((axis) => {
// e.g. r3f also accepts prop keys like "scale-x"
if (props[`${key}-${axis}` as any])
vector[axis] = props[`${key}-${axis}` as any]
})