PluginProbe
CartFlows – Funnel Builder & Checkout Plugin for WooCommerce / trunk
CartFlows – Funnel Builder & Checkout Plugin for WooCommerce vtrunk
3.2.0 3.1.4 3.1.3 3.1.2 3.1.1 3.1.0 3.0.1 trunk 1.0.4 1.1.0 1.1.0.1 1.1.1 1.1.10 1.1.11 1.1.12 1.1.13 1.1.14 1.1.15 1.1.16 1.1.17 1.1.18 1.1.19 1.1.2 1.1.20 1.1.21 All 160 releases
cartflows / wizard / assets / src / fields / ToggleField.js

ToggleField.js in CartFlows – Funnel Builder & Checkout Plugin for WooCommerce trunk, at wizard/assets/src/fields/ToggleField.js

118 lines 3.0 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 import React, { useState, useEffect } from 'react';
2 import { Tooltip } from '@WizardFields';
3 import parse from 'html-react-parser';
4 import classnames from 'classnames';
5
6 function ToggleField( { onChange, ...props } ) {
7 const {
8 name,
9 id,
10 label,
11 value,
12 backComp = false,
13 onClick,
14 isDisabled = false,
15 tooltip,
16 desc,
17 } = props;
18
19 const [ inputvalue, setInputvalue ] = useState( value );
20
21 useEffect( () => {
22 setInputvalue( value );
23 }, [ value ] );
24
25 const checkedvalue = backComp ? 'enable' : 'yes';
26 const uncheckedvalue = backComp ? 'disable' : 'no';
27
28 function handleCheckboxClick( e ) {
29 let current_value = 'no';
30
31 if ( uncheckedvalue === inputvalue ) {
32 setInputvalue( checkedvalue );
33 current_value = checkedvalue;
34 } else {
35 setInputvalue( uncheckedvalue );
36 current_value = uncheckedvalue;
37 }
38
39 // Trigger change
40 const changeEvent = new CustomEvent( 'wcf:toggle:change', {
41 bubbles: true,
42 detail: { e, name, value: current_value },
43 } );
44
45 document.dispatchEvent( changeEvent );
46
47 // Notify parent component about the change
48 if ( onChange ) {
49 onChange( { name, value: current_value } );
50 }
51 }
52 function onChangeHandle() {
53 if ( onClick ) {
54 onClick();
55 }
56 }
57
58 return (
59 <div className={ 'wcf-field wcf-toggle-field' }>
60 <div className={ 'wcf-field__data gap-2' }>
61 <div className="wcf-field__data--content-left">
62 { label && (
63 <label className="flex items-center gap-0.5">
64 { label }
65 { tooltip && <Tooltip text={ tooltip } /> }
66 </label>
67 ) }
68 { desc && (
69 <div className={ `wcf-field__desc text-gray-400` }>
70 { parse( desc ) }
71 </div>
72 ) }
73 </div>
74 <div className="wcf-field__data--content-right">
75 <div className="flex justify-center">
76 <button
77 type="button"
78 // name={ name }
79 // value={ inputvalue }
80 id={ id ? id : name }
81 className={ classnames(
82 props.class,
83 'bg-gray-200 relative inline-flex h-6 w-11 flex-shrink-0 cursor-pointer rounded-full border-2 border-transparent transition-colors duration-200 ease-in-out focus:outline-none focus:ring-2 focus:ring-primary-600 focus:ring-offset-2',
84 checkedvalue === inputvalue
85 ? 'bg-primary-600'
86 : 'bg-gray-200',
87 isDisabled ? '!bg-primary-300' : ''
88 ) }
89 disabled={ isDisabled }
90 role="switch"
91 onClick={ handleCheckboxClick }
92 onChange={ onChangeHandle }
93 >
94 <input
95 type="hidden"
96 className={ props.class }
97 name={ name }
98 value={ inputvalue }
99 />
100 <span
101 aria-hidden="true"
102 className={ classnames(
103 checkedvalue === inputvalue
104 ? 'translate-x-5'
105 : 'translate-x-0',
106 'translate-x-0 pointer-events-none inline-block h-5 w-5 transform rounded-full bg-white shadow ring-0 transition duration-200 ease-in-out'
107 ) }
108 ></span>
109 </button>
110 </div>
111 </div>
112 </div>
113 </div>
114 );
115 }
116
117 export default ToggleField;
118