Add @gladesinger/vue3-yandex-smartcaptcha dependency, replace vue3-yandex-smartcaptcha with YandexSmartCaptcha in CaptchaBlock component, and update PersonalDataBlock label for compliance with data protection laws.

This commit is contained in:
F4ilji
2025-09-05 17:13:04 +05:00
parent c8ab16aecb
commit ff33023643
5 changed files with 72 additions and 57 deletions
+10 -10
View File
@@ -9,6 +9,7 @@
"version": "1.0.0", "version": "1.0.0",
"license": "ISC", "license": "ISC",
"dependencies": { "dependencies": {
"@gladesinger/vue3-yandex-smartcaptcha": "^1.0.0",
"@heroicons/vue": "^2.2.0", "@heroicons/vue": "^2.2.0",
"@inertiajs/inertia": "^0.11.1", "@inertiajs/inertia": "^0.11.1",
"@inertiajs/inertia-vue3": "^0.6.0", "@inertiajs/inertia-vue3": "^0.6.0",
@@ -28,7 +29,6 @@
"preline": "^1.9.0", "preline": "^1.9.0",
"slugify": "^1.6.6", "slugify": "^1.6.6",
"vite": "^6.3.5", "vite": "^6.3.5",
"vue3-yandex-smartcaptcha": "^1.0.0",
"vuex": "^4.1.0" "vuex": "^4.1.0"
}, },
"devDependencies": { "devDependencies": {
@@ -515,6 +515,15 @@
"node": ">=18" "node": ">=18"
} }
}, },
"node_modules/@gladesinger/vue3-yandex-smartcaptcha": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/@gladesinger/vue3-yandex-smartcaptcha/-/vue3-yandex-smartcaptcha-1.0.0.tgz",
"integrity": "sha512-FWCcte2hyFMwdT3YVIFwbNAaP94xFBOY2/s/NhNgZ+QI1GN6+gddaJZOWXAW7u0MuQVIQCKpHtcIUDJN+MeS4w==",
"license": "MIT",
"peerDependencies": {
"vue": "^3.0.0"
}
},
"node_modules/@heroicons/vue": { "node_modules/@heroicons/vue": {
"version": "2.2.0", "version": "2.2.0",
"resolved": "https://registry.npmjs.org/@heroicons/vue/-/vue-2.2.0.tgz", "resolved": "https://registry.npmjs.org/@heroicons/vue/-/vue-2.2.0.tgz",
@@ -9845,15 +9854,6 @@
} }
} }
}, },
"node_modules/vue3-yandex-smartcaptcha": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/vue3-yandex-smartcaptcha/-/vue3-yandex-smartcaptcha-1.1.0.tgz",
"integrity": "sha512-SRHJ4Ln0YKKgFbd3y7BqNcptgfMJtTsA+IPc8GQyvETawcc/bedYPbpYDrYoWzDdoOjOz28gXt94ucRKFY/CZg==",
"license": "MIT",
"peerDependencies": {
"vue": "^3.3.8"
}
},
"node_modules/vuex": { "node_modules/vuex": {
"version": "4.1.0", "version": "4.1.0",
"resolved": "https://registry.npmjs.org/vuex/-/vuex-4.1.0.tgz", "resolved": "https://registry.npmjs.org/vuex/-/vuex-4.1.0.tgz",
+1 -1
View File
@@ -30,6 +30,7 @@
" \"@editorjs/image\": \"^2.8.1\",\n \"@editorjs/quote\": \"^2.5.0\"," " \"@editorjs/image\": \"^2.8.1\",\n \"@editorjs/quote\": \"^2.5.0\","
], ],
"dependencies": { "dependencies": {
"@gladesinger/vue3-yandex-smartcaptcha": "^1.0.0",
"@heroicons/vue": "^2.2.0", "@heroicons/vue": "^2.2.0",
"@inertiajs/inertia": "^0.11.1", "@inertiajs/inertia": "^0.11.1",
"@inertiajs/inertia-vue3": "^0.6.0", "@inertiajs/inertia-vue3": "^0.6.0",
@@ -49,7 +50,6 @@
"preline": "^1.9.0", "preline": "^1.9.0",
"slugify": "^1.6.6", "slugify": "^1.6.6",
"vite": "^6.3.5", "vite": "^6.3.5",
"vue3-yandex-smartcaptcha": "^1.0.0",
"vuex": "^4.1.0" "vuex": "^4.1.0"
}, },
"optionalDependencies": { "optionalDependencies": {
-5
View File
@@ -8,7 +8,6 @@ import { createSSRApp, h } from 'vue';
import { createInertiaApp } from '@inertiajs/vue3'; import { createInertiaApp } from '@inertiajs/vue3';
import { ZiggyVue } from '../../vendor/tightenco/ziggy/dist/vue.m'; import { ZiggyVue } from '../../vendor/tightenco/ziggy/dist/vue.m';
import {linksReform} from "@/mixins/LinksReform.js"; import {linksReform} from "@/mixins/LinksReform.js";
import YSmartCaptcha from 'vue3-yandex-smartcaptcha'
import cookieMixin from "@/mixins/cookieMixin.js"; import cookieMixin from "@/mixins/cookieMixin.js";
import store from '@/store/index.js'; import store from '@/store/index.js';
import '@vuepic/vue-datepicker/dist/main.css'; import '@vuepic/vue-datepicker/dist/main.css';
@@ -30,10 +29,6 @@ createInertiaApp({
.mixin(linksReform) .mixin(linksReform)
.mixin(cookieMixin) .mixin(cookieMixin)
.use(ZiggyVue) .use(ZiggyVue)
.use(YSmartCaptcha, {
siteKey: "ysc1_jxb2IcslgBuHgHbmmKY1F7Nvb8zYHuAeBgjoaTka6886f893",
lang: "Язык ('ru' | 'en' | 'be' | 'kk' | 'tt' | 'uk' | 'uz' | 'tr')"
})
.mount(el); .mount(el);
}, },
progress: { progress: {
@@ -1,48 +1,66 @@
<template> <template>
<div class="mb-4 sm:mb-8"> <div class="mb-4 sm:mb-8">
<div class="relative"> <!-- Рендерим компонент только после того, как родитель примонтирован -->
<!-- Компонент капчи --> <YandexSmartCaptcha
<YSmartCaptcha v-model="token" /> v-if="isMounted"
<!-- Скрытое поле ввода --> :siteKey="yandexCaptchaKey"
<input @onSuccess="handleSuccess"
@onTokenExpired="handleTokenExpired"
/>
<div class="relative">
<input
name="captcha" name="captcha"
v-model="inputValue" v-model="inputValue"
required="required" required="required"
type="text" type="text"
class="hidden" class="hidden"
/> />
</div> </div>
</div> </div>
</template> </template>
<script> <script>
import { YandexSmartCaptcha } from '@gladesinger/vue3-yandex-smartcaptcha';
export default { export default {
name: "CaptchaBlock", name: "CaptchaBlock",
data() { components: {
return { YandexSmartCaptcha,
token: null, // Токен капчи },
inputValue: "", // Значение, которое будет отправлено в input data() {
}; return {
}, yandexCaptchaKey: import.meta.env.VITE_YANDEX_CAPTCHA_KEY,
watch: { token: null,
// Отслеживаем изменения токена inputValue: "",
token(newToken) { isMounted: false, // 1. Добавляем новый флаг
if (newToken) { };
// Если токен получен, считаем капчу успешно пройденной },
this.inputValue = "Капча успешно пройдена"; mounted() {
} else { // 2. Хук mounted() вызывается, когда компонент вставлен в DOM.
// Если токен сброшен, очищаем поле // Теперь можно безопасно рендерить капчу.
this.inputValue = ""; this.isMounted = true;
} },
}, watch: {
}, token(newToken) {
props: { if (newToken) {
block: { this.inputValue = "Капча успешно пройдена";
type: Object, } else {
}, this.inputValue = "";
error: { }
type: Object, },
}, },
}, methods: {
handleSuccess(token) {
this.token = token;
},
handleTokenExpired() {
this.token = null;
}
},
props: {
block: { type: Object },
error: { type: Object },
},
}; };
</script> </script>
@@ -6,7 +6,9 @@
required="required" required="required"
class="shrink-0 mb-0.5 border-gray-200 rounded text-primary focus:ring-blue-500 disabled:opacity-50 disabled:pointer-events-none" class="shrink-0 mb-0.5 border-gray-200 rounded text-primary focus:ring-blue-500 disabled:opacity-50 disabled:pointer-events-none"
id="personal-data-id"> id="personal-data-id">
<label for="personal-data-id" class="text-sm text-gray-500 ms-2">Даю свое согласие на сбор, обработку, хранение и использование персональных данных в соответствии с <a class="underline text-primary" target="_blank" href="https://ntspi.ru/upload/824_%D0%9E%D0%B1_%D1%83%D1%82%D0%B2_%D0%9F%D0%BE%D0%BB%D0%B8%D1%82_%D0%BE%D0%B1%D1%80_%D0%B7%D0%B0%D1%89%D0%B8%D1%82_%D0%BF%D0%B5%D1%80%D1%81_%D0%B4%D0%B0%D0%BD.pdf">Пользовательским соглашением</a> </label> <label for="personal-data-id" class="text-sm text-gray-500 ms-2">
Согласно Федеральному закону от 27.07.2006 152-ФЗ "О персональных данных", даю свое согласие на обработку персональных данных.
</label>
</div> </div>
</div> </div>