reanimated-color-picker
Version:
A Pure JavaScript Color Picker for React Native
159 lines (156 loc) • 4.8 kB
JavaScript
'use strict';
Object.defineProperty(exports, '__esModule', {
value: true,
});
exports.default = HsvWidget;
var _react = _interopRequireWildcard(require('react'));
var _reactNativeReanimated = require('react-native-reanimated');
var _index = _interopRequireDefault(require('../../../colorKit/index'));
var _utils = require('../../../utils');
var _WidgetTextInput = _interopRequireDefault(require('./WidgetTextInput'));
function _interopRequireDefault(e) {
return e && e.__esModule ? e : { default: e };
}
function _interopRequireWildcard(e, t) {
if ('function' == typeof WeakMap)
var r = new WeakMap(),
n = new WeakMap();
return (_interopRequireWildcard = function (e, t) {
if (!t && e && e.__esModule) return e;
var o,
i,
f = { __proto__: null, default: e };
if (null === e || ('object' != typeof e && 'function' != typeof e)) return f;
if ((o = t ? n : r)) {
if (o.has(e)) return o.get(e);
o.set(e, f);
}
for (const t in e)
'default' !== t &&
{}.hasOwnProperty.call(e, t) &&
((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set)
? o(f, t, i)
: (f[t] = e[t]));
return f;
})(e, t);
}
function HsvWidget(props) {
const {
onChange,
colorResult,
hueValue,
saturationValue,
brightnessValue,
alphaValue,
inputStyle,
inputTitleStyle,
inputProps,
disableAlphaChannel,
} = props;
const hsv = (0, _react.useRef)(_index.default.HSV(colorResult().hsva).object(false));
const h = (0, _reactNativeReanimated.useSharedValue)(hsv.current.h.toString());
const s = (0, _reactNativeReanimated.useSharedValue)(hsv.current.s.toString());
const v = (0, _reactNativeReanimated.useSharedValue)(hsv.current.v.toString());
const a = (0, _reactNativeReanimated.useSharedValue)(hsv.current.a.toString());
(0, _reactNativeReanimated.useDerivedValue)(() => {
const currentColor = {
h: hueValue.value,
s: saturationValue.value,
v: brightnessValue.value,
a: alphaValue.value,
};
hsv.current = _index.default.runOnUI().HSV(colorResult(currentColor).hsva).object(false);
h.value = hsv.current.h.toString();
s.value = hsv.current.s.toString();
v.value = hsv.current.v.toString();
a.value = hsv.current.a.toString();
}, [hueValue, saturationValue, brightnessValue, alphaValue]);
const onHueEndEditing = text => {
const hue = (0, _utils.clamp)(+text, 360);
// Force update in case `h` value has not changed
h.value = '';
onChange({
h: hue,
s: +s.value,
v: +v.value,
a: +a.value,
});
};
const onSaturationEndEditing = text => {
const saturation = (0, _utils.clamp)(+text, 100);
s.value = '';
onChange({
h: +h.value,
s: saturation,
v: +v.value,
a: +a.value,
});
};
const onValueEndEditing = text => {
const value = (0, _utils.clamp)(+text, 100);
v.value = '';
onChange({
h: +h.value,
s: +s.value,
v: value,
a: +a.value,
});
};
const onAlphaEndEditing = text => {
const alpha = (0, _utils.clamp)(+text, 1);
a.value = '';
onChange({
h: +h.value,
s: +s.value,
v: +v.value,
a: alpha,
});
};
return /*#__PURE__*/ _react.default.createElement(
_react.default.Fragment,
null,
/*#__PURE__*/ _react.default.createElement(_WidgetTextInput.default, {
inputStyle: inputStyle,
textStyle: inputTitleStyle,
textValue: h,
title: 'H',
label: 'Hue channel in HSV color format',
onEndEditing: onHueEndEditing,
inputProps: inputProps,
}),
/*#__PURE__*/ _react.default.createElement(_WidgetTextInput.default, {
inputStyle: inputStyle,
textStyle: inputTitleStyle,
textValue: s,
title: 'S',
label: 'Saturation channel in HSV color format',
onEndEditing: onSaturationEndEditing,
inputProps: inputProps,
}),
/*#__PURE__*/ _react.default.createElement(_WidgetTextInput.default, {
inputStyle: inputStyle,
textStyle: inputTitleStyle,
textValue: v,
title: 'V',
label: 'Brightness channel in HSV color format',
onEndEditing: onValueEndEditing,
inputProps: inputProps,
}),
/*#__PURE__*/ _react.default.createElement(
_utils.ConditionalRendering,
{
if: !disableAlphaChannel,
},
/*#__PURE__*/ _react.default.createElement(_WidgetTextInput.default, {
inputStyle: inputStyle,
textStyle: inputTitleStyle,
textValue: a,
title: 'A',
label: 'Alpha channel in HSV color format',
onEndEditing: onAlphaEndEditing,
inputProps: inputProps,
decimal: true,
}),
),
);
}