Skip to content

Commit 3c9a847

Browse files
SK-1976 update README and sample for error override (#168)
1 parent b969afb commit 3c9a847

3 files changed

Lines changed: 221 additions & 0 deletions

File tree

README.md

Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1088,6 +1088,87 @@ export default App
10881088
value: '41111111XXXXXXXX',
10891089
};
10901090
```
1091+
1092+
### Override default error Messages
1093+
1094+
You can override the default error messages with custom ones by using `setErrorOverride`. This is especially useful to override default error messages in non-English languages.
1095+
1096+
To override error messages dynamically, you need to:
1097+
1098+
1. Create a ref using `React.useRef`.
1099+
1100+
2. Pass the ref to the Skyflow element for which you want to set the custom error.
1101+
1102+
3. Use `setErrorOverride` on ref.current to set the custom message.
1103+
1104+
`setErrorOverride` overrides the default error message when the value is invalid. The error resets automatically when the value becomes valid.
1105+
1106+
```javascript
1107+
import {
1108+
CardNumberElement,
1109+
useCollectContainer,
1110+
CardHolderNameElement,
1111+
SkyflowCollectElementRef,
1112+
} from 'skyflow-react-js';
1113+
1114+
const CollectElements = () => {
1115+
const container = useCollectContainer();
1116+
1117+
const cardNumberRef = React.useRef<SkyflowCollectElementRef | null>(null);
1118+
const cardholderNameRef = React.useRef<SkyflowCollectElementRef | null>(null);
1119+
1120+
const onCardNumberBlur = (state: any) => {
1121+
if(state.isEmpty){
1122+
//can override the message when the field is required and empty
1123+
cardNumberRef.current?.setErrorOverride("custom error for required");
1124+
} else if(!state.isValid){
1125+
//can override the message when the input is invalid
1126+
cardNumberRef.current?.setErrorOverride("custom error for invalid number");
1127+
}
1128+
}
1129+
1130+
const onCardholderNameBlur = (state: any) => {
1131+
if(state.isEmpty){
1132+
//can override the message when the field is required and empty
1133+
cardNameRef.current?.setErrorOverride("custom error for required");
1134+
} else if(!state.isValid){
1135+
//can override the message when the input is invalid
1136+
cardNameRef.current?.setErrorOverride("custom error for invalid name");
1137+
}
1138+
}
1139+
1140+
return (
1141+
<div>
1142+
<CardNumberElement
1143+
id={'collectCardNumber'}
1144+
container={container}
1145+
table={'table1'}
1146+
column={'card_number'}
1147+
label='Card number'
1148+
ref={cardNumberRef}
1149+
options={{required:true}}
1150+
onBlur={onCardNumberBlur}
1151+
/>
1152+
<CardHolderNameElement
1153+
id={'collectCardName'}
1154+
container={container}
1155+
table={'table1'}
1156+
column={'cardholder_name'}
1157+
label='Name'
1158+
ref={cardNameRef}
1159+
options={{required:true}}
1160+
onBlur={onCardholderNameBlur}
1161+
/>
1162+
</div>
1163+
)
1164+
}
1165+
```
1166+
1167+
**Note**:
1168+
- Maintain different references for different elements.
1169+
- `setErrorOverride` can only override default error messages.
1170+
- `setErrorOverride` can only be used in BLUR event listener as shown in the above example.
1171+
10911172
## Using Skyflow File Input Element to upload a file
10921173
10931174
You can upload binary files to a vault using the Skyflow File Input Element. Use the following steps to securely upload a file.

samples/SkyflowElements/src/App.tsx

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import DynamicCollectElements from './components/DynamicCollectElements';
1414
import DynamicRevealElements from './components/DynamicRevealElements';
1515
import CardBrandChoice from './components/CardBrandChoice';
1616
import ThreeDSHelperFunctions from './components/3DSHelperFunctions';
17+
import OverrideDefaultErrors from './components/OverrideDefaultErrors'
1718

1819
const App = () => {
1920

@@ -64,36 +65,48 @@ const App = () => {
6465
</p>
6566
<CustomValidations />
6667
</div>
68+
<br />
6769
<div id='Sample for Composable Elements In Modal'>
6870
<p>
6971
<b>Sample Composable Elements Dynamic properties update</b>
7072
</p>
7173
<DynamicComposableElements />
7274
</div>
75+
<br />
7376
<div id='Sample for Collect Elements Update Properties'>
7477
<p>
7578
<b>Sample Collect Elements Dynamic properties update</b>
7679
</p>
7780
<DynamicCollectElements />
7881
</div>
82+
<br />
7983
<div id='Sample for Reveal Elements Update Properties'>
8084
<p>
8185
<b>Sample Reveal Elements Dynamic properties update</b>
8286
</p>
8387
<DynamicRevealElements />
8488
</div>
89+
<br />
8590
<div id='Sample for Card Brand Choice'>
8691
<p>
8792
<b>Sample Card Brand Choice</b>
8893
</p>
8994
<CardBrandChoice />
9095
</div>
96+
<br />
9197
<div id='Sample for 3DS Helper Functions'>
9298
<p>
9399
<b>Sample 3DS Helper Functions</b>
94100
</p>
95101
<ThreeDSHelperFunctions />
96102
</div>
103+
<br />
104+
<div id='Sample for override default error messages'>
105+
<p>
106+
<b>Override default error messages</b>
107+
</p>
108+
<OverrideDefaultErrors />
109+
</div>
97110
</div>
98111
);
99112
};
Lines changed: 127 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,127 @@
1+
/*
2+
Copyright (c) 2022 Skyflow, Inc.
3+
*/
4+
import React from 'react';
5+
import {
6+
CardNumberElement,
7+
useCollectContainer,
8+
useMakeSkyflowStyles,
9+
CardHolderNameElement,
10+
SkyflowCollectElementRef,
11+
} from 'skyflow-react-js';
12+
13+
const OverrideDefaultErrors = () => {
14+
const container = useCollectContainer();
15+
16+
const handleCollect = () => {
17+
const response = container.collect();
18+
response
19+
.then((res: unknown) => {
20+
console.log(JSON.stringify(res));
21+
})
22+
.catch((e: unknown) => {
23+
console.log(e);
24+
});
25+
};
26+
27+
const useStyles = useMakeSkyflowStyles({
28+
inputStyles: {
29+
base: {
30+
border: '1px solid black',
31+
borderRadius: '4px',
32+
color: '#1d1d1d',
33+
padding: '10px 16px',
34+
fontFamily: '"Roboto", sans-serif'
35+
},
36+
complete: {
37+
color: '#4caf50',
38+
},
39+
empty: {},
40+
focus: {},
41+
invalid: {
42+
color: '#f44336',
43+
},
44+
global: {
45+
'@import' :'url("https://fonts.googleapis.com/css2?family=Roboto&display=swap")',
46+
}
47+
},
48+
labelStyles: {
49+
base: {
50+
fontSize: '16px',
51+
fontWeight: 'bold',
52+
fontFamily: '"Roboto", sans-serif'
53+
},
54+
global: {
55+
'@import' :'url("https://fonts.googleapis.com/css2?family=Roboto&display=swap")',
56+
},
57+
requiredAsterisk:{
58+
color: 'red'
59+
}
60+
},
61+
errorTextStyles: {
62+
base: {
63+
color: 'red',
64+
fontFamily: '"Roboto", sans-serif'
65+
},
66+
global: {
67+
'@import' :'url("https://fonts.googleapis.com/css2?family=Roboto&display=swap")',
68+
},
69+
},
70+
});
71+
72+
const classes = useStyles();
73+
74+
const cardNumberRef = React.useRef<SkyflowCollectElementRef | null>(null);
75+
76+
const cardholderNameRef = React.useRef<SkyflowCollectElementRef | null>(null);
77+
78+
const onCardNumberBlur = (state: any) => {
79+
if(state.isEmpty){
80+
//can override the message when the field is required and empty
81+
cardNumberRef.current?.setErrorOverride("custom error for required");
82+
} else if(!state.isValid){
83+
//can override the message when the input is invalid
84+
cardNumberRef.current?.setErrorOverride("custom error for invalid number");
85+
}
86+
}
87+
88+
const onCardholderNameBlur = (state: any) => {
89+
if(state.isEmpty){
90+
//can override the message when the field is required and empty
91+
cardholderNameRef.current?.setErrorOverride("custom error for required");
92+
} else if(!state.isValid){
93+
//can override the message when the input is invalid
94+
cardholderNameRef.current?.setErrorOverride("custom error for invalid name");
95+
}
96+
}
97+
98+
return (
99+
<div className='CollectElements' style={{width: '300px'}}>
100+
<CardNumberElement
101+
id={'collectCardNumber'}
102+
container={container}
103+
table={'cards'}
104+
classes={classes}
105+
column={'card_number'}
106+
label='Card number'
107+
ref={cardNumberRef}
108+
options={{required:true}}
109+
onBlur={onCardNumberBlur}
110+
/>
111+
<CardHolderNameElement
112+
id={'collectCardName'}
113+
container={container}
114+
table={'cards'}
115+
classes={classes}
116+
column={'cardholder_name'}
117+
label='Name'
118+
ref={cardholderNameRef}
119+
options={{required:true}}
120+
onBlur={onCardholderNameBlur}
121+
/>
122+
<button onClick={handleCollect}>Collect</button>
123+
</div>
124+
);
125+
};
126+
127+
export default OverrideDefaultErrors;

0 commit comments

Comments
 (0)