datakeen-session-react 1.1.140-dev.59 → 1.1.140-dev.60
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/dist/cjs/components/session/UserInputForm/CustomFormFields.js +7 -19
- package/dist/cjs/components/session/UserInputForm/CustomFormFields.js.map +1 -1
- package/dist/cjs/components/session/UserInputForm/DatePickerField.js +172 -0
- package/dist/cjs/components/session/UserInputForm/DatePickerField.js.map +1 -0
- package/dist/cjs/components/start-flow/CGU.js +3 -0
- package/dist/cjs/components/start-flow/CGU.js.map +1 -1
- package/dist/cjs/components/start-flow/Start.js +3 -0
- package/dist/cjs/components/start-flow/Start.js.map +1 -1
- package/dist/cjs/index.css.js +1 -1
- package/dist/cjs/node_modules/date-fns/locale/_lib/buildFormatLongFn.js +13 -0
- package/dist/cjs/node_modules/date-fns/locale/_lib/buildFormatLongFn.js.map +1 -0
- package/dist/cjs/node_modules/date-fns/locale/_lib/buildLocalizeFn.js +67 -0
- package/dist/cjs/node_modules/date-fns/locale/_lib/buildLocalizeFn.js.map +1 -0
- package/dist/cjs/node_modules/date-fns/locale/_lib/buildMatchFn.js +62 -0
- package/dist/cjs/node_modules/date-fns/locale/_lib/buildMatchFn.js.map +1 -0
- package/dist/cjs/node_modules/date-fns/locale/_lib/buildMatchPatternFn.js +25 -0
- package/dist/cjs/node_modules/date-fns/locale/_lib/buildMatchPatternFn.js.map +1 -0
- package/dist/cjs/node_modules/date-fns/locale/en-US/_lib/formatDistance.js +106 -0
- package/dist/cjs/node_modules/date-fns/locale/en-US/_lib/formatDistance.js.map +1 -0
- package/dist/cjs/node_modules/date-fns/locale/en-US/_lib/formatLong.js +44 -0
- package/dist/cjs/node_modules/date-fns/locale/en-US/_lib/formatLong.js.map +1 -0
- package/dist/cjs/node_modules/date-fns/locale/en-US/_lib/formatRelative.js +16 -0
- package/dist/cjs/node_modules/date-fns/locale/en-US/_lib/formatRelative.js.map +1 -0
- package/dist/cjs/node_modules/date-fns/locale/en-US/_lib/localize.js +192 -0
- package/dist/cjs/node_modules/date-fns/locale/en-US/_lib/localize.js.map +1 -0
- package/dist/cjs/node_modules/date-fns/locale/en-US/_lib/match.js +137 -0
- package/dist/cjs/node_modules/date-fns/locale/en-US/_lib/match.js.map +1 -0
- package/dist/cjs/node_modules/date-fns/locale/en-US.js +31 -0
- package/dist/cjs/node_modules/date-fns/locale/en-US.js.map +1 -0
- package/dist/cjs/node_modules/date-fns/locale/fr/_lib/formatDistance.js +105 -0
- package/dist/cjs/node_modules/date-fns/locale/fr/_lib/formatDistance.js.map +1 -0
- package/dist/cjs/node_modules/date-fns/locale/fr/_lib/formatLong.js +44 -0
- package/dist/cjs/node_modules/date-fns/locale/fr/_lib/formatLong.js.map +1 -0
- package/dist/cjs/node_modules/date-fns/locale/fr/_lib/formatRelative.js +16 -0
- package/dist/cjs/node_modules/date-fns/locale/fr/_lib/formatRelative.js.map +1 -0
- package/dist/cjs/node_modules/date-fns/locale/fr/_lib/localize.js +170 -0
- package/dist/cjs/node_modules/date-fns/locale/fr/_lib/localize.js.map +1 -0
- package/dist/cjs/node_modules/date-fns/locale/fr/_lib/match.js +138 -0
- package/dist/cjs/node_modules/date-fns/locale/fr/_lib/match.js.map +1 -0
- package/dist/cjs/node_modules/date-fns/locale/fr.js +31 -0
- package/dist/cjs/node_modules/date-fns/locale/fr.js.map +1 -0
- package/dist/esm/components/session/UserInputForm/CustomFormFields.js +7 -19
- package/dist/esm/components/session/UserInputForm/CustomFormFields.js.map +1 -1
- package/dist/esm/components/session/UserInputForm/DatePickerField.js +150 -0
- package/dist/esm/components/session/UserInputForm/DatePickerField.js.map +1 -0
- package/dist/esm/components/start-flow/CGU.js +3 -0
- package/dist/esm/components/start-flow/CGU.js.map +1 -1
- package/dist/esm/components/start-flow/Start.js +3 -0
- package/dist/esm/components/start-flow/Start.js.map +1 -1
- package/dist/esm/components/ui/SelectComponent.js +3 -3
- package/dist/esm/components/ui/SelectComponent.js.map +1 -1
- package/dist/esm/index.css.js +1 -1
- package/dist/esm/node_modules/date-fns/locale/_lib/buildFormatLongFn.js +11 -0
- package/dist/esm/node_modules/date-fns/locale/_lib/buildFormatLongFn.js.map +1 -0
- package/dist/esm/node_modules/date-fns/locale/_lib/buildLocalizeFn.js +65 -0
- package/dist/esm/node_modules/date-fns/locale/_lib/buildLocalizeFn.js.map +1 -0
- package/dist/esm/node_modules/date-fns/locale/_lib/buildMatchFn.js +60 -0
- package/dist/esm/node_modules/date-fns/locale/_lib/buildMatchFn.js.map +1 -0
- package/dist/esm/node_modules/date-fns/locale/_lib/buildMatchPatternFn.js +23 -0
- package/dist/esm/node_modules/date-fns/locale/_lib/buildMatchPatternFn.js.map +1 -0
- package/dist/esm/node_modules/date-fns/locale/en-US/_lib/formatDistance.js +104 -0
- package/dist/esm/node_modules/date-fns/locale/en-US/_lib/formatDistance.js.map +1 -0
- package/dist/esm/node_modules/date-fns/locale/en-US/_lib/formatLong.js +42 -0
- package/dist/esm/node_modules/date-fns/locale/en-US/_lib/formatLong.js.map +1 -0
- package/dist/esm/node_modules/date-fns/locale/en-US/_lib/formatRelative.js +14 -0
- package/dist/esm/node_modules/date-fns/locale/en-US/_lib/formatRelative.js.map +1 -0
- package/dist/esm/node_modules/date-fns/locale/en-US/_lib/localize.js +190 -0
- package/dist/esm/node_modules/date-fns/locale/en-US/_lib/localize.js.map +1 -0
- package/dist/esm/node_modules/date-fns/locale/en-US/_lib/match.js +135 -0
- package/dist/esm/node_modules/date-fns/locale/en-US/_lib/match.js.map +1 -0
- package/dist/esm/node_modules/date-fns/locale/en-US.js +29 -0
- package/dist/esm/node_modules/date-fns/locale/en-US.js.map +1 -0
- package/dist/esm/node_modules/date-fns/locale/fr/_lib/formatDistance.js +103 -0
- package/dist/esm/node_modules/date-fns/locale/fr/_lib/formatDistance.js.map +1 -0
- package/dist/esm/node_modules/date-fns/locale/fr/_lib/formatLong.js +42 -0
- package/dist/esm/node_modules/date-fns/locale/fr/_lib/formatLong.js.map +1 -0
- package/dist/esm/node_modules/date-fns/locale/fr/_lib/formatRelative.js +14 -0
- package/dist/esm/node_modules/date-fns/locale/fr/_lib/formatRelative.js.map +1 -0
- package/dist/esm/node_modules/date-fns/locale/fr/_lib/localize.js +168 -0
- package/dist/esm/node_modules/date-fns/locale/fr/_lib/localize.js.map +1 -0
- package/dist/esm/node_modules/date-fns/locale/fr/_lib/match.js +136 -0
- package/dist/esm/node_modules/date-fns/locale/fr/_lib/match.js.map +1 -0
- package/dist/esm/node_modules/date-fns/locale/fr.js +29 -0
- package/dist/esm/node_modules/date-fns/locale/fr.js.map +1 -0
- package/dist/esm/providers/I18nProvider.js +2 -2
- package/dist/esm/providers/I18nProvider.js.map +1 -1
- package/package.json +4 -1
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
2
|
+
import * as React from 'react';
|
|
3
|
+
import { parse, isValid, format } from 'date-fns';
|
|
4
|
+
import { Calendar, ChevronLeft, ChevronRight } from 'lucide-react';
|
|
5
|
+
import { DayPicker } from 'react-day-picker';
|
|
6
|
+
import * as Popover from '@radix-ui/react-popover';
|
|
7
|
+
import clsx from 'clsx';
|
|
8
|
+
import { useI18n } from '../../../hooks/useI18n.js';
|
|
9
|
+
import { enUS } from '../../../node_modules/date-fns/locale/en-US.js';
|
|
10
|
+
import { fr } from '../../../node_modules/date-fns/locale/fr.js';
|
|
11
|
+
|
|
12
|
+
// ─── helpers ──────────────────────────────────────────────────────────────────
|
|
13
|
+
var FORMAT_TO_DATEFNS = {
|
|
14
|
+
"dd/mm/yyyy": "dd/MM/yyyy",
|
|
15
|
+
"mm/dd/yyyy": "MM/dd/yyyy",
|
|
16
|
+
"yyyy-mm-dd": "yyyy-MM-dd",
|
|
17
|
+
};
|
|
18
|
+
// Auto-inserts separator after 2nd and 4th digit while the user types.
|
|
19
|
+
var autoInsertSeparator = function (prev, next, separator) {
|
|
20
|
+
var digits = next.replace(/[^\d]/g, "");
|
|
21
|
+
var out = "";
|
|
22
|
+
for (var i = 0; i < digits.length && i < 8; i++) {
|
|
23
|
+
if (i === 2 || i === 4)
|
|
24
|
+
out += separator;
|
|
25
|
+
out += digits[i];
|
|
26
|
+
}
|
|
27
|
+
if (next.length < prev.length)
|
|
28
|
+
return next;
|
|
29
|
+
return out;
|
|
30
|
+
};
|
|
31
|
+
var MONTH_LABELS_FR = ["Jan", "Fév", "Mar", "Avr", "Mai", "Jun", "Jul", "Aoû", "Sep", "Oct", "Nov", "Déc"];
|
|
32
|
+
var MONTH_LABELS_EN = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"];
|
|
33
|
+
var MiniCalendar = function (_a) {
|
|
34
|
+
var selected = _a.selected, onSelect = _a.onSelect, locale = _a.locale;
|
|
35
|
+
var _b = React.useState("day"), mode = _b[0], setMode = _b[1];
|
|
36
|
+
var _c = React.useState(selected !== null && selected !== void 0 ? selected : new Date()), displayMonth = _c[0], setDisplayMonth = _c[1];
|
|
37
|
+
var _d = React.useState(null), tempYear = _d[0], setTempYear = _d[1];
|
|
38
|
+
var isFr = locale === fr;
|
|
39
|
+
var monthLabels = isFr ? MONTH_LABELS_FR : MONTH_LABELS_EN;
|
|
40
|
+
var yearGrid = React.useMemo(function () {
|
|
41
|
+
var base = displayMonth.getFullYear();
|
|
42
|
+
return Array.from({ length: 15 }, function (_, i) { return base - 7 + i; });
|
|
43
|
+
}, [displayMonth]);
|
|
44
|
+
var navYear = function (dir) {
|
|
45
|
+
var d = new Date(displayMonth);
|
|
46
|
+
d.setFullYear(d.getFullYear() + dir * 15);
|
|
47
|
+
setDisplayMonth(d);
|
|
48
|
+
};
|
|
49
|
+
// Custom MonthCaption pour v9 — reçoit calendarMonth
|
|
50
|
+
var CustomMonthCaption = React.useCallback(function (_a) {
|
|
51
|
+
var calendarMonth = _a.calendarMonth;
|
|
52
|
+
var dm = calendarMonth.date;
|
|
53
|
+
return (jsxs("div", { className: "flex items-center justify-center gap-1 text-sm font-semibold select-none py-1", children: [jsx("button", { type: "button", onClick: function () { setDisplayMonth(dm); setMode("month"); }, className: "hover:text-[#11E5C5] transition-colors capitalize", children: dm.toLocaleString(isFr ? "fr-FR" : "en-US", { month: "long" }) }), jsx("button", { type: "button", onClick: function () { setDisplayMonth(dm); setMode("year"); }, className: "hover:text-[#11E5C5] transition-colors", children: dm.getFullYear() })] }));
|
|
54
|
+
}, [isFr]);
|
|
55
|
+
// Custom Chevron pour v9 — orientation "left" | "right"
|
|
56
|
+
var CustomChevron = React.useCallback(function (_a) {
|
|
57
|
+
var orientation = _a.orientation;
|
|
58
|
+
return orientation === "left"
|
|
59
|
+
? jsx(ChevronLeft, { className: "size-4" })
|
|
60
|
+
: jsx(ChevronRight, { className: "size-4" });
|
|
61
|
+
}, []);
|
|
62
|
+
if (mode === "year") {
|
|
63
|
+
return (jsxs("div", { className: "p-3 w-[252px]", children: [jsxs("div", { className: "flex items-center justify-between mb-3", children: [jsx("button", { type: "button", onClick: function () { return navYear(-1); }, className: "p-1 rounded hover:bg-gray-100", children: jsx(ChevronLeft, { className: "size-4" }) }), jsxs("span", { className: "text-sm font-semibold", children: [yearGrid[0], " \u2013 ", yearGrid[yearGrid.length - 1]] }), jsx("button", { type: "button", onClick: function () { return navYear(1); }, className: "p-1 rounded hover:bg-gray-100", children: jsx(ChevronRight, { className: "size-4" }) })] }), jsx("div", { className: "grid grid-cols-3 gap-1", children: yearGrid.map(function (y) { return (jsx("button", { type: "button", onClick: function () { setTempYear(y); setMode("month"); }, className: clsx("rounded py-1.5 text-sm transition-colors", y === displayMonth.getFullYear()
|
|
64
|
+
? "bg-[#11E5C5] text-white font-semibold"
|
|
65
|
+
: "hover:bg-gray-100"), children: y }, y)); }) })] }));
|
|
66
|
+
}
|
|
67
|
+
if (mode === "month") {
|
|
68
|
+
var year_1 = tempYear !== null && tempYear !== void 0 ? tempYear : displayMonth.getFullYear();
|
|
69
|
+
return (jsxs("div", { className: "p-3 w-[252px]", children: [jsx("div", { className: "text-sm font-semibold text-center mb-3", children: year_1 }), jsx("div", { className: "grid grid-cols-3 gap-1", children: monthLabels.map(function (m, i) { return (jsx("button", { type: "button", onClick: function () {
|
|
70
|
+
var d = new Date(year_1, i, 1);
|
|
71
|
+
setDisplayMonth(d);
|
|
72
|
+
setTempYear(null);
|
|
73
|
+
setMode("day");
|
|
74
|
+
}, className: clsx("rounded py-1.5 text-sm transition-colors", i === displayMonth.getMonth() && year_1 === displayMonth.getFullYear()
|
|
75
|
+
? "bg-[#11E5C5] text-white font-semibold"
|
|
76
|
+
: "hover:bg-gray-100"), children: m }, m)); }) })] }));
|
|
77
|
+
}
|
|
78
|
+
return (jsx(DayPicker, { mode: "single", selected: selected, onSelect: onSelect, month: displayMonth, onMonthChange: setDisplayMonth, locale: locale, showOutsideDays: true, classNames: {
|
|
79
|
+
months: "flex flex-col p-3",
|
|
80
|
+
month: "flex flex-col gap-4",
|
|
81
|
+
month_caption: "flex justify-center relative items-center w-full",
|
|
82
|
+
nav: "flex items-center gap-1",
|
|
83
|
+
button_previous: "absolute left-1 size-7 rounded border border-gray-200 flex items-center justify-center opacity-60 hover:opacity-100 bg-transparent",
|
|
84
|
+
button_next: "absolute right-1 size-7 rounded border border-gray-200 flex items-center justify-center opacity-60 hover:opacity-100 bg-transparent",
|
|
85
|
+
month_grid: "w-full border-collapse",
|
|
86
|
+
weekdays: "flex",
|
|
87
|
+
weekday: "text-gray-400 w-8 font-normal text-[0.8rem] text-center",
|
|
88
|
+
week: "flex w-full mt-1",
|
|
89
|
+
day: "relative p-0 text-center text-sm",
|
|
90
|
+
day_button: "size-8 p-0 font-normal rounded hover:bg-gray-100 w-full",
|
|
91
|
+
selected: "bg-[#11E5C5] text-white rounded hover:bg-[#11E5C5] hover:text-white",
|
|
92
|
+
today: "bg-gray-100 font-semibold rounded",
|
|
93
|
+
outside: "text-gray-300",
|
|
94
|
+
disabled: "text-gray-300 opacity-50",
|
|
95
|
+
hidden: "invisible",
|
|
96
|
+
}, components: {
|
|
97
|
+
MonthCaption: CustomMonthCaption,
|
|
98
|
+
Chevron: CustomChevron,
|
|
99
|
+
} }));
|
|
100
|
+
};
|
|
101
|
+
var DatePickerField = function (_a) {
|
|
102
|
+
var _b;
|
|
103
|
+
var id = _a.id, value = _a.value, dateFormat = _a.dateFormat, placeholder = _a.placeholder, _c = _a.hasError, hasError = _c === void 0 ? false : _c, _d = _a.language, language = _d === void 0 ? "fr" : _d, onChange = _a.onChange, className = _a.className;
|
|
104
|
+
var t = useI18n().t;
|
|
105
|
+
var locale = language === "en" ? enUS : fr;
|
|
106
|
+
var dfnsFmt = (_b = FORMAT_TO_DATEFNS[dateFormat]) !== null && _b !== void 0 ? _b : "dd/MM/yyyy";
|
|
107
|
+
var separator = dateFormat === "yyyy-mm-dd" ? "-" : "/";
|
|
108
|
+
var _e = React.useState(value !== null && value !== void 0 ? value : ""), inputValue = _e[0], setInputValue = _e[1];
|
|
109
|
+
var _f = React.useState(false), open = _f[0], setOpen = _f[1];
|
|
110
|
+
React.useEffect(function () {
|
|
111
|
+
setInputValue(value !== null && value !== void 0 ? value : "");
|
|
112
|
+
}, [value]);
|
|
113
|
+
var parseInputToDate = function (raw) {
|
|
114
|
+
if (raw.length < 10)
|
|
115
|
+
return undefined;
|
|
116
|
+
var d = parse(raw, dfnsFmt, new Date(), { locale: locale });
|
|
117
|
+
return isValid(d) ? d : undefined;
|
|
118
|
+
};
|
|
119
|
+
var selectedDate = parseInputToDate(inputValue);
|
|
120
|
+
var handleInputChange = function (e) {
|
|
121
|
+
var next = autoInsertSeparator(inputValue, e.target.value, separator);
|
|
122
|
+
if (next.length > 10)
|
|
123
|
+
return;
|
|
124
|
+
setInputValue(next);
|
|
125
|
+
if (next.length === 10) {
|
|
126
|
+
var d = parse(next, dfnsFmt, new Date(), { locale: locale });
|
|
127
|
+
if (isValid(d)) {
|
|
128
|
+
onChange(next);
|
|
129
|
+
setOpen(false);
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
else if (next === "") {
|
|
133
|
+
onChange("");
|
|
134
|
+
}
|
|
135
|
+
};
|
|
136
|
+
var handleCalendarSelect = function (d) {
|
|
137
|
+
if (!d)
|
|
138
|
+
return;
|
|
139
|
+
var formatted = format(d, dfnsFmt, { locale: locale });
|
|
140
|
+
setInputValue(formatted);
|
|
141
|
+
onChange(formatted);
|
|
142
|
+
setOpen(false);
|
|
143
|
+
};
|
|
144
|
+
var defaultPlaceholder = placeholder !== null && placeholder !== void 0 ? placeholder : dfnsFmt.toUpperCase();
|
|
145
|
+
var inputClasses = clsx("w-full px-3 py-3 md:py-4 border rounded-lg text-base transition-colors focus:outline-none focus:ring-2 focus:ring-[#11E5C5] focus:border-transparent bg-transparent", hasError ? "border-red-500 bg-red-50" : "border-gray-300 hover:border-gray-400", className);
|
|
146
|
+
return (jsxs(Popover.Root, { open: open, onOpenChange: setOpen, children: [jsx(Popover.Trigger, { asChild: true, children: jsxs("div", { className: "relative", children: [jsx("input", { id: id, type: "text", value: inputValue, onChange: handleInputChange, placeholder: defaultPlaceholder, className: clsx(inputClasses, "pr-10"), autoComplete: "off", inputMode: "numeric", onFocus: function () { return setOpen(true); }, "aria-label": t("custom_form.select_option", "Date") }), jsx("button", { type: "button", tabIndex: -1, onClick: function () { return setOpen(function (o) { return !o; }); }, className: "absolute right-3 top-1/2 -translate-y-1/2 text-gray-400 hover:text-gray-600", children: jsx(Calendar, { className: "size-4" }) })] }) }), jsx(Popover.Portal, { children: jsx(Popover.Content, { side: "bottom", align: "start", sideOffset: 4, className: "z-50 rounded-lg border border-gray-200 bg-white shadow-lg focus:outline-none", onOpenAutoFocus: function (e) { return e.preventDefault(); }, children: jsx(MiniCalendar, { selected: selectedDate, onSelect: handleCalendarSelect, locale: locale }) }) })] }));
|
|
147
|
+
};
|
|
148
|
+
|
|
149
|
+
export { DatePickerField };
|
|
150
|
+
//# sourceMappingURL=DatePickerField.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DatePickerField.js","sources":["../../../../../../src/components/session/UserInputForm/DatePickerField.tsx"],"sourcesContent":["import * as React from \"react\";\nimport { format, parse, isValid, type Locale } from \"date-fns\";\nimport { fr, enUS } from \"date-fns/locale\";\nimport { ChevronLeft, ChevronRight, Calendar } from \"lucide-react\";\nimport { DayPicker } from \"react-day-picker\";\nimport type { MonthCaptionProps, ChevronProps } from \"react-day-picker\";\nimport * as Popover from \"@radix-ui/react-popover\";\nimport clsx from \"clsx\";\nimport type { DateDisplayFormat } from \"../../../types/session\";\nimport { useI18n } from \"../../../hooks/useI18n\";\n\n// ─── helpers ──────────────────────────────────────────────────────────────────\n\nconst FORMAT_TO_DATEFNS: Record<DateDisplayFormat, string> = {\n \"dd/mm/yyyy\": \"dd/MM/yyyy\",\n \"mm/dd/yyyy\": \"MM/dd/yyyy\",\n \"yyyy-mm-dd\": \"yyyy-MM-dd\",\n};\n\n// Auto-inserts separator after 2nd and 4th digit while the user types.\nconst autoInsertSeparator = (\n prev: string,\n next: string,\n separator: \"/\" | \"-\",\n): string => {\n const digits = next.replace(/[^\\d]/g, \"\");\n let out = \"\";\n for (let i = 0; i < digits.length && i < 8; i++) {\n if (i === 2 || i === 4) out += separator;\n out += digits[i];\n }\n if (next.length < prev.length) return next;\n return out;\n};\n\n// ─── mini calendar (DayPicker v9 wrapper) ─────────────────────────────────────\n\ntype CalendarMode = \"day\" | \"month\" | \"year\";\n\ninterface MiniCalendarProps {\n selected: Date | undefined;\n onSelect: (d: Date | undefined) => void;\n locale: Locale;\n}\n\nconst MONTH_LABELS_FR = [\"Jan\", \"Fév\", \"Mar\", \"Avr\", \"Mai\", \"Jun\", \"Jul\", \"Aoû\", \"Sep\", \"Oct\", \"Nov\", \"Déc\"];\nconst MONTH_LABELS_EN = [\"Jan\", \"Feb\", \"Mar\", \"Apr\", \"May\", \"Jun\", \"Jul\", \"Aug\", \"Sep\", \"Oct\", \"Nov\", \"Dec\"];\n\nconst MiniCalendar: React.FC<MiniCalendarProps> = ({ selected, onSelect, locale }) => {\n const [mode, setMode] = React.useState<CalendarMode>(\"day\");\n const [displayMonth, setDisplayMonth] = React.useState<Date>(selected ?? new Date());\n const [tempYear, setTempYear] = React.useState<number | null>(null);\n\n const isFr = locale === fr;\n const monthLabels = isFr ? MONTH_LABELS_FR : MONTH_LABELS_EN;\n\n const yearGrid: number[] = React.useMemo(() => {\n const base = displayMonth.getFullYear();\n return Array.from({ length: 15 }, (_, i) => base - 7 + i);\n }, [displayMonth]);\n\n const navYear = (dir: 1 | -1) => {\n const d = new Date(displayMonth);\n d.setFullYear(d.getFullYear() + dir * 15);\n setDisplayMonth(d);\n };\n\n // Custom MonthCaption pour v9 — reçoit calendarMonth\n const CustomMonthCaption = React.useCallback(\n ({ calendarMonth }: MonthCaptionProps) => {\n const dm = calendarMonth.date;\n return (\n <div className=\"flex items-center justify-center gap-1 text-sm font-semibold select-none py-1\">\n <button\n type=\"button\"\n onClick={() => { setDisplayMonth(dm); setMode(\"month\"); }}\n className=\"hover:text-[#11E5C5] transition-colors capitalize\"\n >\n {dm.toLocaleString(isFr ? \"fr-FR\" : \"en-US\", { month: \"long\" })}\n </button>\n <button\n type=\"button\"\n onClick={() => { setDisplayMonth(dm); setMode(\"year\"); }}\n className=\"hover:text-[#11E5C5] transition-colors\"\n >\n {dm.getFullYear()}\n </button>\n </div>\n );\n },\n [isFr],\n );\n\n // Custom Chevron pour v9 — orientation \"left\" | \"right\"\n const CustomChevron = React.useCallback(\n ({ orientation }: ChevronProps) =>\n orientation === \"left\"\n ? <ChevronLeft className=\"size-4\" />\n : <ChevronRight className=\"size-4\" />,\n [],\n );\n\n if (mode === \"year\") {\n return (\n <div className=\"p-3 w-[252px]\">\n <div className=\"flex items-center justify-between mb-3\">\n <button type=\"button\" onClick={() => navYear(-1)} className=\"p-1 rounded hover:bg-gray-100\">\n <ChevronLeft className=\"size-4\" />\n </button>\n <span className=\"text-sm font-semibold\">\n {yearGrid[0]} – {yearGrid[yearGrid.length - 1]}\n </span>\n <button type=\"button\" onClick={() => navYear(1)} className=\"p-1 rounded hover:bg-gray-100\">\n <ChevronRight className=\"size-4\" />\n </button>\n </div>\n <div className=\"grid grid-cols-3 gap-1\">\n {yearGrid.map((y) => (\n <button\n key={y}\n type=\"button\"\n onClick={() => { setTempYear(y); setMode(\"month\"); }}\n className={clsx(\n \"rounded py-1.5 text-sm transition-colors\",\n y === displayMonth.getFullYear()\n ? \"bg-[#11E5C5] text-white font-semibold\"\n : \"hover:bg-gray-100\",\n )}\n >\n {y}\n </button>\n ))}\n </div>\n </div>\n );\n }\n\n if (mode === \"month\") {\n const year = tempYear ?? displayMonth.getFullYear();\n return (\n <div className=\"p-3 w-[252px]\">\n <div className=\"text-sm font-semibold text-center mb-3\">{year}</div>\n <div className=\"grid grid-cols-3 gap-1\">\n {monthLabels.map((m, i) => (\n <button\n key={m}\n type=\"button\"\n onClick={() => {\n const d = new Date(year, i, 1);\n setDisplayMonth(d);\n setTempYear(null);\n setMode(\"day\");\n }}\n className={clsx(\n \"rounded py-1.5 text-sm transition-colors\",\n i === displayMonth.getMonth() && year === displayMonth.getFullYear()\n ? \"bg-[#11E5C5] text-white font-semibold\"\n : \"hover:bg-gray-100\",\n )}\n >\n {m}\n </button>\n ))}\n </div>\n </div>\n );\n }\n\n return (\n <DayPicker\n mode=\"single\"\n selected={selected}\n onSelect={onSelect}\n month={displayMonth}\n onMonthChange={setDisplayMonth}\n locale={locale}\n showOutsideDays\n classNames={{\n months: \"flex flex-col p-3\",\n month: \"flex flex-col gap-4\",\n month_caption: \"flex justify-center relative items-center w-full\",\n nav: \"flex items-center gap-1\",\n button_previous: \"absolute left-1 size-7 rounded border border-gray-200 flex items-center justify-center opacity-60 hover:opacity-100 bg-transparent\",\n button_next: \"absolute right-1 size-7 rounded border border-gray-200 flex items-center justify-center opacity-60 hover:opacity-100 bg-transparent\",\n month_grid: \"w-full border-collapse\",\n weekdays: \"flex\",\n weekday: \"text-gray-400 w-8 font-normal text-[0.8rem] text-center\",\n week: \"flex w-full mt-1\",\n day: \"relative p-0 text-center text-sm\",\n day_button: \"size-8 p-0 font-normal rounded hover:bg-gray-100 w-full\",\n selected: \"bg-[#11E5C5] text-white rounded hover:bg-[#11E5C5] hover:text-white\",\n today: \"bg-gray-100 font-semibold rounded\",\n outside: \"text-gray-300\",\n disabled: \"text-gray-300 opacity-50\",\n hidden: \"invisible\",\n }}\n components={{\n MonthCaption: CustomMonthCaption,\n Chevron: CustomChevron,\n }}\n />\n );\n};\n\n// ─── DatePickerField (export) ──────────────────────────────────────────────────\n\ninterface DatePickerFieldProps {\n id?: string;\n value: string;\n dateFormat: DateDisplayFormat;\n placeholder?: string;\n hasError?: boolean;\n language?: string;\n onChange: (value: string) => void;\n className?: string;\n}\n\nexport const DatePickerField: React.FC<DatePickerFieldProps> = ({\n id,\n value,\n dateFormat,\n placeholder,\n hasError = false,\n language = \"fr\",\n onChange,\n className,\n}) => {\n const { t } = useI18n();\n const locale = language === \"en\" ? enUS : fr;\n const dfnsFmt = FORMAT_TO_DATEFNS[dateFormat] ?? \"dd/MM/yyyy\";\n const separator = dateFormat === \"yyyy-mm-dd\" ? \"-\" : \"/\";\n\n const [inputValue, setInputValue] = React.useState(value ?? \"\");\n const [open, setOpen] = React.useState(false);\n\n React.useEffect(() => {\n setInputValue(value ?? \"\");\n }, [value]);\n\n const parseInputToDate = (raw: string): Date | undefined => {\n if (raw.length < 10) return undefined;\n const d = parse(raw, dfnsFmt, new Date(), { locale });\n return isValid(d) ? d : undefined;\n };\n\n const selectedDate = parseInputToDate(inputValue);\n\n const handleInputChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const next = autoInsertSeparator(inputValue, e.target.value, separator);\n if (next.length > 10) return;\n setInputValue(next);\n if (next.length === 10) {\n const d = parse(next, dfnsFmt, new Date(), { locale });\n if (isValid(d)) {\n onChange(next);\n setOpen(false);\n }\n } else if (next === \"\") {\n onChange(\"\");\n }\n };\n\n const handleCalendarSelect = (d: Date | undefined) => {\n if (!d) return;\n const formatted = format(d, dfnsFmt, { locale });\n setInputValue(formatted);\n onChange(formatted);\n setOpen(false);\n };\n\n const defaultPlaceholder = placeholder ?? dfnsFmt.toUpperCase();\n\n const inputClasses = clsx(\n \"w-full px-3 py-3 md:py-4 border rounded-lg text-base transition-colors focus:outline-none focus:ring-2 focus:ring-[#11E5C5] focus:border-transparent bg-transparent\",\n hasError ? \"border-red-500 bg-red-50\" : \"border-gray-300 hover:border-gray-400\",\n className,\n );\n\n return (\n <Popover.Root open={open} onOpenChange={setOpen}>\n <Popover.Trigger asChild>\n <div className=\"relative\">\n <input\n id={id}\n type=\"text\"\n value={inputValue}\n onChange={handleInputChange}\n placeholder={defaultPlaceholder}\n className={clsx(inputClasses, \"pr-10\")}\n autoComplete=\"off\"\n inputMode=\"numeric\"\n onFocus={() => setOpen(true)}\n aria-label={t(\"custom_form.select_option\", \"Date\")}\n />\n <button\n type=\"button\"\n tabIndex={-1}\n onClick={() => setOpen((o) => !o)}\n className=\"absolute right-3 top-1/2 -translate-y-1/2 text-gray-400 hover:text-gray-600\"\n >\n <Calendar className=\"size-4\" />\n </button>\n </div>\n </Popover.Trigger>\n\n <Popover.Portal>\n <Popover.Content\n side=\"bottom\"\n align=\"start\"\n sideOffset={4}\n className=\"z-50 rounded-lg border border-gray-200 bg-white shadow-lg focus:outline-none\"\n onOpenAutoFocus={(e) => e.preventDefault()}\n >\n <MiniCalendar\n selected={selectedDate}\n onSelect={handleCalendarSelect}\n locale={locale}\n />\n </Popover.Content>\n </Popover.Portal>\n </Popover.Root>\n );\n};\n"],"names":["_jsxs","_jsx"],"mappings":"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"}
|
|
@@ -33,6 +33,9 @@ import '../../services/documentDetectionService.js';
|
|
|
33
33
|
import 'lucide-react';
|
|
34
34
|
import '../document-collection/DocumentProcessing.js';
|
|
35
35
|
import '../../constants/userInputForm.js';
|
|
36
|
+
import 'date-fns';
|
|
37
|
+
import 'react-day-picker';
|
|
38
|
+
import '@radix-ui/react-popover';
|
|
36
39
|
import 'react-i18next';
|
|
37
40
|
import '../../i18n/index.js';
|
|
38
41
|
import '@docuseal/react';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CGU.js","sources":["../../../../../src/components/start-flow/CGU.tsx"],"sourcesContent":["import Body from \"../ui/Body\";\nimport Title from \"../ui/Title\";\nimport { useState } from \"react\";\nimport { updateSessionStatus } from \"../../services/sessionService\";\n\n// For checkbox\nimport * as CheckboxPrimitive from \"@radix-ui/react-checkbox\";\nimport * as LabelPrimitive from \"@radix-ui/react-label\";\nimport { CheckIcon } from \"@radix-ui/react-icons\";\nimport Button from \"../ui/Button\";\nimport PageActions from \"../ui/PageActions\";\nimport { useI18n } from \"../..\";\nimport LanguageSelector from \"../ui/LanguageSelector\";\nimport MobilePageLayout from \"../ui/MobilePageLayout\";\nimport { SessionData } from \"../../types/session\";\n\ninterface CGUProps {\n setStep: (nubr: number) => void;\n sessionId?: string;\n showQRCodeInstructions: boolean;\n languages?: string[];\n session?: SessionData;\n onBack?: () => void;\n}\n\nconst CGU = ({\n setStep,\n sessionId,\n showQRCodeInstructions,\n languages,\n session,\n onBack,\n}: CGUProps) => {\n const { t, setLanguage } = useI18n();\n const [selectedLanguage, setSelectedLanguage] = useState(\n languages ? languages[0] : \"fr\"\n );\n const [checked, setChecked] = useState(false);\n const [error, setError] = useState(false);\n const [submitError, setSubmitError] = useState<string | null>(null);\n const [isSubmitting, setIsSubmitting] = useState(false);\n\n const handleCheckboxChange = (value: boolean) => {\n setChecked(value);\n setError(false);\n setSubmitError(null);\n };\n\n const goOnNextStep = async () => {\n if (!checked) {\n setError(true);\n return;\n }\n\n const nextStep = showQRCodeInstructions ? 0.5 : 1;\n\n if (!sessionId) {\n setStep(nextStep);\n return;\n }\n\n setIsSubmitting(true);\n try {\n await updateSessionStatus(sessionId, \"started\");\n setStep(nextStep);\n } catch (statusError) {\n console.error(t(\"CGU.error.console_update_status\"), statusError);\n setSubmitError(t(\"CGU.error.general\"));\n } finally {\n setIsSubmitting(false);\n }\n };\n\n const handleLanguageChange = (langId: string) => {\n const lang = languages?.find((l) => l === langId);\n if (lang) {\n setLanguage(lang);\n setSelectedLanguage(lang);\n }\n };\n\n return (\n <MobilePageLayout\n session={session ?? undefined}\n footer={\n <div className=\"w-full space-y-4\">\n {/* Error message */}\n {(error || submitError) && (\n <div className=\"bg-red-50 border border-red-200 rounded-lg p-3\">\n <Body className=\"text-red-600 text-sm text-center\">\n {submitError ? submitError : t(\"CGU.error.required\")}\n </Body>\n </div>\n )}\n\n {/* Consent checkbox */}\n <div className=\"flex items-start gap-3 p-3 bg-gray-50 rounded-lg\">\n <CheckboxPrimitive.Root\n id=\"checkbox\"\n checked={checked}\n onCheckedChange={(value) => handleCheckboxChange(!!value)}\n className={`mt-1 h-5 w-5 shrink-0 rounded border bg-white transition-colors\n data-[state=checked]:bg-[var(--dk-btn-bg)] data-[state=checked]:border-[var(--dk-btn-bg)]\n ${error\n ? \"border-red-500\"\n : \"border-gray-300 hover:border-gray-400\"\n }\n `}\n >\n <CheckboxPrimitive.Indicator className=\"flex items-center justify-center text-white\">\n <CheckIcon className=\"h-4 w-4\" />\n </CheckboxPrimitive.Indicator>\n </CheckboxPrimitive.Root>\n\n <LabelPrimitive.Root htmlFor=\"checkbox\" className=\"cursor-pointer\">\n <Body\n className={`text-left text-sm leading-relaxed ${error ? \"text-red-600\" : \"text-gray-700\"\n }`}\n >\n {t(\"CGU.checkbox_text\")}\n </Body>\n </LabelPrimitive.Root>\n </div>\n\n {/* Buttons */}\n <PageActions\n primary={\n <Button\n onClick={goOnNextStep}\n disabled={!checked || isSubmitting}\n >\n {isSubmitting\n ? t(\"CGU.button.loading\")\n : t(\"CGU.button.continue\")}\n </Button>\n }\n secondary={\n onBack ? (\n <Button variant=\"secondary\" onClick={onBack}>\n {t(\"jdi.country_selection.back\")}\n </Button>\n ) : undefined\n }\n />\n </div>\n }\n >\n <div className=\"px-4 py-8 md:px-8 flex flex-col\">\n <div className=\"w-full max-w-2xl mx-auto space-y-6\">\n <div className=\"text-center justify-center items-center\">\n <Title className=\"text-xl md:text-2xl lg:text-3xl mb-6\">\n {t(\"CGU.terms_of_use\")}\n </Title>\n\n {/* Language selector */}\n {languages && languages.length > 1 && (\n <div className=\"flex justify-center items-center mb-6\">\n <LanguageSelector\n className=\"w-64 mx-auto\"\n languages={languages}\n />\n </div>\n )}\n </div>\n\n {/* Terms content */}\n <div className=\"bg-gray-50 rounded-lg p-4 md:p-6\">\n <Body className=\"text-left text-sm md:text-base leading-relaxed space-y-4\">\n <p>{t(\"CGU.title\")}</p>\n <p>{t(\"CGU.description\")}</p>\n <p>\n {t(\"CGU.description2_before\")}{\" \"}\n <a\n href={t(\"CGU.privacy_url\")}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"underline text-blue-600 hover:text-blue-800\"\n >\n {t(\"CGU.privacy_link_label\")}\n </a>\n {t(\"CGU.description2_after\")}\n </p>\n <p>\n {t(\"CGU.by_proceeding_before\")}{\" \"}\n <a\n href={t(\"CGU.cgu_url\")}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"underline text-blue-600 hover:text-blue-800\"\n >\n {t(\"CGU.cgu_link_label\")}\n </a>\n {t(\"CGU.by_proceeding_after\")}\n </p>\n </Body>\n </div>\n </div>\n </div>\n </MobilePageLayout>\n );\n};\n\nexport default CGU;\n"],"names":["_jsx","_jsxs","LabelPrimitive"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"CGU.js","sources":["../../../../../src/components/start-flow/CGU.tsx"],"sourcesContent":["import Body from \"../ui/Body\";\nimport Title from \"../ui/Title\";\nimport { useState } from \"react\";\nimport { updateSessionStatus } from \"../../services/sessionService\";\n\n// For checkbox\nimport * as CheckboxPrimitive from \"@radix-ui/react-checkbox\";\nimport * as LabelPrimitive from \"@radix-ui/react-label\";\nimport { CheckIcon } from \"@radix-ui/react-icons\";\nimport Button from \"../ui/Button\";\nimport PageActions from \"../ui/PageActions\";\nimport { useI18n } from \"../..\";\nimport LanguageSelector from \"../ui/LanguageSelector\";\nimport MobilePageLayout from \"../ui/MobilePageLayout\";\nimport { SessionData } from \"../../types/session\";\n\ninterface CGUProps {\n setStep: (nubr: number) => void;\n sessionId?: string;\n showQRCodeInstructions: boolean;\n languages?: string[];\n session?: SessionData;\n onBack?: () => void;\n}\n\nconst CGU = ({\n setStep,\n sessionId,\n showQRCodeInstructions,\n languages,\n session,\n onBack,\n}: CGUProps) => {\n const { t, setLanguage } = useI18n();\n const [selectedLanguage, setSelectedLanguage] = useState(\n languages ? languages[0] : \"fr\"\n );\n const [checked, setChecked] = useState(false);\n const [error, setError] = useState(false);\n const [submitError, setSubmitError] = useState<string | null>(null);\n const [isSubmitting, setIsSubmitting] = useState(false);\n\n const handleCheckboxChange = (value: boolean) => {\n setChecked(value);\n setError(false);\n setSubmitError(null);\n };\n\n const goOnNextStep = async () => {\n if (!checked) {\n setError(true);\n return;\n }\n\n const nextStep = showQRCodeInstructions ? 0.5 : 1;\n\n if (!sessionId) {\n setStep(nextStep);\n return;\n }\n\n setIsSubmitting(true);\n try {\n await updateSessionStatus(sessionId, \"started\");\n setStep(nextStep);\n } catch (statusError) {\n console.error(t(\"CGU.error.console_update_status\"), statusError);\n setSubmitError(t(\"CGU.error.general\"));\n } finally {\n setIsSubmitting(false);\n }\n };\n\n const handleLanguageChange = (langId: string) => {\n const lang = languages?.find((l) => l === langId);\n if (lang) {\n setLanguage(lang);\n setSelectedLanguage(lang);\n }\n };\n\n return (\n <MobilePageLayout\n session={session ?? undefined}\n footer={\n <div className=\"w-full space-y-4\">\n {/* Error message */}\n {(error || submitError) && (\n <div className=\"bg-red-50 border border-red-200 rounded-lg p-3\">\n <Body className=\"text-red-600 text-sm text-center\">\n {submitError ? submitError : t(\"CGU.error.required\")}\n </Body>\n </div>\n )}\n\n {/* Consent checkbox */}\n <div className=\"flex items-start gap-3 p-3 bg-gray-50 rounded-lg\">\n <CheckboxPrimitive.Root\n id=\"checkbox\"\n checked={checked}\n onCheckedChange={(value) => handleCheckboxChange(!!value)}\n className={`mt-1 h-5 w-5 shrink-0 rounded border bg-white transition-colors\n data-[state=checked]:bg-[var(--dk-btn-bg)] data-[state=checked]:border-[var(--dk-btn-bg)]\n ${error\n ? \"border-red-500\"\n : \"border-gray-300 hover:border-gray-400\"\n }\n `}\n >\n <CheckboxPrimitive.Indicator className=\"flex items-center justify-center text-white\">\n <CheckIcon className=\"h-4 w-4\" />\n </CheckboxPrimitive.Indicator>\n </CheckboxPrimitive.Root>\n\n <LabelPrimitive.Root htmlFor=\"checkbox\" className=\"cursor-pointer\">\n <Body\n className={`text-left text-sm leading-relaxed ${error ? \"text-red-600\" : \"text-gray-700\"\n }`}\n >\n {t(\"CGU.checkbox_text\")}\n </Body>\n </LabelPrimitive.Root>\n </div>\n\n {/* Buttons */}\n <PageActions\n primary={\n <Button\n onClick={goOnNextStep}\n disabled={!checked || isSubmitting}\n >\n {isSubmitting\n ? t(\"CGU.button.loading\")\n : t(\"CGU.button.continue\")}\n </Button>\n }\n secondary={\n onBack ? (\n <Button variant=\"secondary\" onClick={onBack}>\n {t(\"jdi.country_selection.back\")}\n </Button>\n ) : undefined\n }\n />\n </div>\n }\n >\n <div className=\"px-4 py-8 md:px-8 flex flex-col\">\n <div className=\"w-full max-w-2xl mx-auto space-y-6\">\n <div className=\"text-center justify-center items-center\">\n <Title className=\"text-xl md:text-2xl lg:text-3xl mb-6\">\n {t(\"CGU.terms_of_use\")}\n </Title>\n\n {/* Language selector */}\n {languages && languages.length > 1 && (\n <div className=\"flex justify-center items-center mb-6\">\n <LanguageSelector\n className=\"w-64 mx-auto\"\n languages={languages}\n />\n </div>\n )}\n </div>\n\n {/* Terms content */}\n <div className=\"bg-gray-50 rounded-lg p-4 md:p-6\">\n <Body className=\"text-left text-sm md:text-base leading-relaxed space-y-4\">\n <p>{t(\"CGU.title\")}</p>\n <p>{t(\"CGU.description\")}</p>\n <p>\n {t(\"CGU.description2_before\")}{\" \"}\n <a\n href={t(\"CGU.privacy_url\")}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"underline text-blue-600 hover:text-blue-800\"\n >\n {t(\"CGU.privacy_link_label\")}\n </a>\n {t(\"CGU.description2_after\")}\n </p>\n <p>\n {t(\"CGU.by_proceeding_before\")}{\" \"}\n <a\n href={t(\"CGU.cgu_url\")}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"underline text-blue-600 hover:text-blue-800\"\n >\n {t(\"CGU.cgu_link_label\")}\n </a>\n {t(\"CGU.by_proceeding_after\")}\n </p>\n </Body>\n </div>\n </div>\n </div>\n </MobilePageLayout>\n );\n};\n\nexport default CGU;\n"],"names":["_jsx","_jsxs","LabelPrimitive"],"mappings":"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"}
|
|
@@ -33,6 +33,9 @@ import '../../services/documentDetectionService.js';
|
|
|
33
33
|
import 'lucide-react';
|
|
34
34
|
import '../document-collection/DocumentProcessing.js';
|
|
35
35
|
import '../../constants/userInputForm.js';
|
|
36
|
+
import 'date-fns';
|
|
37
|
+
import 'react-day-picker';
|
|
38
|
+
import '@radix-ui/react-popover';
|
|
36
39
|
import 'react-i18next';
|
|
37
40
|
import '../../i18n/index.js';
|
|
38
41
|
import '@docuseal/react';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Start.js","sources":["../../../../../src/components/start-flow/Start.tsx"],"sourcesContent":["import { useI18n } from \"../..\";\nimport { SessionData } from \"../../types/session\";\nimport StartIcon from \"../icons/StartIcon\";\nimport Button from \"../ui/Button\";\nimport PageActions from \"../ui/PageActions\";\nimport Subtitle from \"../ui/Subtitle\";\nimport Title from \"../ui/Title\";\nimport MobilePageLayout from \"../ui/MobilePageLayout\";\n\ninterface StartProps {\n setStep: (nubr: number) => void;\n welcomeTitle?: string;\n welcomeSubtitle?: string;\n welcomeDescription?: string;\n welcomeImage?: string;\n session?: SessionData;\n}\n\nconst Start = ({\n setStep,\n welcomeTitle,\n welcomeSubtitle,\n welcomeDescription,\n welcomeImage,\n session,\n}: StartProps) => {\n const { t } = useI18n();\n\n const displayTitle =\n welcomeTitle || t(\"start.welcome_title\", \"Vérifions votre identité\");\n const displaySubtitle =\n welcomeSubtitle ||\n t(\"start.welcome_subtitle\", \"Nous devons vérifier votre identité\");\n const displayDescription =\n welcomeDescription || t(\"start.welcome_description\");\n\n const goOnCGU = () => {\n setStep(1);\n };\n\n return (\n <MobilePageLayout\n footer={\n <PageActions\n primary={\n <Button onClick={goOnCGU}>{t(\"start_verification\")}</Button>\n }\n />\n }\n session={session}\n >\n <div className=\"flex flex-col items-center px-4 py-8 md:px-8\">\n <div className=\"w-full max-w-md mx-auto text-center space-y-6 flex flex-col\">\n {/* Icon/Image - shown on top for both mobile and desktop */}\n <div className=\"flex justify-center\">\n {welcomeImage ? (\n <img\n src={welcomeImage}\n alt=\"Welcome image\"\n className=\"max-w-48 w-auto h-auto rounded-lg\"\n />\n ) : (\n <StartIcon className=\"w-48 h-48\" />\n )}\n </div>\n\n {/* Text content */}\n <div className=\"space-y-4\">\n <Title className=\"text-xl md:text-2xl lg:text-3xl\">\n {displayTitle}\n </Title>\n <Subtitle className=\"text-sm md:text-base text-gray-600 leading-relaxed whitespace-pre-line\">\n {displaySubtitle}\n </Subtitle>\n </div>\n\n {/* Terms notice */}\n <div className=\"md:block mt-8\">\n <p className=\"text-xs text-gray-500 leading-relaxed max-w-sm mx-auto whitespace-pre-line\">\n {displayDescription}\n </p>\n </div>\n </div>\n </div>\n </MobilePageLayout>\n );\n};\n\nexport default Start;\n"],"names":["_jsx","_jsxs"],"mappings":"
|
|
1
|
+
{"version":3,"file":"Start.js","sources":["../../../../../src/components/start-flow/Start.tsx"],"sourcesContent":["import { useI18n } from \"../..\";\nimport { SessionData } from \"../../types/session\";\nimport StartIcon from \"../icons/StartIcon\";\nimport Button from \"../ui/Button\";\nimport PageActions from \"../ui/PageActions\";\nimport Subtitle from \"../ui/Subtitle\";\nimport Title from \"../ui/Title\";\nimport MobilePageLayout from \"../ui/MobilePageLayout\";\n\ninterface StartProps {\n setStep: (nubr: number) => void;\n welcomeTitle?: string;\n welcomeSubtitle?: string;\n welcomeDescription?: string;\n welcomeImage?: string;\n session?: SessionData;\n}\n\nconst Start = ({\n setStep,\n welcomeTitle,\n welcomeSubtitle,\n welcomeDescription,\n welcomeImage,\n session,\n}: StartProps) => {\n const { t } = useI18n();\n\n const displayTitle =\n welcomeTitle || t(\"start.welcome_title\", \"Vérifions votre identité\");\n const displaySubtitle =\n welcomeSubtitle ||\n t(\"start.welcome_subtitle\", \"Nous devons vérifier votre identité\");\n const displayDescription =\n welcomeDescription || t(\"start.welcome_description\");\n\n const goOnCGU = () => {\n setStep(1);\n };\n\n return (\n <MobilePageLayout\n footer={\n <PageActions\n primary={\n <Button onClick={goOnCGU}>{t(\"start_verification\")}</Button>\n }\n />\n }\n session={session}\n >\n <div className=\"flex flex-col items-center px-4 py-8 md:px-8\">\n <div className=\"w-full max-w-md mx-auto text-center space-y-6 flex flex-col\">\n {/* Icon/Image - shown on top for both mobile and desktop */}\n <div className=\"flex justify-center\">\n {welcomeImage ? (\n <img\n src={welcomeImage}\n alt=\"Welcome image\"\n className=\"max-w-48 w-auto h-auto rounded-lg\"\n />\n ) : (\n <StartIcon className=\"w-48 h-48\" />\n )}\n </div>\n\n {/* Text content */}\n <div className=\"space-y-4\">\n <Title className=\"text-xl md:text-2xl lg:text-3xl\">\n {displayTitle}\n </Title>\n <Subtitle className=\"text-sm md:text-base text-gray-600 leading-relaxed whitespace-pre-line\">\n {displaySubtitle}\n </Subtitle>\n </div>\n\n {/* Terms notice */}\n <div className=\"md:block mt-8\">\n <p className=\"text-xs text-gray-500 leading-relaxed max-w-sm mx-auto whitespace-pre-line\">\n {displayDescription}\n </p>\n </div>\n </div>\n </div>\n </MobilePageLayout>\n );\n};\n\nexport default Start;\n"],"names":["_jsx","_jsxs"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAkBA,IAAM,KAAK,GAAG,UAAC,EAOF,EAAA;AANX,IAAA,IAAA,OAAO,GAAA,EAAA,CAAA,OAAA,EACP,YAAY,GAAA,EAAA,CAAA,YAAA,EACZ,eAAe,GAAA,EAAA,CAAA,eAAA,EACf,kBAAkB,wBAAA,EAClB,YAAY,GAAA,EAAA,CAAA,YAAA,EACZ,OAAO,GAAA,EAAA,CAAA,OAAA;AAEC,IAAA,IAAA,CAAC,GAAK,OAAO,EAAE,EAAd;IAET,IAAM,YAAY,GAChB,YAAY,IAAI,CAAC,CAAC,qBAAqB,EAAE,0BAA0B,CAAC;IACtE,IAAM,eAAe,GACnB,eAAe;AACf,QAAA,CAAC,CAAC,wBAAwB,EAAE,qCAAqC,CAAC;IACpE,IAAM,kBAAkB,GACtB,kBAAkB,IAAI,CAAC,CAAC,2BAA2B,CAAC;AAEtD,IAAA,IAAM,OAAO,GAAG,YAAA;QACd,OAAO,CAAC,CAAC,CAAC;AACZ,IAAA,CAAC;IAED,QACEA,GAAA,CAAC,gBAAgB,EAAA,EACf,MAAM,EACJA,GAAA,CAAC,WAAW,EAAA,EACV,OAAO,EACLA,GAAA,CAAC,MAAM,EAAA,EAAC,OAAO,EAAE,OAAO,EAAA,QAAA,EAAG,CAAC,CAAC,oBAAoB,CAAC,EAAA,CAAU,EAAA,CAE9D,EAEJ,OAAO,EAAE,OAAO,EAAA,QAAA,EAEhBA,aAAK,SAAS,EAAC,8CAA8C,EAAA,QAAA,EAC3DC,IAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,6DAA6D,EAAA,QAAA,EAAA,CAE1ED,GAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,qBAAqB,EAAA,QAAA,EACjC,YAAY,IACXA,GAAA,CAAA,KAAA,EAAA,EACE,GAAG,EAAE,YAAY,EACjB,GAAG,EAAC,eAAe,EACnB,SAAS,EAAC,mCAAmC,EAAA,CAC7C,KAEFA,GAAA,CAAC,SAAS,EAAA,EAAC,SAAS,EAAC,WAAW,EAAA,CAAG,CACpC,EAAA,CACG,EAGNC,IAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,WAAW,EAAA,QAAA,EAAA,CACxBD,GAAA,CAAC,KAAK,EAAA,EAAC,SAAS,EAAC,iCAAiC,EAAA,QAAA,EAC/C,YAAY,EAAA,CACP,EACRA,GAAA,CAAC,QAAQ,EAAA,EAAC,SAAS,EAAC,wEAAwE,EAAA,QAAA,EACzF,eAAe,EAAA,CACP,CAAA,EAAA,CACP,EAGNA,GAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,eAAe,EAAA,QAAA,EAC5BA,GAAA,CAAA,GAAA,EAAA,EAAG,SAAS,EAAC,4EAA4E,EAAA,QAAA,EACtF,kBAAkB,EAAA,CACjB,EAAA,CACA,CAAA,EAAA,CACF,EAAA,CACF,EAAA,CACW;AAEvB;;;;"}
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
2
|
-
import
|
|
2
|
+
import React__default, { useState, useRef, useEffect } from 'react';
|
|
3
3
|
import ReactDOM from 'react-dom';
|
|
4
4
|
import { ChevronDownIcon } from 'lucide-react';
|
|
5
5
|
import { useI18n } from '../../hooks/useI18n.js';
|
|
6
6
|
|
|
7
|
-
var Select =
|
|
7
|
+
var Select = React__default.forwardRef(function (_a, ref) {
|
|
8
8
|
var options = _a.options, value = _a.value, onValueChange = _a.onValueChange, placeholder = _a.placeholder, _b = _a.className, className = _b === void 0 ? "" : _b, _c = _a.disabled, disabled = _c === void 0 ? false : _c, _d = _a.error, error = _d === void 0 ? false : _d, _e = _a.allowCustomValue, allowCustomValue = _e === void 0 ? false : _e, inputMode = _a.inputMode, maxLength = _a.maxLength, pattern = _a.pattern, _f = _a.compact, compact = _f === void 0 ? false : _f;
|
|
9
9
|
var t = useI18n().t;
|
|
10
10
|
var _g = useState(false), isOpen = _g[0], setIsOpen = _g[1];
|
|
@@ -15,7 +15,7 @@ var Select = React.forwardRef(function (_a, ref) {
|
|
|
15
15
|
var _k = useState({}), dropdownStyle = _k[0], setDropdownStyle = _k[1];
|
|
16
16
|
var dropdownRef = useRef(null);
|
|
17
17
|
// Combine refs
|
|
18
|
-
|
|
18
|
+
React__default.useImperativeHandle(ref, function () { return internalInputRef.current; });
|
|
19
19
|
var normalizeText = function (text) {
|
|
20
20
|
return (text || "")
|
|
21
21
|
.normalize("NFD")
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SelectComponent.js","sources":["../../../../../src/components/ui/SelectComponent.tsx"],"sourcesContent":["import React, { useState, useRef, useEffect } from \"react\";\nimport ReactDOM from \"react-dom\";\nimport { ChevronDownIcon } from \"lucide-react\";\nimport { useI18n } from \"../../hooks/useI18n\";\n\ninterface SelectOption {\n value: string;\n label: string;\n flag?: string;\n}\n\ninterface SelectProps {\n options: SelectOption[];\n value: string;\n onValueChange: (value: string) => void;\n placeholder?: string;\n className?: string;\n disabled?: boolean;\n error?: boolean;\n allowCustomValue?: boolean;\n inputMode?: React.InputHTMLAttributes<HTMLInputElement>[\"inputMode\"];\n maxLength?: number;\n pattern?: string;\n /** Réduit le padding pour une utilisation dans des cellules de tableau */\n compact?: boolean;\n}\n\nexport const Select = React.forwardRef<HTMLInputElement, SelectProps>(({\n options,\n value,\n onValueChange,\n placeholder,\n className = \"\",\n disabled = false,\n error = false,\n allowCustomValue = false,\n inputMode,\n maxLength,\n pattern,\n compact = false,\n}, ref) => {\n const { t } = useI18n();\n const [isOpen, setIsOpen] = useState(false);\n const selectRef = useRef<HTMLDivElement>(null);\n const [inputValue, setInputValue] = useState<string>(value || \"\");\n const [isSearching, setIsSearching] = useState(false);\n const internalInputRef = useRef<HTMLInputElement>(null);\n const [dropdownStyle, setDropdownStyle] = useState<React.CSSProperties>({});\n const dropdownRef = useRef<HTMLDivElement>(null);\n\n // Combine refs\n React.useImperativeHandle(ref, () => internalInputRef.current as HTMLInputElement);\n\n const normalizeText = (text: string) =>\n (text || \"\")\n .normalize(\"NFD\")\n .replace(/[\\u0300-\\u036f]/g, \"\")\n .toLowerCase();\n\n const matchesNumericValue = (optionValue: string, input: string) => {\n // Strict matching for length to avoid \"1\" matching \"01\" and triggering auto-advance\n if (optionValue.length !== input.length) return false;\n\n const numericOption = parseInt(optionValue, 10);\n const numericInput = parseInt(input, 10);\n if (Number.isNaN(numericOption) || Number.isNaN(numericInput)) {\n return false;\n }\n return numericOption === numericInput;\n };\n\n // Helper to remove emoji flags from search input\n const removeEmojis = (text: string) => {\n // Remove emoji flags (regional indicator symbols) - using surrogate pairs\n return text.replace(/[\\uD83C][\\uDDE6-\\uDDFF]/g, '').trim();\n };\n\n const displayPlaceholder =\n placeholder ?? t(\"select_component.placeholder\");\n\n // Close dropdown when clicking outside (trigger ou portail dropdown)\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n const target = event.target as Node;\n const insideTrigger = selectRef.current?.contains(target);\n const insideDropdown = dropdownRef.current?.contains(target);\n if (!insideTrigger && !insideDropdown) {\n setIsOpen(false);\n }\n };\n\n if (isOpen) {\n document.addEventListener(\"mousedown\", handleClickOutside);\n return () =>\n document.removeEventListener(\"mousedown\", handleClickOutside);\n }\n }, [isOpen]);\n\n const selectedOption = options.find((option) => option.value === value);\n\n useEffect(() => {\n if (!allowCustomValue) return;\n\n // Don't update input value if the input is currently focused\n // This prevents auto-formatting while typing (e.g. typing \"1\" becoming \"01\")\n if (document.activeElement === internalInputRef.current) return;\n\n if (!value) {\n setInputValue(\"\");\n return;\n }\n\n const optionMatch = options.find((option) => option.value === value);\n if (optionMatch) {\n // Include flag in the input value if it exists\n const displayValue = optionMatch.flag\n ? `${optionMatch.flag} ${optionMatch.label}`\n : optionMatch.label;\n setInputValue(displayValue);\n } else if (inputMode === \"numeric\") {\n // Pour les champs numériques, afficher la valeur brute\n setInputValue(value);\n }\n // Pour les autres cas, ne pas mettre à jour inputValue si pas de match\n // Cela permet de garder la recherche en cours\n }, [value, allowCustomValue, options, inputMode]);\n\n const handleSelect = (optionValue: string) => {\n onValueChange(optionValue);\n if (allowCustomValue) {\n const optionMatch = options.find(\n (option) => option.value === optionValue\n );\n if (optionMatch) {\n // Include flag in the input value if it exists\n const displayValue = optionMatch.flag\n ? `${optionMatch.flag} ${optionMatch.label}`\n : optionMatch.label;\n setInputValue(displayValue);\n } else {\n setInputValue(optionValue);\n }\n }\n setIsSearching(false);\n setIsOpen(false);\n };\n\n const handleInputChange = (event: React.ChangeEvent<HTMLInputElement>) => {\n if (!allowCustomValue) return;\n\n const nextValue = event.target.value;\n // Remove emojis before normalizing for matching\n const cleanedValue = removeEmojis(nextValue);\n const normalizedNext = normalizeText(cleanedValue);\n setInputValue(nextValue);\n setIsSearching(true);\n\n const exactMatch = options.find(\n (option) =>\n (normalizeText(option.value) === normalizedNext && option.value.length === normalizedNext.length) ||\n (normalizeText(option.label) === normalizedNext && option.label.length === normalizedNext.length) ||\n matchesNumericValue(option.value, normalizedNext)\n );\n\n if (exactMatch) {\n onValueChange(exactMatch.value);\n } else if (inputMode === \"numeric\") {\n // Pour les champs numériques (date), on accepte les valeurs personnalisées\n onValueChange(nextValue);\n } else if (cleanedValue === \"\") {\n // If the user clears the input, clear the selection\n onValueChange(\"\");\n }\n // Pour les autres cas (pays, etc.), on ne met à jour que si match exact\n };\n\n\n\n const filteredOptions =\n allowCustomValue && isSearching && inputValue\n ? options.filter((option) => {\n // Remove emojis from input before searching\n const cleanedInput = removeEmojis(inputValue);\n const searchValue = normalizeText(cleanedInput);\n return (\n normalizeText(option.label).includes(searchValue) ||\n normalizeText(option.value).includes(searchValue) ||\n matchesNumericValue(option.value, searchValue)\n );\n })\n : options;\n\n // Calcule la position absolue du dropdown pour le portail\n useEffect(() => {\n if (isOpen && selectRef.current) {\n const rect = selectRef.current.getBoundingClientRect();\n setDropdownStyle({\n position: \"fixed\",\n top: rect.bottom + 4,\n left: rect.left,\n width: rect.width,\n zIndex: 9999,\n });\n }\n }, [isOpen]);\n\n const fieldBaseClasses = `w-full px-3 border rounded-lg text-base transition-colors\n focus:outline-none focus:ring-2 focus:ring-[#11E5C5] focus:border-transparent\n focus-within:outline-none focus-within:ring-2 focus-within:ring-[#11E5C5] focus-within:border-transparent\n ${compact ? \"py-2 text-sm\" : \"py-3 md:py-4\"}\n ${error\n ? \"border-red-500 bg-red-50\"\n : \"border-gray-300 hover:border-gray-400\"\n }\n ${disabled ? \"opacity-50 cursor-not-allowed\" : \"cursor-pointer\"}`;\n\n return (\n <div className={`relative ${className}`} ref={selectRef}>\n {allowCustomValue ? (\n <div\n className={fieldBaseClasses.replace(\n \"cursor-pointer\",\n allowCustomValue ? \"cursor-text\" : \"cursor-pointer\"\n )}\n onClick={() => {\n if (disabled) return;\n internalInputRef.current?.focus();\n }}\n >\n <div className=\"flex items-center gap-2 w-full\">\n <input\n type=\"text\"\n value={inputValue}\n onChange={handleInputChange}\n onFocus={() => {\n if (!disabled) {\n setIsOpen(true);\n setIsSearching(false);\n }\n }}\n onBlur={(e) => {\n // Close dropdown if focus moves outside the component AND its dropdown portal\n const isInsideSelect = selectRef.current?.contains(e.relatedTarget as Node);\n const isInsideDropdown = dropdownRef.current?.contains(e.relatedTarget as Node);\n\n if (!isInsideSelect && !isInsideDropdown) {\n setIsOpen(false);\n }\n\n // On blur, ensure the input value matches the selected value's label if possible\n if (value) {\n const optionMatch = options.find((option) => option.value === value);\n if (optionMatch) {\n // Include flag in the input value if it exists\n const displayValue = optionMatch.flag\n ? `${optionMatch.flag} ${optionMatch.label}`\n : optionMatch.label;\n setInputValue(displayValue);\n }\n }\n }}\n placeholder={displayPlaceholder}\n className=\"flex-1 bg-transparent outline-none text-gray-900 placeholder:text-gray-500\"\n disabled={disabled}\n inputMode={inputMode}\n maxLength={maxLength}\n pattern={pattern}\n ref={internalInputRef}\n />\n </div>\n </div>\n ) : (\n <button\n type=\"button\"\n onClick={() => !disabled && setIsOpen(!isOpen)}\n disabled={disabled}\n className={`${fieldBaseClasses} text-left flex items-center justify-between`}\n >\n <span className={selectedOption ? \"text-gray-900\" : \"text-gray-500\"}>\n {selectedOption ? (\n <span className=\"flex items-center gap-2\">\n {selectedOption.flag && <span>{selectedOption.flag}</span>}\n {selectedOption.label}\n </span>\n ) : (\n displayPlaceholder\n )}\n </span>\n <ChevronDownIcon\n className={`h-4 w-4 text-gray-400 transition-transform ${isOpen ? \"rotate-180\" : \"\"\n }`}\n />\n </button>\n )}\n\n {isOpen && !disabled && ReactDOM.createPortal(\n <div\n ref={dropdownRef}\n style={dropdownStyle}\n className=\"bg-white border border-gray-300 rounded-lg shadow-lg max-h-60 overflow-y-auto\"\n >\n <div className=\"py-1\">\n {filteredOptions.map((option) => (\n <button\n key={option.value}\n type=\"button\"\n onMouseDown={(e) => {\n // Prevent input blur before click fires\n e.preventDefault();\n }}\n onClick={() => handleSelect(option.value)}\n className={`w-full text-left px-3 py-2 hover:bg-gray-100\n active:bg-gray-200 transition-colors text-base flex items-center gap-2\n ${option.value === value\n ? \"bg-gray-50 text-gray-900\"\n : \"text-gray-700\"\n }\n `}\n >\n {option.flag && <span className=\"text-lg\">{option.flag}</span>}\n {option.label}\n </button>\n ))}\n {filteredOptions.length === 0 && (\n <div className=\"px-3 py-2 text-sm text-gray-500\">\n {t(\"select_component.no_results\")}\n </div>\n )}\n </div>\n </div>,\n document.body,\n )}\n </div>\n );\n});\n"],"names":["_jsxs","_jsx"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"SelectComponent.js","sources":["../../../../../src/components/ui/SelectComponent.tsx"],"sourcesContent":["import React, { useState, useRef, useEffect } from \"react\";\nimport ReactDOM from \"react-dom\";\nimport { ChevronDownIcon } from \"lucide-react\";\nimport { useI18n } from \"../../hooks/useI18n\";\n\ninterface SelectOption {\n value: string;\n label: string;\n flag?: string;\n}\n\ninterface SelectProps {\n options: SelectOption[];\n value: string;\n onValueChange: (value: string) => void;\n placeholder?: string;\n className?: string;\n disabled?: boolean;\n error?: boolean;\n allowCustomValue?: boolean;\n inputMode?: React.InputHTMLAttributes<HTMLInputElement>[\"inputMode\"];\n maxLength?: number;\n pattern?: string;\n /** Réduit le padding pour une utilisation dans des cellules de tableau */\n compact?: boolean;\n}\n\nexport const Select = React.forwardRef<HTMLInputElement, SelectProps>(({\n options,\n value,\n onValueChange,\n placeholder,\n className = \"\",\n disabled = false,\n error = false,\n allowCustomValue = false,\n inputMode,\n maxLength,\n pattern,\n compact = false,\n}, ref) => {\n const { t } = useI18n();\n const [isOpen, setIsOpen] = useState(false);\n const selectRef = useRef<HTMLDivElement>(null);\n const [inputValue, setInputValue] = useState<string>(value || \"\");\n const [isSearching, setIsSearching] = useState(false);\n const internalInputRef = useRef<HTMLInputElement>(null);\n const [dropdownStyle, setDropdownStyle] = useState<React.CSSProperties>({});\n const dropdownRef = useRef<HTMLDivElement>(null);\n\n // Combine refs\n React.useImperativeHandle(ref, () => internalInputRef.current as HTMLInputElement);\n\n const normalizeText = (text: string) =>\n (text || \"\")\n .normalize(\"NFD\")\n .replace(/[\\u0300-\\u036f]/g, \"\")\n .toLowerCase();\n\n const matchesNumericValue = (optionValue: string, input: string) => {\n // Strict matching for length to avoid \"1\" matching \"01\" and triggering auto-advance\n if (optionValue.length !== input.length) return false;\n\n const numericOption = parseInt(optionValue, 10);\n const numericInput = parseInt(input, 10);\n if (Number.isNaN(numericOption) || Number.isNaN(numericInput)) {\n return false;\n }\n return numericOption === numericInput;\n };\n\n // Helper to remove emoji flags from search input\n const removeEmojis = (text: string) => {\n // Remove emoji flags (regional indicator symbols) - using surrogate pairs\n return text.replace(/[\\uD83C][\\uDDE6-\\uDDFF]/g, '').trim();\n };\n\n const displayPlaceholder =\n placeholder ?? t(\"select_component.placeholder\");\n\n // Close dropdown when clicking outside (trigger ou portail dropdown)\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n const target = event.target as Node;\n const insideTrigger = selectRef.current?.contains(target);\n const insideDropdown = dropdownRef.current?.contains(target);\n if (!insideTrigger && !insideDropdown) {\n setIsOpen(false);\n }\n };\n\n if (isOpen) {\n document.addEventListener(\"mousedown\", handleClickOutside);\n return () =>\n document.removeEventListener(\"mousedown\", handleClickOutside);\n }\n }, [isOpen]);\n\n const selectedOption = options.find((option) => option.value === value);\n\n useEffect(() => {\n if (!allowCustomValue) return;\n\n // Don't update input value if the input is currently focused\n // This prevents auto-formatting while typing (e.g. typing \"1\" becoming \"01\")\n if (document.activeElement === internalInputRef.current) return;\n\n if (!value) {\n setInputValue(\"\");\n return;\n }\n\n const optionMatch = options.find((option) => option.value === value);\n if (optionMatch) {\n // Include flag in the input value if it exists\n const displayValue = optionMatch.flag\n ? `${optionMatch.flag} ${optionMatch.label}`\n : optionMatch.label;\n setInputValue(displayValue);\n } else if (inputMode === \"numeric\") {\n // Pour les champs numériques, afficher la valeur brute\n setInputValue(value);\n }\n // Pour les autres cas, ne pas mettre à jour inputValue si pas de match\n // Cela permet de garder la recherche en cours\n }, [value, allowCustomValue, options, inputMode]);\n\n const handleSelect = (optionValue: string) => {\n onValueChange(optionValue);\n if (allowCustomValue) {\n const optionMatch = options.find(\n (option) => option.value === optionValue\n );\n if (optionMatch) {\n // Include flag in the input value if it exists\n const displayValue = optionMatch.flag\n ? `${optionMatch.flag} ${optionMatch.label}`\n : optionMatch.label;\n setInputValue(displayValue);\n } else {\n setInputValue(optionValue);\n }\n }\n setIsSearching(false);\n setIsOpen(false);\n };\n\n const handleInputChange = (event: React.ChangeEvent<HTMLInputElement>) => {\n if (!allowCustomValue) return;\n\n const nextValue = event.target.value;\n // Remove emojis before normalizing for matching\n const cleanedValue = removeEmojis(nextValue);\n const normalizedNext = normalizeText(cleanedValue);\n setInputValue(nextValue);\n setIsSearching(true);\n\n const exactMatch = options.find(\n (option) =>\n (normalizeText(option.value) === normalizedNext && option.value.length === normalizedNext.length) ||\n (normalizeText(option.label) === normalizedNext && option.label.length === normalizedNext.length) ||\n matchesNumericValue(option.value, normalizedNext)\n );\n\n if (exactMatch) {\n onValueChange(exactMatch.value);\n } else if (inputMode === \"numeric\") {\n // Pour les champs numériques (date), on accepte les valeurs personnalisées\n onValueChange(nextValue);\n } else if (cleanedValue === \"\") {\n // If the user clears the input, clear the selection\n onValueChange(\"\");\n }\n // Pour les autres cas (pays, etc.), on ne met à jour que si match exact\n };\n\n\n\n const filteredOptions =\n allowCustomValue && isSearching && inputValue\n ? options.filter((option) => {\n // Remove emojis from input before searching\n const cleanedInput = removeEmojis(inputValue);\n const searchValue = normalizeText(cleanedInput);\n return (\n normalizeText(option.label).includes(searchValue) ||\n normalizeText(option.value).includes(searchValue) ||\n matchesNumericValue(option.value, searchValue)\n );\n })\n : options;\n\n // Calcule la position absolue du dropdown pour le portail\n useEffect(() => {\n if (isOpen && selectRef.current) {\n const rect = selectRef.current.getBoundingClientRect();\n setDropdownStyle({\n position: \"fixed\",\n top: rect.bottom + 4,\n left: rect.left,\n width: rect.width,\n zIndex: 9999,\n });\n }\n }, [isOpen]);\n\n const fieldBaseClasses = `w-full px-3 border rounded-lg text-base transition-colors\n focus:outline-none focus:ring-2 focus:ring-[#11E5C5] focus:border-transparent\n focus-within:outline-none focus-within:ring-2 focus-within:ring-[#11E5C5] focus-within:border-transparent\n ${compact ? \"py-2 text-sm\" : \"py-3 md:py-4\"}\n ${error\n ? \"border-red-500 bg-red-50\"\n : \"border-gray-300 hover:border-gray-400\"\n }\n ${disabled ? \"opacity-50 cursor-not-allowed\" : \"cursor-pointer\"}`;\n\n return (\n <div className={`relative ${className}`} ref={selectRef}>\n {allowCustomValue ? (\n <div\n className={fieldBaseClasses.replace(\n \"cursor-pointer\",\n allowCustomValue ? \"cursor-text\" : \"cursor-pointer\"\n )}\n onClick={() => {\n if (disabled) return;\n internalInputRef.current?.focus();\n }}\n >\n <div className=\"flex items-center gap-2 w-full\">\n <input\n type=\"text\"\n value={inputValue}\n onChange={handleInputChange}\n onFocus={() => {\n if (!disabled) {\n setIsOpen(true);\n setIsSearching(false);\n }\n }}\n onBlur={(e) => {\n // Close dropdown if focus moves outside the component AND its dropdown portal\n const isInsideSelect = selectRef.current?.contains(e.relatedTarget as Node);\n const isInsideDropdown = dropdownRef.current?.contains(e.relatedTarget as Node);\n\n if (!isInsideSelect && !isInsideDropdown) {\n setIsOpen(false);\n }\n\n // On blur, ensure the input value matches the selected value's label if possible\n if (value) {\n const optionMatch = options.find((option) => option.value === value);\n if (optionMatch) {\n // Include flag in the input value if it exists\n const displayValue = optionMatch.flag\n ? `${optionMatch.flag} ${optionMatch.label}`\n : optionMatch.label;\n setInputValue(displayValue);\n }\n }\n }}\n placeholder={displayPlaceholder}\n className=\"flex-1 bg-transparent outline-none text-gray-900 placeholder:text-gray-500\"\n disabled={disabled}\n inputMode={inputMode}\n maxLength={maxLength}\n pattern={pattern}\n ref={internalInputRef}\n />\n </div>\n </div>\n ) : (\n <button\n type=\"button\"\n onClick={() => !disabled && setIsOpen(!isOpen)}\n disabled={disabled}\n className={`${fieldBaseClasses} text-left flex items-center justify-between`}\n >\n <span className={selectedOption ? \"text-gray-900\" : \"text-gray-500\"}>\n {selectedOption ? (\n <span className=\"flex items-center gap-2\">\n {selectedOption.flag && <span>{selectedOption.flag}</span>}\n {selectedOption.label}\n </span>\n ) : (\n displayPlaceholder\n )}\n </span>\n <ChevronDownIcon\n className={`h-4 w-4 text-gray-400 transition-transform ${isOpen ? \"rotate-180\" : \"\"\n }`}\n />\n </button>\n )}\n\n {isOpen && !disabled && ReactDOM.createPortal(\n <div\n ref={dropdownRef}\n style={dropdownStyle}\n className=\"bg-white border border-gray-300 rounded-lg shadow-lg max-h-60 overflow-y-auto\"\n >\n <div className=\"py-1\">\n {filteredOptions.map((option) => (\n <button\n key={option.value}\n type=\"button\"\n onMouseDown={(e) => {\n // Prevent input blur before click fires\n e.preventDefault();\n }}\n onClick={() => handleSelect(option.value)}\n className={`w-full text-left px-3 py-2 hover:bg-gray-100\n active:bg-gray-200 transition-colors text-base flex items-center gap-2\n ${option.value === value\n ? \"bg-gray-50 text-gray-900\"\n : \"text-gray-700\"\n }\n `}\n >\n {option.flag && <span className=\"text-lg\">{option.flag}</span>}\n {option.label}\n </button>\n ))}\n {filteredOptions.length === 0 && (\n <div className=\"px-3 py-2 text-sm text-gray-500\">\n {t(\"select_component.no_results\")}\n </div>\n )}\n </div>\n </div>,\n document.body,\n )}\n </div>\n );\n});\n"],"names":["React","_jsxs","_jsx"],"mappings":"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"}
|