aboutsummaryrefslogtreecommitdiffstats
path: root/src/components/ui
diff options
context:
space:
mode:
authorLibravatar Vijay Aravamudhan <vraravam@users.noreply.github.com>2022-11-07 06:50:40 +0530
committerLibravatar GitHub <noreply@github.com>2022-11-07 01:20:40 +0000
commit93a5de8d8e725cb6fff256a54544d39cf50a16f8 (patch)
tree6772686892a9e63e183109944c2845fcdeeb8939 /src/components/ui
parent6.2.1-nightly.40 [skip ci] (diff)
downloadferdium-app-93a5de8d8e725cb6fff256a54544d39cf50a16f8.tar.gz
ferdium-app-93a5de8d8e725cb6fff256a54544d39cf50a16f8.tar.zst
ferdium-app-93a5de8d8e725cb6fff256a54544d39cf50a16f8.zip
Revert "Remove duplicated Toggle.js component" (#742)
Revert "Remove duplicated Toggle.js component (#741)" This reverts commit dd238ae7949e72e3b90235f56e14686cc5231f34.
Diffstat (limited to 'src/components/ui')
-rw-r--r--src/components/ui/Toggle.js72
-rw-r--r--src/components/ui/toggle/index.tsx56
2 files changed, 104 insertions, 24 deletions
diff --git a/src/components/ui/Toggle.js b/src/components/ui/Toggle.js
new file mode 100644
index 000000000..c1d86a7f6
--- /dev/null
+++ b/src/components/ui/Toggle.js
@@ -0,0 +1,72 @@
1import { Component } from 'react';
2import PropTypes from 'prop-types';
3import { observer } from 'mobx-react';
4import classnames from 'classnames';
5import { Field } from 'mobx-react-form';
6
7// Can this file be merged into the './toggle/index.tsx' file?
8class Toggle extends Component {
9 static propTypes = {
10 field: PropTypes.instanceOf(Field).isRequired,
11 className: PropTypes.string,
12 showLabel: PropTypes.bool,
13 disabled: PropTypes.bool,
14 };
15
16 static defaultProps = {
17 className: '',
18 showLabel: true,
19 disabled: false,
20 };
21
22 onChange(e) {
23 const { field } = this.props;
24
25 field.onChange(e);
26 }
27
28 render() {
29 const { field, className, showLabel, disabled } = this.props;
30
31 if (field.value === '' && field.default !== '') {
32 field.value = field.default;
33 }
34
35 return (
36 <div
37 className={classnames([
38 'franz-form__field',
39 'franz-form__toggle-wrapper',
40 'franz-form__toggle-disabled',
41 className,
42 ])}
43 >
44 <label
45 htmlFor={field.id}
46 className={classnames({
47 'franz-form__toggle': true,
48 'is-active': field.value,
49 })}
50 >
51 <div className="franz-form__toggle-button" />
52 <input
53 type="checkbox"
54 id={field.id}
55 name={field.name}
56 value={field.name}
57 checked={field.value}
58 onChange={e => (!disabled ? this.onChange(e) : null)}
59 />
60 </label>
61 {field.error && <div className={field.error}>{field.error}</div>}
62 {field.label && showLabel && (
63 <label className="franz-form__label" htmlFor={field.id}>
64 {field.label}
65 </label>
66 )}
67 </div>
68 );
69 }
70}
71
72export default observer(Toggle);
diff --git a/src/components/ui/toggle/index.tsx b/src/components/ui/toggle/index.tsx
index fee8adbc7..d478cbba5 100644
--- a/src/components/ui/toggle/index.tsx
+++ b/src/components/ui/toggle/index.tsx
@@ -1,26 +1,27 @@
1import classnames from 'classnames'; 1import classnames from 'classnames';
2import { Property } from 'csstype'; 2import { Property } from 'csstype';
3import { noop } from 'lodash';
4import { Component, InputHTMLAttributes } from 'react'; 3import { Component, InputHTMLAttributes } from 'react';
5import withStyles, { WithStylesProps } from 'react-jss'; 4import injectStyle, { WithStylesProps } from 'react-jss';
5
6import { Theme } from '../../../themes'; 6import { Theme } from '../../../themes';
7import { IFormField } from '../typings/generic';
8
7import Error from '../error'; 9import Error from '../error';
8import Label from '../label'; 10import Label from '../label';
9import { IFormField } from '../typings/generic';
10import Wrapper from '../wrapper'; 11import Wrapper from '../wrapper';
11 12
12interface IProps 13interface IProps
13 extends Omit<InputHTMLAttributes<HTMLInputElement>, 'value'>, 14 extends InputHTMLAttributes<HTMLInputElement>,
14 IFormField, 15 IFormField,
15 WithStylesProps<typeof styles> { 16 WithStylesProps<typeof styles> {
16 className?: string; 17 className?: string;
17 value: boolean | undefined; // due to type capability between InputHTMLAttributes and mobx-react-form
18} 18}
19 19
20const buttonTransition: string = 20let buttonTransition: string = 'none';
21 window && window.matchMedia('(prefers-reduced-motion: no-preference)') 21
22 ? 'all .5s' 22if (window && window.matchMedia('(prefers-reduced-motion: no-preference)')) {
23 : 'none'; 23 buttonTransition = 'all .5s';
24}
24 25
25const styles = (theme: Theme) => ({ 26const styles = (theme: Theme) => ({
26 toggle: { 27 toggle: {
@@ -63,18 +64,25 @@ const styles = (theme: Theme) => ({
63}); 64});
64 65
65class ToggleComponent extends Component<IProps> { 66class ToggleComponent extends Component<IProps> {
67 public static defaultProps = {
68 onChange: () => {},
69 showLabel: true,
70 disabled: false,
71 error: '',
72 };
73
66 render() { 74 render() {
67 const { 75 const {
68 classes, 76 classes,
69 className, 77 className,
70 id = '', 78 disabled,
71 name = '', 79 error,
72 label = '', 80 id,
73 error = '', 81 label,
74 value = false, 82 showLabel,
75 showLabel = true, 83 checked,
76 disabled = false, 84 value,
77 onChange = noop, 85 onChange,
78 } = this.props; 86 } = this.props;
79 87
80 return ( 88 return (
@@ -94,24 +102,24 @@ class ToggleComponent extends Component<IProps> {
94 <div 102 <div
95 className={classnames({ 103 className={classnames({
96 [`${classes.button}`]: true, 104 [`${classes.button}`]: true,
97 [`${classes.buttonActive}`]: value, 105 [`${classes.buttonActive}`]: checked,
98 })} 106 })}
99 /> 107 />
100 <input 108 <input
101 type="checkbox"
102 id={id}
103 name={name}
104 checked={value as boolean | undefined}
105 className={classes.input} 109 className={classes.input}
110 id={id}
111 type="checkbox"
112 checked={checked}
113 value={value}
106 onChange={onChange} 114 onChange={onChange}
107 disabled={disabled} 115 disabled={disabled}
108 /> 116 />
109 </div> 117 </div>
110 </Label> 118 </Label>
111 {error ? <Error message={error as string} /> : null} 119 {error && <Error message={error} />}
112 </Wrapper> 120 </Wrapper>
113 ); 121 );
114 } 122 }
115} 123}
116 124
117export default withStyles(styles, { injectTheme: true })(ToggleComponent); 125export default injectStyle(styles, { injectTheme: true })(ToggleComponent);