{{-- format-ignore-start --}} @props([ // name of the input field for use in forms 'name' => defaultBladewindName('pin-code-'), // total number of boxes to display 'totalDigits' => config('bladewind.code.total_digits', 4), /* what function should be called when the user is done entering the verification code. this should just be the function name without parenthesis and parameters. example: verifyPin ... when the user is done entering the code Bladewind will call verifyPin(code) note that the code is passed to your function as the only parameter so you need to expect a parameter when defining your function... using the above example: verifyPin = (pin_code) => {} */ 'onVerify' => null, //TODO: drop this attribute in the next major release 'onverify' => null, // error message to display when pin is wrong 'errorMessage' => __('bladewind::bladewind.otp_error_message'), // should input text be masked to hide code 'mask' => config('bladewind.code.mask', false), // after how many seconds should the link to resend a code be displayed 'timer' => null, // boxes can either be big or regular 'size' => config('bladewind.code.size', 'regular'), 'nonce' => config('bladewind.script.nonce', null), ]) @php $name = parseBladewindName($name); $mask = parseBladewindVariable($mask); $input_css = ($size !== 'big') ? " w-14 text-xl" : "w-[75px] text-5xl"; $cloak_size = ($size == 'big') ? " h-24" : "h-16"; $onverify = $onVerify; @endphp {{-- format-ignore-end --}}
@for ($x = 0; $x < $totalDigits; $x++) @endfor
var moveCursorNext = (name, index, total_digits, user_function, evt) => { if (evt.key === 'Backspace') { if (index > 0) { domEl(`.${name}-pcode${index}`).value = ''; index--; } } else { if (domEl(`.${name}-pcode${index}`).value) { index++ } } (index < total_digits) ? domEl(`.${name}-pcode${index}`).focus() : setPin(name, user_function); } var setPin = (name, user_function) => { domEl(`.${name}`).value = ''; domEls(`.${name}-pin-code`).forEach((el) => { domEl(`.${name}`).value += el.value; }); let pin_code = domEl(`.${name}`).value; (user_function) ? callUserFunction(`${user_function}('${pin_code}','${name}')`) : doNothing(); } var clearPin = (name) => { domEls(`.${name}-pin-code`).forEach((el) => { el.value = ''; }); domEl(`.${name}-pcode0`).focus(); } var showPinError = (name, autoHide = true) => { unhide(`.bw-${name}-pin-error`); if (autoHide) setTimeout(() => { hidePinError(name); }, 10000); } var hidePinError = (name) => { hide(`.bw-${name}-pin-error`); } var showSpinner = (name) => { hide(`.bw-${name}-pin-valid`); unhide(`.bw-${name}-pin-spinner`); domEl(`.${name}-pcode0`).focus(); domEl(`.${name}-pcode0`).blur(); } var hideSpinner = (name) => { hide(`.bw-${name}-pin-spinner`); } var showPinSuccess = (name) => { hide(`.bw-${name}-pin-spinner`); unhide(`.bw-${name}-pin-valid`); loseFocus(name); } var loseFocus = (name) => { domEl(`.${name}-pcode0`).focus(); domEl(`.${name}-pcode0`).blur(); } var setFocus = (name) => { domEl(`.${name}-pcode0`).focus(); } var disablePin = (name) => { loseFocus(name); unhide(`.bw-${name}-pin-cloak`); } var enablePin = (name) => { hide(`.bw-${name}-pin-cloak`); setFocus(name); } var bw_timer_interval; var showTimer = (name, duration = 60) => { let minutes_ = Math.floor(duration / 60); let seconds_ = (duration % 60); let countdown_div = domEl(`.bw-${name}-pin-timer .countdown`); let minutes_span = domEl(`.bw-${name}-pin-timer .minutes`); let seconds_span = domEl(`.bw-${name}-pin-timer .seconds`); let done_div = domEl(`.bw-${name}-pin-timer .done`); unhide(`.bw-${name}-pin-timer .countdown`); disablePin(name); countdown({ name: name, minutes: minutes_, seconds: seconds_, countdownDiv: countdown_div, minutesSpan: minutes_span, secondsSpan: seconds_span, doneDiv: done_div, }); } var countdown = (options = {}) => { let name = options.name; options.minutesSpan.innerHTML = options.minutes; options.secondsSpan.innerHTML = options.seconds; options.doneDiv.innerHTML = ''; unhide(options.countdownDiv, true); bw_timer_interval = setInterval(() => { if (options.seconds !== 0) { options.seconds--; options.secondsSpan.innerHTML = (options.seconds < 10) ? `0${options.seconds}` : options.seconds; } else { if (options.minutes !== 0) { options.minutes--; options.seconds = 60; options.minutesSpan.innerHTML = options.minutes; } else { clearInterval(bw_timer_interval); options.secondsSpan.innerHTML = options.minutesSpan.innerHTML = ''; if (domEl('.bw-code-timer-done')) { hide(options.countdownDiv, true); options.doneDiv.innerHTML = domEl('.bw-code-timer-done').innerHTML; enablePin(name); } } } }, 1000); } @if(is_numeric($timer)) showTimer('{{$name}}', {{$timer}}); @endif