@mvf/external-components 3.31.1-dev.7 → 3.31.1-dev.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/Components/Atoms/FormControl/FormControl.js +3 -1
- package/Components/Atoms/FormControl/FormControl.js.map +1 -1
- package/Components/Atoms/FormControl/makeFormControlStyles.d.ts +3 -1
- package/Components/Atoms/FormControl/makeFormControlStyles.js +1 -2
- package/Components/Atoms/FormControl/makeFormControlStyles.js.map +1 -1
- package/Components/Atoms/Input/IInputProps.d.ts +5 -0
- package/Components/Atoms/Input/Input.js +3 -2
- package/Components/Atoms/Input/Input.js.map +1 -1
- package/Components/Molecules/PhoneNumberTextField/PhoneNumberTextField.js +5 -3
- package/Components/Molecules/PhoneNumberTextField/PhoneNumberTextField.js.map +1 -1
- package/Components/Molecules/PhoneNumberTextFieldCustom/IPhoneNumberTextFieldProps.d.ts +57 -0
- package/Components/Molecules/PhoneNumberTextFieldCustom/IPhoneNumberTextFieldProps.js +3 -0
- package/Components/Molecules/PhoneNumberTextFieldCustom/IPhoneNumberTextFieldProps.js.map +1 -0
- package/Components/Molecules/PhoneNumberTextFieldCustom/PhoneNumberCallbacks.d.ts +33 -0
- package/Components/Molecules/PhoneNumberTextFieldCustom/PhoneNumberCallbacks.js +3 -0
- package/Components/Molecules/PhoneNumberTextFieldCustom/PhoneNumberCallbacks.js.map +1 -0
- package/Components/Molecules/PhoneNumberTextFieldCustom/PhoneNumberTextField.d.ts +7 -0
- package/Components/Molecules/PhoneNumberTextFieldCustom/PhoneNumberTextField.js +216 -0
- package/Components/Molecules/PhoneNumberTextFieldCustom/PhoneNumberTextField.js.map +1 -0
- package/Components/Molecules/PhoneNumberTextFieldCustom/PhoneNumberTextField.test.d.ts +1 -0
- package/Components/Molecules/PhoneNumberTextFieldCustom/PhoneNumberTextField.test.js +596 -0
- package/Components/Molecules/PhoneNumberTextFieldCustom/PhoneNumberTextField.test.js.map +1 -0
- package/Components/Molecules/PhoneNumberTextFieldCustom/__helpers__/components/demo/AutofillDemo.d.ts +7 -0
- package/Components/Molecules/PhoneNumberTextFieldCustom/__helpers__/components/demo/AutofillDemo.js +28 -0
- package/Components/Molecules/PhoneNumberTextFieldCustom/__helpers__/components/demo/AutofillDemo.js.map +1 -0
- package/Components/Molecules/PhoneNumberTextFieldCustom/__helpers__/components/display/ErrorDisplay.d.ts +8 -0
- package/Components/Molecules/PhoneNumberTextFieldCustom/__helpers__/components/display/ErrorDisplay.js +17 -0
- package/Components/Molecules/PhoneNumberTextFieldCustom/__helpers__/components/display/ErrorDisplay.js.map +1 -0
- package/Components/Molecules/PhoneNumberTextFieldCustom/__helpers__/components/forms/PhoneInput.d.ts +22 -0
- package/Components/Molecules/PhoneNumberTextFieldCustom/__helpers__/components/forms/PhoneInput.js +56 -0
- package/Components/Molecules/PhoneNumberTextFieldCustom/__helpers__/components/forms/PhoneInput.js.map +1 -0
- package/Components/Molecules/PhoneNumberTextFieldCustom/__helpers__/components/forms/PhoneInput.test.d.ts +1 -0
- package/Components/Molecules/PhoneNumberTextFieldCustom/__helpers__/components/forms/PhoneInput.test.js +159 -0
- package/Components/Molecules/PhoneNumberTextFieldCustom/__helpers__/components/forms/PhoneInput.test.js.map +1 -0
- package/Components/Molecules/PhoneNumberTextFieldCustom/__helpers__/components/ui/CountryDropdown.d.ts +12 -0
- package/Components/Molecules/PhoneNumberTextFieldCustom/__helpers__/components/ui/CountryDropdown.js +206 -0
- package/Components/Molecules/PhoneNumberTextFieldCustom/__helpers__/components/ui/CountryDropdown.js.map +1 -0
- package/Components/Molecules/PhoneNumberTextFieldCustom/__helpers__/components/ui/CountryDropdown.test.d.ts +1 -0
- package/Components/Molecules/PhoneNumberTextFieldCustom/__helpers__/components/ui/CountryDropdown.test.js +187 -0
- package/Components/Molecules/PhoneNumberTextFieldCustom/__helpers__/components/ui/CountryDropdown.test.js.map +1 -0
- package/Components/Molecules/PhoneNumberTextFieldCustom/__helpers__/components/ui/CountryModal.d.ts +10 -0
- package/Components/Molecules/PhoneNumberTextFieldCustom/__helpers__/components/ui/CountryModal.js +229 -0
- package/Components/Molecules/PhoneNumberTextFieldCustom/__helpers__/components/ui/CountryModal.js.map +1 -0
- package/Components/Molecules/PhoneNumberTextFieldCustom/__helpers__/components/ui/CountryModal.test.d.ts +1 -0
- package/Components/Molecules/PhoneNumberTextFieldCustom/__helpers__/components/ui/CountryModal.test.js +281 -0
- package/Components/Molecules/PhoneNumberTextFieldCustom/__helpers__/components/ui/CountryModal.test.js.map +1 -0
- package/Components/Molecules/PhoneNumberTextFieldCustom/__helpers__/components/ui/CountrySelector.d.ts +11 -0
- package/Components/Molecules/PhoneNumberTextFieldCustom/__helpers__/components/ui/CountrySelector.js +34 -0
- package/Components/Molecules/PhoneNumberTextFieldCustom/__helpers__/components/ui/CountrySelector.js.map +1 -0
- package/Components/Molecules/PhoneNumberTextFieldCustom/__helpers__/components/ui/FlagIcon.d.ts +10 -0
- package/Components/Molecules/PhoneNumberTextFieldCustom/__helpers__/components/ui/FlagIcon.js +114 -0
- package/Components/Molecules/PhoneNumberTextFieldCustom/__helpers__/components/ui/FlagIcon.js.map +1 -0
- package/Components/Molecules/PhoneNumberTextFieldCustom/__helpers__/hooks/useAutofillDetection.d.ts +10 -0
- package/Components/Molecules/PhoneNumberTextFieldCustom/__helpers__/hooks/useAutofillDetection.js +105 -0
- package/Components/Molecules/PhoneNumberTextFieldCustom/__helpers__/hooks/useAutofillDetection.js.map +1 -0
- package/Components/Molecules/PhoneNumberTextFieldCustom/__helpers__/hooks/useCountrySelector.d.ts +12 -0
- package/Components/Molecules/PhoneNumberTextFieldCustom/__helpers__/hooks/useCountrySelector.js +36 -0
- package/Components/Molecules/PhoneNumberTextFieldCustom/__helpers__/hooks/useCountrySelector.js.map +1 -0
- package/Components/Molecules/PhoneNumberTextFieldCustom/__helpers__/hooks/usePhoneNumber.d.ts +38 -0
- package/Components/Molecules/PhoneNumberTextFieldCustom/__helpers__/hooks/usePhoneNumber.js +181 -0
- package/Components/Molecules/PhoneNumberTextFieldCustom/__helpers__/hooks/usePhoneNumber.js.map +1 -0
- package/Components/Molecules/PhoneNumberTextFieldCustom/__helpers__/stories/PhoneNumberTextFieldStory.d.ts +21 -0
- package/Components/Molecules/PhoneNumberTextFieldCustom/__helpers__/stories/PhoneNumberTextFieldStory.js +41 -0
- package/Components/Molecules/PhoneNumberTextFieldCustom/__helpers__/stories/PhoneNumberTextFieldStory.js.map +1 -0
- package/Components/Molecules/PhoneNumberTextFieldCustom/__helpers__/styling/makeFormControlPhoneNumberStyling.d.ts +10 -0
- package/Components/Molecules/PhoneNumberTextFieldCustom/__helpers__/styling/makeFormControlPhoneNumberStyling.js +144 -0
- package/Components/Molecules/PhoneNumberTextFieldCustom/__helpers__/styling/makeFormControlPhoneNumberStyling.js.map +1 -0
- package/Components/Molecules/PhoneNumberTextFieldCustom/__helpers__/utils/countryData.d.ts +12 -0
- package/Components/Molecules/PhoneNumberTextFieldCustom/__helpers__/utils/countryData.js +509 -0
- package/Components/Molecules/PhoneNumberTextFieldCustom/__helpers__/utils/countryData.js.map +1 -0
- package/Components/Molecules/PhoneNumberTextFieldCustom/__helpers__/utils/defaultProps.d.ts +21 -0
- package/Components/Molecules/PhoneNumberTextFieldCustom/__helpers__/utils/defaultProps.js +33 -0
- package/Components/Molecules/PhoneNumberTextFieldCustom/__helpers__/utils/defaultProps.js.map +1 -0
- package/Components/Molecules/PhoneNumberTextFieldCustom/__helpers__/utils/phoneValidation.d.ts +15 -0
- package/Components/Molecules/PhoneNumberTextFieldCustom/__helpers__/utils/phoneValidation.js +130 -0
- package/Components/Molecules/PhoneNumberTextFieldCustom/__helpers__/utils/phoneValidation.js.map +1 -0
- package/Components/Molecules/PhoneNumberTextFieldCustom/__helpers__/utils/phoneValidation.test.d.ts +1 -0
- package/Components/Molecules/PhoneNumberTextFieldCustom/__helpers__/utils/phoneValidation.test.js +157 -0
- package/Components/Molecules/PhoneNumberTextFieldCustom/__helpers__/utils/phoneValidation.test.js.map +1 -0
- package/Components/Molecules/PhoneNumberTextFieldCustom/defaultProps.d.ts +21 -0
- package/Components/Molecules/PhoneNumberTextFieldCustom/defaultProps.js +33 -0
- package/Components/Molecules/PhoneNumberTextFieldCustom/defaultProps.js.map +1 -0
- package/Components/Molecules/PhoneNumberTextFieldCustom/index.d.ts +10 -0
- package/Components/Molecules/PhoneNumberTextFieldCustom/index.js +21 -0
- package/Components/Molecules/PhoneNumberTextFieldCustom/index.js.map +1 -0
- package/Components/Molecules/ScrollContainer/ScrollContainer.js +0 -25
- package/Components/Molecules/ScrollContainer/ScrollContainer.js.map +1 -1
- package/Components/Molecules/index.d.ts +1 -0
- package/Components/Molecules/index.js +3 -1
- package/Components/Molecules/index.js.map +1 -1
- package/Components/index.d.ts +1 -1
- package/Components/index.js +2 -1
- package/Components/index.js.map +1 -1
- package/Themes/auroraTheme.js +1 -1
- package/Themes/auroraTheme.js.map +1 -1
- package/index.d.ts +1 -1
- package/index.js +2 -1
- package/index.js.map +1 -1
- package/package.json +3 -1
@@ -0,0 +1,281 @@
|
|
1
|
+
"use strict";
|
2
|
+
var __assign = (this && this.__assign) || function () {
|
3
|
+
__assign = Object.assign || function(t) {
|
4
|
+
for (var s, i = 1, n = arguments.length; i < n; i++) {
|
5
|
+
s = arguments[i];
|
6
|
+
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
|
7
|
+
t[p] = s[p];
|
8
|
+
}
|
9
|
+
return t;
|
10
|
+
};
|
11
|
+
return __assign.apply(this, arguments);
|
12
|
+
};
|
13
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
14
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
15
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
16
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
17
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
18
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
19
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
20
|
+
});
|
21
|
+
};
|
22
|
+
var __generator = (this && this.__generator) || function (thisArg, body) {
|
23
|
+
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === "function" ? Iterator : Object).prototype);
|
24
|
+
return g.next = verb(0), g["throw"] = verb(1), g["return"] = verb(2), typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
25
|
+
function verb(n) { return function (v) { return step([n, v]); }; }
|
26
|
+
function step(op) {
|
27
|
+
if (f) throw new TypeError("Generator is already executing.");
|
28
|
+
while (g && (g = 0, op[0] && (_ = 0)), _) try {
|
29
|
+
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
|
30
|
+
if (y = 0, t) op = [op[0] & 2, t.value];
|
31
|
+
switch (op[0]) {
|
32
|
+
case 0: case 1: t = op; break;
|
33
|
+
case 4: _.label++; return { value: op[1], done: false };
|
34
|
+
case 5: _.label++; y = op[1]; op = [0]; continue;
|
35
|
+
case 7: op = _.ops.pop(); _.trys.pop(); continue;
|
36
|
+
default:
|
37
|
+
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
|
38
|
+
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
|
39
|
+
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
|
40
|
+
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
|
41
|
+
if (t[2]) _.ops.pop();
|
42
|
+
_.trys.pop(); continue;
|
43
|
+
}
|
44
|
+
op = body.call(thisArg, _);
|
45
|
+
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
|
46
|
+
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
47
|
+
}
|
48
|
+
};
|
49
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
50
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
51
|
+
};
|
52
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
53
|
+
var jsx_runtime_1 = require("@emotion/react/jsx-runtime");
|
54
|
+
var react_1 = require("@testing-library/react");
|
55
|
+
var user_event_1 = __importDefault(require("@testing-library/user-event"));
|
56
|
+
var React_1 = require("../../../../../../Helpers/React");
|
57
|
+
var CountryModal_1 = __importDefault(require("./CountryModal"));
|
58
|
+
var countryData_1 = require("../../utils/countryData");
|
59
|
+
// Mock the useTheme hook to provide the required theme structure
|
60
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-return
|
61
|
+
jest.mock('@emotion/react', function () { return (__assign(__assign({}, jest.requireActual('@emotion/react')), { useTheme: function () { return ({
|
62
|
+
mvf: {
|
63
|
+
palette: {
|
64
|
+
background: {
|
65
|
+
answerBackgroundColor: '#ffffff',
|
66
|
+
},
|
67
|
+
},
|
68
|
+
boxShadow: {
|
69
|
+
fierce: '0px 4px 8px rgba(0, 0, 0, 0.1)',
|
70
|
+
},
|
71
|
+
},
|
72
|
+
}); } })); });
|
73
|
+
describe('CountryModal', function () {
|
74
|
+
var mockCountries = (0, countryData_1.getCountryData)();
|
75
|
+
var mockCountry = mockCountries[0];
|
76
|
+
var mockOnCountryChange = jest.fn();
|
77
|
+
var mockOnClose = jest.fn();
|
78
|
+
var defaultProps = {
|
79
|
+
selectedCountry: mockCountry,
|
80
|
+
onCountryChange: mockOnCountryChange,
|
81
|
+
enableCountrySearch: false,
|
82
|
+
open: false,
|
83
|
+
onClose: mockOnClose,
|
84
|
+
};
|
85
|
+
beforeEach(function () {
|
86
|
+
jest.clearAllMocks();
|
87
|
+
});
|
88
|
+
describe('Modal Visibility', function () {
|
89
|
+
it('renders without crashing and does not show modal when closed', function () {
|
90
|
+
(0, React_1.renderWithProviders)((0, jsx_runtime_1.jsx)(CountryModal_1.default, __assign({}, defaultProps)));
|
91
|
+
// Modal should not be visible when open is false
|
92
|
+
expect(react_1.screen.queryByText('Select Country')).not.toBeInTheDocument();
|
93
|
+
});
|
94
|
+
it('renders modal content when open is true', function () {
|
95
|
+
(0, React_1.renderWithProviders)((0, jsx_runtime_1.jsx)(CountryModal_1.default, __assign({}, defaultProps, { open: true })));
|
96
|
+
expect(react_1.screen.getByText('Select Country')).toBeInTheDocument();
|
97
|
+
// Check for modal container instead of dialog role
|
98
|
+
expect(react_1.screen.getByText('Select Country').closest('[role="presentation"]')).toBeInTheDocument();
|
99
|
+
});
|
100
|
+
it('displays close button and can close modal', function () { return __awaiter(void 0, void 0, void 0, function () {
|
101
|
+
var closeButton;
|
102
|
+
return __generator(this, function (_a) {
|
103
|
+
switch (_a.label) {
|
104
|
+
case 0:
|
105
|
+
(0, React_1.renderWithProviders)((0, jsx_runtime_1.jsx)(CountryModal_1.default, __assign({}, defaultProps, { open: true })));
|
106
|
+
closeButton = react_1.screen.getByRole('button', { name: /close/i });
|
107
|
+
expect(closeButton).toBeInTheDocument();
|
108
|
+
react_1.fireEvent.click(closeButton);
|
109
|
+
// Note: Due to the timeout in the component, we need to wait
|
110
|
+
return [4 /*yield*/, (0, react_1.waitFor)(function () {
|
111
|
+
expect(mockOnClose).toHaveBeenCalledTimes(1);
|
112
|
+
}, { timeout: 300 })];
|
113
|
+
case 1:
|
114
|
+
// Note: Due to the timeout in the component, we need to wait
|
115
|
+
_a.sent();
|
116
|
+
return [2 /*return*/];
|
117
|
+
}
|
118
|
+
});
|
119
|
+
}); });
|
120
|
+
});
|
121
|
+
describe('Country Search', function () {
|
122
|
+
it('does not render search input when enableCountrySearch is false', function () {
|
123
|
+
(0, React_1.renderWithProviders)((0, jsx_runtime_1.jsx)(CountryModal_1.default, __assign({}, defaultProps, { open: true, enableCountrySearch: false })));
|
124
|
+
expect(react_1.screen.queryByPlaceholderText('Search countries...')).not.toBeInTheDocument();
|
125
|
+
});
|
126
|
+
it('renders search input when enableCountrySearch is true', function () {
|
127
|
+
(0, React_1.renderWithProviders)((0, jsx_runtime_1.jsx)(CountryModal_1.default, __assign({}, defaultProps, { open: true, enableCountrySearch: true })));
|
128
|
+
expect(react_1.screen.getByPlaceholderText('Search countries...')).toBeInTheDocument();
|
129
|
+
});
|
130
|
+
it('filters countries based on search term', function () {
|
131
|
+
(0, React_1.renderWithProviders)((0, jsx_runtime_1.jsx)(CountryModal_1.default, __assign({}, defaultProps, { open: true, enableCountrySearch: true })));
|
132
|
+
var searchInput = react_1.screen.getByPlaceholderText('Search countries...');
|
133
|
+
// Search for a specific country (assuming United States exists)
|
134
|
+
user_event_1.default.type(searchInput, 'United States');
|
135
|
+
// Should show filtered results
|
136
|
+
expect(react_1.screen.getByText('United States')).toBeInTheDocument();
|
137
|
+
// Should not show all countries anymore
|
138
|
+
var countryItems = react_1.screen.getAllByRole('option');
|
139
|
+
expect(countryItems.length).toBeLessThan(mockCountries.length);
|
140
|
+
});
|
141
|
+
it('shows "No countries found" when search yields no results', function () {
|
142
|
+
(0, React_1.renderWithProviders)((0, jsx_runtime_1.jsx)(CountryModal_1.default, __assign({}, defaultProps, { open: true, enableCountrySearch: true })));
|
143
|
+
var searchInput = react_1.screen.getByPlaceholderText('Search countries...');
|
144
|
+
// Search for something that doesn't exist
|
145
|
+
user_event_1.default.type(searchInput, 'NonexistentCountry');
|
146
|
+
expect(react_1.screen.getByText('No countries found')).toBeInTheDocument();
|
147
|
+
});
|
148
|
+
it('filters countries by dial code', function () {
|
149
|
+
(0, React_1.renderWithProviders)((0, jsx_runtime_1.jsx)(CountryModal_1.default, __assign({}, defaultProps, { open: true, enableCountrySearch: true })));
|
150
|
+
var searchInput = react_1.screen.getByPlaceholderText('Search countries...');
|
151
|
+
// Search for +1 (should find US, Canada, etc.)
|
152
|
+
user_event_1.default.type(searchInput, '+1');
|
153
|
+
// Should show filtered results
|
154
|
+
var countryItems = react_1.screen.getAllByRole('option');
|
155
|
+
expect(countryItems.length).toBeGreaterThan(0);
|
156
|
+
expect(countryItems.length).toBeLessThan(mockCountries.length);
|
157
|
+
});
|
158
|
+
});
|
159
|
+
describe('Country List and Selection', function () {
|
160
|
+
it('displays country list when open', function () {
|
161
|
+
(0, React_1.renderWithProviders)((0, jsx_runtime_1.jsx)(CountryModal_1.default, __assign({}, defaultProps, { open: true })));
|
162
|
+
// Should show at least the first few countries
|
163
|
+
expect(react_1.screen.getByText(mockCountries[0].name)).toBeInTheDocument();
|
164
|
+
expect(react_1.screen.getByText(mockCountries[1].name)).toBeInTheDocument();
|
165
|
+
// Should show country list container
|
166
|
+
expect(react_1.screen.getByRole('listbox', { name: /country list/i })).toBeInTheDocument();
|
167
|
+
});
|
168
|
+
it('calls onCountryChange when a country is selected', function () { return __awaiter(void 0, void 0, void 0, function () {
|
169
|
+
var countryToSelect, countryOption;
|
170
|
+
return __generator(this, function (_a) {
|
171
|
+
switch (_a.label) {
|
172
|
+
case 0:
|
173
|
+
(0, React_1.renderWithProviders)((0, jsx_runtime_1.jsx)(CountryModal_1.default, __assign({}, defaultProps, { open: true })));
|
174
|
+
countryToSelect = mockCountries.find(function (c) { return c.name !== mockCountry.name; });
|
175
|
+
expect(countryToSelect).toBeDefined();
|
176
|
+
countryOption = react_1.screen.getByRole('option', {
|
177
|
+
name: new RegExp((countryToSelect === null || countryToSelect === void 0 ? void 0 : countryToSelect.name) || ''),
|
178
|
+
});
|
179
|
+
react_1.fireEvent.click(countryOption);
|
180
|
+
expect(mockOnCountryChange).toHaveBeenCalledWith(countryToSelect);
|
181
|
+
// Should also trigger close after timeout
|
182
|
+
return [4 /*yield*/, (0, react_1.waitFor)(function () {
|
183
|
+
expect(mockOnClose).toHaveBeenCalledTimes(1);
|
184
|
+
}, { timeout: 300 })];
|
185
|
+
case 1:
|
186
|
+
// Should also trigger close after timeout
|
187
|
+
_a.sent();
|
188
|
+
return [2 /*return*/];
|
189
|
+
}
|
190
|
+
});
|
191
|
+
}); });
|
192
|
+
it('displays country flags and dial codes', function () {
|
193
|
+
(0, React_1.renderWithProviders)((0, jsx_runtime_1.jsx)(CountryModal_1.default, __assign({}, defaultProps, { open: true })));
|
194
|
+
// Check that dial codes are displayed (use getAllByText since some dial codes might be duplicated)
|
195
|
+
var firstDialCode = react_1.screen.getAllByText(mockCountries[0].dialCode);
|
196
|
+
var secondDialCode = react_1.screen.getAllByText(mockCountries[1].dialCode);
|
197
|
+
expect(firstDialCode.length).toBeGreaterThan(0);
|
198
|
+
expect(secondDialCode.length).toBeGreaterThan(0);
|
199
|
+
});
|
200
|
+
});
|
201
|
+
describe('Keyboard Navigation', function () {
|
202
|
+
it('closes modal when Escape key is pressed', function () { return __awaiter(void 0, void 0, void 0, function () {
|
203
|
+
var searchInput;
|
204
|
+
return __generator(this, function (_a) {
|
205
|
+
switch (_a.label) {
|
206
|
+
case 0:
|
207
|
+
(0, React_1.renderWithProviders)((0, jsx_runtime_1.jsx)(CountryModal_1.default, __assign({}, defaultProps, { open: true, enableCountrySearch: true })));
|
208
|
+
searchInput = react_1.screen.getByPlaceholderText('Search countries...');
|
209
|
+
react_1.fireEvent.keyDown(searchInput, { key: 'Escape' });
|
210
|
+
return [4 /*yield*/, (0, react_1.waitFor)(function () {
|
211
|
+
expect(mockOnClose).toHaveBeenCalledTimes(1);
|
212
|
+
}, { timeout: 300 })];
|
213
|
+
case 1:
|
214
|
+
_a.sent();
|
215
|
+
return [2 /*return*/];
|
216
|
+
}
|
217
|
+
});
|
218
|
+
}); });
|
219
|
+
it('navigates countries with arrow keys when search is enabled', function () {
|
220
|
+
(0, React_1.renderWithProviders)((0, jsx_runtime_1.jsx)(CountryModal_1.default, __assign({}, defaultProps, { open: true, enableCountrySearch: true })));
|
221
|
+
var searchInput = react_1.screen.getByPlaceholderText('Search countries...');
|
222
|
+
// Simulate arrow down navigation
|
223
|
+
react_1.fireEvent.keyDown(searchInput, { key: 'ArrowDown' });
|
224
|
+
react_1.fireEvent.keyDown(searchInput, { key: 'ArrowDown' });
|
225
|
+
// Should highlight second item (index 1)
|
226
|
+
var secondCountryOption = react_1.screen.getByRole('option', {
|
227
|
+
name: new RegExp(mockCountries[1].name),
|
228
|
+
});
|
229
|
+
expect(secondCountryOption).toHaveAttribute('aria-selected', 'true');
|
230
|
+
});
|
231
|
+
it('selects highlighted country with Enter key', function () { return __awaiter(void 0, void 0, void 0, function () {
|
232
|
+
var searchInput;
|
233
|
+
return __generator(this, function (_a) {
|
234
|
+
switch (_a.label) {
|
235
|
+
case 0:
|
236
|
+
(0, React_1.renderWithProviders)((0, jsx_runtime_1.jsx)(CountryModal_1.default, __assign({}, defaultProps, { open: true, enableCountrySearch: true })));
|
237
|
+
searchInput = react_1.screen.getByPlaceholderText('Search countries...');
|
238
|
+
// Navigate to first country and select it
|
239
|
+
react_1.fireEvent.keyDown(searchInput, { key: 'ArrowDown' });
|
240
|
+
react_1.fireEvent.keyDown(searchInput, { key: 'Enter' });
|
241
|
+
expect(mockOnCountryChange).toHaveBeenCalledWith(mockCountries[0]);
|
242
|
+
return [4 /*yield*/, (0, react_1.waitFor)(function () {
|
243
|
+
expect(mockOnClose).toHaveBeenCalledTimes(1);
|
244
|
+
}, { timeout: 300 })];
|
245
|
+
case 1:
|
246
|
+
_a.sent();
|
247
|
+
return [2 /*return*/];
|
248
|
+
}
|
249
|
+
});
|
250
|
+
}); });
|
251
|
+
});
|
252
|
+
describe('Accessibility', function () {
|
253
|
+
it('has proper ARIA labels and roles', function () {
|
254
|
+
(0, React_1.renderWithProviders)((0, jsx_runtime_1.jsx)(CountryModal_1.default, __assign({}, defaultProps, { open: true, enableCountrySearch: true })));
|
255
|
+
// Modal should have proper ARIA attributes on the presentation container
|
256
|
+
var modal = react_1.screen.getByRole('presentation');
|
257
|
+
expect(modal).toHaveAttribute('aria-labelledby', 'country-selection-modal');
|
258
|
+
expect(modal).toHaveAttribute('aria-describedby', 'country-selection-modal-description');
|
259
|
+
// Search input should have proper label
|
260
|
+
expect(react_1.screen.getByLabelText('Search countries')).toBeInTheDocument();
|
261
|
+
// Country list should have proper role
|
262
|
+
expect(react_1.screen.getByRole('listbox', { name: /country list/i })).toBeInTheDocument();
|
263
|
+
// Country options should have proper roles
|
264
|
+
var countryOptions = react_1.screen.getAllByRole('option');
|
265
|
+
expect(countryOptions.length).toBeGreaterThan(0);
|
266
|
+
});
|
267
|
+
it('renders search input and can be focused when modal opens with search enabled', function () { return __awaiter(void 0, void 0, void 0, function () {
|
268
|
+
var searchInput;
|
269
|
+
return __generator(this, function (_a) {
|
270
|
+
(0, React_1.renderWithProviders)((0, jsx_runtime_1.jsx)(CountryModal_1.default, __assign({}, defaultProps, { open: true, enableCountrySearch: true })));
|
271
|
+
searchInput = react_1.screen.getByPlaceholderText('Search countries...');
|
272
|
+
expect(searchInput).toBeInTheDocument();
|
273
|
+
// Focus the input manually to verify it's focusable
|
274
|
+
searchInput.focus();
|
275
|
+
expect(searchInput).toHaveFocus();
|
276
|
+
return [2 /*return*/];
|
277
|
+
});
|
278
|
+
}); });
|
279
|
+
});
|
280
|
+
});
|
281
|
+
//# sourceMappingURL=CountryModal.test.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"CountryModal.test.js","sourceRoot":"","sources":["../../../../../../../src/Components/Molecules/PhoneNumberTextFieldCustom/__helpers__/components/ui/CountryModal.test.tsx"],"names":[],"mappings":"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"}
|
@@ -0,0 +1,11 @@
|
|
1
|
+
import { CountryData } from '../../utils/countryData';
|
2
|
+
export interface CountrySelectorProps {
|
3
|
+
selectedCountry: CountryData;
|
4
|
+
enableCountryChange?: boolean;
|
5
|
+
isCountryMenuOpen?: boolean;
|
6
|
+
disabled?: boolean;
|
7
|
+
onClick?: () => void;
|
8
|
+
onKeyDown?: (event: React.KeyboardEvent<HTMLDivElement>) => void;
|
9
|
+
}
|
10
|
+
declare const CountrySelector: import("react").ForwardRefExoticComponent<CountrySelectorProps & import("react").RefAttributes<HTMLDivElement>>;
|
11
|
+
export default CountrySelector;
|
package/Components/Molecules/PhoneNumberTextFieldCustom/__helpers__/components/ui/CountrySelector.js
ADDED
@@ -0,0 +1,34 @@
|
|
1
|
+
"use strict";
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
4
|
+
};
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
6
|
+
var jsx_runtime_1 = require("@emotion/react/jsx-runtime");
|
7
|
+
/** @jsxImportSource @emotion/react */
|
8
|
+
var ExpandMore_1 = __importDefault(require("@mui/icons-material/ExpandMore"));
|
9
|
+
var react_1 = require("react");
|
10
|
+
var FlagIcon_1 = __importDefault(require("./FlagIcon"));
|
11
|
+
var CountrySelector = (0, react_1.forwardRef)(function (_a, ref) {
|
12
|
+
var selectedCountry = _a.selectedCountry, _b = _a.enableCountryChange, enableCountryChange = _b === void 0 ? false : _b, _c = _a.isCountryMenuOpen, isCountryMenuOpen = _c === void 0 ? false : _c, _d = _a.disabled, disabled = _d === void 0 ? false : _d, onClick = _a.onClick, onKeyDown = _a.onKeyDown;
|
13
|
+
// If disabled, we should not allow country changes
|
14
|
+
var isInteractive = enableCountryChange && !disabled;
|
15
|
+
return ((0, jsx_runtime_1.jsxs)("div", { ref: ref, className: "country-selector", onClick: isInteractive ? onClick : undefined, style: {
|
16
|
+
display: 'flex',
|
17
|
+
alignItems: 'center',
|
18
|
+
cursor: isInteractive ? 'pointer' : 'default',
|
19
|
+
minWidth: '40px',
|
20
|
+
justifyContent: 'center',
|
21
|
+
opacity: disabled ? 0.6 : 1,
|
22
|
+
}, role: isInteractive ? 'button' : undefined, tabIndex: isInteractive ? 0 : undefined, "aria-label": isInteractive
|
23
|
+
? "Select country, currently ".concat(selectedCountry.name)
|
24
|
+
: "Country: ".concat(selectedCountry.name), "aria-haspopup": isInteractive ? 'listbox' : undefined, "aria-expanded": isInteractive ? isCountryMenuOpen : undefined, "aria-controls": isInteractive ? 'country-selector-listbox' : undefined, onKeyDown: isInteractive ? onKeyDown : undefined, children: [(0, jsx_runtime_1.jsx)(FlagIcon_1.default, { countryCode: selectedCountry.code }), isInteractive && ((0, jsx_runtime_1.jsx)(ExpandMore_1.default, { style: {
|
25
|
+
fontSize: '16px',
|
26
|
+
color: 'rgba(0, 0, 0, 1)',
|
27
|
+
marginLeft: '4px',
|
28
|
+
transform: isCountryMenuOpen ? 'rotate(180deg)' : 'rotate(0deg)',
|
29
|
+
transition: 'transform 0.1s ease-in-out',
|
30
|
+
} }))] }));
|
31
|
+
});
|
32
|
+
CountrySelector.displayName = 'CountrySelector';
|
33
|
+
exports.default = CountrySelector;
|
34
|
+
//# sourceMappingURL=CountrySelector.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"CountrySelector.js","sourceRoot":"","sources":["../../../../../../../src/Components/Molecules/PhoneNumberTextFieldCustom/__helpers__/components/ui/CountrySelector.tsx"],"names":[],"mappings":";;;;;;AAAA,sCAAsC;AACtC,8EAAwD;AACxD,+BAAmC;AAEnC,wDAAkC;AAWlC,IAAM,eAAe,GAAG,IAAA,kBAAU,EAChC,UACE,EAOC,EACD,GAAG;QAPD,eAAe,qBAAA,EACf,2BAA2B,EAA3B,mBAAmB,mBAAG,KAAK,KAAA,EAC3B,yBAAyB,EAAzB,iBAAiB,mBAAG,KAAK,KAAA,EACzB,gBAAgB,EAAhB,QAAQ,mBAAG,KAAK,KAAA,EAChB,OAAO,aAAA,EACP,SAAS,eAAA;IAIX,mDAAmD;IACnD,IAAM,aAAa,GAAG,mBAAmB,IAAI,CAAC,QAAQ,CAAC;IAEvD,OAAO,CACL,iCACE,GAAG,EAAE,GAAG,EACR,SAAS,EAAC,kBAAkB,EAC5B,OAAO,EAAE,aAAa,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,EAC5C,KAAK,EAAE;YACL,OAAO,EAAE,MAAM;YACf,UAAU,EAAE,QAAQ;YACpB,MAAM,EAAE,aAAa,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS;YAC7C,QAAQ,EAAE,MAAM;YAChB,cAAc,EAAE,QAAQ;YACxB,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;SAC5B,EACD,IAAI,EAAE,aAAa,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,EAC1C,QAAQ,EAAE,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,gBAErC,aAAa;YACX,CAAC,CAAC,oCAA6B,eAAe,CAAC,IAAI,CAAE;YACrD,CAAC,CAAC,mBAAY,eAAe,CAAC,IAAI,CAAE,mBAEzB,aAAa,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,mBACrC,aAAa,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,SAAS,mBAC7C,aAAa,CAAC,CAAC,CAAC,0BAA0B,CAAC,CAAC,CAAC,SAAS,EACrE,SAAS,EAAE,aAAa,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,aAEhD,uBAAC,kBAAQ,IAAC,WAAW,EAAE,eAAe,CAAC,IAAI,GAAI,EAC9C,aAAa,IAAI,CAChB,uBAAC,oBAAU,IACT,KAAK,EAAE;oBACL,QAAQ,EAAE,MAAM;oBAChB,KAAK,EAAE,kBAAkB;oBACzB,UAAU,EAAE,KAAK;oBACjB,SAAS,EAAE,iBAAiB,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,cAAc;oBAChE,UAAU,EAAE,4BAA4B;iBACzC,GACD,CACH,IACG,CACP,CAAC;AACJ,CAAC,CACF,CAAC;AAEF,eAAe,CAAC,WAAW,GAAG,iBAAiB,CAAC;AAEhD,kBAAe,eAAe,CAAC"}
|
package/Components/Molecules/PhoneNumberTextFieldCustom/__helpers__/components/ui/FlagIcon.d.ts
ADDED
@@ -0,0 +1,10 @@
|
|
1
|
+
/** @jsxImportSource @emotion/react */
|
2
|
+
import React from 'react';
|
3
|
+
import { CountryCode } from '../../utils/countryData';
|
4
|
+
interface FlagIconProps {
|
5
|
+
countryCode: CountryCode;
|
6
|
+
style?: React.CSSProperties;
|
7
|
+
className?: string;
|
8
|
+
}
|
9
|
+
declare const FlagIcon: React.FC<FlagIconProps>;
|
10
|
+
export default FlagIcon;
|
@@ -0,0 +1,114 @@
|
|
1
|
+
"use strict";
|
2
|
+
var __assign = (this && this.__assign) || function () {
|
3
|
+
__assign = Object.assign || function(t) {
|
4
|
+
for (var s, i = 1, n = arguments.length; i < n; i++) {
|
5
|
+
s = arguments[i];
|
6
|
+
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
|
7
|
+
t[p] = s[p];
|
8
|
+
}
|
9
|
+
return t;
|
10
|
+
};
|
11
|
+
return __assign.apply(this, arguments);
|
12
|
+
};
|
13
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
14
|
+
if (k2 === undefined) k2 = k;
|
15
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
16
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
17
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
18
|
+
}
|
19
|
+
Object.defineProperty(o, k2, desc);
|
20
|
+
}) : (function(o, m, k, k2) {
|
21
|
+
if (k2 === undefined) k2 = k;
|
22
|
+
o[k2] = m[k];
|
23
|
+
}));
|
24
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
25
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
26
|
+
}) : function(o, v) {
|
27
|
+
o["default"] = v;
|
28
|
+
});
|
29
|
+
var __importStar = (this && this.__importStar) || (function () {
|
30
|
+
var ownKeys = function(o) {
|
31
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
32
|
+
var ar = [];
|
33
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
34
|
+
return ar;
|
35
|
+
};
|
36
|
+
return ownKeys(o);
|
37
|
+
};
|
38
|
+
return function (mod) {
|
39
|
+
if (mod && mod.__esModule) return mod;
|
40
|
+
var result = {};
|
41
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
42
|
+
__setModuleDefault(result, mod);
|
43
|
+
return result;
|
44
|
+
};
|
45
|
+
})();
|
46
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
47
|
+
var jsx_runtime_1 = require("@emotion/react/jsx-runtime");
|
48
|
+
/** @jsxImportSource @emotion/react */
|
49
|
+
var react_1 = __importStar(require("react"));
|
50
|
+
// Global flag to track if CSS has been loaded
|
51
|
+
var flagIconsCssLoaded = false;
|
52
|
+
// Function to lazy load the flag-icons CSS
|
53
|
+
var loadFlagIconsCSS = function () {
|
54
|
+
return new Promise(function (resolve) {
|
55
|
+
// Check if already loaded
|
56
|
+
if (flagIconsCssLoaded) {
|
57
|
+
resolve();
|
58
|
+
return;
|
59
|
+
}
|
60
|
+
// Check if link already exists in DOM
|
61
|
+
var existingLink = document.querySelector('link[href*="flag-icons"]');
|
62
|
+
if (existingLink) {
|
63
|
+
flagIconsCssLoaded = true;
|
64
|
+
resolve();
|
65
|
+
return;
|
66
|
+
}
|
67
|
+
// Create and append the CSS link
|
68
|
+
var link = document.createElement('link');
|
69
|
+
link.rel = 'stylesheet';
|
70
|
+
link.href =
|
71
|
+
'https://cdn.jsdelivr.net/gh/lipis/flag-icons@7.5.0/css/flag-icons.min.css';
|
72
|
+
link.onload = function () {
|
73
|
+
flagIconsCssLoaded = true;
|
74
|
+
resolve();
|
75
|
+
};
|
76
|
+
link.onerror = function () {
|
77
|
+
console.warn('Failed to load flag-icons CSS, falling back to text representation');
|
78
|
+
flagIconsCssLoaded = true; // Prevent retries
|
79
|
+
resolve();
|
80
|
+
};
|
81
|
+
document.head.appendChild(link);
|
82
|
+
});
|
83
|
+
};
|
84
|
+
var FlagIcon = react_1.default.memo(function (_a) {
|
85
|
+
var countryCode = _a.countryCode, style = _a.style, _b = _a.className, className = _b === void 0 ? '' : _b;
|
86
|
+
var _c = (0, react_1.useState)(flagIconsCssLoaded), cssLoaded = _c[0], setCssLoaded = _c[1];
|
87
|
+
(0, react_1.useEffect)(function () {
|
88
|
+
var mounted = true;
|
89
|
+
if (!cssLoaded && !flagIconsCssLoaded) {
|
90
|
+
void loadFlagIconsCSS().then(function () {
|
91
|
+
if (mounted) {
|
92
|
+
setCssLoaded(true);
|
93
|
+
}
|
94
|
+
});
|
95
|
+
}
|
96
|
+
else if (flagIconsCssLoaded && !cssLoaded) {
|
97
|
+
// If CSS was loaded globally but state doesn't reflect it
|
98
|
+
setCssLoaded(true);
|
99
|
+
}
|
100
|
+
return function () {
|
101
|
+
mounted = false;
|
102
|
+
};
|
103
|
+
}, [cssLoaded]);
|
104
|
+
// Convert country code to lowercase for flag-icons
|
105
|
+
var flagClass = "fi fi-".concat(countryCode.toLowerCase());
|
106
|
+
// Show fallback while CSS is loading
|
107
|
+
if (!cssLoaded) {
|
108
|
+
return ((0, jsx_runtime_1.jsx)("span", { className: className, style: __assign({ fontSize: '16px', lineHeight: 1, display: 'inline-block', width: '20px', height: '15px', backgroundColor: '#f0f0f0', border: '1px solid #ccc', borderRadius: '2px', textAlign: 'center' }, style), "aria-label": "".concat(countryCode, " flag (loading)"), title: "Loading flag..." }));
|
109
|
+
}
|
110
|
+
return ((0, jsx_runtime_1.jsx)("span", { className: "".concat(flagClass, " ").concat(className), style: __assign({ fontSize: '16px', lineHeight: 1, display: 'inline-block', width: '20px', height: '15px' }, style), "aria-label": "".concat(countryCode, " flag") }));
|
111
|
+
});
|
112
|
+
FlagIcon.displayName = 'FlagIcon';
|
113
|
+
exports.default = FlagIcon;
|
114
|
+
//# sourceMappingURL=FlagIcon.js.map
|
package/Components/Molecules/PhoneNumberTextFieldCustom/__helpers__/components/ui/FlagIcon.js.map
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"FlagIcon.js","sourceRoot":"","sources":["../../../../../../../src/Components/Molecules/PhoneNumberTextFieldCustom/__helpers__/components/ui/FlagIcon.tsx"],"names":[],"mappings":"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"}
|
package/Components/Molecules/PhoneNumberTextFieldCustom/__helpers__/hooks/useAutofillDetection.d.ts
ADDED
@@ -0,0 +1,10 @@
|
|
1
|
+
interface UseAutofillDetectionReturn {
|
2
|
+
isAutoFilledActive: boolean;
|
3
|
+
inputRef: React.RefObject<HTMLInputElement>;
|
4
|
+
}
|
5
|
+
/**
|
6
|
+
* Hook to automatically detect when a browser autofills an input field
|
7
|
+
* This solves the issue where the parent component needs to manually track autofill state
|
8
|
+
*/
|
9
|
+
export declare const useAutofillDetection: () => UseAutofillDetectionReturn;
|
10
|
+
export {};
|
package/Components/Molecules/PhoneNumberTextFieldCustom/__helpers__/hooks/useAutofillDetection.js
ADDED
@@ -0,0 +1,105 @@
|
|
1
|
+
"use strict";
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
+
exports.useAutofillDetection = void 0;
|
4
|
+
var react_1 = require("react");
|
5
|
+
/**
|
6
|
+
* Hook to automatically detect when a browser autofills an input field
|
7
|
+
* This solves the issue where the parent component needs to manually track autofill state
|
8
|
+
*/
|
9
|
+
var useAutofillDetection = function () {
|
10
|
+
var _a = (0, react_1.useState)(false), isAutoFilledActive = _a[0], setIsAutoFilledActive = _a[1];
|
11
|
+
var inputRef = (0, react_1.useRef)(null);
|
12
|
+
var animationRef = (0, react_1.useRef)();
|
13
|
+
(0, react_1.useEffect)(function () {
|
14
|
+
var input = inputRef.current;
|
15
|
+
if (!input)
|
16
|
+
return;
|
17
|
+
var checkAutofill = function () {
|
18
|
+
// Method 1: Check if the input has the -webkit-autofill pseudo-class
|
19
|
+
var computedStyle = window.getComputedStyle(input);
|
20
|
+
var backgroundColor = computedStyle.backgroundColor;
|
21
|
+
// Method 2: Check if the input has been filled by autofill
|
22
|
+
// Autofilled inputs often have a specific background color
|
23
|
+
var isAutofilled = backgroundColor === 'rgb(250, 255, 189)' || // Safari autofill color
|
24
|
+
backgroundColor === 'rgb(232, 240, 254)' || // Chrome autofill color
|
25
|
+
backgroundColor === 'rgb(255, 255, 255)' || // Some browsers use white
|
26
|
+
backgroundColor === 'rgb(0, 0, 0)'; // Some browsers use black
|
27
|
+
// Method 3: Check for autofill attributes
|
28
|
+
var hasAutofillAttribute = input.matches(':-webkit-autofill') ||
|
29
|
+
input.hasAttribute('data-autofilled') ||
|
30
|
+
input.classList.contains('autofilled');
|
31
|
+
if (isAutofilled || hasAutofillAttribute) {
|
32
|
+
setIsAutoFilledActive(true);
|
33
|
+
}
|
34
|
+
else {
|
35
|
+
setIsAutoFilledActive(false);
|
36
|
+
}
|
37
|
+
};
|
38
|
+
// Check immediately
|
39
|
+
checkAutofill();
|
40
|
+
// Set up a mutation observer to watch for autofill changes
|
41
|
+
var observer = new MutationObserver(function (mutations) {
|
42
|
+
mutations.forEach(function (mutation) {
|
43
|
+
if (mutation.type === 'attributes' || mutation.type === 'childList') {
|
44
|
+
checkAutofill();
|
45
|
+
}
|
46
|
+
});
|
47
|
+
});
|
48
|
+
// Observe the input element and its parent for changes
|
49
|
+
observer.observe(input, {
|
50
|
+
attributes: true,
|
51
|
+
attributeFilter: ['style', 'class'],
|
52
|
+
childList: true,
|
53
|
+
subtree: true,
|
54
|
+
});
|
55
|
+
// Also observe the parent form for autofill events
|
56
|
+
var form = input.closest('form');
|
57
|
+
if (form) {
|
58
|
+
observer.observe(form, {
|
59
|
+
attributes: true,
|
60
|
+
childList: true,
|
61
|
+
subtree: true,
|
62
|
+
});
|
63
|
+
}
|
64
|
+
// Set up periodic checking as a fallback
|
65
|
+
var startPeriodicCheck = function () {
|
66
|
+
animationRef.current = requestAnimationFrame(function () {
|
67
|
+
checkAutofill();
|
68
|
+
startPeriodicCheck();
|
69
|
+
});
|
70
|
+
};
|
71
|
+
startPeriodicCheck();
|
72
|
+
// Cleanup
|
73
|
+
return function () {
|
74
|
+
observer.disconnect();
|
75
|
+
if (animationRef.current) {
|
76
|
+
cancelAnimationFrame(animationRef.current);
|
77
|
+
}
|
78
|
+
};
|
79
|
+
}, []);
|
80
|
+
// Additional effect to handle autofill events
|
81
|
+
(0, react_1.useEffect)(function () {
|
82
|
+
var input = inputRef.current;
|
83
|
+
if (!input)
|
84
|
+
return;
|
85
|
+
var handleAnimationStart = function (e) {
|
86
|
+
if (e.animationName === 'onAutoFillStart') {
|
87
|
+
setIsAutoFilledActive(true);
|
88
|
+
}
|
89
|
+
};
|
90
|
+
var handleAnimationEnd = function (e) {
|
91
|
+
if (e.animationName === 'onAutoFillCancel') {
|
92
|
+
setIsAutoFilledActive(false);
|
93
|
+
}
|
94
|
+
};
|
95
|
+
input.addEventListener('animationstart', handleAnimationStart);
|
96
|
+
input.addEventListener('animationend', handleAnimationEnd);
|
97
|
+
return function () {
|
98
|
+
input.removeEventListener('animationstart', handleAnimationStart);
|
99
|
+
input.removeEventListener('animationend', handleAnimationEnd);
|
100
|
+
};
|
101
|
+
}, []);
|
102
|
+
return { isAutoFilledActive: isAutoFilledActive, inputRef: inputRef };
|
103
|
+
};
|
104
|
+
exports.useAutofillDetection = useAutofillDetection;
|
105
|
+
//# sourceMappingURL=useAutofillDetection.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"useAutofillDetection.js","sourceRoot":"","sources":["../../../../../../src/Components/Molecules/PhoneNumberTextFieldCustom/__helpers__/hooks/useAutofillDetection.ts"],"names":[],"mappings":"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"}
|
package/Components/Molecules/PhoneNumberTextFieldCustom/__helpers__/hooks/useCountrySelector.d.ts
ADDED
@@ -0,0 +1,12 @@
|
|
1
|
+
export interface UseCountrySelectorOptions {
|
2
|
+
enableCountryChange?: boolean;
|
3
|
+
disabled?: boolean;
|
4
|
+
}
|
5
|
+
export interface UseCountrySelectorReturn {
|
6
|
+
isCountryMenuOpen: boolean;
|
7
|
+
openCountryMenu: () => void;
|
8
|
+
closeCountryMenu: () => void;
|
9
|
+
handleCountrySelectClick: () => void;
|
10
|
+
handleKeyDown: (e: React.KeyboardEvent) => void;
|
11
|
+
}
|
12
|
+
export declare const useCountrySelector: ({ enableCountryChange, disabled, }?: UseCountrySelectorOptions) => UseCountrySelectorReturn;
|